A RevOps AI agent is a language model that calls tools to read, check and fix your revenue data, then repeats until the job is done. The model does not hold the data. The tools do. This page shows the loop and the calls, using LeadOcean as the data tool.
TL;DR
- A RevOps agent is three parts: a model, a set of data tools, and a loop with a stop rule.
- Setup takes about 30 minutes: connect the MCP server, give the agent one job, run it.
- A first run spends about 25 LeadOcean records on the free plan. Counts and filter lookups are free.
Prerequisites
- A free LeadOcean account and API key, stored as
$LEADOCEAN_API_KEY. No card. - Any MCP client that supports remote HTTP servers and OAuth, for the agent route. The server URL is
https://api.leadocean.io/mcp. curlfor the REST route.- A job for the agent. Pick one narrow task, such as "list every VP or Director of RevOps in the US and fill their gaps".
Step 1: Define the loop
An agent is a loop: plan, call a tool, read the result, decide. Write the stop rule first, because that is where agents go wrong.
Job: build a list of US RevOps leaders and flag the ones we can reach.
Loop:
1. Size the list with a free count. Stop if it is under 50 or over 5,000.
2. Pull one page of 25 and read it.
3. Enrich only rows whose flags show a sendable email.
4. Stop when 25 rows are reachable, or after 3 pages.
Never: call an export, never exceed 100 records without asking.A RevOps agent differs from a sales agent in the job, not the machinery. It cleans, routes and sizes. It sends nothing. For the sales-side version, read what an AI sales agent is and how it works.
Step 2: Connect the data tool
LeadOcean runs a hosted MCP server with 13 tools. Sign-in is OAuth, so you paste no key. Add the server URL in your client's MCP settings.
{
"mcpServers": {
"leadocean": {
"url": "https://api.leadocean.io/mcp"
}
}
}Client config formats differ, so check your client's own MCP docs for the exact file. Setup pages for Claude, ChatGPT, Cursor and others are on the MCP hub. The free tools are leadocean_count_leads, leadocean_count_companies, leadocean_list_filters, leadocean_list_enum_values, leadocean_get_account, leadocean_get_export and leadocean_list_exports. The rest spend one record per person or company returned.
Step 3: Size the audience for free
The agent should count before it pulls. A count spends no records. On 2026-10-21 we ran this through the MCP tool:
{
"tool": "leadocean_count_leads",
"arguments": {
"title": ["Revenue Operations", "RevOps"],
"jobLevel": ["VP", "Director", "C-Team"],
"country": ["US"],
"facets": false
}
}The same count over REST is a search with count=true as a query parameter and limit 1. The body is flat JSON and filters are arrays.
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 '{
"title": ["Revenue Operations", "RevOps"],
"jobLevel": ["VP", "Director", "C-Team"],
"country": ["US"],
"limit": 1
}'Resolve enum values before guessing. They are exact strings, and a wrong one returns nothing.
leadocean_list_enum_values { "name": "job_level" }Step 4: Pull one page and read it
Now the agent spends records. Keep the page small.
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": ["Revenue Operations", "RevOps"],
"jobLevel": ["VP", "Director", "C-Team"],
"country": ["US"],
"limit": 25
}'A page of 25 is 25 records. The agent pages with the cursor from the response. One search pages to 10,000 rows, and a capped page sets meta.depthCapped, so the agent should narrow filters instead of walking the index.
Step 5: Enrich only the reachable rows
The agent reads each row's flags and enriches only the rows worth contacting. Enrich takes exactly one of linkedin_url, email, phone or person_id. A person we hold nothing for is a 404 and costs nothing.
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", "reveal_email": true}'The person_id sits at meta.source_ids.person_id on each search row, digits only.
Enrich a row only when has_email is true and email_status is verified or catch_all_valid.For a phone, the agent calls GET /v2/people/phone. Enrichment also returns career history in resume_data, which helps a RevOps agent spot a new owner of a stack. See profile enrichment. For account-level gaps, the same pattern works on companies: company enrichment explained.
Step 6: Give it a stop rule and a report
The last instruction is the report. Ask for counts, not prose.
Return a table: rows pulled, rows with a verified email, rows enriched,
records spent, and the filters used. If any call failed, list the status code.What you get
The count from Step 3, run on 2026-10-21:
{
"total": 3059,
"totalIsExact": true,
"totalAll": 5438,
"distinctCompanies": 2389
}That is 3,059 mailable US VPs, Directors and C-level people with a RevOps title, across 2,389 employers. "Mailable" here means a verified, catch_all_valid or catch_all email. Without an email condition the same filters match 5,438.
A search page returns this shape (response shape from the API reference, placeholder values):
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "VP Revenue Operations at Acme" },
"contact_data": {
"has_email": true,
"has_phone": false,
"email_status": "verified",
"contact_current_experiences": [
{ "job_title": "VP Revenue Operations", "company_name": "Acme", "company_domain": "acme.com" }
]
},
"meta": { "source_ids": { "person_id": "123456789" } }
}
],
"meta": { "nextCursor": "CURSOR_VALUE" }
}Rows carry has_email, has_phone and email_status as flags, not the address. That is what Step 5 reads to decide whether to enrich.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported and sent as the x-api-key header |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honour Retry-After, or add a short delay between agent calls |
| 402 | The 1,000 free records are spent | Move to a paid plan on pricing |
| Empty results | A bad enum value, such as Vice President for jobLevel | Look it up with leadocean_list_enum_values; use VP |
| 404 on enrich | Nothing held for that person | Free. Skip the row and move on |
meta.depthCapped is true | The search hit 10,000 rows | Narrow the filters |
FAQ
What is a RevOps AI agent?
It is a model that uses tools to do revenue operations work: size segments, fill missing fields, flag stale records and report. It acts through tool calls, not from memory.
How is it different from a workflow tool?
A workflow runs fixed steps. An agent picks the next step from the last result. For a fixed job, a workflow is cheaper and easier to debug.
Does it replace a RevOps person?
No. It removes the lookups and cleanup. A person still owns routing rules, territories and what gets sent.
How many records will it spend?
You set that in the stop rule. The free plan has 1,000 records, once. Counts, filter lookups and empty enrichments cost nothing.
Give your RevOps agent real data
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →