Bearer keys, prefixed ULIDs, cursor pagination, idempotency on every mutation, signed webhooks. Learn it once for SK Calendar; it holds across all of Softknack.
Availability is a read; a booking is a conditional write. The database is the referee, so two requests for one slot resolve to exactly one winner — no application-level locking to get wrong.
Get a test key, make one authenticated call, and listen for the webhook. The same three moves work for every endpoint in the suite.
Test and live keys are separate environments. Build against sk_test_ without touching a real customer.
One authenticated POST with an idempotency key. Same key + same body always returns the same result.
A signed appointment.created event hits your endpoint — verify the HMAC, act on it, return 200.
curl -X POST https://api.softknack.com/calendar/v1/appointments \ -H "Authorization: Bearer sk_live_..." \ -H "Idempotency-Key: 9f2c-4d1a-...-e7b3" \ -H "Content-Type: application/json" \ -d '{ "slot_id": "slt_01J9X...", "contact_id": "ctc_01J9X...", "service": "ac_service" }'
Signed with HMAC-SHA256, delivered at-least-once, retried on a fixed schedule, and replayable from a dead-letter queue. You will never miss an event because a deploy was mid-flight.
| Event | When it fires |
|---|---|
appointment.booked | Committed atomically — agent, page, API or staff. |
appointment.rescheduled | Old slot released, new slot won, parties notified. |
appointment.cancelled | With reason; slot returns to inventory instantly. |
slot.released | Capacity opened — your waitlist's moment. |
appointment.reminder_sent | A reminder went out via SK Notifications. |
appointment.no_show | Flagged for follow-up. |
The platform conventions every SK product obeys — learn them once, rely on them everywhere.
Every mutation takes an Idempotency-Key. Same key + body returns the original result; a conflicting body gets 409.
Sortable, debuggable IDs like apt_01J9X... — you can read the type and the time right off the wire.
Stable cursors that never skip or repeat a row when data changes mid-list. No page-offset drift.
Isolation enforced in the database. 404-over-403, so the existence of another tenant's record never leaks.
HMAC-SHA256 on every delivery, with the full retry schedule and dead-letter replay above.
The OpenAPI spec is generated from the code's validators and checked in CI — the docs can't lie.
Embed booking in your own app: read availability, commit a slot with a conditional write, and let reminders ride SK Notifications. The booking page uses this exact contract — and SUKI books mid-call through it, race-free, while the caller is still on the line.
Spin up a hosted, branded booking page in seconds — it writes through the identical atomic slot engine, so self-serve bookings can never collide with phone or staff bookings.
Auth, errors, pagination, every endpoint and schema — written once for the platform, shared by every product.
docs.softknack.com/calendar See pricing →