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

How-to guide

How to Automate RevOps (10 Workflows With Real Queries)

Ten jobs a RevOps team repeats every week, each as a request you can schedule. Short on theory, long on output.

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

Automate the jobs that start with a lookup: sizing a market, filling a blank CRM field, checking a stale contact. Those are API calls, so a scheduler can run them. Routing rules and territory design still need a human.

Most RevOps automation guides list ten ideas and stop. This one gives the request for each. Every example runs against https://api.leadocean.io with a key in the x-api-key header.

The ten steps fall into three groups. Steps 1 and 2 size and pull the audience. Steps 3 to 7 keep CRM records complete and current. Steps 8 to 10 map accounts and report on them.

TL;DR

  • All ten workflows take about 45 minutes to run once, and under 10 minutes each to schedule.
  • The walkthrough spends about 30 records. Counts, sizing and 404s are free.
  • Send only to verified, catch_all_valid or catch_all emails. Read email_status first.

Prerequisites

  • A LeadOcean API key from app.leadocean.io. Free is 1,000 records, one-off, no card, 5 requests a second.
  • The key exported as $LEADOCEAN_API_KEY.
  • curl, jq and any scheduler (cron is enough). Examples use acme.com and Jane Doe as placeholders.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Size the market before you build anything

Count first. A free count tells you whether a segment is worth a workflow. The MCP tool leadocean_count_leads takes the same filters as search and spends no records.

For companies, GET /v1/companies/count returns an exact total with breakdowns by industry, headcount band, HQ country, HQ state and NAICS.

bash
curl -s "https://api.leadocean.io/v1/companies/count?hqCountry=US&employeeRange=51-200" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.'

Run this weekly and store the total. A segment that shrinks or doubles is a signal worth a Slack message.

Step 2: Pull the ICP contact list on a schedule

Search returns up to 100 rows a page. Send a flat JSON body, filters as arrays, and follow the cursor.

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 '{"title":["Head of Revenue Operations","VP Revenue Operations"],"country":["US"],"limit":25}' \
  | jq '.meta, (.data | length)'

One search pages to 10,000 rows. When meta.depthCapped is true there is no nextCursor. Narrow the filters instead of walking further.

Step 3: Enrich inbound leads on form fill

When a form lands, call enrich with the email. Enrich takes exactly one of linkedin_url, email, phone or person_id. A person we hold nothing for is a 404 and costs nothing.

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"}' | jq '.data.contact_data.contact_current_experiences'

Write the result to your CRM from the webhook handler. Skip the write on a 404.

Step 4: Backfill missing CRM fields nightly

Export the records with a blank title, phone or company size. Loop the ones you have a linkedin_url or person_id for. Phones and emails come back only with reveal_email true.

bash
while read -r url; do
  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\":\"$url\",\"reveal_email\":true}" \
    | jq -c '.data.contact_data | {title: .contact_current_experiences[0].job_title, phones: [.contact_phones[]?.phone]}'
  sleep 0.25
done < missing_fields.txt

The sleep keeps you under 5 requests a second on Free. Agency allows 200.

Step 5: Find phone numbers only when a rep asks

A phone lookup costs a record even when it finds nothing. Pull phones on demand, not for the whole table. The endpoint is GET /v2/people/phone.

bash
curl -s "https://api.leadocean.io/v2/people/phone?linkedin_url=https://www.linkedin.com/in/jane-doe-acme" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.'

Trigger it from a CRM task or a button, so reps spend records on people they will call.

Step 6: Refresh stale contacts and catch job changes

Re-enrich by person_id every quarter. Since October 2026 enrich returns career history in resume_data: past roles, education and certifications. Compare the current role to your CRM title, and keep the past roles as context.

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 '{"person_id":"PERSON_ID_FROM_SEARCH"}' \
  | jq '.data | {now: .contact_data.contact_current_experiences[0], before: .resume_data.experiences[0:2]}'

Past employers carry no company_id yet, so match them by name.

Step 7: Route leads by company size

