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

How-to guide

How to Build a RevOps AI Agent (With Real Queries and Output)

A RevOps agent is a model plus tools plus a loop. Here is the loop, the calls it makes and what it costs in records.

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

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.
  • curl for 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.

text
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.

json
{
  "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:

json
{
  "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.

bash
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.

text
leadocean_list_enum_values { "name": "job_level" }

Step 4: Pull one page and read it

Now the agent spends records. Keep the page small.

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": ["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.

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", "reveal_email": true}'

The person_id sits at meta.source_ids.person_id on each search row, digits only.

text
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.

text
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:

json
{
  "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):

json
{
  "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

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported and sent as the x-api-key header
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour Retry-After, or add a short delay between agent calls
402The 1,000 free records are spentMove to a paid plan on pricing
Empty resultsA bad enum value, such as Vice President for jobLevelLook it up with leadocean_list_enum_values; use VP
404 on enrichNothing held for that personFree. Skip the row and move on
meta.depthCapped is trueThe search hit 10,000 rowsNarrow 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 →