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

How-to guide

How to Enrich a Company (From Domain to Firmographics With the LeadOcean API)

Company enrichment is one domain in, one firmographic record out. Here is the request, the output and what each call costs.

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

TL;DR

  • Company enrichment takes an identifier, usually a domain, and returns a company record: name, headcount, industry, HQ, funding and detected website technologies.
  • It takes about 10 minutes and spends about 4 LeadOcean records. A hit costs 1 record. A 404, a count and an empty page cost nothing.
  • Count the list before you enrich it. POST /v1/companies/count is free and returns an exact total.

Company enrichment is the step that turns a bare domain in your CRM into something you can filter on. You send acme.com. You get back how big Acme is, what it sells, where it sits and what it runs on.

Prerequisites

  • A LeadOcean account on the Free plan: sign up. No card.
  • An API key from app.leadocean.io, exported as $LEADOCEAN_API_KEY.
  • curl and jq. Any HTTP client works the same way.
  • A domain to test. We use the placeholder acme.com.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Pick the identifier

Enrichment is a lookup, not a search. You hand over one key and get one record. Company enrich accepts a domain or a linkedin_url.

A domain is the better key. It is unique, it sits in most CRM exports and it needs no cleaning beyond lowercasing and stripping https://www.. There is no lookup by company name. If you only have a name, search first and enrich the domain that comes back (Step 4).

Step 2: Enrich one company

Send the domain to POST /v1/companies/enrich.

bash
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"}' | jq .

GET works too, with domain or linkedin_url as query parameters. A hit costs 1 record. A 404 means we hold nothing for that company and costs nothing. Treat it as a miss, not an error.

Step 3: Size the list before you enrich it

Before you loop over thousands of domains, or before you search for a segment, count it. The count call is free and returns an exact total plus breakdowns.

bash
curl -s -X POST "https://api.leadocean.io/v1/companies/count" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"hqCountry":["US"],"employeeRange":["51-200"],"industry":["Software Development"]}' \
  | jq '.data | {total, totalIsExact}'

Filters are arrays of exact strings. If a value is rejected, list the allowed ones with GET /v1/enums or the leadocean_list_enum_values MCP tool. An agent can run the same count through leadocean_count_companies.

Step 4: Find companies when you only have a segment

Search returns companies that match filters, 1 record per company returned. Use it when you have a profile of the company you want and no domain list yet.

bash
curl -s -X POST "https://api.leadocean.io/v1/companies/search" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"hqCountry":["US"],"employeeRange":["51-200"],"industry":["Software Development"],"limit":3}' \
  | jq '.meta'

The body is flat JSON and limit runs 1 to 100. Page with the cursor value from the previous response. One search pages to 10,000 rows. Past that, meta.depthCapped is true and there is no nextCursor, so narrow the filters instead.

Step 5: Loop a batch and respect the rate limit

There is no batch endpoint for company enrichment. Loop over your domains and keep under your plan's rate limit: 5 requests a second on Free, 200 on Agency.

bash
mkdir -p out
while read -r d; do
  code=$(curl -s -o "out/$d.json" -w "%{http_code}" \
    -X POST "https://api.leadocean.io/v1/companies/enrich" \
    -H "x-api-key: $LEADOCEAN_API_KEY" \
    -H "content-type: application/json" \
    -d "{\"domain\":\"$d\"}")
  echo "$d $code"
  sleep 0.25
done < domains.txt

Log the status code per domain. On a 429, wait for the Retry-After header and retry. When you want a whole segment rather than a domain list, page POST /v1/companies/search with cursor instead of looping enrich. POST /v1/exports covers people, not companies, and bulk CSV export is not on the Free plan.

What you get

Step 3 returns an exact total. This is the free MCP count for the same filters, run on 21 October 2026:

json
{
  "total": 9261,
  "totalIsExact": true,
  "unsupportedFilters": []
}

The same call also returns hq_state buckets. California leads with 2,398 of the 9,261 companies.

Step 2 returns the shape below. This is the response shape from the API reference, with placeholder values.

json
{
  "success": true,
  "data": {
    "company_data": {
      "company_name": "Acme",
      "company_domain": "acme.com",
      "company_employees": { "number_of_employees": 240, "number_of_employees_code": "201-500" },
      "company_primary_address": { "city": "Austin", "country_code": "US" },
      "company_funding": { "last_round_type": "Series B" },
      "company_number_of_detected_technologies": 1
    },
    "company_detected_technologies": [
      { "technology_product": { "name": "Cloudflare" }, "technology_last_detected_date": "2026-08-21" }
    ],
    "company_metrics": { "completion_score": 94, "marketability_score": 81 },
    "meta": { "sources": ["own"], "fetched_at": "2026-10-01", "schema": "leadocean.company.v1" }
  }
}

Unknown values come back as null, never guessed. Funding and revenue are thin for small private companies, so do not build a filter on them alone. Technology data covers about 7.8M crawled sites, so that array is empty for companies outside the set. The dataset is refreshed monthly and each record carries its own fetched_at date.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported and the header name is exact
404We hold nothing for that domainTreat it as a miss. It costs nothing. Try the LinkedIn company URL
429Above your plan's rate limit (5 a second on Free, 200 on Agency)Slow the loop and honor Retry-After
402The 1,000 Free records are spentUpgrade to Solo ($97 a month) or Agency ($497 a month)
Empty search resultsA filter value that is not an exact enum stringCheck spelling and case with /v1/enums
Search stops at 10,000 rowsThe depth cap, meta.depthCapped trueAdd filters and run several narrower searches

FAQ

What is company enrichment?

It is a lookup that adds firmographic data to a company you already know by domain. Typical fields are headcount, industry, HQ, funding stage and the technologies on its website.

How is it different from profile enrichment?

Profile enrichment adds person-level data: title, seniority, contact points and career history. Company enrichment adds company-level data. See profile enrichment.

How is it different from a lead enrichment API?

A lead enrichment API often covers both people and companies, and may append scores. See lead enrichment APIs. LeadOcean keeps a separate endpoint for each: /v1/people/enrich and /v1/companies/enrich.

How much does it cost?

One record per company found. Misses are free. The Free plan covers the first 1,000 records once. Paid plans have no per-record price: Solo is $97 a month and Agency is $497 a month, inside fair use. See pricing.

Where can I read the full API walkthrough?

The company enrichment API guide covers the flatten-to-CSV step and the cost at scale. More guides are on the blog.

Enrich your first company, free

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

Get your free API key →