Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

B2B data guide

How to Choose a B2B Data Provider (and What B2B Data Is)

A definition in three sentences, then four tests you can run in an afternoon on any provider, with the queries to do it.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

B2B data is structured records about the people and companies you sell to. A person record holds a name, job title, employer, work email and sometimes a phone number. A company record holds a domain, industry, headcount, location and technology. Pick a provider by testing it on your own market, not by reading its record count.

TL;DR

  • B2B data comes in two record types (people and companies) and four field families (identity, firmographic, contact, signal). Quality is how many of those fields are right and recent.
  • The test takes about 30 minutes: size your market, check enum accuracy, sample 25 records, check email status. On LeadOcean it spends 25 records at most of the 1,000 free ones.
  • Judge on coverage of your segment, email status you can filter on, pricing you can predict and an API you can script. Ignore the headline total.

Prerequisites

  • A free LeadOcean account at app.leadocean.io (no card) and one API key, exported as $LEADOCEAN_API_KEY.
  • curl and jq, or any HTTP client.
  • A written segment: titles, countries, company size. Use your real one. A made-up segment tells you nothing.
  • Optional: the hosted MCP server at https://api.leadocean.io/mcp (13 tools, OAuth sign-in) if you would rather run the tests from an AI client.

What B2B data actually contains

There are two record types. A person record describes someone at work. A company record describes the business.

FamilyExamplesWhat breaks first
Identityname, LinkedIn URL, person IDduplicates
Firmographicindustry, headcount, HQ country, fundingstale headcount
Contactwork email, personal email, phone, email statusbounces, wrong numbers
Signaljob changes, technology on the website, funding roundsage of the signal

Contact data decays fastest. People change jobs, so an email that was right last year bounces today. That is why a provider's freshness and email status labels matter more than its size.

LeadOcean lists 693M people, 366M with an email and 166M with a phone, plus 67M companies (measured October 2026). The dataset is refreshed monthly and each record carries a fetched_at date. Treat any provider's totals the same way: a claim until you test it.

Step 1: Size your segment before you pay

A provider that cannot count your market for free is asking you to buy blind. Send your filters as a count first.

bash
curl -s "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobLevel": ["VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["CA"]
  }' | jq '.meta'

count=true is a query parameter, not a body field. It returns the total with no rows and spends no records. meta.total is capped at 100,000, so a bigger segment shows the cap.

Compare the result with what the other provider tells you for the same filters. A gap of 2x or more is the first signal worth investigating.

Step 2: Check that filters accept real values

Closed-list filters fail quietly. A wrong value returns zero rows and looks like an empty market. List the valid values before you filter.

bash
curl -s "https://api.leadocean.io/v1/enums" -H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'

Enum values are exact strings. jobLevel takes C-Team, VP, Director, Manager, Staff or Other. seniority is lowercase (c_suite, vp, director). Job functions read like Sales & Business Development. The same lookup is the free leadocean_list_enum_values MCP tool.

Ask any provider you test: how many industries, countries and tech categories can I filter on, and can I see the list? LeadOcean has 50 people filters, 34 company filters, 534 industries and 254 countries.

Step 3: Pull 25 records and read every field

Sample a small page of real results and check them by hand. Twenty-five records is enough to see a pattern.

bash
curl -s "https://api.leadocean.io/v1/people/search" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobLevel": ["VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["CA"],
    "limit": 25
  }' > sample.json
jq '.data | length' sample.json

This spends 25 records. Open ten of them on LinkedIn. Is the title current? Does the person still work there? Is the company right? Count the misses. Do the same sample at every provider and compare the miss rate, not the totals.

The body is flat JSON, filters are arrays of strings, limit runs from 1 to 100, and you page with cursor. One search pages to 10,000 rows. Narrow the filters instead of walking past that.

Step 4: Check the email status before you send

