A startup should buy B2B data in this order: size the list for free, test on a free allowance, then pay month to month. Never sign an annual contract before you have sent a real campaign.
This guide does the first two parts with requests you can run today. It ends with the point where a paid plan makes sense.
TL;DR
- Takes about 20 minutes from signup to a first enriched list.
- Spends about 30 of your 1,000 free records. Counts, sizing and empty results cost nothing.
- Free has no card and no clock. Paid plans start at $97 a month with no contract.
Prerequisites
- A free LeadOcean account at app.leadocean.io. No credit card.
- An API key from the app, exported as
$LEADOCEAN_API_KEY. curlandjq. Optional: an MCP client such as Claude Code for Step 2.
export LEADOCEAN_API_KEY="paste-your-key-here"
curl -s https://api.leadocean.io/v1/account -H "x-api-key: $LEADOCEAN_API_KEY"The account call is free. It confirms the key works and shows your records left.
Step 1: Size the list before you spend anything
Counting is free, so count first. The search endpoint takes count=true as a query parameter, not in the body, with limit=1.
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": ["C-Team"],
"country": ["US"],
"industry": ["Software Development"]
}' | jq '.meta'The body is flat JSON and every filter is an array of strings. Enum values are exact: C-Team, not c-team or CEO. If a value returns nothing, check it with GET /v1/enums.
meta.total is capped at 100,000 on this call. For an exact total over that, use the MCP tool in Step 2.
Step 2: Get an exact count from an MCP client
The hosted MCP server at https://api.leadocean.io/mcp signs in with OAuth, so you paste no key. Add it to Claude Code like this (Claude Code MCP docs).
claude mcp add --transport http leadocean https://api.leadocean.io/mcpThen ask in plain language.
Use leadocean_count_leads: jobLevel C-Team, country US,
industry Software Development. Report the total and distinctCompanies.leadocean_count_leads is one of 13 tools. It is free, like leadocean_list_filters and leadocean_list_enum_values. For companies, leadocean_count_companies does the same job.
Step 3: Spend a few free records on a real sample
Pull 25 people. Each person returned is one record, so this spends 25 of your 1,000.
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": ["C-Team"],
"country": ["US"],
"industry": ["Software Development"],
"limit": 25
}' > sample.json
jq '.meta' sample.jsonPage further with the cursor value from the response. One search pages to 10,000 rows. When meta.depthCapped is true, narrow the filters instead of walking deeper.
The thin projection has no addresses. To get one, enrich the person with reveal_email set to true, then check email_status. Mailable means verified, catch_all_valid or catch_all.
Step 4: Enrich the people you already know
If you have a LinkedIn URL, an email, a phone or a person_id, enrich it. Send exactly one of those inputs.
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}'An enrichment that finds nothing is a 404 and costs nothing. The response also carries career history in resume_data when we hold it.
There is no name plus domain lookup. Search by domain first, then enrich by person_id.
Step 5: Decide when to move off Free
The Free plan is 1,000 records for life, one key, 5 requests a second. Move up when you need volume or speed, not before.
| Plan | Price | Fits |
|---|---|---|
| Free | $0 | Testing a list. 1,000 records, no card. |
| Solo | $97 a month | One person. Bulk CSV export included. |
| Agency | $497 a month | A team or agency. 200 requests a second, 5 keys. |
| Platform | $1,997 a month | A product that embeds or resells the data. |
Paid plans have a fair-use pace, not credits. Nothing expires and there is no per-record overage invoice. Prices are on the pricing page.
For contrast, LeadMagic lists Essential at $99 a month for 5,000 credits, billed monthly (LeadMagic pricing, September 2026). Billed yearly it shows $83 a month, which is $990 a year for 60,000 credits. Its startup page says "no long-term contracts" (LeadMagic startups, October 2026).
The difference is the unit. Credits run out. A LeadOcean paid plan slows at its pace and keeps serving.
Many data vendors sell credits, and credits create three problems for a team of one to five people.
First, you guess your volume a month ahead. Second, an unused balance may expire or stop rolling over, depending on the vendor. Third, one expensive field, such as a mobile number, burns the balance faster than the plan page implies.
A record-based free plan avoids the guessing. You get 1,000 records once and spend them on whatever test you like. A search page of 25 is 25 records. A count, a breakdown and an empty page cost nothing.
On a paid plan the unit changes again. You pay a flat monthly price and the key slows at its pace instead of stopping. That suits a startup whose volume swings from 200 contacts one week to 20,000 the next.
Step 6: Test one campaign, then widen the list
Run the same three checks before you pay any vendor, ours included.
- Count the market. If the free count is under a few thousand, the data is too thin for your ICP.
- Pull a small sample and read the rows. Check the titles, the companies and the email status.
- Send a small campaign to the mailable rows and read your bounce rate before you scale.
Bounced emails are not refunded or credited back on any plan. So read email_status before you send, and keep to the mailable statuses.
Once the sample looks right, widen the filters and size the new list for free before you pull it. The same count call works for any country, so a startup selling abroad can test a market in minutes.
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": ["C-Team"], "country": ["IL"], "industry": ["Software Development"]}' \
| jq '.meta | {total, totalIsExact, distinctCompanies}'The Israel database guide shows that pattern for a single country.
Then look at what the rows tell you. Which titles bounce, which industries have thin coverage, which company sizes reply. The B2B data analysis guide covers how to read a list that way before you buy more.
If you are still comparing vendors, the startup provider roundup lists the options with sourced prices. Use the free plan here as your control: a real sample from one vendor beats a feature table from five.
When a list works and you need volume, move to Solo for bulk CSV export, or to Agency for a team and five keys. You can cancel from your account at any time. It takes effect at the end of the period you paid for.
What you get
This is the free count from Step 2, run on 21 October 2026 with leadocean_count_leads.
{
"query": { "jobLevel": ["C-Team"], "country": ["US"], "industry": ["Software Development"] },
"total": 130510,
"totalIsExact": true,
"totalAll": 320469,
"distinctCompanies": 41207,
"credits": 0
}total counts mailable addresses only (verified, catch_all_valid, catch_all). totalAll has no email filter. The run cost 0 records.
A search page has this shape (response shape from the API reference, placeholder values).
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "CEO at Acme" },
"contact_data": { "has_email": true, "has_phone": false, "email_status": "verified" },
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": null }
}Search returns a thin projection with no contact points. has_email and has_phone tell you whether a number or address exists before you ask for it. Revealing the address is a separate step, with reveal_email on the enrich call.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-copy the key from app.leadocean.io and re-export $LEADOCEAN_API_KEY |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Wait for Retry-After, then slow the loop |
| 402 | Out of records. Free is 1,000 for life | Move to Solo or Agency |
Empty data | A filter value is not an exact enum string | List valid values with GET /v1/enums or leadocean_list_enum_values |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export by filter. Bulk CSV is not on Free |
FAQ
Is there a contract?
No. Paid plans are billed monthly and you can cancel from your account; it takes effect at the end of the paid period. Free has no card and no expiry.
Can a startup use Free for real outreach?
Yes. 1,000 records covers a first campaign of a few hundred contacts. Read email_status first and send only to mailable addresses.
What happens when I hit the pace on a paid plan?
The key is served at a reduced rate until the window resets. meta.notice says which window. Nothing stops and nothing needs a top-up.
Do I need an engineer?
For the API, yes, a little. Without one, the app has an Exports page with a filter builder, column picker and price preview. Bulk CSV export is on paid plans.
Count your first startup market for free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →