Contact form submitted
Incoming webhook deliveries are authenticated with HMAC signature headers (X-Chatway-Signature and X-Chatway-Timestamp), not your Chatway API key.
A visitor submitted a contact or offline form.
Use contact.form.submitted when follow-up depends on a visitor submitting a contact or offline form. For example, create a follow-up task using the supplied answers. The example separates visitor identity in data.visitor from form answers in data.fields. Use Contact updated for profile-change workflows and Message received for incoming chat messages. These event types let you choose the notification that matches your workflow.
For signature verification and retries, see Webhooks overview.
POST webhook: contact.form.submittedParameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
X-Chatway-Event | header | Yes | string | Event name for this delivery. Example: contact.form.submitted |
X-Chatway-Webhook-Id | header | Yes | string (uuid) | Unique webhook subscription ID. Example: 9f3c2a1b-4d5e-4f70-8a9b-0c1d2e3f4a5b |
X-Chatway-Delivery-Id | header | Yes | string | Unique ID for this HTTP delivery attempt (`del_` + 32 hex characters). A new value is sent on each retry. Example: del_1b0279b1f28f12c0b9f2a2fdbf3758ee |
X-Chatway-Delivery-Attempt | header | Yes | string | Attempt number for this event (`1` on first try). Sent as a decimal string in the header. Example: 1 |
X-Chatway-Timestamp | header | Yes | string | Unix timestamp in seconds when the request was signed. Sent as a decimal string in the header. Example: 1770201001 |
X-Chatway-Signature | header | Yes | string | `sha256=` followed by the lowercase hex HMAC SHA256 of `{X-Chatway-Timestamp}.{raw request body}`, keyed with your webhook secret. The example is computed for the example body serialized as compact JSON, the example timestamp, and the placeholder secret `whsec_exampleSecretForDocsOnly00000000`. Example: sha256=af2a101fe417b3872b3efd1fee7697d0fdc93b417e14213bc42ad6c017804b2e |
Request body
Signed JSON envelope for this event.
application/json
id (string, required)— Stable event ID (`evt_…`). Same across HTTP retries for this notification.event (string, required)— Event name. For this webhook, always `contact.form.submitted`.data (object, required)— Payload for contact.form.submitted.conversation (object)— The contact's latest conversation. Omitted when the contact has no conversation yet.id (string (uuid), required)— Conversation ID.channel (string, required)— Normalized channel.status (string, required)— Conversation status.widget_name (string)— Present when the conversation is tied to a website widget.identifier (string)— Widget identifier when widget_name is present.
visitor (object, required)id (string (uuid), required)— Visitor/contact ID.name (string)— Visitor name. Omitted when empty.email (string|null, required)— Visitor email. Always present; null when unknown.phone (string|null, required)— Visitor phone. Always present; null when unknown.
fields (object, required)— Submitted form answers. Only fields with a value are included. Custom data fields appear as extra keys named after the field (for example `company`), each with a string value.name (string)— Visitor name entered in the form.email (string)— Email address entered in the form.phone (string)— Phone number entered in the form.message (string)— Message entered in the form.text (string)— Value of the form's short text field.textarea (string)— Value of the form's long text field.dropdown (string)— Option selected in the form's dropdown field.number (string)— Value of the form's number field, as a string.date (string)— Value of the form's date field, as a string.link (string)— Value of the form's link field.file (string)— Value of the form's file field (the uploaded file reference).
occurred_at (string (date-time), required)— When the business event occurred.version (string, required)— Payload schema version.
Responses
200
Return any 2xx status to acknowledge receipt.
410
Optional HTTP 410 Gone to signal the endpoint is permanently unavailable. Like every non-2xx response below 500 (including 408 and 429), it is not retried. It does not disable the subscription; turn the webhook off in Chatway Settings if you want deliveries to stop.
Examples
Request body example
{
"id": "evt_1234567890abcdef1234567890abcdef",
"event": "contact.form.submitted",
"data": {
"conversation": {
"id": "0f46c0a1-8938-40e3-b2b5-bb56f569fcab",
"channel": "website",
"status": "open",
"widget_name": "Main site widget",
"identifier": "eouqtiupanm6uvglwshy"
},
"visitor": {
"id": "9b0c5fe6-35ad-459d-b6ba-4288191f84f1",
"name": "John Doe",
"email": "[email protected]",
"phone": "+1XXXXXXXXXX"
},
"fields": {
"message": "Please contact me",
"company": "Acme Inc"
}
},
"occurred_at": "2026-02-04T10:30:00Z",
"version": "2026-09"
}