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

How-to guide

How to Do B2B Lead Generation for AI Startups (Who to Target and How)

Pick the right buyers inside small AI companies, build the filter, size the list with a free count, then pull only the rows you will write to.

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

AI startups buy through two or three people. Find those people with an industry, a company keyword and a size band, count them for free, then pull only the rows you will write to.

TL;DR

  • AI startups are small, so the buying committee is two or three people. Usually a founder, a head of engineering or product, and sometimes a head of go-to-market. Target those roles, not the whole company.
  • It takes about 30 minutes. Sizing the list is free. The first pull of 25 people spends about 25 of your 1,000 free records.
  • Count first, then search. A free count on 2026-10-21 showed 757 mailable C-level people at 285 small US software companies that describe themselves as artificial intelligence.

Prerequisites

  • A LeadOcean account and key from app.leadocean.io. The free plan has no card and 1,000 records, one-off, at 5 requests a second. Free keys get both search and enrich scopes.
  • The key in your shell as $LEADOCEAN_API_KEY.
  • curl and jq. Optional: the hosted MCP server at https://api.leadocean.io/mcp if you work from an AI assistant. The count tools are free there too.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Decide who buys inside a small AI company

A 20-person AI startup has no procurement team. One person signs, one person vetoes, and one person feels the pain. Name the roles before you touch a filter.

RoleWhy they matterFilter to use
Founder or CEOHolds the budget and signsjobLevel: ["C-Team"]
CTO or Head of EngineeringVetoes anything that touches the stackjobFunction: ["Engineering"], jobLevel: ["C-Team", "VP", "Director"]
Head of ProductOwns the roadmap you want to fit intotitle: ["Head of Product", "VP Product"]
Head of Growth or SalesOwns pipeline and the tooling budgetjobFunction: ["Sales & Business Development"]

Pick one role for the first list. Mixing all four in one email sequence makes the message vague. Selling developer tooling? Start with the CTO. Selling go-to-market tooling? Start with the founder, since at this size the founder is also the head of sales.

Step 2: Find the right filter values

Industry and size values are exact strings. Guessing returns empty results. Look them up first. These calls are free.

bash
curl -s "https://api.leadocean.io/v1/enums/industry?q=software" \
  -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data.values'

Through MCP, ask for leadocean_list_enum_values with name: "industry" and q: "software". "AI" is not an industry label in LeadOcean. Most AI startups are filed under Software Development or Technology; Information and Internet. So combine an industry with a company keyword. The keyword matches the company description, specialties, tags or name.

Use these four.

  • industry: ["Software Development"]
  • companyKeywords: ["artificial intelligence"]
  • employeeRange: ["11-50"] (valid ranges include 1-10, 11-50, 51-200).
  • hqCountry: ["US"] (ISO two-letter codes).

Run the keyword as a phrase list. Several values OR together, so add "machine learning" or "generative AI" to widen it. Each phrase must have all its words present in the company text.

Step 3: Size the list for free

Never pull before you count. Send count=true as a query parameter with limit 1. The count comes back in meta.total and costs nothing.

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 '{
    "industry": ["Software Development"],
    "companyKeywords": ["artificial intelligence"],
    "employeeRange": ["11-50"],
    "hqCountry": ["US"],
    "jobLevel": ["C-Team"],
    "limit": 1
  }' | jq '.meta'

If you use an AI assistant, the same filters work in leadocean_count_leads. Use leadocean_count_companies to count the companies alone. The company count is exact and carries a breakdown by HQ state.

The count is a size check, not a promise. A person count with default settings covers addresses worth sending to (verified, catch_all_valid or catch_all). Say that when you report it.

Step 4: Narrow to a list you can write to

A list of 757 is still too big to personalise. Cut it by one signal that your message can use.

  • Location. The company breakdown below put 244 of 792 companies in California and 78 in Texas. A local angle (a meetup, a time zone) beats a generic one.
  • Headcount. Move from 11-50 to 51-200 for companies that have a budget line.
  • Technology. Add technologyCategories: ["Artificial Intelligence"] to keep companies whose site shows AI tooling. That covers the roughly 7.8M crawled sites, not every company.
  • Funding. Funding filters narrow the list further at search time, but free counts do not support them. Count without funding, then add fundingType in the search and watch meta.total fall.

Count again after each cut. Stop when the list is a size one person can write to in a week. For a cold email run, 200 to 500 people per message is a sane ceiling.