Routing is logic, not data. Enrich the company, read the headcount, and pick an owner. Keep the rules in a table so RevOps edits them without a deploy.

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 '.'
yaml
routes:
  - when: employee_range in ["1-10", "11-50"]
    owner: smb-pool
  - when: employee_range in ["51-200", "201-500"]
    owner: mid-market-pod
  - default: enterprise-queue

Step 8: Dedupe accounts by domain

Domains are the cleanest account key. Normalize every CRM account to its root domain, then group. Run the check in SQL or a script.

sql
SELECT lower(regexp_replace(website, '^(https?://)?(www\.)?', '')) AS domain,
       count(*) AS dupes
FROM accounts
GROUP BY 1 HAVING count(*) > 1;

Merge the losers into the oldest record. Keep the merged ID list for audit.

Step 9: Map the buying committee for a target account

For each named account, list its people by domain. This endpoint stops at 10,000 rows.

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

Filter to jobLevel values C-Team, VP and Director on the search endpoint when the company is large. Enum values are exact strings.

Step 10: Send a weekly pipeline report from an agent

The hosted MCP server at https://api.leadocean.io/mcp signs in with OAuth, so no key is pasted. It exposes 13 tools, and the counting tools are free. An agent can run the weekly sizing and post a summary.

text
Using LeadOcean, count US people with title "Head of Revenue Operations"
or "VP Revenue Operations" and compare with last week's total: [LAST_WEEK_TOTAL].
Use leadocean_count_leads only. Report the change and the distinct companies.

Schedule the prompt weekly in your agent runner. See the Claude Code Salesforce guide and the HubSpot guide for the CRM write-back, and the best Claude skills for RevOps automation for ready-made agent steps. More guides are on the blog.

What you get

This is a real run of leadocean_count_leads on 21 October 2026. Filters: title "Head of Revenue Operations", "VP Revenue Operations" or "Director of Revenue Operations", country US. The default counts mailable addresses only.

json
{
  "total": 1358,
  "totalIsExact": true,
  "totalAll": 2467,
  "distinctCompanies": 1232,
  "credits": 0
}

total is mailable people (verified, catch_all_valid or catch_all). totalAll has no email condition. The call spent nothing.

A person enrich response with reveal_email true, response shape from the API reference, with placeholder values:

json
{
  "success": true,
  "data": {
    "profile_data": { "profile_full_name": "Jane Doe" },
    "contact_data": {
      "has_phone": true,
      "email_status": "verified",
      "contact_current_experiences": [
        { "job_title": "Head of RevOps", "company_name": "Acme", "company_domain": "acme.com" }
      ],
      "contact_phones": [{ "phone": "+1 415 555 0133" }]
    },
    "resume_data": { "experiences": [] }
  },
  "meta": { "schema": "leadocean.person.v1" }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-export $LEADOCEAN_API_KEY and check the header name.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honor Retry-After, add a sleep, or move up a plan.
402The Free plan's records are spentFree is 1,000 for life. Move to Solo ($97 a month) or Agency ($497 a month). Paid plans slow down at the fair-use pace instead of stopping.
Empty resultsA bad enum value, such as vp where the filter wants VPCheck GET /v1/enums or leadocean_list_enum_values.
404 on enrichNothing held for that personFree. Try another identifier or skip the write.
Export stops shortOver 50,000 rows a request or 500,000 a daySplit the pull across requests and days. Bulk CSV is not on Free.

FAQ

Which RevOps jobs are worth automating first?

Start with enrichment on form fill and the nightly backfill. They run daily, touch every lead, and fail loudly when wrong.

Does this need a sequencer or CRM from LeadOcean?

No. LeadOcean is a data API and hosted MCP server, plus an app with an Exports page. It has no sequencer, dialer, CRM or Chrome extension. You write results to the CRM you already run.

How many records does it cost?

A search or enrich spends one record per person or company returned. Counts, empty pages and 404s are free. See pricing for plan paces.

Can an agent run these instead of cron?

Yes for the read steps. The MCP server has 13 tools, and leadocean_count_leads and leadocean_count_companies are free. Keep CRM writes behind a reviewed script.

Automate your first RevOps workflow on real data

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

Get your free API key →