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

How-to guide

How to Enrich Keap Contacts (6 Routes With Real Requests)

Six ways to fill the email, phone and job title on a Keap contact. Each one is a request you can run today, with the record cost.

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

The cleanest way to enrich Keap is to read the contact's email, look it up in a data API, and write the result back with one PUT. Everything else in this guide is a variation on that loop.

We did not benchmark six vendors for this one. The title asks for tools, but a Keap contact needs routes: a way to size the list, find new people, fill old ones, write back, automate and backfill. Each step below is one route, with the request and what it costs in LeadOcean records.

Keap's REST API takes OAuth 2.0 and exposes contacts at /rest/v1/contacts (Keap developer docs, October 2026). Its create-or-update call updates an existing contact with only the values you send. That is what makes write-back safe.

Which route wins depends on what you start with. Start from a form fill or an existing Keap contact, and Steps 3 and 4 do the work. Start from a market with no contacts yet, and Steps 1 and 2 come first. Start from a list of thousands, and skip to Step 6.

TL;DR

  • All six routes take about 45 minutes the first time.
  • The walkthrough spends about 6 LeadOcean records. Counts, sizing and 404s are free. A backfill costs 1 record per row.
  • Enrich only what you will use. Read email_status before you mail anything.

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.
  • A Keap app with an OAuth access token, exported as $KEAP_ACCESS_TOKEN. Keap's v1 spec names the server https://api.infusionsoft.com/crm (Keap v1 OpenAPI spec, October 2026).
  • curl and jq. Examples use acme.com and Jane Doe as placeholders.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"
export KEAP_ACCESS_TOKEN="paste-your-token-here"
export KEAP_BASE="https://api.infusionsoft.com/crm"

Step 1: Size the list you want for free

Count before you spend. A count costs nothing. Send count=true and limit=1 as query parameters, and pass arrays as comma-separated values.

bash
curl -s -G https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  --data-urlencode "seniority=owner,founder" \
  --data-urlencode "employeeRange=1-10,11-50" \
  --data-urlencode "country=US" \
  --data-urlencode "count=true" \
  --data-urlencode "limit=1" | jq '.meta | {total, totalIsExact, countOnly}'

Always size first, because the same filters can match a thousand people or a million. This example sizes owners and founders at companies of 1 to 50 people. REST meta.total stops at 100,000. The MCP tool leadocean_count_leads returns bigger exact totals, and you will see one in the output section.

Step 2: Find new contacts to add

Search returns a thin row with a person_id and contact flags. Each person returned costs 1 record. Filters are arrays in a flat JSON body, and limit runs from 1 to 100.

bash
curl -s https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "seniority": ["owner", "founder"],
    "employeeRange": ["1-10", "11-50"],
    "country": ["US"],
    "emailStatus": ["verified", "catch_all_valid"],
    "limit": 25
  }' | jq '.data[] | {person_id: .meta.source_ids.person_id}'

Step 3: Enrich a contact you already hold

Most Keap lists start with a name and an email from a form. Enrich takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup.

bash
curl -s 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", "reveal_email": true}' \
  | jq '.data | {profile_data, contact_data}'

It costs 1 record, and reveal_email adds every email and phone we hold at no extra charge. Someone we hold nothing for is a 404 and costs nothing. Check email_status in the answer: verified, catch_all_valid and catch_all are the ones worth mailing. For a person from Step 2, send {"person_id": "..."} instead.

Step 4: Write the result back to Keap

Keap's create-or-update call is PUT /rest/v1/contacts. It accepts a duplicate_option of Email or EmailAndName, and a match updates the existing contact (Keap developer docs, October 2026). Request bodies carry email_addresses, phone_numbers, job_title and custom_fields.

bash
curl -s -X PUT "$KEAP_BASE/rest/v1/contacts?duplicate_option=Email" \
  -H "Authorization: Bearer $KEAP_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email_addresses": [{"email": "jane.doe@acme.com", "field": "EMAIL1"}],
    "phone_numbers": [{"number": "+14155550133", "field": "PHONE1"}],
    "job_title": "Owner"
  }'

The field value is required on each email and phone: EMAIL1 to EMAIL3 and PHONE1 to PHONE5 (Keap v1 OpenAPI spec, October 2026). Keap also warns that job_title and custom_fields are left out of list responses unless you ask for them in optional_properties.

