Website widget, forms and webhooks
Embed a receptionist on any website with one script tag or an iframe, customise it, understand its limits, and send bookings and leads to your own systems.
3 min readUpdated Oct 17, 2026Applies to Reception AI 1.0.0
On this page
Every published receptionist has a public chat page at https://<APP_URL>/w/<receptionist-id>. The widget puts that page on any website.
Embed with a script tag
Copy the snippet from Tools → Website widget (it fills in your domain and receptionist ID) and paste it before </body> on your site:
<script src="https://YOUR-DOMAIN/widget.js" data-agent="AGENT_ID" defer></script>It adds a floating button that opens the chat in a panel. The panel loads only when a visitor clicks, so it does not slow the page down.
| Attribute | Default | Effect |
|---|---|---|
data-agent |
Required | The receptionist to show |
data-position |
right |
left puts the button in the bottom-left corner |
data-label |
Chat with us |
The button's label |
data-open |
Not set | true opens the panel when the page loads |
Embed with an iframe
To place the chat inline in a page instead of a floating button:
<iframe
src="https://YOUR-DOMAIN/w/AGENT_ID"
title="Reception AI"
style="width:100%;height:640px;border:0;border-radius:16px"
allow="microphone"
></iframe>allow="microphone" lets visitors use voice input.
Appearance
Under the receptionist's Share section you can set a headline, a logo URL, an accent colour, and hide the "Powered by Reception AI" line.
The receptionist must be published for visitors to chat. While it is a draft, visitors see that it isn't public; you can still preview it while signed in.
How the widget talks
- Typed chat uses the receptionist's chat model through xAI, with its instructions, knowledge, tools and, if it uses one, its workflow.
XAI_API_KEYis required. - Voice is push to talk: the visitor taps the orb, speaks, and taps again. The clip is transcribed, answered, and the reply is read aloud when sound is on. It is not a live, interruptible conversation like a phone call.
- A conversation is capped at 10 visitor messages of up to 500 characters each.
Limits and switches
| Limit | Default | Setting |
|---|---|---|
| Messages per visitor IP | 12 per minute (owner exempt) | LIMIT_WIDGET_IP |
| Messages per receptionist | 90 per minute | LIMIT_WIDGET_AGENT |
| Messages per workspace | 2,000 per day | LIMIT_WIDGET_WORKSPACE_DAY |
- Each message also counts toward the workspace plan's monthly allowance (0.025 minute by default). A workspace that is out of allowance sees "This assistant is unavailable right now."
FEATURE_WIDGEToff stops widget chat for every workspace. It also turns off the homepage voice demo.
Note
There is no setting in the 1.0.0 interface to restrict which websites may embed a receptionist; anyone with the snippet can place it on a page. The per-IP, per-receptionist and per-workspace limits above are the protection against abuse.
Forms
Tools → Forms builds simple public forms, served at https://<APP_URL>/f/<form-id>. Submissions appear in the workspace and fire the form.submitted webhook event.
Limits: 6 submissions per minute per IP (LIMIT_FORM_IP) and 120 per minute per form (LIMIT_FORM_FORM).
Webhooks
Tools → Webhooks sends events to your own URL as JSON over HTTPS POST.
| Event | Sent when |
|---|---|
appointment.booked |
A receptionist books a slot |
lead.created |
A receptionist captures a lead |
form.submitted |
A public form is submitted |
Each delivery includes these headers:
| Header | Contents |
|---|---|
X-ReceptionAI-Event |
The event name |
X-ReceptionAI-Delivery |
A unique delivery ID, useful for ignoring duplicates |
X-ReceptionAI-Signature |
t=<unix time>,v1=<HMAC-SHA256 of "<t>.<body>"> |
Warning
In 1.0.0 webhooks are created without a signing secret, so the signature header cannot prove a delivery came from your install. Use an HTTPS endpoint with a long, unguessable path (or a token in the query string), and treat the payload as a notification to verify rather than as trusted input. The call.completed event appears in the list but is not sent yet.
Webhook URLs must be public addresses; private and local addresses are refused.
Homepage live voice demo
The marketing homepage includes a Start talking demo that uses OpenAI Realtime over WebRTC with a fixed demo persona, so prospects can hear the product. It needs OPENAI_API_KEY and FEATURE_WIDGET, and is limited to 2 sessions per minute and 6 per day per visitor, and 30 per day in total. Without an OpenAI key it falls back to typed chat, which needs XAI_API_KEY.
Not in this version yet
- WhatsApp and Gmail under Tools → Messaging support a test send only; receptionists do not reply on those channels yet.
- Webhook signing secrets and the
call.completedevent. - A domain allow-list in the interface.