Skip to main content
By the end of this page, your bot will answer a real message with formatted text and a button.

Before you start

You need:
  • A chatbot in your dashboard with its brain set to Webhook.
  • An HTTPS endpoint we can reach. We never call http://, and we never follow redirects.
  • Your bot’s signing secret (whsec_…), from the bot’s webhook settings.
Local tunnels are fine for development — anything with a public HTTPS URL works. Private and local network addresses are blocked for security.

Get started

1

Answer the verification challenge

A webhook bot cannot go active until its URL passes a check. When you press Verify, we send a webhook.verify event with a one-time challenge string. Send it back, and your bot goes live.Two forms work. Return the raw challenge as the body, or return any JSON object with a matching top-level challenge key:
The key name is case-sensitive. Content-Type does not matter. You have 10 seconds. A check is never retried — just press Verify again.
Using Zapier? Catch Hooks cannot return a custom body, so we skip the echo for zapier.com addresses. See the Zapier guide.
2

Reply to a message

Once verified, every visitor message arrives as a message.created event. Return Block Kit JSON from the same request, and it shows up right away:
That shortcut turns into a full text block on our side. Read the visitor’s words from message.text:
Do not return your framework’s default body. We know the common ones — Accepted, OK, Workflow was started — and we block them instead of posting them. But anything else that is not JSON becomes a real chat bubble. Return JSON, or return an empty body.
3

Add a button

Buttons make the reply interactive. When someone clicks one, you get an interaction.button_clicked event:
A plain label is enough. We build the action_id from it (Track package becomes track_package).
4

Check the signature

Before you go live, check that each request really came from us. Every POST includes X-MyAIChatbot-Signature:
You must sign the raw body bytes, not a re-built object. Full guide in five languages: Verifying signatures.

Next steps

Work that takes longer

You get 10 seconds to reply. Slower work must use the response_url.

Every block type

Images, files, forms, cards, and progress bars.