Step 5: Pull the first 25 rows

Now spend records. Drop count=true, set limit to 25 and read the rows before you scale.

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 '{
    "industry": ["Software Development"],
    "companyKeywords": ["artificial intelligence"],
    "employeeRange": ["11-50"],
    "hqCountry": ["US"],
    "jobLevel": ["C-Team"],
    "limit": 25
  }' | jq '.meta, .data[0]'

Each person returned costs one record. Page with the cursor from meta for the next 25. One search pages to 10,000 rows, so narrow the filters rather than walking the index.

To get an email for someone you picked, enrich by 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}'

Enrich also returns career history: past roles, education and certifications. Past employers carry no company_id yet. Use it to find a real opener, such as a shared former employer.

Step 6: Match the message to the role

Short messages win at this size. Write three lines: why them, what you do, one question.

  • Founder. Lead with speed. "You are probably the one doing outbound yourself. Here is how to fill a list in an afternoon."
  • CTO. Lead with the stack. Name the API, the integration or the failure you remove. Skip the pitch.
  • Head of product. Lead with the user problem you solve, in their terms.
  • All roles. Do not open with "I saw you raised." Say what you saw on their site or in their role history.

Read email_status before sending. LeadOcean gives no refund or credit-back for bounced emails, so filter to verified rows first.

What you get

Two free counts, run through the LeadOcean MCP tools on 2026-10-21. Both spent 0 records.

People count: industry Software Development, companyKeywords artificial intelligence, employeeRange 11-50, hqCountry US, jobLevel C-Team. Mailable (verified, catch_all_valid or catch_all) by default.

json
{
  "total": 757,
  "totalIsExact": true,
  "totalAll": 2086,
  "distinctCompanies": 285,
  "credits": 0
}

Company count (leadocean_count_companies): the same industry, size and country filters, with the phrase passed as keywords, the company-side name for the same text match.

json
{
  "total": 792,
  "totalIsExact": true,
  "facets": {
    "hq_state": [
      {"value": "California", "count": 244},
      {"value": "Texas", "count": 78},
      {"value": "New York", "count": 65}
    ]
  },
  "credits": 0
}

Read it this way: 792 companies match, 285 of them have a mailable C-level contact, and the 757 people span those 285 employers. totalAll of 2,086 is the same filters with no email condition.

A person row from Step 5 looks like this. It is the response shape from the API reference, with placeholder values.

json
{
  "profile_data": {
    "profile_full_name": "Jane Doe",
    "profile_headline": "Co-founder and CEO at Acme"
  },
  "contact_data": {
    "has_email": true,
    "email_status": "verified",
    "contact_current_experiences": [{
      "job_title": "Co-founder and CEO",
      "company_name": "Acme",
      "company_domain": "acme.com"
    }]
  }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported and sent as x-api-key
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour the Retry-After header and slow the loop
402Out of records (the Free plan has 1,000, one-off)Spend fewer per list, or move to Solo at $97 a month
Empty resultsA bad enum value, such as "AI" as an industryLook values up with GET /v1/enums/industry?q=... or leadocean_list_enum_values
meta.depthCapped is trueOne search reached its 10,000-row depthNarrow the filters and run a second search
Export refusedOver 50,000 rows a request or 500,000 a day, or Free planSplit the export. Bulk CSV export is not on Free

FAQ

Who should I contact first at an AI startup?

The founder, if the company has fewer than 50 people. At that size the founder owns budget, roadmap and often sales. Add the head of engineering when your product touches the stack.

Can LeadOcean tell me which companies are AI companies?

It matches the words in each company's description, specialties, tags and name, through companyKeywords. That finds companies that describe themselves as AI. It will miss some and include some that only use the word once. Spot-check the first 25 rows.

Is the count exact?

The count is exact for the filters it accepts, and it reports totalIsExact. A person count defaults to mailable addresses only. Funding, revenue and HQ city filters are not supported in free person counts, so size without them.

How many records does a list cost?

One record per person or company you receive. Counts, empty pages and enrichments that find nothing cost nothing. See pricing for the paid plans. Solo is $97 a month for one person. Agency is $497 a month for teams.

What else should I read?

Other sector guides use the same method: Web3, travel and telecom. The full set lives in the blog hub.

Size your AI startup list for free, then pull the first 25 people

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

Get your free API key →