B2B data comes in four types you can query today: firmographic, contact, technographic and career history. Each answers a different question, and each is one filter group in a search request.
This guide shows the query for each type, a live free count, and the shape of what comes back. Intent data is out of scope here.
TL;DR
- Four types, four requests: firmographic and technographic filters narrow companies, contact data reaches the person, career history explains who they are.
- Time: about 15 minutes. Cost: 5 LeadOcean records, because counts are free and you pull only 3 sample rows, 1 person enrichment and 1 company enrichment.
- Size every list with a free count first. Pull records only when the number looks right.
Prerequisites
- A LeadOcean account. The Free plan ($0, 1,000 records for life, no card, 5 requests a second) covers this guide. Start at pricing.
- An API key, exported as
$LEADOCEAN_API_KEY. curlandjq, or any HTTP client. Requests go tohttps://api.leadocean.iowith the headerx-api-key.- Optional: the hosted MCP server at
https://api.leadocean.io/mcpfor the free count tools.
export LEADOCEAN_API_KEY="your_key_here"Step 1: Know the four types
Each type is a group of fields on a person or company record. Pick the type by the question you need answered.
| Type | Question it answers | Example fields | LeadOcean filter |
|---|---|---|---|
| Firmographic | Is this company a fit? | industry, headcount, HQ country | industry, employeeRange, hqCountry |
| Contact | Who do I reach, and how? | title, work email, email status, phone | jobLevel, jobFunction, emailStatus |
| Technographic | What do they run? | detected tools by category | technologyCategories, technologies |
| Career history | Who is this person? | past roles, education, certifications | returned by person enrich |
Technographic data covers about 7.8M crawled sites, so a company with no crawl has no tech fields. Treat an empty tech filter result as "not crawled", not "uses nothing".
Step 2: Check exact filter values
Enum filters take exact strings. A wrong value returns an empty result, not an error. Look values up first, for free.
curl -s "https://api.leadocean.io/v1/enums" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'In an MCP client, ask: "List the job_level values with leadocean_list_enum_values." Job levels are C-Team, VP, Director, Manager, Staff and Other. Job functions look like Sales & Business Development. Countries are ISO codes such as CA.
Step 3: Size a contact and firmographic list for free
Add count=true as a query parameter and send limit 1. No records are spent and data comes back empty.
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": ["CA"],
"limit": 1
}' | jq '.meta'meta.total is capped at 100,000. The MCP tool leadocean_count_leads takes the same filters and returns the total, plus how many employers the people span (distinctCompanies).
Step 4: Add a technographic filter
Technographic data filters people by what their employer's site runs. Use a category name from tech_category, such as CRM, or a tool name under technologies.
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": ["C-Team"],
"employeeRange": ["51-200"],
"technologyCategories": ["CRM"],
"limit": 1
}' | jq '.meta'This stacks a firmographic filter (employeeRange), a contact filter (jobLevel) and a technographic one in a single request. That stacking is the point of keeping the types in one record.
Step 5: Pull a small sample
Once the count looks right, pull 3 rows. Search body is flat JSON, filters are arrays, limit runs 1 to 100, and you page with cursor.
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": ["CA"],
"limit": 3
}' | jq '.data[0]'This spends 3 records. Each row carries has_email and email_status as flags, not the address. The MCP count tool defaults to verified, catch_all_valid and catch_all; add emailStatus to the search body to pull the same set.
Step 6: Enrich one person and one company
Enrichment takes exactly one of linkedin_url, email, phone or person_id. Use the person_id a search row carries at meta.source_ids.person_id (digits only).
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": "123456789", "reveal_email": true}'
curl -s -X POST "https://api.leadocean.io/v1/companies/enrich" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "acme.com"}'Person enrich returns career history in resume_data: past roles in experiences[], plus educations[], certifications[] and awards[], each when held. Past employers carry no company_id yet. A company comes back as company_data, company_detected_technologies and company_metrics. A lookup that finds nothing is a 404 and costs nothing. These two calls spend 2 records.
What you get
Live counts from the free leadocean_count_leads tool, run on 2026-10-21. Both counts are mailable (verified, catch_all_valid or catch_all email), which is the tool's default.
| Query | Mailable people | All matching people | Employers |
|---|---|---|---|
| jobLevel VP, jobFunction Sales & Business Development, country CA | 5,574 | 18,800 | 3,873 |
| jobLevel C-Team, employeeRange 51-200, technologyCategories CRM | 2,125 | 9,183 | 519 |
Response shape from the API reference, with placeholder values:
{
"success": true,
"data": {
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "VP Sales at Acme" },
"contact_data": {
"has_email": true,
"email_status": "verified",
"email_type": "work",
"contact_current_experiences": [
{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }
]
},
"resume_data": {
"experiences": [
{ "job_title": "Director of Sales", "company_name": "Example Co" }
],
"educations": [],
"certifications": []
},
"meta": { "schema": "leadocean.person.v1", "fetched_at": "2026-10-01" }
}
}The four blocks (profile_data, contact_data, resume_data, meta) follow the person schema in the enrich docs. Check exact names there before you map them into a database.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-export $LEADOCEAN_API_KEY and check there is no trailing space. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Back off for the Retry-After seconds. Batch with limit 100. |
| 402 | The 1,000 Free records are spent | Upgrade to Solo ($97 a month) or Agency ($497 a month). |
| Empty results | A bad enum value, such as Vice President for jobLevel | Look the value up with /v1/enums or leadocean_list_enum_values. |
| Tech filter returns few rows | The employer site was not crawled | Drop the tech filter for coverage, or accept the crawled subset. |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export. Bulk CSV export is not on Free. |
FAQ
What are the main B2B data types?
Firmographic (company facts), contact (people and how to reach them), technographic (tools a company runs) and intent (research signals). This guide covers the first three by filter, plus career history, which comes back from person enrich.
Which type should I buy first?
Contact data, filtered by firmographics. A good title and company size cut gets you a list; technographics narrow it further. Count each combination before you pull records.
How many records does a count cost?
None. Counts, filter lookups and enum lookups are free. Only people or companies returned to you count as records.
Can I compare providers by data type?
Yes. See the best B2B databases and the UK provider roundup. For definitions and why each type matters, read the B2B data overview.
Run your first B2B data query free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →