Skip to main content
Alice runs a hub, and her leads arrive in Typeform. She wants every new response to land in Mio as a contact and start her “New lead onboarding” automation. An inbound webhook is the URL that makes this work: Zapier or Make posts the response to it with a secret in an Authorization header, Mio finds or creates the contact by email, and every live automation bound to that URL starts for them.

Set it up

  1. Create the webhook. In the API, POST /api/v1/teams/{team_id}/hubs/{hub_id}/inbound-webhooks with a name. The response carries attributes.url, and once, attributes.secret and attributes.header. The secret is shown only this one time, so copy it now. The URL holds no secret and can be shown again. Your assistant can do the same with the create_inbound_webhook tool.
  2. Bind an automation to it. Create an automation whose trigger has event_type automation.inbound_webhook.received and inbound_webhook_id set to the webhook’s id. The webhook must belong to the same hub.
  3. Publish and activate the automation before you test. A request that arrives while no live automation is bound is still answered 202, because 202 only means received. Nobody is enrolled, and that request is not replayed later.
  4. Point Zapier or Make at the URL. Use a Webhooks action with method POST, payload type JSON, the URL from step 1, and one header: Authorization with the value Bearer whk_<secret> (the response’s attributes.header gives the exact line). In Zapier that is Webhooks by Zapier → POST → Payload Type: json, with Authorization under Headers; in Make it is the HTTP → Make a request module with body type Raw, content type JSON, and Authorization added under Headers.
  5. Map the fields (below), send a test, and check the automation’s enrollments.

What to send

One flat JSON object, up to 64 KiB. email is required; every other key is optional.
Mapping happens in Zapier or Make: name the keys after your custom field slugs. A text field takes a string, a number field a number, a yes/no field true or false, a date field YYYY-MM-DD, and a single or multiple choice field the option id (an array of ids for multiple). Because the values are on the contact, a later branch step, an entry filter or a segment can use them.

Avoid enrolling someone twice

Zapier and Make retry on errors. Send an Idempotency-Key header with the id of the source record, for example the Typeform response id. Mio uses it per webhook: a repeat of the same key answers 202 with the original id and writes nothing, even if the body changed.

What the answers mean

If the secret leaks

The secret is the credential: anyone who holds it, together with the webhook’s URL, can create contacts in that hub and start its automations. The URL alone does nothing. If the secret appears somewhere it should not:
  • Rotate it. POST .../inbound-webhooks/{id}/rotate (or rotate_inbound_webhook) returns a new secret once, and the old one stops working at once. The URL stays the same. Update the Authorization header in Zapier or Make.
  • Or switch it off. PATCH the webhook with enabled: false. A switched-off webhook answers 404.
  • token_prefix is the first 12 characters of the secret. It is safe to show and lets you tell your webhooks apart.

Admin API

A hub can have 20 live webhooks. The resource type is inbound_webhooks.
A sequence (drip campaign) cannot start on this event. Use an automation with an inbound webhook trigger and an enroll_in_sequence step.