An email field is not a deliverable email. Providers differ most on how they label it. LeadOcean returns an email_status with 13 values: verified, catch_all_valid, catch_all, risky, unknown, untested, invalid, role, disposable, spam_trap, abuse, derived and none.

bash
jq -r '.data[].contact_data.email_status' sample.json | sort | uniq -c | sort -rn

Then ask each provider three questions:

  1. Can I filter on the status before I pull rows?
  2. Is a bounce refunded? LeadOcean does not refund bounces, so read the status first.
  3. When was this record last fetched?

Counts that include an email filter size the mailable list, not everyone. On 2026-10-21 the segment above counted 5,574 people with a verified or catch-all email, out of 18,800 matching the filters with no email condition.

What you get

This is the free count run on 2026-10-21 through the leadocean_count_leads MCP tool, filtered to jobLevel VP, jobFunction Sales & Business Development, country CA. It spent 0 records.

json
{
  "total": 5574,
  "totalIsExact": true,
  "totalAll": 18800,
  "distinctCompanies": 3873,
  "defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)"
}

total is the mailable count. totalAll is the same filters with no email condition. distinctCompanies is how many employers those people span.

A person row from the search in Step 3, as the response shape from the API reference, with placeholder values:

json
{
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe" },
      "contact_data": {
        "has_email": true,
        "has_phone": false,
        "email_status": "verified",
        "contact_current_experiences": [
          { "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }
        ]
      },
      "meta": { "source_ids": { "person_id": "1234567890" }, "fetched_at": "2026-10-01" }
    }
  ],
  "meta": { "count": 1, "nextCursor": null }
}

Search rows carry flags (has_email, email_status), not addresses. Enrich a row by its person_id with reveal_email set to true to get the address.

Scoring the result

Score each provider from 1 to 5 on these, using the numbers you just collected:

  • Coverage: the Step 1 count against your own estimate of the market.
  • Accuracy: the miss rate from your ten LinkedIn checks.
  • Deliverability: the share of rows with a sendable email_status, and whether you can filter on it.
  • Price you can predict: can you work out the monthly bill before you start? LeadOcean is Free ($0, 1,000 records for life), Solo $97 a month, Agency $497 a month and Platform $1,997 a month. Paid plans run on a fair-use pace, not credits. See pricing.
  • API fit: is there a documented endpoint for each step of your workflow, and a rate limit that fits? LeadOcean is 5 requests a second on Free and 200 on Agency.

Weight them for your case. A team that sends cold email weights deliverability. A team that enriches CRM records weights accuracy and the API.

For a side-by-side of named vendors, read best B2B databases, best B2B data providers and best B2B data providers in the UK. More guides sit in the blog.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Back off for the Retry-After period, or move up a plan
402The 1,000 free records are spentUpgrade, or wait: counts and enum lookups stay free
Zero rows on a segment you know existsA wrong enum value, such as VP Sales for jobLevelList valid values with /v1/enums and use the exact string
meta.total stuck at 100,000The count capAdd filters until the number drops below it
Search stops at 10,000 rowsmeta.depthCapped is trueSplit the segment by country or headcount and run each

FAQ

What is B2B data in one sentence?

B2B data is a structured record of a business, or of a person at work. Fields include title, employer, industry, email and phone. Teams use it to find and contact buyers.

How many records do I need to test a provider?

About 25 per provider. That is enough to see a title error rate and the spread of email statuses. LeadOcean's free plan has 1,000 records, so you can run the full test four or five times.

Is a bigger database better?

Only for your segment. A 693M-person total says little about VPs of sales in Canada. Count your segment first, as in Step 1.

Should I buy data or use an API?

Use an API if you enrich or refresh often, because records go stale. A one-off list export suits a single campaign. LeadOcean supports both: the API, and bulk CSV export from the app on paid plans.

Does the free plan include every feature?

Yes. The free plan has the whole database, search, enrichment and the MCP server within 1,000 records for life and 5 requests a second. Bulk CSV export is not on Free.

Run the four tests on your own segment, free

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →