You get a handler that fires on every Typeform submission, looks the respondent up in LeadOcean, tags the lead as hot, standard or hold, and sends it to the right queue. Typeform pushes each response to your URL as it arrives (Typeform docs, September 2026). LeadOcean adds the job title, company and email status the form never asked for. You need a free LeadOcean key and any HTTPS endpoint that can run 20 lines of code.
How it works
- Ask for a work email. Add one email field to the form. Everything else comes from LeadOcean, so the form stays short.
- Register the webhook. Call the Typeform Webhooks API with
PUT /forms/{form_id}/webhooks/{tag}, anenabledflag, yoururland asecret(Typeform docs, September 2026). - Verify the signature. Typeform signs the body with HMAC SHA-256 in the
Typeform-Signatureheader. Reject anything that does not match (Typeform docs, September 2026). - Read the email. The payload has
event_typeofform_response. Find the entry inform_response.answerswhosetypeisemail(Typeform docs, September 2026). - Enrich. Send that address to
POST /v1/people/enrichwithreveal_email: true. A person LeadOcean holds nothing for is a 404 and costs nothing (LeadOcean docs, September 2026). - Classify. Match the current job title against your own list. Check
email_status. Tag the leadhot,standardorhold. - Route. Post
hotto Slack or your CRM owner queue,standardto a nurture list,holdto a review sheet. - Answer fast. Return a 2XX within 30 seconds or Typeform marks the delivery failed and retries (Typeform docs, September 2026). Do the routing after you reply.
Configuration
Register the webhook once per form. Typeform needs its own token here.
curl -X PUT "https://api.typeform.com/forms/$FORM_ID/webhooks/leadocean" \
-H "Authorization: Bearer $TYPEFORM_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true,"url":"https://hooks.acme.com/typeform","secret":"'"$WEBHOOK_SECRET"'","event_types":{"form_response":true}}'The enrich call your handler makes, tested with a placeholder address:
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}'Send exactly one identifier per call. The handler core:
const res = await fetch("https://api.leadocean.io/v1/people/enrich", {
method: "POST",
headers: { "x-api-key": process.env.LEADOCEAN_API_KEY, "content-type": "application/json" },
body: JSON.stringify({ email, reveal_email: true }),
});
if (res.status === 404) return tag("hold", email);
const p = (await res.json()).data;
const title = p.contact_data.contact_current_experiences?.[0]?.job_title ?? "";
const status = p.contact_data.email_status;
const hot = /\b(vp|head|director|chief|founder)\b/i.test(title) && status === "verified";Field mapping
| LeadOcean field | Target field | Note |
|---|---|---|
contact_current_experiences[].job_title | Lead title | Input to your hot rule. |
contact_current_experiences[].company_name | Company | Fills what the form skipped. |
contact_current_experiences[].company_domain | Website | Use it to dedupe accounts. |
contact_data.email_status | Email status | Status of the best address. Branch on it. Bounces are not refunded. |
contact_phones[].phone | Phone | Only after reveal_email. Hot leads only. |
form_response.hidden.* | UTM or source | Typeform's own field, passed through untouched. |
Cost at 10,000 rows
10,000 submissions cost at most 10,000 LeadOcean records, and $0 on Free for the first 1,000. A hit is one record. A 404 costs nothing. Free allows 5 requests a second. Solo is $97 a month and Agency is $497 a month, with a fair-use pace and no per-record price (LeadOcean pricing).
Typeform bills by responses. Basic is $28 a month for 100 responses. Plus is $56 for 1,000. Business is $91 for 10,000 (Typeform pricing, September 2026). Billed yearly, the page shows a saving of $132, $276 and $456 a year on those three plans. Webhooks are listed on Basic (Typeform pricing, October 2026).
| 10,000 rows in a month | LeadOcean | Typeform |
|---|---|---|
| Plan | Solo, $97 a month | Business, $91 a month |
| Per-row price | None | Included up to 10,000 |
| Total | $97 | $91 |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Webhook disabled | Your URL returned 404 or 410 | Typeform stops at once. Fix the route, then re-enable it (Typeform docs, September 2026). |
| Duplicate leads | Typeform retried after a slow reply | Reply first. Key on event_id. |
| Signature mismatch | Body parsed before hashing | Hash the raw bytes, not re-serialized JSON. |
| 401 from LeadOcean | Wrong header | Use x-api-key. |
Everything lands in hold | Respondents used personal email | Enrich anyway, then route on linkedin_url if the form asked for it. |
| 402 | The 1,000 free records are spent | Move to Solo or Agency. |
FAQ
Do I need Zapier or Make?
No. Any HTTPS endpoint works. A no-code tool is fine if it can read the answers array and call an HTTP URL. See the sign-up enrichment workflow for the pattern.
Why not ask the respondent for their title?
People type titles inconsistently, and each extra field is one more to skip. Ask for the email and let the data fill the rest.
Can I enrich a past batch?
Yes. Export responses from Typeform and loop the same call. The enrich leads prompt does it from Claude.
Where do hot leads go in a CRM?
Create or update the record with the mapped fields. See the Salesforce recipe.
Back to all integrations. See pricing.
Route your next Typeform lead before the rep opens it. Start free.
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →