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

How-to guide

How to Auto-Fill Capsule CRM Contacts (6 Enrichment Routes With Real Requests)

Capsule has a clean REST API. Six ways to point an enrichment source at it, from one curl to an agent, each with the request you can run.

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

The cleanest way to auto-fill Capsule contacts is a script that reads a party, enriches it by email and writes the gaps back. The other five routes are the same loop run by a different tool.

Capsule's own docs point to Zapier and Make for no-code integrations (Capsule developer docs, September 2026). They do not describe a built-in enrichment feature, so you bring the data source. This page uses LeadOcean for that and shows the six routes in order of effort.

TL;DR

  • Steps 1 and 2 take about 40 minutes and need only curl and jq. Steps 3 to 5 are no-code or low-code and take 15 to 20 minutes each.
  • The single-contact test spends 1 LeadOcean record. After that, each contact enriched is 1 record. A count and a 404 are free.
  • Fill gaps only. Never overwrite a field a rep typed in by hand.

Prerequisites

  • A LeadOcean key from app.leadocean.io. Free is 1,000 records, once, no card. Export it as $LEADOCEAN_API_KEY.
  • A Capsule bearer token. Capsule lets you generate a personal token from your account instead of running the OAuth 2 flow (Capsule authentication docs, September 2026). Export it as $CAPSULE_TOKEN.
  • curl and jq. Examples use Jane Doe and acme.com as placeholders.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"
export CAPSULE_TOKEN="paste-your-capsule-token-here"

Step 1: Enrich one contact with a script

Enrich by the email already on the Capsule party, then write the job title and phone back. This is the base recipe. Every later step repeats it.

LeadOcean person enrich takes one of linkedin_url, email, phone or person_id. Add reveal_email=true to get the contact points back. It costs 1 record, and a person with no match is a free 404.

bash
CAP="https://api.capsulecrm.com/api/v2"
EMAIL="jane.doe@acme.com"

ID=$(curl -s -H "Authorization: Bearer $CAPSULE_TOKEN" \
  "$CAP/parties/search?q=$EMAIL" | jq '.parties[0].id')

curl -s -G https://api.leadocean.io/v1/people/enrich \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  --data-urlencode "email=$EMAIL" -d reveal_email=true > person.json

JOB=$(jq -r '.data.contact_data.contact_current_experiences[0].job_title // empty' person.json)
PHONE=$(jq -r '.data.contact_data.contact_phones[0].phone // empty' person.json)

curl -s -X PUT "$CAP/parties/$ID" \
  -H "Authorization: Bearer $CAPSULE_TOKEN" -H "Content-Type: application/json" \
  -d "{\"party\":{\"jobTitle\":\"$JOB\",\"phoneNumbers\":[{\"number\":\"$PHONE\"}]}}"

Capsule's update call leaves fields you omit unchanged. Entries in phoneNumbers and emailAddresses without an id are added as new ones, so a second run adds a duplicate (Capsule Party docs, September 2026). Step 2 guards against that.

Step 2: Fill the whole account in a loop

Page through parties changed since a date, skip any that already have a phone, and enrich the rest. Capsule pages at up to 100 parties with perPage and takes since for incremental runs.

bash
SINCE="2026-09-01T00:00:00Z"
curl -s -H "Authorization: Bearer $CAPSULE_TOKEN" \
  "$CAP/parties?perPage=100&since=$SINCE" \
| jq -c '.parties[]
    | select(.type=="person" and (.phoneNumbers|length)==0 and (.emailAddresses|length)>0)
    | {id, email: .emailAddresses[0].address}' \
| while read -r row; do
    ID=$(echo "$row" | jq -r .id); EMAIL=$(echo "$row" | jq -r .email)
    curl -s -G https://api.leadocean.io/v1/people/enrich \
      -H "x-api-key: $LEADOCEAN_API_KEY" \
      --data-urlencode "email=$EMAIL" -d reveal_email=true > "p_$ID.json"
    sleep 0.25   # stays under 5 requests a second on Free
  done

Free allows 5 requests a second per account. Solo ($97 a month) allows 50, and Agency ($497 a month) allows 200. Follow the Link header's next page for more than 100 parties. Run the write-back from Step 1 on each saved file.

Step 3: Use Zapier for new contacts

Use Zapier when you want every new Capsule contact enriched without running anything yourself. Capsule's docs call Zapier a popular choice and give a contact created in Capsule as an example trigger. That is the event this Zap uses.

The Zap has three steps. A Capsule new-contact trigger, a Custom Request to LeadOcean, then a Capsule update. Zapier lists Webhooks by Zapier on its Free plan as well as its paid plans (Zapier help, October 2026). Check your plan's task allowance before a large run.

text
Method: GET
URL:    https://api.leadocean.io/v1/people/enrich
Query:  email = {{trigger email}}   reveal_email = true
Header: x-api-key: <your key>

Map data.contact_data.contact_current_experiences[0].job_title to Job Title and data.contact_data.contact_phones[0].phone to Phone in the update step. Our Zapier recipe shows the full set-up.

Step 4: Use Make for scheduled batches

