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
hasPhoneshows 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. curlandjq.- 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.
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.
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
jobLevelfor the band (VP,C-Team) andseniorityfor finer cuts such asheadordirector. - Company size:
employeeRangetakes bands from1-10to10001+. Pick the bands your offer sells into. - Geography:
countryis where the person sits.hqCountryis 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.
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.
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.
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.
{
"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
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked key | Check that x-api-key holds $LEADOCEAN_API_KEY and the key is active. |
| 402 | Free plan: the 1,000 records are spent | The allowance is one-off. Move to Solo at $97 a month to keep going. |
| 429 | Above the plan's rate limit: 5 a second on Free, 50 on Solo, 200 on Agency | Honour Retry-After. Slow the loop or upgrade the plan. |
| Empty results | A bad enum value, such as vp for a job level | Use exact strings: VP, C-Team. Check GET /v1/enums, and send arrays for every filter. |
found: false | We hold no number for that person | It still costs 1 record on v2. Filter with hasPhone first. |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split 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?
Read how to get phone numbers at scale for cold calling. For regions, see the APAC mobile-first phone databases and the North America accuracy-tested phone databases. Plans are on the pricing page.
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 →