Create a webhook.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Creates a webhook that sends a JSON POST to url each time event_type happens. The webhook is turned on unless you pass enabled: false.
The request body should look like the following:
{
event_type: "booking_request_made",
url: "https://example.com/apptoto/bookings",
enabled: true
}event_type must be one of:
| event_type | Fires when |
|---|---|
event_created | An event is created |
event_updated | An event is updated |
event_deleted | An event is deleted |
participant_reminder_state_changed | A participant's reminder state changes |
participant_confirmed | A participant confirms |
participant_not_coming | A participant says they are not coming |
participant_needs_reschedule | A participant asks to reschedule |
participant_booking_state_changed | A participant's booking state changes |
participant_invite_sent | A booking message is sent to a participant |
participant_accepted | A participant accepts a booking |
participant_declined | A participant declines a booking |
participant_replied_to_message | A participant replies to a message |
participant_check_in_state_changed | A participant's check-in state changes |
booking_request_made | A booking request is completed |
booking_request_rescheduled | A booking request is rescheduled |
booking_page_viewed | A booking page is viewed |
message_sent | A message is sent |
message_received | A message is received |
message_failed | A message fails to send or deliver |
phone_added_to_stoplist | A phone number is added to the stoplist |
email_added_to_stoplist | An email address is added to the stoplist |
payment_processed | A payment is processed |
payment_refunded | A payment is refunded |
url must be a full http:// or https:// address, up to 2048 characters. An account can have at most 100 webhooks.
The created webhook is returned in the same shape as /v1/webhooks:
{
webhook: {
id: 4513,
event_type: "booking_request_made",
url: "https://example.com/apptoto/bookings",
enabled: true,
created_at: "2026-10-12T15:10:42.000-07:00",
updated_at: "2026-10-12T15:10:42.000-07:00"
}
}A missing or invalid event_type or url returns 400 with a message saying what was wrong:
{
error: "url must be a full http:// or https:// address",
status: 400
}See Webhook Payloads for what Apptoto sends to the URL.
OAuth scope
Calls authenticated with an OAuth 2.0 bearer token must include the webhooks:write scope. A token without it receives a 403 insufficient_scope response. HTTP Basic auth is not scope-gated.
