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

How-to guide

How to buy a phone numbers list (B2B cold calling, global coverage)

Skip the static list. Size a segment for free, filter to people with a number on file, then pull only the rows you will dial.

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

Do not buy a frozen file of phone numbers. Size the segment you want, filter to people we hold a number for, and pay one record per row you actually take.

TL;DR

  • Sizing is free. Filtering on hasPhone shows how many people in a segment have a number before you spend anything. About 15 minutes gets a first list.
  • A search costs 1 record per person returned. A phone lookup costs 1 record. A CSV export costs 1 record per row, with up to 50,000 rows a request.
  • The Free plan gives 1,000 records for life, so you can test a list on real rows. Bulk CSV export starts on Solo at $97 a month.

Prerequisites

  • A LeadOcean API key from the free plan: no card. Export it as $LEADOCEAN_API_KEY.
  • curl and jq.
  • A target segment: a job level, a function and one or more countries.
  • A calling policy for each country you dial. See Step 6.

Step 1: Decide what "buy" means

You can buy a phone list three ways. They differ in what you pay for and how stale the data gets.

  • A static file: a CSV sold once. It starts ageing the day you download it.
  • A per-seat tool: you pay for access and call from inside the vendor's app.
  • A data API: you query a database and pay per record returned.

LeadOcean is the third. It has no dialer, no sequencer and no CRM, so you take the numbers into the tool you already call from. If you prefer no code, the app at app.leadocean.io has an Exports page. It offers a filter builder, a column picker, a price preview and a CSV download.

Step 2: Check coverage before you pay

Coverage is the question a list buyer should ask first. We hold a phone for 166M of 693M people (measured September 2026). The share varies by country, so size your own segment.

The free leadocean_count_leads MCP tool does this from Claude. Here is one run on 2026-10-21. The filters were hasPhone, job level VP and function Sales & Business Development.

text
country: any       total 431,522   (207,166 distinct companies)
country: DE        total   1,159   (760 distinct companies)

Both totals are exact, and both cost 0 records. These counts filter on people with a phone on file. They say nothing about whether a number is live.

The same sizing works over REST. Send count=true as a query parameter, not in the body.

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

Filter values are arrays and enums are exact strings. meta.total on this REST call is capped at 100,000, so a broad segment shows the cap and not its true size.

Step 3: Choose the segment

A phone list is only as good as its segment. Three choices change the result more than any vendor does.

  • Seniority: use jobLevel for the band (VP, C-Team) and seniority for finer cuts such as head or director.
  • Company size: employeeRange takes bands from 1-10 to 10001+. Pick the bands your offer sells into.
  • Geography: country is where the person sits. hqCountry is where the company sits. Pick the one that matches the time zone you will call in.

Narrow first, then size again. A segment of 1,159 people you will actually dial beats 431,522 you never will.

Step 4: Pull a sample first

Spend 25 records on a test page before you commit to a big pull. Read the rows, then ring a few.

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": ["DE"],
    "hasPhone": true,
    "limit": 25
  }' | jq '.meta'

Page on with meta.nextCursor. One search pages to 10,000 rows, then meta.depthCapped is true and no cursor comes back. Narrow the filters instead, by country, company size (employeeRange) or title.

Step 5: Get the numbers

A search row tells you a person has a number. The lookup returns it. Pass the person_id the search row carries at meta.source_ids.person_id.

bash
curl -s "https://api.leadocean.io/v2/people/phone?person_id=1234567890" \
  -H "x-api-key: $LEADOCEAN_API_KEY"

Numbers come best first. Each carries a type, the source's own label such as mobile or office, which is not a closed list. The call costs 1 record, even when it finds nothing.

For a full list, skip the per-person loop and export. The export takes the search filters and column ids from GET /v1/exports/columns. Numbered columns use N, and caps sets how many come back.

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": "de-vp-sales-phones",
    "filters": {
      "jobLevel": ["VP"],
      "jobFunction": ["Sales & Business Development"],
      "country": ["DE"],
      "hasPhone": true
    },
    "columns": ["profile_full_name", "current_job_title", "current_company_name", "phone_N_number", "phone_N_type"],
    "caps": { "phones": 2 },
    "limit": 1000
  }'

Poll GET /v1/exports/{id}, then fetch GET /v1/exports/{id}/download. An export reserves up to limit records at once and bills each row written. Bulk CSV export is not on Free. Solo at $97 a month includes it, and Agency at $497 a month adds 200 requests a second and 5 keys for teams. See pricing.

Step 6: Check before you dial

A number on a list is not consent to call it. The v2 phone response publishes no do-not-call flag, and its absence is not clearance.

Check the rules for each country you call, and for mobiles in particular. Business-call rules differ by country, so ask counsel if you are unsure. Log who you called, when and why.

For global coverage, call by region and local business hours. A list that spans Germany, the US and Singapore needs three call plans, not one.

What you get

The phone endpoint returns the numbers in priority order. This is the response shape from the API reference (openapi.json, October 2026), with placeholder values. It is not a real record.

json
{
  "success": true,
  "data": {
    "person_id": "1234567890",
    "found": true,
    "phones": [
      { "phone": "+14155550133", "type": "mobile" },
      { "phone": "+14155550100", "type": "office" }
    ]
  }
}

The array position is the priority. The endpoint returns data and no meta, so read your spend from GET /v1/usage.

An export gives you a CSV with one row per person. Phone columns arrive as phone_1_number, phone_1_type, phone_2_number and phone_2_type, with the other columns you asked for.

Troubleshooting

ErrorCauseFix
401Missing, wrong or revoked keyCheck that x-api-key holds $LEADOCEAN_API_KEY and the key is active.
402Free plan: the 1,000 records are spentThe allowance is one-off. Move to Solo at $97 a month to keep going.
429Above the plan's rate limit: 5 a second on Free, 50 on Solo, 200 on AgencyHonour Retry-After. Slow the loop or upgrade the plan.
Empty resultsA bad enum value, such as vp for a job levelUse exact strings: VP, C-Team. Check GET /v1/enums, and send arrays for every filter.
found: falseWe hold no number for that personIt still costs 1 record on v2. Filter with hasPhone first.
Export refusedOver 50,000 rows a request or 500,000 a daySplit the export by country or headcount band.

FAQ

Can I buy a phone list as a one-off file?

Yes, as a CSV export, priced at 1 record per row. You are not buying a frozen file, so re-run the same filters next month.

How many countries does the phone data cover?

The country filter takes 254 values. Phone coverage differs by country, so run Step 2 for each one you plan to call.

Is it legal to cold call these numbers?

It depends on the country and on whether a line is registered as do-not-call. We publish no compliance flag, so check the local rules and keep a call log.

How fresh are the numbers?

The dataset is refreshed monthly, and each record carries its own fetched_at date. Read it before a large campaign.

Where do I go next?

Size your phone list free before you buy a row

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

Get your free API key →