{"items":[{"type":"link","label":"Speedy Sticks API","link":"/openapi","routeSlug":"/openapi"},{"type":"group","label":"Auth","link":"/openapi/auth","routeSlug":"/openapi/auth","items":[{"label":"Send a two factor authentication login code","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/auth/paths/~1request-code/post","routeSlug":"/openapi/auth/paths/~1request-code/post","metadata":{"seo":{"title":"Send a two factor authentication login code","description":"Sends a one-time code to the provided email address."}},"httpPath":"/request-code"},{"label":"Login with two factor authentication code","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/auth/paths/~1login/post","routeSlug":"/openapi/auth/paths/~1login/post","metadata":{"seo":{"title":"Login with two factor authentication code","description":"Authenticates a user using their email and the one-time code they were sent."}},"httpPath":"/login"},{"label":"Login with password","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/auth/paths/~1login-password/post","routeSlug":"/openapi/auth/paths/~1login-password/post","metadata":{"seo":{"title":"Login with password","description":"Authenticates a user using their email and password."}},"httpPath":"/login-password"},{"label":"Request a bearer token","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/auth/paths/~1api~1request-token/post","routeSlug":"/openapi/auth/paths/~1api~1request-token/post","metadata":{"seo":{"title":"Request a bearer token","description":"Exchange your API key for a short-lived bearer token. The token expires every 15 minutes and must be used in the Authorization header for all subsequent requests."}},"httpPath":"/api/request-token"}]},{"type":"group","label":"API Keys","link":"/openapi/api-keys","routeSlug":"/openapi/api-keys","items":[{"label":"Get API key","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/api-keys/paths/~1api~1key/get","routeSlug":"/openapi/api-keys/paths/~1api~1key/get","metadata":{"seo":{"title":"Get API key","description":"Returns the current API key and associated analytics for the authenticated client account."}},"httpPath":"/api/key"},{"label":"Issue a new API key","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/api-keys/paths/~1api~1key~1regenerate/post","routeSlug":"/openapi/api-keys/paths/~1api~1key~1regenerate/post","metadata":{"seo":{"title":"Issue a new API key","description":"Generates and returns a new API key for the authenticated client account, replacing the existing one."}},"httpPath":"/api/key/regenerate"}]},{"type":"group","label":"Patients","link":"/openapi/patients","routeSlug":"/openapi/patients","items":[{"label":"Create a patient","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/patients/paths/~1api~1patient/post","routeSlug":"/openapi/patients/paths/~1api~1patient/post","metadata":{"seo":{"title":"Create a patient","description":"Creates a new patient record associated with the authenticated client account. If an externalId is provided and already exists for this account, a 409 is returned with the existing patient ID."}},"httpPath":"/api/patient"},{"label":"Get patient by ID","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/patients/paths/~1api~1patient~1{id}/get","routeSlug":"/openapi/patients/paths/~1api~1patient~1{id}/get","metadata":{"seo":{"title":"Get patient by ID","description":"Retrieves a patient record by their internal ID. The patient must be assigned to the authenticated account."}},"httpPath":"/api/patient/{id}"},{"label":"Update a patient","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/patients/paths/~1api~1patient~1{id}/patch","routeSlug":"/openapi/patients/paths/~1api~1patient~1{id}/patch","metadata":{"seo":{"title":"Update a patient","description":"Updates an existing patient record. The externalId field cannot be changed after creation."}},"httpPath":"/api/patient/{id}"},{"label":"Get patient by external ID","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/patients/paths/~1api~1patient~1{patientid}~1external-id/get","routeSlug":"/openapi/patients/paths/~1api~1patient~1{patientid}~1external-id/get","metadata":{"seo":{"title":"Get patient by external ID","description":"Looks up a patient using their external ID from your system."}},"httpPath":"/api/patient/{patientId}/external-id"}]},{"type":"group","label":"Appointments","link":"/openapi/appointments","routeSlug":"/openapi/appointments","items":[{"label":"List appointments","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/paths/~1api~1appointment/get","routeSlug":"/openapi/appointments/paths/~1api~1appointment/get","metadata":{"seo":{"title":"List appointments","description":"Returns all appointments associated with the authenticated client account."}},"httpPath":"/api/appointment"},{"label":"Book an appointment","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/paths/~1api~1appointment/post","routeSlug":"/openapi/appointments/paths/~1api~1appointment/post","metadata":{"seo":{"title":"Book an appointment","description":"Books a new appointment for a patient. Billing type determines payment requirements — bill-to-patient appointments require a valid Stripe paymentMethod ID collected via the setup intent flow. Bill-to-account falls back to the account card on file. Monthly invoice requires no payment method."}},"httpPath":"/api/appointment"},{"label":"Get appointment by ID","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/paths/~1api~1appointment~1{id}/get","routeSlug":"/openapi/appointments/paths/~1api~1appointment~1{id}/get","metadata":{"seo":{"title":"Get appointment by ID","description":"Retrieves a single appointment by ID. The appointment must belong to the authenticated client account."}},"httpPath":"/api/appointment/{id}"},{"label":"Cancel an appointment","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/paths/~1api~1cancel-appointment/post","routeSlug":"/openapi/appointments/paths/~1api~1cancel-appointment/post","metadata":{"seo":{"title":"Cancel an appointment","description":"Cancels an existing appointment. The appointment must be in a Pending or Confirmed state and more than 3 hours away. A cancellation reason is required, and if the reason is \"Other\" a note must also be provided. A $50 cancellation fee applies."}},"httpPath":"/api/cancel-appointment"},{"label":"Get cancellation reasons","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/paths/~1api~1cancellation-reasons/get","routeSlug":"/openapi/appointments/paths/~1api~1cancellation-reasons/get","metadata":{"seo":{"title":"Get cancellation reasons","description":"Returns a list of all available cancellation reasons to be used when cancelling an appointment."}},"httpPath":"/api/cancellation-reasons"},{"label":"Get an appointment price estimate","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/getpricecheck","routeSlug":"/openapi/appointments/getpricecheck","metadata":{"seo":{"title":"Get an appointment price estimate","description":"Calculates an appointment price estimate based on the selected service, number of patients, location, requested date, and authenticated client account."}},"httpPath":"/api/price-check"},{"label":"List appointment services","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/appointments/getservices","routeSlug":"/openapi/appointments/getservices","metadata":{"seo":{"title":"List appointment services","description":"Returns all services available for appointment booking and price estimates."}},"httpPath":"/api/services"}]},{"type":"group","label":"Webhooks","link":"/openapi/webhooks","routeSlug":"/openapi/webhooks","items":[{"label":"Get webhook events","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/webhooks/paths/~1api~1webhooks~1events/get","routeSlug":"/openapi/webhooks/paths/~1api~1webhooks~1events/get","metadata":{"seo":{"title":"Get webhook events","description":"Returns a list of all supported webhook event types available for subscription."}},"httpPath":"/api/webhooks/events"},{"label":"Get active webhooks","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/webhooks/paths/~1api~1webhooks/get","routeSlug":"/openapi/webhooks/paths/~1api~1webhooks/get","metadata":{"seo":{"title":"Get active webhooks","description":"Returns a list of all active webhooks associated with your account."}},"httpPath":"/api/webhooks"},{"label":"Create a webhook","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/webhooks/paths/~1api~1webhooks/post","routeSlug":"/openapi/webhooks/paths/~1api~1webhooks/post","metadata":{"seo":{"title":"Create a webhook","description":"Register a new webhook endpoint to receive real-time event notifications."}},"httpPath":"/api/webhooks"},{"label":"Get webhook by ID","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/webhooks/paths/~1api~1webhooks~1{id}/get","routeSlug":"/openapi/webhooks/paths/~1api~1webhooks~1{id}/get","metadata":{"seo":{"title":"Get webhook by ID","description":"Retrieves a single webhook by ID."}},"httpPath":"/api/webhooks/{id}"},{"label":"Delete a webhook","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/webhooks/paths/~1api~1webhooks~1{id}/delete","routeSlug":"/openapi/webhooks/paths/~1api~1webhooks~1{id}/delete","metadata":{"seo":{"title":"Delete a webhook","description":"Permanently removes a webhook by ID."}},"httpPath":"/api/webhooks/{id}"},{"label":"Update a webhook","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/webhooks/paths/~1api~1webhooks~1{id}/patch","routeSlug":"/openapi/webhooks/paths/~1api~1webhooks~1{id}/patch","metadata":{"seo":{"title":"Update a webhook","description":"Update the URL or subscribed events for an existing webhook."}},"httpPath":"/api/webhooks/{id}"}]},{"type":"group","label":"Service Area","link":"/openapi/service-area","routeSlug":"/openapi/service-area","items":[{"label":"Check zip code serviceability","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/service-area/paths/~1api~1service-area~1check/get","routeSlug":"/openapi/service-area/paths/~1api~1service-area~1check/get","metadata":{"seo":{"title":"Check zip code serviceability","description":"Returns whether Speedy Sticks can service the provided zip code based on nearby phlebotomist availability."}},"httpPath":"/api/service-area/check"}]},{"type":"group","label":"Payments","link":"/openapi/payments","routeSlug":"/openapi/payments","items":[{"label":"Create a stripe setup intent","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi/payments/paths/~1api~1booking~1setup-intent/post","routeSlug":"/openapi/payments/paths/~1api~1booking~1setup-intent/post","metadata":{"seo":{"title":"Create a stripe setup intent","description":"Creates a Stripe SetupIntent for collecting a patient's card on file. Only required for bill-to-patient appointments. Returns a client secret and publishable key to initialize Stripe.js on the client side."}},"httpPath":"/api/booking/setup-intent"}]}]}