Use Make when you want a scheduled sweep rather than a per-contact trigger. Capsule names Make as an alternative to Zapier. Make has a generic HTTP app that sends a request to any URL (Make HTTP app, September 2026).

Build the scenario in five modules. Start with a schedule. Add an HTTP module that lists Capsule parties changed since the last run, then an iterator. Finish with an HTTP module that calls LeadOcean and one that sends the Capsule PUT. The bodies are the ones from Steps 1 and 2. Store the last run time so each sweep only touches new changes. Our Make recipe covers the module settings.

Step 5: Use n8n if you self-host

Use n8n when you want the flow on your own server. The HTTP Request node covers all three calls, and n8n's docs list header-based credentials for it (n8n docs, September 2026).

Create two Header Auth credentials. One has Name x-api-key for LeadOcean. The other has Name Authorization and value Bearer <token> for Capsule. Use a Schedule trigger, then the three HTTP Request nodes in the same order as Step 2. Our n8n recipe has the credential setup.

Step 6: Hand it to an agent through MCP

Use an agent when the job is judgement, not a fixed mapping, such as adding the missing colleagues at a customer. LeadOcean runs a hosted MCP server at https://api.leadocean.io/mcp with 13 tools. Sign-in is OAuth, so you paste no key.

Size the job first. leadocean_count_leads and leadocean_count_companies are free. Then give the agent a prompt like this:

text
For acme.com, use leadocean_count_leads to count VPs and C-Team in Sales & Business Development.
If the count is under 25, list them with leadocean_search_leads (limit 25) and show me
name, title and email_status. Do not write anything to Capsule yet.

Add the writes only after you read the list. A search returns 1 record per person, so the cap in the prompt is your spend limit. For the REST route, GET /v1/companies/{domain}/people lists a company's people, 1 record each. It returns no contact points, so enrich the ones you keep.

Which route to pick

Pick Steps 1 and 2 if someone on your team can run a script. They are the cheapest, the easiest to audit and the only routes where you control every field of the write-back. Pick Zapier or Make if nobody can. Pick n8n if the data must stay on your own server.

Pick Step 6 for one-off account work. It is the wrong tool for a standing sync, because an agent's output varies from run to run and a script's does not.

Rules that keep the CRM clean

Set three rules before any route goes live. They cost nothing and save a cleanup later.

  • Write only to empty fields. Check the party first, then fill the gap.
  • Store the email status next to the address. A custom field for it is enough, and Capsule lets you create one through the API.
  • Cap the run. A loop with no limit spends records on contacts you never meant to touch.

What you get

A count is free and returns in one call. This one ran on 2026-10-21. The filters were jobLevel VP, jobFunction Sales & Business Development and country GB. It used the default mailable filter (verified, catch_all_valid, catch_all).

json
{
  "total": 3623,
  "totalIsExact": true,
  "totalAll": 9019,
  "distinctCompanies": 2042,
  "credits": 0
}

The enrich response, as documented in the API reference, with placeholder values (response shape from the API reference):

json
{
  "success": true,
  "data": {
    "profile_data": { "profile_full_name": "Jane Doe" },
    "contact_data": {
      "contact_emails": [
        { "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
      ],
      "contact_phones": [
        { "phone": "+14155550133", "type": "mobile", "priority": 1 }
      ],
      "email_status": "verified",
      "contact_current_experiences": [
        { "company_name": "Acme", "company_domain": "acme.com", "job_title": "VP Sales" }
      ]
    }
  }
}

Since 2026-10-17, enrich also returns career history in resume_data. Past employers carry no company_id yet.

Troubleshooting

ErrorCauseFix
401 from LeadOceanMissing or wrong x-api-keyRe-export $LEADOCEAN_API_KEY. Send the header, not a query parameter.
401 from CapsuleBad or expired bearer tokenGenerate a new personal token and send Authorization: Bearer.
404 from enrichNobody matched that emailFree. Try linkedin_url, or skip the contact.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour Retry-After, add a sleep, or move up a plan.
402The 1,000 Free records are spentMove to Solo or Agency. Paid plans slow down at their pace instead of returning 402.
Duplicate phones in CapsuleRe-run added entries with no idSkip parties that already have a phone, as in Step 2.
Empty search in Step 6Enum value spelled wrongCheck leadocean_list_enum_values. Values are exact strings.

FAQ

Does Capsule enrich contacts by itself?

Its developer docs do not describe a built-in enrichment feature. They describe a REST API and point to Zapier and Make for integrations. Bring your own data source.

Which route should I pick?

Pick Step 1 and 2 if you can run a script. Pick Zapier or Make if you cannot, and n8n if you self-host. An agent suits ad hoc account work, not a standing sync.

What does it cost at 5,000 contacts?

Each contact enriched is 1 record, so 5,000 contacts is up to 5,000 records. Free covers 1,000 once. Solo is $97 a month, with a fair-use pace of 10k enrichments every 5 hours (pricing). Contacts with no match cost nothing.

Can I send to the emails it returns?

Read email_status first. Send to verified, catch_all_valid or catch_all. There is no refund for bounces.

Auto-fill your Capsule contacts from a free key

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

Get your free API key →