First request in a minute
curlcurl api.chronoskin.example/v4/slots \ -H "Authorization: Bearer ck_test_..." \ -d calendar="studio" \ -d day="2025-03-14"Follow the quickstart
chronoskin turns calendars, time zones and opening hours into one bookable schedule. Start with a guide, or go straight to the endpoint you need.
curl api.chronoskin.example/v4/slots \ -H "Authorization: Bearer ck_test_..." \ -d calendar="studio" \ -d day="2025-03-14"Follow the quickstart
42 endpoints, each with a request you can copy.
Open the referenceTyped clients for four languages.
The last 30 days, measured at the edge?Timed from six regions every minute, not from inside our own network.
The forum is answered by the same six people who maintain the API, usually within a working day.
Choose what reaches your inbox.
Free, rate limited, and it cannot touch a real calendar.
Twenty-eight worked examples, each one task from the first request to the last check.
Reserve a time for ten minutes while your customer pays, and confirm or release it afterwards.
Describe a week once and let the API answer in the zone of whoever is asking.
Check the signature, answer within five seconds and handle a delivery that arrives twice.
Cursors, page sizes and why the last page can be empty.
Quickstart, holding a slot, payments in between, then webhooks.
Quickstart, opening hours, time zones, then caching the answers.
A hold reserves a time for a short while without booking it. Use one whenever something has to happen between choosing a time and committing to it, such as a payment.
Send the calendar and the instant you want to POST /v4/holds. The answer carries an id and the moment the hold runs out, ten minutes later unless you ask for less.
const hold = await chronoskin.holds.create({ calendar: "studio", start: "2025-03-14T09:30:00Z", minutes: 45, });
409 with the next free slot.422.When the payment succeeds, confirm the hold and it becomes a booking. If it fails, release it at once so the time is free again; do not wait for it to run out. The holds reference lists every field.
It is not sent to the customer's calendar and no webhook fires until you confirm it.
A hold can be extended once. A second attempt answers 409 and the slot is released.
Between one and thirty minutes. Ten is the default, and one extension of the same length is allowed.
Creating one is a request like any other. Holding it costs nothing.
Only when the calendar allows more than one booking at a time, such as a class with twelve places.
Reserve a time for a few minutes before it becomes a booking. Six endpoints, all under /v4/holds.
| Endpoint | What it does | State | A minute |
|---|---|---|---|
| POST/holds | Create a hold | Stable | 600 |
| GET/holds/:id | Read one hold | Stable | 1,200 |
| POST/holds/:id/confirm | Turn it into a booking | Stable | 600 |
| POST/holds/:id/extend | Add time, once | Beta | 120 |
| DELETE/holds/:id | Release it | Stable | 600 |
| PUT/holds/:id | Replace a hold | Leaves in 5.0 | 60 |
The calendar's short name or id. The key must have the bookings scope for it.
An instant in UTC. A local time without a zone is refused.
Length of the slot. Defaults to the calendar's own slot length.
How long the hold lasts, in minutes, from 1 to 30.
{
"id": "hold_8fq2",
"calendar": "studio",
"minutes": 45,
"expires_at": "09:40:00Z"
}
A key is shown once, when it is made. Keep it out of the browser and out of your repository.
Requests signed with the key named Old checkout will fail at once. This cannot be undone.
| Name | Kind | Last used | Requests today |
|---|---|---|---|
| Booking page | Live | Today, 14:00 | 8,412 |
| Back office | Live | Today, 13:00 | 1,096 |
| Old checkout | Live, unused | 41 days ago | 0 |
| Laptop | Test | Yesterday, 18:00 | 37 |