An AI GTM engineer is a technical operator who builds the systems that find, enrich and route prospects, and uses LLM agents for the judgment steps. This guide shows the role as a working stack you can run in 30 minutes.
TL;DR
- The role is data engineering for sales: queries, enrichment, agents and routing. The deliverable is a pipeline that keeps running.
- The stack has five parts: an ICP as filters, a sizing call, a search, an enrichment step and an agent or table to act on the rows.
- Time: about 30 minutes. Cost: 0 records to size the audience, 30 records to run the pipeline on one page of 25 people plus 5 enrichments.
Prerequisites
- A LeadOcean account on the Free plan: 1,000 records for life, no card, 5 requests a second. Sign up at app.leadocean.io.
- An API key in your shell:
export LEADOCEAN_API_KEY=... curlandjq. Python or Node if you want to script the loop.- Optional: an MCP client such as Claude Code, pointed at
https://api.leadocean.io/mcp(OAuth sign-in, no key pasted). The server exposes 13 tools.
What the role is
An AI GTM engineer owns the path from "who should we sell to" to "a row a rep or agent can act on". The AI part is where an LLM reads a profile, scores fit or drafts a first line. The engineering part is everything around it.
Four skills carry most of the job:
- Data fluency. Know the fields, the enum values and what an email status means before a row is sent.
- API scripting. Page with cursors, handle 429 and 402, keep keys out of code.
- Agent wiring. Give an LLM tools (MCP or function calls) and keep it from spending records on guesses.
- Sales judgment. Pick filters that match a buyer a rep would call.
For the wider definition, see what is a GTM engineer. For hiring and career data, see the GTM engineer report.
The stack, in one table
Each part has one job. Swap the tool, keep the job.
| Part | Job | Where it runs |
|---|---|---|
| Data API | Filters, search, enrich, exports | https://api.leadocean.io |
| Sizing call | Count before you spend | count=true, leadocean_count_leads |
| Agent | Score fit, draft, decide who to enrich | An MCP client such as Claude Code |
| Table or workflow | Join the data to other sources and schedule runs | Clay or n8n |
| Destination | CRM or sequencer, owned by your team | Not part of LeadOcean |
LeadOcean covers the data layer and the MCP server. It has no sequencer, dialer, CRM or Chrome extension, so the last row is always a tool you already use. The app at app.leadocean.io adds an Exports page: filter builder, column picker, price preview and CSV download. Use it when a rep wants a file, not an API.
What separates a good one from a busy one
Good GTM engineers measure before they build. They size the audience, pull 25 rows, read them, and only then write the loop.
They also keep spend visible. A search page of 25 is 25 records, a count is free, and a miss on enrich is free. A script that enriches every row from a loose filter burns a Free plan in one run.
Last, they read email_status on every row. LeadOcean does not refund bounced emails, so the filter has to happen before the send, not after.
A realistic first week
Day one is the ICP and the sizing calls. Write three filter sets, count each, and keep the one with a count you can work: a few thousand, not a few million.
Day two is search and enrichment on small pages. Pull 25 rows per set, read them, and tighten the title filters until the rows look like buyers.
Day three is the agent. Give it the count, search and enum tools, and a written rule for when it may spend records. Log every call it makes.
Days four and five are routing and review. Push the rows to your CRM or sequencer, check bounce rates after the first send, and write down what you would change.
Step 1: Write the ICP as filters
Turn the target into fields before you touch any tool. Filters are arrays of strings, and enum values are exact.
{
"title": ["Head of Growth", "VP Marketing"],
"country": ["US"],
"jobLevel": ["VP", "Director"],
"employeeRange": ["51-200", "201-500"]
}Check enum spellings first. Seniority values are lowercase (c_suite, vp, director), while jobLevel uses C-Team, VP, Director. You can list them for free:
curl -s https://api.leadocean.io/v1/enums \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'Step 2: Size the audience before you spend
Count first. If the number is wrong, change the filters, not the budget. Send count=true as a query parameter with limit=1. Sizing costs nothing.
curl -s "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"title":["Head of Growth","VP Marketing"],"country":["US"],"employeeRange":["51-200","201-500"]}' \
| jq '.meta'meta.total is capped at 100,000, and meta.countOnly is true. For companies, GET /v1/companies/count does the same job with breakdowns by industry, headcount band and HQ country.
Step 3: Search a page of people
Pull one page of 25 and read it before you pull more. Limit runs 1 to 100, and you page with cursor.
curl -s https://api.leadocean.io/v1/people/search \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"title":["Head of Growth","VP Marketing"],"country":["US"],"employeeRange":["51-200","201-500"],"limit":25}' \
| tee page1.json | jq '.meta'This spends 25 records. One search pages to 10,000 rows by default. If meta.depthCapped is true, narrow the filters instead of walking the index.
Step 4: Enrich the rows that pass your filter
Do not enrich everyone. Let a script or an agent drop rows first, then enrich by person_id, which each search row carries at meta.source_ids.person_id. Enrich takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup, so search by domain first.
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}'Since October 2026, enrich also returns career history in resume_data: past roles, education, certifications and awards. Past employers carry no company_id yet. An enrichment that finds nobody is a 404 and costs nothing.
Step 5: Hand the rows to an agent or a table
This is the AI step. Give an agent the MCP tools and a rule: size first, search small, enrich only what scores well.
You are a GTM engineer agent. Goal: 10 VP-level marketing leads at US
companies with 51-500 employees.
1. Call leadocean_count_leads with these filters. Report the total.
2. If the total is under 5,000, call leadocean_search_leads with limit 10.
3. Score each row 1-5 on fit from title and company. Drop below 4.
4. Never call leadocean_find_phone or get_lead without my approval.For a table-based version, Clay can call an HTTP API from a column. See our Clay integration and n8n integration for the request setup. Both tools document their own limits, so read those before you size a run.
What you get
The sizing call returns a count with no data. Here is the free count for the role this page is about: leadocean_count_leads on 2026-10-21, title GTM Engineer, worldwide.
{
"total": 475,
"totalIsExact": true,
"totalAll": 1617,
"distinctCompanies": 404,
"credits": 0
}That is 475 people with a verified, catch_all_valid or catch_all email, the tool's default. With no email condition the title matches 1,617 people across all employers. The 475 span 404 companies.
The record-level response below is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"has_email": true,
"email_status": "verified",
"contact_current_experiences": [{ "job_title": "VP Marketing", "company_name": "Acme", "company_domain": "acme.com" }]
},
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": null }
}A search row has no address. Enrich with reveal_email to get contact_data.contact_emails[]. The full shape is in api.leadocean.io/openapi.json.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-export $LEADOCEAN_API_KEY; keys are per plan (1 on Free) |
| 429 | Above the plan rate limit: 5 requests a second on Free, 200 on Agency | Honor Retry-After; add a short sleep between pages |
| 402 | Records spent (1,000 for life on Free) | Check GET /v1/account; move to Solo at $97 a month or Agency at $497 |
| Empty results | Enum value spelled wrong, such as Vp for VP | List exact values with GET /v1/enums or leadocean_list_enum_values |
| 404 on enrich | Nobody matched the input | Free. Try another identifier, or search by domain first |
| Export refused | Over 50,000 rows a request or 500,000 a day; bulk CSV is not on Free | Split the export, or use Solo or Agency |
FAQ
What does an AI GTM engineer do all day?
They build and maintain pipelines: audience sizing, search, enrichment, scoring and routing. Most of the week is fixing data issues and tuning filters, not writing prompts.
Is it a sales job or an engineering job?
It sits between the two. The best fit is someone who can read an API reference and also knows what a rep wants in a row.
Which skills matter most?
Scripting against REST APIs, reading email status, and giving agents safe tools. Prompting is the smallest part.
What does the stack cost to start?
LeadOcean Free costs $0 and gives 1,000 records for life. Solo is $97 a month for one person and Agency is $497 a month for teams. See pricing.
Where do I read more about the role?
Start with what is a GTM engineer and the solutions page for GTM engineers. Every guide is in the blog.
Build your first GTM pipeline on 1,000 free records
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →