API and webhooks
OpenAPI
Browse the machine-readable contract at /api/v1/openapi. Use it to generate clients or inspect paths for catalog, availability, estimate, bookings, deposit-intents, portfolio, clients, and webhook registration.
Authentication
Open Settings → Website & embed → Developers for API keys. Use sk_ keys only on servers. Use pk_ keys in browsers with origin allowlists. Connect / Go live issues embed materials so shop owners are not stuffing secrets into CMS fields.
Webhooks
Add endpoints under Settings → Website & embed → Webhooks (or POST /api/v1/webhooks). Verify X-Inkdesk-Signature (HMAC) before trusting payloads—SDK helpers include verifyWebhook where available.
Zapier and Make integrate through these webhooks (see integrations/zapier and integrations/make scaffolds). Use them for Slack, sheets, and side effects when bookings or deposits change.
When to use API vs widget
Widget/hosted: default for shops. API: agencies building custom UI while Inkdesk remains CRM, deposits, and floor ops. Subscription remains $50/shop/month; Stripe fees still apply on charges.
- 1Plugin / blockWordPress · Download plugin → Generate connect code
- 2App or snippetShopify/Wix Add to… · or Create snippet for Code/Embed
- 3Hosted book pageNo website · Create hosted link + QR → /{salon}/book
Endpoint reference
Generated from the OpenAPI 3 contract (Inkdesk Public API v1.0.0). Base path: /api/v1. Machine-readable copy: /api/v1/openapi.
Salon-scoped booking API and Telegram bot messaging API. Authenticate with Bearer pk_… / sk_…. Per-bot keys are secret keys scoped to read:messaging + write:messaging only. Owners bind sites via connect codes (never paste raw keys).
Availability
- GET
/api/v1/availabilityBookable slots
artist(query, required) · stringfrom(query, required) · stringto(query, required) · string
Bookings
- POST
/api/v1/bookingsCreate booking or request
- GET
/api/v1/bookings/{id}Get booking
id(path, required) · string
- PATCH
/api/v1/bookings/{id}Cancel or reschedule
id(path, required) · string
- POST
/api/v1/references/presignPresign reference image upload
Catalog
- GET
/api/v1/catalogList artists and styles
Clients
- POST
/api/v1/clientsUpsert client by phone (secret key)
Connections
- POST
/api/v1/connect/exchangeExchange a one-time connect code for a publishable key
Used by the WordPress plugin / snippet binder. No prior auth required.
- POST
/api/v1/connections/{id}/seenVerification beacon from widget/embed
id(path, required) · string
Deposits
- POST
/api/v1/deposit-intentsStart deposit PaymentIntent
Estimate
- POST
/api/v1/estimatePrice calculator estimate
- GET
/api/v1/pricing/calculator-configCalculator config (types, sizes, artists, resolved hours)
artistId(query) · string
Messaging
- GET
/api/v1/messaging/booking-linkPublic /{salon}/book URL for Mini App / deep-link
- POST
/api/v1/messaging/inboundPush an inbound Telegram DM (bot secret key)
Idempotent by externalEventId. Tenant is bound from the per-bot key; externalAccountId is a cross-check only. Poll+ack outbound — Inkdesk does not push to the bot.
- GET
/api/v1/messaging/outboundPoll queued staff replies for this bot
limit(query) · integer
- POST
/api/v1/messaging/outbound/{id}/ackAcknowledge that the bot sent a queued reply
id(path, required) · string
- POST
/api/v1/messaging/outbound/{id}/deliveryMark outbound delivery status
id(path, required) · string
- GET
/api/v1/messaging/salonMinimal salon context (name, hours)
Portfolio
- GET
/api/v1/portfolioPortfolio gallery
Waitlist
- GET
/api/v1/waitlistList waitlist entries (secret key)
- POST
/api/v1/waitlistJoin waitlist, or ?action=fill to book from waitlist (secret)
Webhooks
- DELETE
/api/v1/webhooksDeactivate webhook by id query param
id(query, required) · string
- GET
/api/v1/webhooksList webhook subscriptions (secret key)
- POST
/api/v1/webhooksCreate webhook subscription (Zapier/Make REST Hooks)