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

How-to guide

How to Test B2B Lead Gen and Sales Intelligence Brands (Before You Pay)

Skip the ranking lists. Run one audience through every brand, count it, sample it, and price it. Thirty minutes, 100 to 200 records.

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

A brand is worth paying for if it returns your audience, at a mailable rate you can verify, for a price you can write down at your volume. You can test all three in 30 minutes with one fixed audience and 100 to 200 records. Brand lists and awards tell you none of that.

TL;DR

  • Pick one audience, write it as filters, and run the same ask against every brand you are considering.
  • Score four numbers: total matches, mailable share, sample accuracy on 100 rows, and the cost at your real volume.
  • The LeadOcean side takes about 30 minutes and spends 100 records for the sample, plus up to 100 for the match-rate test. Both fit inside the Free plan's 1,000.

Prerequisites

  • A LeadOcean Free key from the app (no card), stored as $LEADOCEAN_API_KEY.
  • curl and jq.
  • A written audience: job level, function, country, company size. Write it before you open any vendor site.
  • An accounts list or a CRM export of 100 people you already know are valid, if you want to test match rate.

Step 1: Write the audience as filters

Write the audience as a flat filter set first, so every brand gets the same question. Closed-list values are exact strings, so check them before you guess.

bash
curl -s "https://api.leadocean.io/v1/enums" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.enums[].name'

Our test audience: VPs of sales and business development, in the US, at companies with 51-200 employees.

json
{
  "jobLevel": ["VP"],
  "jobFunction": ["Sales & Business Development"],
  "country": ["US"],
  "employeeRange": ["51-200"]
}

The same audience lives in the MCP server as filters on leadocean_count_leads. Use leadocean_list_enum_values if a value is rejected.

Step 2: Count before you pull anything

Count first, because a count is free on LeadOcean and shows whether the audience exists. Send count=true and limit=1 as query parameters, with the filters in the body.

bash
curl -s -X POST "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": ["US"],
    "employeeRange": ["51-200"]
  }' | jq '.meta'

meta.total is capped at 100,000, so a bigger audience reads as exactly that. Ask every other brand for the same number. If a brand will not show a count before payment, write that down: it is a finding.

Step 3: Split the count by what you will actually use

The total is not the useful number. The mailable share is. The same audience with an email condition gives a very different figure, so label each count by what you filtered.

bash
curl -s -X POST "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": ["US"],
    "employeeRange": ["51-200"],
    "emailStatus": ["verified"]
  }' | jq '.meta.total'

The email_status field has 13 values, from verified to spam_trap. A brand that gives you one "valid" flag and no status gives you less to filter on.

Step 4: Pull a 100-row sample and check it by hand

Pull 100 rows, the search page maximum, and check 20 of them yourself. This is the only step that spends records.

bash
curl -s -X POST "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": ["US"],
    "employeeRange": ["51-200"],
    "emailStatus": ["verified"],
    "limit": 100
  }' > sample.json

Open 20 profiles. Check that the person still holds the title and the company is the right size. Do the same with 100 rows from each other brand, and compare the two error rates, not the brand names.

Step 5: Test match rate on people you already know

If you hold 100 contacts you know are real, enrich them and count the hits. Enrich takes exactly one of linkedin_url, email, phone or person_id. A person we hold nothing for returns a 404 and costs nothing.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/enrich" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"linkedin_url": "https://www.linkedin.com/in/jane-doe-example", "reveal_email": true}'

Hits divided by 100 is your match rate. Each hit costs one record. Keep the 404s: a brand that bills for empty answers changes the math.

Step 6: Price it at your volume, not at the sample

Price the full audience, billed as you would really use it. Write the monthly list price first and the yearly-billed figure after it. If a brand has no public price at your volume, write "No public 1M price" and do not multiply a per-record rate out.

On LeadOcean the answer is a plan, not a per-record price (leadocean.io/pricing, October 2026):

PlanMonthlyRate limitFits
Free$05 requests a secondThis test: 1,000 records for life, no card
Solo$9750 requests a secondOne person, bulk CSV export included
Agency$497200 requests a secondTeams and agencies, 5 keys
Platform$1,99710,000 requests a secondProducts that embed or resell the data

Paid plans have a fair-use pace, not credits. Nothing to top up, nothing that expires. If the 100-row test passes, the Solo plan at $97 covers one person's outbound, and Agency at $497 covers a team.

What you get

The two counts, run on 2026-10-21 with leadocean_count_leads, for the audience above:

text
Filters: jobLevel VP, jobFunction Sales & Business Development,
         country US, employeeRange 51-200

Default count (verified, catch_all_valid, catch_all): 18,567
  distinctCompanies: 12,192
Same filters, emailStatus verified only:               4,552
  distinctCompanies: 3,463
Same filters, no email condition (totalAll):           60,456

That is 60,456 people, 18,567 with an address worth sending to, and 4,552 verified. Ask every other brand for the same three lines. The sample call returns this shape (response shape from the API reference, placeholder values):

json
{
  "success": true,
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe" },
      "contact_data": {
        "has_email": true,
        "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": 100, "limit": 100, "credits": 100, "nextCursor": "opaque-cursor-string" }
}

Each record carries its own fetched_at date. The dataset refreshes monthly.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-copy the key from the app and check $LEADOCEAN_API_KEY is exported
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Back off for the Retry-After value, then slow the loop
402The 1,000 free records are spentUpgrade to Solo or Agency, or narrow the sample
Empty resultsA bad enum value, such as VP Sales for jobLevelLook up the exact string with GET /v1/enums or leadocean_list_enum_values
meta.depthCapped is trueOne search pages to 10,000 rowsNarrow the filters instead of walking the index
Export refusedOver 50,000 rows a request or 500,000 a daySplit the export by country or size band

FAQ

Is a bigger database always the better brand?

No. A bigger total only matters if the mailable share and the sample accuracy hold up for your audience. Count your own filters, not the brand's headline number.

How many records should a fair test use?

100 rows per brand, with 20 checked by hand, shows large gaps. If two brands look close, repeat with a second audience before you decide.

Can I run this through an AI client instead of curl?

Yes. LeadOcean has a hosted MCP server at https://api.leadocean.io/mcp with 13 tools, and the counts are free. Sign-in is OAuth 2.1, so no key is pasted.

Does LeadOcean replace my sequencer or CRM?

No. LeadOcean is data and an API. It has an Exports page in the app for CSV download, and no sequences, dialer or CRM.

How does this compare to ranking lists?

Start with our best B2B lead gen companies list for names, then use this test to decide. The usability guide and most innovative tools cover the other angles. Plans are on /pricing.

Test your audience before you buy anyone's data

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

Get your free API key →