List start times
Bookable start times for a given day and service selection.
Also callable with a publishable key (shyni_pk_...).
Mirrors the customer booking widget's start-time step exactly (same allocator),
scoped to the calling key's own studio.
The selection is checked like POST /orders checks it: it must contain at least one primary or secondary
service (add-ons alone answer 400 INVALID_INPUT, field: serviceIds), and no start later than one year
ahead is offered (a date beyond that horizon returns an empty list).
ApiKeyAuth catalog:readAuthorizationBearer <shyni_sk_live_*>An API key, issued once and never retrievable again: an organization key in the developer
portal, or a studio key in the studio's admin (Moje studio → API). Send as Authorization: Bearer shyni_sk_live_....
Scope: catalog:read
date*stringDay to compute starts for (YYYY-MM-DD).
dateserviceIds*stringComma-separated service ids (at least one, at most 10; more answers 400 INVALID_INPUT).
variant?stringVariant code the order will be booked with (a code from the service variants). Its extraMinutes
lengthen the work, so pass the same value you later send in POST /orders. Omitted, no variant minutes
are added.
optionAnswers?stringConfigurator answers, the POST /orders optionAnswers[] pairs as comma-separated
questionId:optionId (the parameter may also repeat). The picked options' minutes lengthen the work, so
pass the same answers you later send in POST /orders; without them a configurator service's window is
too short and the order is refused. The same rules as the order apply: an unknown question or option, a
question answered twice, an unanswered required question, or answers with no configurator service in the
selection answer 400 INVALID_INPUT (field: optionAnswers); a malformed pair is 400 too.
inspection?booleantrue returns the windows of the studio's free inspection (konzultace) instead of the selection's own
duration: every window is as long as the studio's inspection length, whatever variant and optionAnswers
say, and the selection is not priced or checked for it (serviceIds is still required). Book one with
POST /orders and inspection: true. Anything but true or false is 400 INVALID_INPUT, field: inspection.
falseBookable start/end windows on the requested day, in allocator order, wrapped in
the list envelope ({"data": [...]}; not paged, so no meta).
application/json- response
data*array<>curl -X GET 'https://api.shyni.io/api/v1/availability/starts?date=2019-08-24&serviceIds=3b7e9c52-81d4-4f6a-a0c3-2d9e5b8f1a47%2C7d2f4a10-5c96-4e83-b1a7-9f0e3c6d8b25&variant=MEDIUM&optionAnswers=9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f%3A5a6b7c8d-9e0f-1a2b-3c4d-5e6f7a8b9c0d' \ -H 'Authorization: Bearer shyni_sk_test_YOUR_KEY'Response 200
Bookable start/end windows on the requested day, in allocator order, wrapped in
the list envelope ({"data": [...]}; not paged, so no meta).
{ "data": [ { "start": "2019-08-24T14:15:22Z", "end": "2019-08-24T14:15:22Z" } ]}Response 400
A parameter, header or request body is missing, malformed, or out of range. A request body property the endpoint does not define answers UNKNOWN_FIELD instead, with field naming it.
{ "code": "INVALID_INPUT", "message": "Parameter perPage must be between 1 and 100."}Response 401
Missing, malformed, unknown, or revoked API key (INVALID_API_KEY).
{ "code": "INVALID_API_KEY", "message": "Missing or invalid API key."}Response 403
The key is valid but the request is refused. Branch on code: INSUFFICIENT_SCOPE (the key lacks the
permission this endpoint requires), PLAN_REQUIRED (the studio is not on a plan that includes API keys,
Pro and above), ORIGIN_NOT_ALLOWED, SECRET_KEY_IN_BROWSER, or DEMO_STUDIO on a write to the demo studio.
See Authentication and Scopes above.
{ "code": "INSUFFICIENT_SCOPE", "message": "This API key does not have the permission this endpoint requires."}Response 409
The studio is not published, so its booking data is not available (STUDIO_NOT_PUBLISHED).
{ "code": "STUDIO_NOT_PUBLISHED", "message": "The studio is not published; booking data is not available."}Response 429
Burst rate limit exceeded.
{ "code": "RATE_LIMITED", "message": "Too many requests. Retry after the time given in the Retry-After header."}