Run Step 3 and Step 4 as one script over a list of Keap emails, and add a short pause between calls to stay under your plan's rate limit. Free allows 5 requests a second.

Do not write an email into Keap as marketable because LeadOcean returned it. Opt-in is a Keap decision with its own opt_in_reason. Keep a custom field for email_status so you can filter on it.

Step 5: Automate it with a no-code step

For a trickle of new contacts, let a workflow tool call both APIs. We have recipes for Zapier, Make and n8n. Each one sends a plain HTTP request to https://api.leadocean.io, because LeadOcean has no native listing in them.

The enrich body is the one from Step 3, with the email mapped from the Keap trigger. Add a filter step so a contact with no email never calls the API. A zero-email call is wasted work, and an empty enrich that finds nothing costs no record.

No-code is the wrong tool for a backfill. It runs one contact at a time and burns workflow tasks. Use Step 6 for volume.

Step 6: Backfill the whole list from a CSV

For thousands of contacts, export instead of looping. POST /v1/exports takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on Free.

bash
curl -s https://api.leadocean.io/v1/exports \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "US owners, small companies",
    "filters": {"seniority": ["owner", "founder"], "employeeRange": ["1-10"],
                "country": ["US"], "emailStatus": ["verified", "catch_all_valid"]},
    "limit": 5000,
    "preset": "full"
  }'

Poll GET /v1/exports/{id}, then GET /v1/exports/{id}/download. Every row costs 1 record. The Exports page in the app does the same with a filter builder, a column picker and the record price before you start. Then import the CSV with Keap's own contact import. LeadOcean has no CRM or sequencer, so the send happens in Keap.

What you get

Step 1 is free. We ran leadocean_count_leads on 2026-10-21 with seniority owner and founder, employee range 1-10 and 11-50, country US, on the default mailable filter (verified, catch_all_valid or catch_all).

QueryMailable peopleExact
Owners and founders, 1-50 employees, US1,233,795Yes

The mailable people span about 898,464 distinct companies. The same filters without the mailable default match 4,963,160 people. Of the mailable total, 886,754 sit at companies of 1 to 10 people and 347,041 at 11 to 50. Treat it as a ceiling for sizing, not a send list. Narrow by industry before you export. The top industry in that count is Real Estate with 56,499 people, then Construction with 46,897.

An enriched person comes back in this shape. This is the response shape from the API reference, with placeholder values.

json
{
  "success": true,
  "data": {
    "profile_data": {},
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "contact_emails": [
        { "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
      ]
    }
  }
}

Map contact_emails[].email and email_status into Keap. Since October 2026 a person enrich also returns career history in resume_data. Past employers carry no company_id yet.

Troubleshooting

ErrorCauseFix
401The x-api-key header is missing, or the key is wrong or revoked.Copy a fresh key from the app and reload $LEADOCEAN_API_KEY.
402Your records are spent. On Free the 1,000 are one-off.Check GET /v1/account, or move to a paid plan.
429Requests above your plan's rate limit: 5 a second on Free, 200 on Agency.Wait the Retry-After seconds, then retry.
Empty resultsA filter value is not an exact enum string, such as Owner where owner is expected for seniority.Call leadocean_list_enum_values and pass the exact string.
404 on enrichWe hold nothing for that person.Nothing was charged. Try another identifier.
Export refusedOne export is capped at 50,000 rows a request and 500,000 a day, and bulk CSV export is not on Free.Split the job across requests and days, or narrow the filters.

FAQ

Which route should a small Keap team start with?

Step 3 and Step 4. Enrich the contacts you already hold, then write back with the PUT. It spends records only on people already in your account.

How many Keap contacts can I enrich on the free plan?

You have 1,000 records, one-off. Enrich costs 1 record per match, so roughly 1,000 contacts. A 404 costs nothing.

Does LeadOcean replace Keap?

No. LeadOcean is a data API with a hosted MCP server and an app with an Exports page. It has no CRM, sequences or dialer, so Keap stays your system of record and sender.

Can an AI agent do this?

Yes. The hosted MCP server at https://api.leadocean.io/mcp exposes 13 tools. The count and filter tools are free, and the agent can hand you the rows to import.

For the same loop in another CRM, read the HubSpot enrichment guide. For a wider comparison, see the 12-platform benchmark. New to the term? Start with enrichment. More recipes live in the blog hub, and plans are on pricing.

Enrich your Keap contacts with 1,000 free records

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

Get your free API key →