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

How-to guide

How to Track Hiring Signals (With a People Data API)

LeadOcean holds no job postings. It holds the people those postings turn into. Here is how to read that as a hiring signal, with real queries.

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

You track hiring signals with LeadOcean by watching the people, not the postings. We hold no job postings and no live feed. We hold people, their start dates and company headcount, refreshed monthly.

That makes three signals reliable: recruiter teams at a target account, recent hires in the function you sell to, and headcount that moves between snapshots. If you need posting-level alerts the day a role opens, use a job-board feed alongside this. Crustdata covers that side in its hiring signals guide (checked September 2026).

TL;DR

  • It takes about 20 minutes to size an account list, pull recent hires and set up a headcount snapshot.
  • The walkthrough spends about 30 records: 25 from one search page and a few from enrichment. Counts are free.
  • Treat the output as a monthly signal. The dataset refreshes monthly, so "real time" here means your own polling, not our data changing by the minute.

Prerequisites

  • A LeadOcean API key from app.leadocean.io. The free plan has 1,000 records, one-off, and no card.
  • The key in your shell as $LEADOCEAN_API_KEY.
  • curl and jq.
  • A watchlist of company domains. The examples use acme.com.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Size the accounts that fit your ICP

Count companies before you watch any. GET /v1/companies/count is free and takes the company search filters.

bash
curl -s -G https://api.leadocean.io/v1/companies/count \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  --data-urlencode "industry=Computer Software" \
  --data-urlencode "employeeRange=51-200" \
  --data-urlencode "hqCountry=US" | jq '{total: .data.total, exact: .data.totalIsExact}'

Pick the band where a few hires change the buying picture. Between 51 and 200 staff, one new VP of Sales is a real event. At 10,001 or more it is noise.

Step 2: Find companies building a recruiting team

A company with several recruiters is hiring at volume. Count people with a recruiting title in HR, free, with count=true and limit=1 as query parameters.

bash
curl -s -G https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  --data-urlencode "title=Talent Acquisition,Recruiter" \
  --data-urlencode "jobFunction=Human Resources" \
  --data-urlencode "domain=acme.com" \
  --data-urlencode "count=true" \
  --data-urlencode "limit=1" | jq '.meta | {total, distinctCompanies}'

Run it per domain on your watchlist, or drop domain and use an industry and size filter to see the whole segment. Title values are keywords, so read a sample before you trust a number.

Step 3: Pull recent hires at one account

New leaders in your buyer's function are the strongest people-level signal. Search by domain and function, then sort by start date on your side. The search row carries the current role and its start date.

bash
curl -s https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": ["acme.com"],
    "jobFunction": ["Sales & Business Development"],
    "jobLevel": ["VP", "Director", "Manager"],
    "limit": 25
  }' | jq '[.data[] | {
      person_id: .meta.source_ids.person_id,
      name: .profile_data.profile_full_name,
      role: .contact_data.contact_current_experiences[0]
    }]
    | map(select(.role.start_date != null))
    | sort_by(.role.start_date) | reverse | .[0:5]'

This costs 25 records for the page. The API reference describes the start date in prose without fixing its key name or format, so print one row first and adjust start_date in the filter to match. Rows with no start date are dropped.

Step 4: Check whether a hire is new to the company

A recent start date can be a promotion inside the company. Enrich the person and read the career history to tell a new employer from a new title. Enrich takes one of linkedin_url, email, phone or person_id.

bash
curl -s https://api.leadocean.io/v1/people/enrich \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"person_id": "PERSON_ID_FROM_STEP_3"}' \
  | jq '.data.resume_data.experiences[] | {job_title, company_name, start_date, end_date}'

Print one response first and adjust the keys if they differ: the reference lists title, company name and start and end dates for each past role. If the previous role is at a different company, it is an external hire. Past employers carry no company_id yet, so match them by name. An enrichment that finds nobody is a 404 and costs nothing.

Step 5: Snapshot headcount and diff it

Headcount change is the closest thing to a velocity signal we offer. Enrich each watchlist domain once a month, store the figure, and compare.

bash
for d in acme.com example.com; do
  curl -s https://api.leadocean.io/v1/companies/enrich \
    -H "x-api-key: $LEADOCEAN_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"domain\": \"$d\"}" \
  | jq -c --arg d "$d" '{domain: $d, date: (now|strftime("%Y-%m-%d")), employees: .data.company_data.company_employees.number_of_employees}'
done >> headcount.jsonl

Each company is 1 record per snapshot. Run it from cron after the monthly refresh, since a daily run only reads the same figure. A rise of 10 percent in a month on a 100-person company is worth a task. That threshold is a rule of thumb, not a LeadOcean figure.

What you get

Steps 1 and 2 are free. We ran them on 2026-10-21 with leadocean_count_companies and leadocean_count_leads.

QueryResult
US software companies, 51-200 staff (company count)460 (exact)
Same segment, people titled Talent Acquisition in Human Resources9 mailable people across 6 companies (36 people without an email filter)

The second number is small on purpose. Few small companies employ a dedicated recruiter, so a recruiter at one of them is already a strong flag. Keyword title matching means you should read a sample.

A person from Step 3 comes back in the shape below. This is the response shape from the API reference, with placeholder values. The start_date key is illustrative.

json
{
  "success": true,
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe" },
      "contact_data": {
        "contact_current_experiences": [
          { "job_title": "VP of Sales", "company_name": "Acme", "company_domain": "acme.com", "start_date": "2026-09-01" }
        ]
      },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1 }
}

Troubleshooting

ErrorCauseFix
401The x-api-key header is missing, or the key is wrong or revoked.Copy a fresh key from the app and reload $LEADOCEAN_API_KEY.
402Your records are spent. The Free 1,000 are a one-off allowance.Check GET /v1/account, or move to a paid plan (Solo, from $97 a month).
429More requests a second than your plan allows: 5 on Free, 200 on Agency.Wait the Retry-After seconds and retry, or slow the loop.
Empty resultsA filter value is not an exact enum string, such as Sales for Sales & Business Development.Call leadocean_list_enum_values for job_function and pass the exact string.
meta.depthCapped is trueOne search pages to 10,000 rows.Narrow the filters instead of walking the index.
Export refusedOne export is capped at 50,000 rows a request and 500,000 rows a day.Split the job across requests and days.

FAQ

Does LeadOcean track job postings?

No. We hold people, current roles with start dates, career history, and company headcount. Postings come from a job-board or scraping source, and you can join them to our records by domain.

How fresh is the signal?

The dataset is refreshed monthly, and each record carries its own fetched_at date. Polling more often than monthly will not find new data. It only reruns the same answer.

Can I run this from Claude instead of curl?

Yes. Connect Claude to https://api.leadocean.io/mcp and use leadocean_count_leads and leadocean_count_companies for the free sizing steps. See track social signals for the prompt pattern.

What do I do with a hit?

Send it to a person, not a list. Time your outreach to the first weeks of a new leader's tenure, and wire the checks into an internal signal tool if you run them weekly.

Track hiring signals on 67M companies, free to start

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

Get your free API key →