Skip to main content
A Loop gives you a URL to send records to, and a webhook to receive results at — no polling required. Create one from your dashboard under Loops, or via the API.

Creating a Loop

Your webhook URL must be https and publicly reachable. On success, you’ll get back the Loop along with a signing secret — shown once, at creation:
Store the secret securely — you’ll need it to verify incoming webhooks, and we can’t show it to you again. If you lose it, delete the Loop and create a new one.

Sending records to a Loop

This behaves exactly like POST /v1/companies/enrich — you get the same task response immediately, and can still poll it if you like — but once the enrichment finishes, we also POST the result to your Loop’s webhook.

The webhook we send you

event is one of task.succeeded, task.failed, or test (sent when you use the Send test event button in the dashboard). X-EnrichLoop-Delivery-Id is stable across retries of the same delivery — use it to deduplicate on your end. Respond with any 2xx status to acknowledge receipt. Anything else is treated as a failure and retried.

Verifying webhook signatures

Every webhook is signed with your Loop’s secret, using the same scheme as Stripe:
The signature is computed over {timestamp}.{raw request body}. Verify it like this:
Verify against the raw request body, before any JSON parsing — re-serializing and comparing will not match.

Retries

If your endpoint doesn’t respond with a 2xx, we retry automatically: After the final attempt, delivery is marked failed. You can see delivery history and retry manually from your dashboard.

Managing Loops

See the API Reference for the full GET/PATCH/DELETE schemas on /v1/loops/{id}. Disabling a Loop stops new runs from being accepted through it; existing tasks already in flight still complete.