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

How-to guide

How to Map Intent Data to the Buyer's Journey (With the LeadOcean API)

Sort signals into awareness, consideration and decision, then pull the matching accounts and people with real queries.

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

Buyer's journey intent data is a signal tagged with the stage it points to: awareness, consideration or decision. The tag decides what you send. A topic spike is not a pricing-page visit, and one email should not treat them the same.

LeadOcean has no intent feed. It holds the people and company data that signals attach to, plus filters that work as proxies. This guide shows both halves.

TL;DR

  • Sort every signal you own into one of three stages, then attach a LeadOcean query to each stage so you know who to contact.
  • It takes about 25 minutes and spends about 110 records. Counting is free.
  • Third-party intent is account-level and fuzzy. Your own site and product signals are the strong ones. Use filters to find the people behind them.

Prerequisites

  • A LeadOcean API key in $LEADOCEAN_API_KEY. The Free plan has 1,000 records for life, no card, 5 requests a second.
  • curl and jq.
  • A list of signals you already collect: site visits, pricing views, demo requests, a third-party topic feed, or none yet.
  • Optional: the hosted MCP server at https://api.leadocean.io/mcp (OAuth sign-in, no key pasted) to run the counts from an assistant.

Step 1: Tag each signal with a stage

Put each signal in the stage it implies, then write down the account-level fact and the person-level fact you would need. This file is the whole model.

json
{
  "awareness": {
    "signals": ["topic surge on a third-party feed", "blog or docs visit", "new in role"],
    "need": "right company and a role that owns the problem",
    "leadocean": "technologyCategories + jobFunction + jobLevel"
  },
  "consideration": {
    "signals": ["compare or alternatives page", "webinar signup", "repeat visits from one domain"],
    "need": "the buying group at that domain",
    "leadocean": "domain + seniority, GET /v1/companies/{domain}/people"
  },
  "decision": {
    "signals": ["pricing page", "demo request", "trial or free signup"],
    "need": "one verified contact at the deciding level",
    "leadocean": "POST /v1/people/enrich + reveal_email"
  }
}

Third-party feeds fill awareness best. Decision signals almost always come from your own product and site.

Step 2: Size each stage for free

A count call spends nothing and tells you if the list is worth building. Send count=true as a query parameter with limit=1.

bash
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 '{
    "technologyCategories": ["Marketing automation"],
    "jobFunction": ["Advertising & Marketing"],
    "jobLevel": ["VP", "C-Team"],
    "country": ["US"]
  }' | jq '.meta'

The technologyCategories filter reads technology detected on company websites, for about 7.8M crawled companies. A company running a marketing automation tool is a stage-one proxy: it has the problem you sell against.

Funding is a second proxy. minLastFundingYear narrows a search, but do not count with it. It applies only when the matching companies number 50,000 or fewer, and counts that use it can come back wrong.

Step 3: Pull the awareness and consideration lists

Page through the search once the count looks right. The body is flat JSON, filters are arrays, limit runs 1 to 100.

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 '{
    "technologyCategories": ["Marketing automation"],
    "jobFunction": ["Advertising & Marketing"],
    "jobLevel": ["VP", "C-Team"],
    "country": ["US"],
    "emailStatus": ["verified", "catch_all_valid"],
    "limit": 100
  }' | jq '{total: .meta.total, next: .meta.nextCursor}'

Pass meta.nextCursor as cursor for the next page. One search stops at 10,000 rows. When meta.depthCapped is true, narrow the filters instead of walking further.

For consideration, a visitor domain from your analytics is the signal. Pull the people at that account.

bash
curl -s "https://api.leadocean.io/v1/companies/acme.com/people?limit=100" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.meta'

Step 4: Enrich the decision-stage contact

A demo request gives you an email or a LinkedIn URL. Enrich takes exactly one of linkedin_url, email, phone or person_id. Set reveal_email to get the address back.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/enrich" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "jane.doe@acme.com", "reveal_email": true}'

Enrich also returns career history in resume_data: past roles, education and certifications. The current role sits in contact_data.contact_current_experiences[0] with its start_date, so you can see how long the contact has held it. An enrichment that finds nobody is a 404 and costs nothing.

What you get

This is the Step 2 query run through the MCP count tool on 2026-10-21, trimmed to the fields that matter. It cost 0 records.

json
{
  "total": 2898,
  "totalAll": 6810,
  "distinctCompanies": 1917,
  "credits": 0,
  "defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)"
}

Read it as: 2,898 US marketing VPs and C-level people, at companies with detected marketing automation, with a mailable email, spread over 1,917 companies. The same filters without the email condition match 6,810 people.

Swap VP and C-Team for Director and Manager and the same run returned 23,500 mailable people across 8,040 companies. The senior list is small enough to hand-work. The manager list needs scoring first.

Response shape from the API reference, placeholder values, abridged:

json
{
  "data": [
    { "profile_data": { "profile_full_name": "Jane Doe" },
      "contact_data": {
        "contact_current_experiences": [
          { "job_title": "VP Marketing", "company_name": "Acme", "company_domain": "acme.com" }
        ],
        "has_email": true,
        "email_status": "verified"
      },
      "meta": { "source_ids": { "person_id": "<person_id>" } } }
  ],
  "meta": { "total": 2898, "nextCursor": "opaque-string", "depthCapped": false }
}

On an enriched record, past roles sit in resume_data.experiences[] with job_title, company_name, start_date, end_date and job_seniority.job_level. Past employers carry no company_id yet, so match them by name. Search rows carry no email address, only the has_email and email_status flags.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerSend the key in x-api-key, read from $LEADOCEAN_API_KEY.
429Above the plan rate limit: 5 a second on Free, 200 on AgencyWait the Retry-After seconds, then slow the loop.
402Out of records. Free is 1,000 for lifeUpgrade or narrow the query. Counts never spend records.
Empty or rejected resultsAn enum value was not exact, such as Marketing Automation instead of Marketing automation, or United States instead of USCheck exact strings with GET /v1/enums or leadocean_list_enum_values.
Count looks wrongA funding filter was used in a countCount without funding filters, then add them at search time.
meta.depthCapped is trueOne search paged to 10,000 rowsAdd filters and split the list.

FAQ

Does LeadOcean sell intent data?

No. There is no intent feed and no topic-surge score. LeadOcean supplies the people, the contact fields and proxy filters such as detected technology and last funding year.

Which stage should I build first?

Decision. Demo requests and pricing views are rare and strong, and you only need a contact for each one. Build awareness lists last, because third-party signals are the weakest.

How do I join my own signals to LeadOcean records?

Join on email or domain. Enrich the email to get a person_id, or call the company people endpoint with the visitor's domain.

Can I export a stage list as CSV?

Yes, on paid plans. Use POST /v1/exports (up to 50,000 rows a request) or the Exports page in the app at app.leadocean.io. Bulk CSV export is not on Free.

Where can I read more on intent data?

Start with what is intent data, then best intent data providers if you want a feed. For combining signals with enrichment, see these five enrichment tools. More guides are in the blog hub. Plans are on pricing.

Find the people behind your buying signals

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

Get your free API key →