You get a Retool Workflow that runs on a schedule. It picks the database rows that are not enriched yet and calls LeadOcean for each one. It writes the current job title, company domain, phone and email status back to the row. Retool Workflows support schedule triggers, a Loop block and Resource query blocks, the Free plan included (Retool docs, September 2026). That is the whole integration. No extra tool sits between them.
How it works
The recipe has one query to read, one loop to enrich and one query to write. The loop calls POST /v1/people/enrich once per row. A 404 means LeadOcean holds nothing for that person and costs nothing.
- Add the resource. Create a REST API resource with base URL
https://api.leadocean.io, Authentication set to None, and a global headerx-api-keyholding your key. Global headers go on every request. Turn on Sanitize custom headers to keep the key out of logs (Retool docs, October 2026). - Create the workflow and a schedule trigger. Open the startTrigger block and add a Schedule trigger. Interval mode runs every n minutes, hours, days, weeks or months. Cron mode takes cron syntax and a timezone (Retool docs, September 2026).
- Read unenriched rows. Add a Resource query block on your database resource. Select rows where
leadocean_enriched_atis null andemailis not null, with aLIMIT. This is the dedupe guard. - Add a Loop block over the rows. Reference the query result as the array. Inside,
{{ value.email }}is the current row. Set Execution mode to Batch, with a batch size and a batch delay, so you stay under the rate limit (Retool docs, September 2026). - Call LeadOcean inside the loop. Add a Resource query on the REST API resource: POST
/v1/people/enrichwith the JSON body below. - Write back. Add a second Resource query that updates the row by primary key. Always set
leadocean_enriched_at, even on a 404, so a miss is not retried every run. - Run it once by hand. Test with
LIMIT 5, check the rows, then raise the limit and switch the schedule on.
Retool's Loop docs say parallel mode suits small data sets and can hit API limits on large ones. Sequential and Batch modes take an optional delay for that reason.
Configuration
The request body for step 5. Send exactly one identifier per call: email, linkedin_url, phone or person_id (LeadOcean docs, September 2026).
{
"email": "{{ value.email }}",
"reveal_email": true
}Test the same call from a terminal before you build anything:
curl -X POST "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}'reveal_email costs no extra record. Add the two columns to your table first: leadocean_enriched_at (timestamp) and leadocean_email_status (text).
Field mapping
The response is one leadocean.person.v1 object under a data key (LeadOcean docs, September 2026).
| LeadOcean field | Target column | Note |
|---|---|---|
contact_data.contact_current_experiences[0].job_title | job_title | Current role. Overwrite only when empty. |
contact_data.contact_current_experiences[0].company_domain | company_domain | Good join key to your company table. |
contact_data.contact_phones[0].phone | phone | First number only. Empty when none is held. |
contact_data.contact_emails[0].status | leadocean_email_status | Values include verified, catch_all_valid and risky. Branch on it before any send. |
| run time | leadocean_enriched_at | Dedupe guard. Set it on hits and on 404s. |
Match on a stable primary key in your table, not on the email, so a changed address never creates a second row. LeadOcean does not refund bounced emails, so read the status before sending.
Cost at 10,000 rows
10,000 rows cost $97 on LeadOcean Solo, which allows 10k enrichments every 5 hours and 50k a week. The first 1,000 rows run free on the Free plan, which is one-off and needs no card. Solo is 50 requests a second and Free is 5, so set the batch delay to match.
| LeadOcean | Retool | |
|---|---|---|
| Free plan | 1,000 records, once. No card. | Workflows: 500 runs a month, schedule and webhook triggers included. |
| 10,000 rows | Solo, $97 a month, no per-record price. | One scheduled run is one workflow run, however many rows the loop handles. |
| Paid Retool | Team $10 and Business $50 per builder a month, billed annually. Retool says annual billing saves 20 percent (Retool, October 2026). |
Retool counts a workflow run each time a triggered workflow executes successfully, and steps are unlimited on the Free plan. So a daily run over 10,000 rows adds about 30 runs a month, well inside the Free allowance.
Above 50k enrichments a week, look at Agency at $497 a month. See pricing.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| 404 on a row | LeadOcean holds nothing for that person. | Expected, and free. Stamp leadocean_enriched_at and move on. |
| 402 | The Free plan's 1,000 records are spent. | Move to Solo, or lower the LIMIT. |
429 with Retry-After | The loop is faster than your plan's rate. | Use Batch mode with a batch delay, or Sequential with an iteration delay. |
| 401 or 403 | Key missing, or the header name is wrong. | Check the header is exactly x-api-key. |
| Same rows enriched every run | The write-back failed or skipped misses. | Update leadocean_enriched_at in every branch. |
| Run stops partway | A run is capped at 30 hours and 2.5GB of memory (Retool limits). | Lower the LIMIT and run more often. |
FAQ
Can I enrich from a Retool app instead of a workflow?
Yes. A resource query in an app can call the same endpoint from a button. Retool says a query that writes data must run from an event handler, so put the call behind a button (Retool docs, September 2026).
How do I find people by domain first?
LeadOcean has no name-plus-domain lookup. Call GET /v1/companies/{domain}/people, then enrich by person_id. Search with count=true and limit=1 is free for sizing.
Does enriching the same row twice cost twice?
Yes, each hit counts one record. That is why the recipe stamps leadocean_enriched_at and selects only null rows.
Can an AI agent in Retool use LeadOcean directly?
Yes. Retool Agents connect to remote MCP servers over Streamable HTTP or SSE, with a Server URL and an authenticate step (Retool docs, October 2026). LeadOcean's server is at https://api.leadocean.io/mcp with 13 tools and OAuth sign-in. We have not tested the pair, so the scheduled recipe stays on the REST API.
Related recipes: Notion, Folk, Attio. All integrations are on the integrations hub.
Enrich your Retool records with a free LeadOcean key.
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →