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

How-to guide

How to Test a B2B Lead Gen and Sales Intelligence Tool for Usability (With Real Queries)

Usability is what happens between your first filter and your first usable row. Run these five checks and you will know in 20 minutes.

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

A lead data tool is usable when a stranger can size a list, pull rows and trust the output without asking support. Five checks cover it. This guide runs them against LeadOcean, and each check works on any vendor with an API.

TL;DR

  • Run five checks: size, filters, rows, enrichment, export. Score each pass or fail.
  • It takes about 20 minutes and spends about 20 LeadOcean records on steps 1 to 4, inside the free 1,000. The export check needs a paid plan.
  • A tool that cannot tell you a list size before charging you fails check one.

Prerequisites

  • A free LeadOcean key in $LEADOCEAN_API_KEY (start free, no card: pricing).
  • curl and jq.
  • One target in mind, such as US sales VPs. Write it down before you test.

Step 1: Size the list before you spend anything

Counting must be free and exact. If a vendor charges to tell you how many rows match, you cannot budget.

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": ["US"]
  }' | jq '.meta'

count=true is a query parameter, not a body field. The body rejects unknown fields. meta.total is capped at 100,000, so read the cap before you trust a big number.

Step 2: Read the filters instead of guessing them

Enum filters are exact strings. Director works. director returns nothing. List the allowed values first.

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

Both calls are free. If you work from an AI client instead, the hosted MCP server at https://api.leadocean.io/mcp exposes leadocean_list_filters and leadocean_list_enum_values for the same job. It signs in with OAuth, so you paste no key.

Step 3: Pull 15 rows and read them

One search page of 15 is 15 records. Ask only for addresses worth sending to, then judge the rows by eye.

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": ["US"],
    "emailStatus": ["verified"],
    "limit": 15
  }' > people.json

jq -r '.data[] | [.profile_data.profile_full_name, .contact_data.contact_current_experiences[0].job_title, .contact_data.contact_current_experiences[0].company_name, .contact_data.email_status] | @tsv' people.json

Search is a flat JSON body, filters are arrays, and limit runs 1 to 100. Page on with cursor. One search pages to 10,000 rows, then meta.depthCapped turns true. Narrow the filters instead of walking further.

Step 4: Enrich five people and count the empty fields

Enrich takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup, so search first and enrich by person_id.

bash
for id in $(jq -r '.data[0:5][].meta.source_ids.person_id' people.json); do
  curl -s -X POST https://api.leadocean.io/v1/people/enrich \
    -H "x-api-key: $LEADOCEAN_API_KEY" \
    -H "content-type: application/json" \
    -d "{\"person_id\": \"$id\"}" | jq '{title: .data.contact_data.contact_current_experiences[0].job_title, past_roles: (.data.resume_data.experiences | length)}'
done

A person we hold nothing for is a 404 and costs nothing. Enrich also returns career history in resume_data: past roles, education and certifications. Past employers carry no company_id yet. Score the tool on how many of the five came back with a current role.

Step 5: Export a small file and open it

Exports are where tools hide limits. Check the ceiling, the columns and the price before you press go.

bash
curl -s -X POST https://api.leadocean.io/v1/exports \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "name": "usability-test",
    "filters": {
      "jobLevel": ["VP"],
      "jobFunction": ["Sales & Business Development"],
      "country": ["US"]
    },
    "limit": 100,
    "preset": "full"
  }' | jq '.data | {id, status, requested, estimatedTotal}'

Poll GET /v1/exports/{id} until status is done, then fetch the file from downloadUrl.

An export takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan, so this step needs Solo or above and spends up to 100 records. On a paid plan, the app at app.leadocean.io has an Exports page with a filter builder, a column picker and the record price before you start.

What you get

On 2026-10-21 the free MCP tool leadocean_count_leads returned this for VP, Sales & Business Development, US:

json
{
  "total": 129494,
  "totalIsExact": true,
  "totalAll": 350517,
  "distinctCompanies": 58121,
  "credits": 0
}

The 129,494 counts people with a verified, catch_all_valid or catch_all email. Without any email condition the same filters match 350,517. Quote the one you mean.

Row-level response shape from the API reference, with placeholder values (not a real person):

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

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyCopy the key from app.leadocean.io and export it again
429Above the plan rate limit (5 a second on Free, 200 on Agency)Honor Retry-After, or move to a higher plan
402Records spent (Free has 1,000 for life)Check GET /v1/usage, then pick a plan on pricing
Empty resultsA bad enum value, such as vp for jobLevelCheck exact strings with leadocean_list_enum_values
404 on enrichNothing held for that personNo cost. Try another person_id
Export refusedOver 50,000 rows a request or 500,000 a daySplit the export. Bulk CSV is not on Free

FAQ

What makes a lead gen tool usable?

A free exact count, filters you can list, rows you can read and a stated export ceiling. Anything you must ask sales about fails.

How many records does this test cost?

About 20 on LeadOcean. Counts, filter lists and an enrichment that finds nobody cost nothing.

Does LeadOcean replace my sales intelligence platform?

No. It returns data through an API, an MCP server and an exports page. It has no rep workspace, sequencer, dialer, CRM or Chrome extension.

Can I run these checks on another vendor?

Yes. Swap the endpoints and keep the five questions. For ranked lists of vendors, see the best B2B lead gen and sales intelligence companies, the best sales intelligence platforms and the most innovative tools.

Test your own list size in two minutes

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

Get your free API key →