Skip to content

service.created

POST

A service is added. Sent to the account’s webhooks, and to an OAuth app that subscribes to it while its installation grants services:read.

X-Talki-Signature
required
string

t=<unix seconds>,v1=<hex HMAC-SHA256>, the HMAC computed over <t>.<raw body> with the signing secret. During a secret rotation it carries one v1 per secret: accept the request if any matches.

X-Talki-Event
required
string

The event type, as in type.

X-Talki-Delivery
required
string

The event ID, as in id.

Media typeapplication/json
object
id
required
Id

The event’s ID, evt_ and 32 hex characters. Equal to the X-Talki-Delivery header and unchanged on a redelivery: deduplicate on it.

string
type
required
string
Allowed values: service.created
created_at
required
Created At

When the event was written, ISO 8601 with a +00:00 offset, possibly with microseconds. Parse it as an instant.

string format: date-time
api_version
required
Api Version

The dated contract version data is shaped for: the endpoint’s version on a webhook, the app’s on an app event.

string
account_id
required
Account Id

The Talki account the event happened on.

string
livemode
required
Livemode

false for an event from a sandbox account.

boolean
origin
required
Any of:
EventOrigin
object
source
required
Source

Where the change came from: voice (the assistant, during a call), dashboard (a person in the Talki web or mobile app), api (a credential through the API) or system (a rule Talki applied on its own). New values may be added; treat one you do not recognise as unknown.

string
credential_id
required
Any of:
string
idempotency_key
required
Any of:
string
installation_id
Any of:
string
data
required

The event’s payload.

object
object
required

The Service object, as the REST API returns it.

object
id
required
Id

Opaque Talki service identifier.

string
location_id
required
Location Id

The location that offers it (GET /v1/locations). Each location has services of its own, so two locations selling the same thing have one service each, with its own id, price and availability. Never null, and it never changes.

string
name
required
Name

What the business calls this service.

string
description
required
Any of:
string
price
required
Any of:
string
duration_minutes
required
Any of:
integer
booking_mode
required
Booking Mode

duration for a timed slot (the common case), or day_range for a stay spanning whole nights or days: a hotel room, a multi-day rental. Read this before duration_minutes; the two modes are booked with different information.

string
Allowed values: duration day_range
range_unit
required
Any of:

nights (check-out day is free again) or days (the whole last day is held).

string
Allowed values: nights days
min_stay
required
Any of:
integer
max_stay
required
Any of:
integer
checkin_time
required
Any of:
string
checkout_time
required
Any of:
string
asks_quantity
required
Asks Quantity

True when a booking of this service carries a count — covers, people, items — and the assistant asks for it. False when one booking always means one unit.

boolean
quantity_label
required
Any of:
string
min_quantity
required
Min Quantity

Smallest count a booking may carry.

integer
max_quantity
required
Any of:
integer
is_active
required
Is Active

False when the business has switched the service off. It is still published — see the note on this object — but it is not bookable and should not be offered.

boolean
created_at
required
Created At

When the service was added, RFC 3339 UTC.

string format: date-time
updated_at
required
Updated At

Last change to the service, RFC 3339 UTC. Show it to a human; do not sync on it, for the reason given on Appointment.updated_at.

string format: date-time
Example
{
"id": "evt_04d8e87897db4ecab459a456ea55e754",
"type": "service.created",
"created_at": "2026-09-22T15:04:06.218734+00:00",
"api_version": "2026-10-01",
"account_id": "f7e39b9a-1ac8-45e4-93da-2600f17cb286",
"livemode": true,
"origin": {
"source": "dashboard",
"credential_id": null,
"idempotency_key": null
},
"data": {
"object": {
"id": "45c470b7-592a-42cd-8ce8-5d7a0a497d26",
"location_id": "0b7d4e19-8a2c-4f61-9d3e-5c1a7b2f8e40",
"name": "Haircut",
"description": "Wash and cut",
"price": "30€",
"duration_minutes": 30,
"booking_mode": "duration",
"range_unit": null,
"min_stay": null,
"max_stay": null,
"checkin_time": null,
"checkout_time": null,
"asks_quantity": false,
"quantity_label": null,
"min_quantity": 1,
"max_quantity": null,
"is_active": true,
"created_at": "2026-08-01T08:00:00Z",
"updated_at": "2026-09-10T10:30:00Z"
}
}
}

Any 2xx acknowledges the event. Any other status, a redirect, or no answer within 10 seconds is a failure and is retried; 410 disables a webhook endpoint at once.