{"openapi":"3.1.0","info":{"title":"Talkspresso Partner API","version":"1.0.0","summary":"Book, take payment for and run video sessions with a coach roster from your own platform.","description":"Everything under /partner/v1 authenticates with an organization-bound API key (Authorization: Bearer tsp_...). The organization routes at the end are for the organization's own admin key. Times are ISO 8601 with a zone and answers are in UTC. Money is whole US cents and the currency is USD. Every POST except replay needs an Idempotency-Key header. Errors on /partner/v1 are { error: { code, message } }; organization routes use the older { error: \"text\" } shape. Limits per key: 120 reads a minute, 30 writes a minute, 300 bookings or checkouts a day for at most 150 different buyers; a key's first 24 hours run at one quarter of every limit. Staging is for building: api-staging.talkspresso.com with a sandbox key and PayPal's sandbox. Production keys are issued after go-live. Questions: support@talkspresso.com.","contact":{"name":"Talkspresso partner support","email":"support@talkspresso.com"}},"servers":[{"url":"https://api-staging.talkspresso.com","description":"Staging (sandbox key, no real money)"},{"url":"https://api.talkspresso.com","description":"Production (after go-live)"}],"tags":[{"name":"Catalog","description":"Coaches, services, questions and open times."},{"name":"Bookings","description":"Create, read, cancel and move bookings; the buyer's room link."},{"name":"Checkouts","description":"Hosted checkout for paid sessions."},{"name":"Products","description":"Digital products your coaches sell: the list, a hosted checkout and the order."},{"name":"Webhooks","description":"The event feed, endpoints and delivery history."},{"name":"Organization","description":"Your organization's settings, branding and roster."},{"name":"Developer kit","description":"This specification."},{"name":"Internal","description":"Called by Talkspresso's own hosted pages. Not for partner servers."}],"security":[{"partnerApiKey":[]}],"paths":{"/partner/v1/openapi.json":{"get":{"operationId":"getOpenApiDocument","summary":"This document","description":"The OpenAPI 3.1 description of the partner API. No key needed. Cached for an hour.","tags":["Developer kit"],"security":[],"responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"The partner API is switched off for this environment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]}}}},"/partner/v1/providers":{"get":{"operationId":"listProviders","summary":"List your coaches and their bookable services","description":"The organization's approved coaches who agreed to be listed, with their active one-on-one services. A paid service appears only when a buyer could actually pay for it. Group sessions, webinars, request-only and pay-what-you-can services are not listed.","tags":["Catalog"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","responses":{"200":{"description":"The coaches.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Provider"}}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/providers/{id}/readiness":{"get":{"operationId":"getProviderReadiness","summary":"Whether one coach can be booked right now, and why not","description":"Computed fresh on every call by the same decision POST /bookings and POST /checkouts make. blocking comes from a closed list and never says how Talkspresso has acted on a coach: any hold reads as unavailable. A coach who is not in your organization, does not exist, or is not available through the API at all answers the same 404.","tags":["Catalog"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"id","in":"path","required":true,"description":"A coach id from GET /providers.","schema":{"type":"string"}}],"responses":{"200":{"description":"The coach's readiness.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ProviderReadinessResponse"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/settings":{"get":{"operationId":"getSettings","summary":"Your organization's settings and go-live checklist","description":"Read only. The checklist tells your developers what is open and who unblocks it. Never gated by readiness, so you can always read why you are not ready.","tags":["Organization"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","responses":{"200":{"description":"Settings and checklist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PartnerSettings"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/services/{serviceId}/intake-questions":{"get":{"operationId":"getIntakeQuestions","summary":"The booking questions for a service","tags":["Catalog"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"serviceId","in":"path","required":true,"description":"A service id from GET /providers.","schema":{"type":"string"}}],"responses":{"200":{"description":"The questions.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IntakeQuestions"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"422":{"description":"The service cannot be booked through the partner API (a group session, request-only or pay-what-you-can).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["service_not_supported"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/services/{serviceId}/availability":{"get":{"operationId":"getAvailability","summary":"Open times for a service","description":"Always fresh: never cached, so a slot a booking just took is gone. At most 14 days per call. A group service returns occurrences (type group) instead of slots.","tags":["Catalog"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"serviceId","in":"path","required":true,"description":"A service id from GET /providers.","schema":{"type":"string"}},{"name":"from","in":"query","required":true,"description":"First day, YYYY-MM-DD.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"days","in":"query","required":false,"description":"How many days, 1 to 14.","schema":{"type":"integer","minimum":1,"maximum":14,"default":7}},{"name":"timezone","in":"query","required":false,"description":"IANA timezone the slots are grouped in.","schema":{"type":"string","maxLength":64,"default":"UTC"}}],"responses":{"200":{"description":"The slots.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Availability"}},"required":["data"]}}}},"400":{"description":"A query value is missing or wrong.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"422":{"description":"The service cannot be booked through the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["service_not_supported"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/bookings":{"post":{"operationId":"createBooking","summary":"Book a free session","description":"Free services only. The buyer is a guest: no Talkspresso account is created. Paid services answer 402 payment_required with next: POST /partner/v1/checkouts.","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:bookings","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required on every POST except replay. 8 to 255 characters: letters, digits and _ . : -. Use a new value for each action. Sending the same value with the same body returns the first answer and adds the response header Idempotent-Replayed: true. The same value with a different body is refused with 422 idempotency_key_reused.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9_.:\\-]{8,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingRequest"}}}},"responses":{"201":{"description":"The booking, with the buyer's join link.","headers":{"Idempotent-Replayed":{"description":"true when this is the stored answer to an earlier call with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Booking"}},"required":["data"]}}}},"400":{"description":"A field is missing or wrong (fields lists them), or the Idempotency-Key header is missing or malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","idempotency_key_required","idempotency_key_invalid"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"402":{"description":"The service is paid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["payment_required"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"409":{"description":"The time is gone, the group session is full, closed, moved or already booked by this buyer, the call is still being processed, or the booking emails setting is not available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["slot_unavailable","sold_out","occurrence_changed","occurrence_closed","already_booked","request_in_progress","notifications_mode_not_enabled","webhook_endpoint_required"]},"422":{"description":"The request is understood but cannot be done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["buyer_email_not_usable","booking_terms_need_buyer_consent","service_not_supported","not_supported_for_group","idempotency_key_reused"]},"429":{"description":"A rate or daily limit was reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited","daily_limit_reached","daily_buyer_limit_reached"]}}},"get":{"operationId":"listBookings","summary":"List the bookings your platform created","description":"Newest first. Only bookings made through your partner keys appear; no list row carries a join link.","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"from","in":"query","required":false,"description":"Bookings starting at or after this time.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Bookings starting before this time.","schema":{"type":"string","format":"date-time"}},{"name":"status","in":"query","required":false,"description":"Filter by status.","schema":{"type":"string","enum":["active","cancelled","awaiting_payment","completed"]}},{"name":"provider_id","in":"query","required":false,"description":"Filter by coach.","schema":{"type":"string","maxLength":100}},{"name":"partner_ref","in":"query","required":false,"description":"Filter by your own reference.","schema":{"type":"string","maxLength":128}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string","maxLength":300}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"A page of bookings.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BookingListRow"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}},"required":["data","has_more","next_cursor"]}}}},"400":{"description":"A query value is wrong, or the cursor is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","invalid_cursor"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/bookings/{id}":{"get":{"operationId":"getBooking","summary":"One booking, with the buyer's join link","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"id","in":"path","required":true,"description":"A booking id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The booking.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Booking"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/bookings/{id}/intake":{"get":{"operationId":"getBookingIntake","summary":"The buyer's answers to the booking questions","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"id","in":"path","required":true,"description":"A booking id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The answers.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BookingIntake"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/bookings/{id}/room-links":{"get":{"operationId":"getRoomLinks","summary":"The buyer's video room link, for your own page","description":"Buyer only, for bookings your platform created, each issue is audited. Needs the video setting iframe and an allowed site registered for your organization. Never cached. 60 an hour.","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"id","in":"path","required":true,"description":"A booking id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The room link.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RoomLink"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"409":{"description":"There is no room to show right now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["booking_cancelled","not_a_video_booking","room_unavailable","session_over","video_mode_not_enabled","no_allowed_origins"]},"429":{"description":"Too many room links this hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["room_link_rate_limited","rate_limited"]}}}},"/partner/v1/bookings/{id}/cancel":{"post":{"operationId":"cancelBooking","summary":"Cancel a booking with a full refund","description":"Always a full refund and never the buyer's late fee, so a reason_code is required. The coach must have agreed that your platform may cancel their sessions. Cancelling a booking that is already cancelled is a harmless repeat. A seat in a group session is cancelled the same way and its place is free again at once; it cannot be cancelled once the first session has started (400 already_started). If the refund does not go through the booking stays active and the answer is 424 (see the codes below; a seat answers course_refund_failed and a person at Talkspresso is told). 20 an hour.","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:bookings","parameters":[{"name":"id","in":"path","required":true,"description":"A booking id.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required on every POST except replay. 8 to 255 characters: letters, digits and _ . : -. Use a new value for each action. Sending the same value with the same body returns the first answer and adds the response header Idempotent-Replayed: true. The same value with a different body is refused with 422 idempotency_key_reused.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9_.:\\-]{8,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelRequest"}}}},"responses":{"200":{"description":"The cancelled booking.","headers":{"Idempotent-Replayed":{"description":"true when this is the stored answer to an earlier call with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Booking"}},"required":["data"]}}}},"400":{"description":"A field is missing or wrong (fields lists them), or the Idempotency-Key header is missing or malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","idempotency_key_required","idempotency_key_invalid"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"409":{"description":"The coach has not agreed, the call is still being processed, or the payment was already refunded at PayPal and our record has not caught up (try again in a few minutes).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["coach_consent_required","request_in_progress","already_refunded"]},"422":{"description":"The same Idempotency-Key was used with a different body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["idempotency_key_reused"]},"424":{"description":"The buyer could not be refunded, so nothing was cancelled: the booking is unchanged, the buyer was told nothing and the consultant's earning stands. payee_cannot_refund means the PayPal account that holds the payment cannot make the refund (permission, restriction or funds); refund_failed is any other refusal; course_refund_failed is the same refusal for a seat in a group session (the seat stays active and a person at Talkspresso is told).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["payee_cannot_refund","refund_failed","course_refund_failed"]},"429":{"description":"Too many cancels this hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["cancel_rate_limited","rate_limited"]}}}},"/partner/v1/bookings/{id}/reschedule":{"post":{"operationId":"rescheduleBooking","summary":"Move a booking to another open time","description":"The new time must be exactly a slot the coach offers, and the booking's own reschedule rules apply. The coach must have agreed that your platform may move their sessions. A move inside the fee window is refused 409 reschedule_fee_required: only the buyer can pay that fee, from the link in their booking email. 20 an hour.","tags":["Bookings"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:bookings","parameters":[{"name":"id","in":"path","required":true,"description":"A booking id.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required on every POST except replay. 8 to 255 characters: letters, digits and _ . : -. Use a new value for each action. Sending the same value with the same body returns the first answer and adds the response header Idempotent-Replayed: true. The same value with a different body is refused with 422 idempotency_key_reused.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9_.:\\-]{8,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RescheduleRequest"}}}},"responses":{"200":{"description":"The moved booking.","headers":{"Idempotent-Replayed":{"description":"true when this is the stored answer to an earlier call with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Booking"}},"required":["data"]}}}},"400":{"description":"A field is missing or wrong (fields lists them), or the Idempotency-Key header is missing or malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","idempotency_key_required","idempotency_key_invalid"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"409":{"description":"The coach has not agreed, the time is gone, a fee applies, or the call is still being processed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["coach_consent_required","slot_unavailable","reschedule_fee_required","request_in_progress"]},"422":{"description":"The same Idempotency-Key was used with a different body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["idempotency_key_reused"]},"429":{"description":"Too many moves this hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["reschedule_rate_limited","rate_limited"]}}}},"/partner/v1/checkouts":{"post":{"operationId":"createCheckout","summary":"Open a hosted checkout for a paid session","description":"Talkspresso holds the slot request and the buyer pays on our hosted page; your server never touches the payment. Send the buyer to data.url. The checkout lasts 30 minutes. At most 5 checkouts a minute for one buyer email.","tags":["Checkouts"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:bookings","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required on every POST except replay. 8 to 255 characters: letters, digits and _ . : -. Use a new value for each action. Sending the same value with the same body returns the first answer and adds the response header Idempotent-Replayed: true. The same value with a different body is refused with 422 idempotency_key_reused.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9_.:\\-]{8,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutRequest"}}}},"responses":{"201":{"description":"The checkout, with the hosted page address.","headers":{"Idempotent-Replayed":{"description":"true when this is the stored answer to an earlier call with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Checkout"}},"required":["data"]}}}},"400":{"description":"A field is missing or wrong (fields lists them), or the Idempotency-Key header is missing or malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","idempotency_key_required","idempotency_key_invalid"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"409":{"description":"The time is gone, the group session is full, closed, moved or already booked by this buyer, the money setup is not ready, or the call is still being processed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["slot_unavailable","sold_out","occurrence_changed","occurrence_closed","already_booked","channel_fee_unset","org_owner_not_ready","org_payee_mismatch","provider_not_connected","request_in_progress","notifications_mode_not_enabled","webhook_endpoint_required"]},"422":{"description":"The request is understood but cannot be done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["service_is_free","buyer_email_not_usable","return_url_not_allowed","service_not_supported","not_supported_for_group","idempotency_key_reused"]},"429":{"description":"A rate or daily limit was reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited","daily_limit_reached","daily_buyer_limit_reached","checkout_hold_limit"]}}}},"/partner/v1/checkouts/{id}":{"get":{"operationId":"getCheckout","summary":"The state of a checkout","description":"Poll this or listen for the checkout.paid webhook. Never returns the hosted page address.","tags":["Checkouts"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"id","in":"path","required":true,"description":"A checkout id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The checkout.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Checkout"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/products":{"get":{"operationId":"listProducts","summary":"Digital products your coaches sell","description":"Published, paid, one-time file products of your approved coaches who accepted the listing consent and can take payment. Empty when your organization collects money for its coaches (products are sold coach direct only). Drafts, archived products, free products and products made from session recordings never appear. No file address, count or revenue is ever returned.","tags":["Products"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"provider_id","in":"query","required":false,"description":"Only this coach's products.","schema":{"type":"string","maxLength":100}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string","maxLength":300}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"A page of products.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}},"required":["data","has_more","next_cursor"]}}}},"400":{"description":"A query value is wrong, or the cursor is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","invalid_cursor"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/product-checkouts":{"post":{"operationId":"createProductCheckout","summary":"Open a hosted checkout for a digital product","description":"Talkspresso holds the order and the buyer pays on our hosted page; your server never touches the payment. Send the buyer to data.url. The price is the product's price now and is fixed for the checkout (a product whose price moved before the buyer pays answers 409 price_changed on the page). Talkspresso emails the download links to the buyer; you are never sent a link. The checkout lasts 30 minutes and counts in the same daily limits as bookings.","tags":["Products"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:bookings","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required on every POST except replay. 8 to 255 characters: letters, digits and _ . : -. Use a new value for each action. Sending the same value with the same body returns the first answer and adds the response header Idempotent-Replayed: true. The same value with a different body is refused with 422 idempotency_key_reused.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9_.:\\-]{8,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductCheckoutRequest"}}}},"responses":{"201":{"description":"The checkout, with the hosted page address. data.id is the order id.","headers":{"Idempotent-Replayed":{"description":"true when this is the stored answer to an earlier call with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ProductCheckout"}},"required":["data"]}}}},"400":{"description":"A field is missing or wrong (fields lists them), or the Idempotency-Key header is missing or malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","idempotency_key_required","idempotency_key_invalid"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"409":{"description":"The money setup is not ready for products, or the call is still being processed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["channel_fee_unset","products_not_supported_in_org_collects","org_payments_disabled","provider_cannot_accept_payments","provider_bookings_not_open","request_in_progress"]},"422":{"description":"The request is understood but cannot be done. reason says why a product is not sold through the API: free_product, product_type_not_supported, recording_product, lead_mode, no_files, booking_mode.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["product_not_supported","buyer_email_not_usable","return_url_not_allowed","idempotency_key_reused"]},"429":{"description":"A rate or daily limit was reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited","daily_limit_reached","daily_buyer_limit_reached"]}}}},"/partner/v1/product-orders/{id}":{"get":{"operationId":"getProductOrder","summary":"The state of a product order","description":"id is the checkout id from POST /product-checkouts. Poll this or listen for product.purchased and product.refunded. delivery.status says whether Talkspresso's email with the download links has gone out. The response never contains a download link, token or access code, and there is no call to resend one.","tags":["Products"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"id","in":"path","required":true,"description":"An order id (a product checkout id).","schema":{"type":"string"}}],"responses":{"200":{"description":"The order.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ProductOrder"}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/events":{"get":{"operationId":"listEvents","summary":"The event feed, oldest first, for catching up","description":"Pass the last id you processed as since. Events appear about 30 seconds after they happen.","tags":["Webhooks"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"since","in":"query","required":false,"description":"Return events after this event id.","schema":{"type":"string","pattern":"^evt_[0-9a-f]{24}$"}},{"name":"type","in":"query","required":false,"description":"Only this event type.","schema":{"type":"string","enum":["booking.created","booking.paid","booking.cancelled","booking.rescheduled","booking.completed","checkout.paid","checkout.expired","checkout.refunded","occurrence.sold_out","provider.readiness_changed","product.purchased","product.refunded","ping"]}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"A page of events.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}},"required":["data","has_more","next_cursor"]}}}},"400":{"description":"A query value is wrong, the type is unknown, or since is not an id of yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed","invalid_cursor"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/events/{id}/replay":{"post":{"operationId":"replayEvent","summary":"Ask for an event to be sent to your endpoints again","description":"Re-sends the stored payload to every active endpoint that takes this event type. At most 5 an hour per event. No Idempotency-Key needed.","tags":["Webhooks"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:webhooks","parameters":[{"name":"id","in":"path","required":true,"description":"An event id, evt_ followed by 24 hex characters.","schema":{"type":"string"}}],"responses":{"200":{"description":"How many deliveries were queued.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"event_id":{"type":"string"},"queued_deliveries":{"type":"integer"}},"required":["event_id","queued_deliveries"]}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"410":{"description":"The event is older than the 90 day retention window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["event_expired"]},"429":{"description":"Too many replays of this event this hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["replay_rate_limited","rate_limited"]}}}},"/partner/v1/webhook-endpoints":{"get":{"operationId":"listWebhookEndpoints","summary":"Where your events are sent","description":"Read only. There is no call to create, change or delete an endpoint or a secret.","tags":["Webhooks"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","responses":{"200":{"description":"The endpoints.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"required":["data"]}}}},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner/v1/webhook-deliveries":{"get":{"operationId":"listWebhookDeliveries","summary":"Delivery attempts, newest first","tags":["Webhooks"],"security":[{"partnerApiKey":[]}],"x-scope":"partner:read","parameters":[{"name":"endpoint_id","in":"query","required":false,"description":"Only this endpoint.","schema":{"type":"string","maxLength":64}},{"name":"event_id","in":"query","required":false,"description":"Only this event.","schema":{"type":"string","maxLength":64}},{"name":"status","in":"query","required":false,"description":"Only this status.","schema":{"type":"string","enum":["pending","delivered","abandoned"]}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"The deliveries.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}},"required":["data"]}}}},"400":{"description":"A query value is wrong.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key, a wrong key, an expired key or a revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_credentials"]},"403":{"description":"The key lacks the scope, or the organization is not ready to use the partner API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["missing_scope","org_not_ready","org_not_supported","owner_not_admin","key_misconfigured"]},"404":{"description":"The partner API is switched off for this environment, or the id does not exist, belongs to another organization, or was not created by your platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["not_found"]},"429":{"description":"Too many calls. retry_after_seconds says how long to wait (also sent as a Retry-After header).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["rate_limited"]}}}},"/partner-checkout/{id}/resolve":{"post":{"operationId":"hostedCheckoutResolve","summary":"Hosted checkout page: load the checkout (internal)","description":"Called by the Talkspresso hosted checkout page in the buyer's browser. No key: the signed token in the body is the credential. Not for partner servers. 30 a minute per IP.","tags":["Internal"],"x-internal":true,"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"A checkout id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedResolveRequest"}}}},"responses":{"200":{"description":"The buyer-facing summary: first name and a masked email only.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/HostedResolveResponse"}},"required":["data"]}}}},"403":{"description":"The link is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_checkout_link"]}}}},"/partner-checkout/{id}/return":{"post":{"operationId":"hostedCheckoutReturn","summary":"Hosted checkout page: where to send the buyer after paying (internal)","description":"Called by the hosted checkout page. Returns the return address re-checked against your organization's current allowed hosts. Not for partner servers. 30 a minute per IP.","tags":["Internal"],"x-internal":true,"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"A checkout id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedResolveRequest"}}}},"responses":{"200":{"description":"The redirect address, or null.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/HostedReturnResponse"}},"required":["data"]}}}},"403":{"description":"The link is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_checkout_link"]}}}},"/partner-product-checkout/{id}/resolve":{"post":{"operationId":"hostedProductCheckoutResolve","summary":"Hosted product page: load the checkout (internal)","description":"Called by the Talkspresso hosted product checkout page in the buyer's browser. No key: the signed product token in the body is the credential, and a booking checkout token does not work here. Not for partner servers. 30 a minute per IP.","tags":["Internal"],"x-internal":true,"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"A product checkout id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedResolveRequest"}}}},"responses":{"200":{"description":"The buyer-facing summary: first name and a masked email only, never a link.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/HostedProductResolveResponse"}},"required":["data"]}}}},"403":{"description":"The link is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_checkout_link"]},"410":{"description":"The link has expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["checkout_expired"]}}}},"/partner-product-checkout/{id}/order":{"post":{"operationId":"hostedProductCheckoutOrder","summary":"Hosted product page: start the payment (internal)","description":"Called by the hosted page when the buyer chooses to pay. Everything that decides the sale is read again on the server: the product, the coach, the price and the fee. The card path needs the same bot check as every other card checkout. Not for partner servers.","tags":["Internal"],"x-internal":true,"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"A product checkout id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedProductOrderRequest"}}}},"responses":{"200":{"description":"The payment to approve.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/HostedProductOrderResponse"}},"required":["data"]}}}},"403":{"description":"The link is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_checkout_link"]},"409":{"description":"The product changed or cannot be sold now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["price_changed","product_unavailable","provider_cannot_accept_payments","checkout_already_paid","channel_fee_unset","org_not_supported"]},"410":{"description":"The link has expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["checkout_expired"]}}}},"/partner-product-checkout/{id}/return":{"post":{"operationId":"hostedProductCheckoutReturn","summary":"Hosted product page: where to send the buyer after paying (internal)","description":"Called by the hosted product page. Returns the return address re-checked against your organization's current allowed hosts. Not for partner servers.","tags":["Internal"],"x-internal":true,"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"A product checkout id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedResolveRequest"}}}},"responses":{"200":{"description":"The redirect address, or null.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/HostedReturnResponse"}},"required":["data"]}}}},"403":{"description":"The link is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerError"}}},"x-error-codes":["invalid_checkout_link"]}}}},"/organization/my":{"get":{"tags":["Organization"],"operationId":"listMyOrganizations","summary":"The organizations the key's owner belongs to","security":[{"partnerApiKey":[]}],"x-scope":"read","responses":{"200":{"description":"The organizations, with userRole and adminRole on each.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}":{"get":{"tags":["Organization"],"operationId":"getOrganization","summary":"One organization (what a key may read)","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The organization.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Organization"}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}},"put":{"tags":["Organization"],"operationId":"updateOrganizationPut","summary":"Change the organization's branding and copy","description":"Same as PATCH. Owners and admins only; a manager is refused. Branding and copy only, see OrganizationUpdate.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"The updated organization.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Organization"}},"required":["data"]}}}},"400":{"description":"A field a key may not write (field_not_allowed_for_keys) or a bad value (invalid_field_value). Nothing is saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}},"patch":{"tags":["Organization"],"operationId":"updateOrganization","summary":"Change the organization's branding and copy","description":"Owners and admins only; a manager is refused. Branding and copy only, see OrganizationUpdate.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"The updated organization.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Organization"}},"required":["data"]}}}},"400":{"description":"A field a key may not write (field_not_allowed_for_keys) or a bad value (invalid_field_value). Nothing is saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/members":{"get":{"tags":["Organization"],"operationId":"listOrganizationMembers","summary":"The organization's members","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter by membership status.","schema":{"type":"string"}},{"name":"featured","in":"query","required":false,"description":"Filter by featured.","schema":{"type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip.","schema":{"type":"integer"}}],"responses":{"200":{"description":"The members.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationMember"}},"total":{"type":"integer"}},"required":["members","total"]}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/members/{memberId}":{"put":{"tags":["Organization"],"operationId":"updateOrganizationMemberPut","summary":"Change a member's title, bio, featured flag or order","description":"Same as PATCH.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"memberId","in":"path","required":true,"description":"The membership id, not the user id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberUpdate"}}}},"responses":{"200":{"description":"The updated member.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OrganizationMember"}},"required":["data"]}}}},"400":{"description":"A field a key may not write, such as status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}},"patch":{"tags":["Organization"],"operationId":"updateOrganizationMember","summary":"Change a member's title, bio, featured flag or order","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"memberId","in":"path","required":true,"description":"The membership id, not the user id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberUpdate"}}}},"responses":{"200":{"description":"The updated member.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OrganizationMember"}},"required":["data"]}}}},"400":{"description":"A field a key may not write, such as status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}},"delete":{"tags":["Organization"],"operationId":"removeOrganizationMember","summary":"Remove a member from the organization","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"memberId","in":"path","required":true,"description":"The membership id, not the user id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Removed.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/invitations":{"post":{"tags":["Organization"],"operationId":"createOrganizationInvitation","summary":"Invite a coach to the organization","description":"Creates the invitation and returns it, including the join token. The API call itself does not send an email. The coach signs in, reads and accepts the partner consent, and is then listed. A key may send at most 20 invitations a day.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationRequest"}}}},"responses":{"200":{"description":"The invitation.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Invitation"}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/stats":{"get":{"tags":["Organization"],"operationId":"getOrganizationStats","summary":"Member and revenue totals","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Totals.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/activity":{"get":{"tags":["Organization"],"operationId":"getOrganizationActivity","summary":"Sessions across the organization","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Rows and totals.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/activity/overview":{"get":{"tags":["Organization"],"operationId":"getOrganizationActivityOverview","summary":"What needs attention and what is coming up","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The overview.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/reporting/summary":{"get":{"tags":["Organization"],"operationId":"getOrganizationReportingSummary","summary":"Gross, fees and shares for a period","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The summary, in cents.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/payouts":{"get":{"tags":["Organization"],"operationId":"listOrganizationPayouts","summary":"Payout history","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The payouts.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/commissions/pending":{"get":{"tags":["Organization"],"operationId":"listOrganizationPendingCommissions","summary":"Commissions not yet paid out","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip.","schema":{"type":"integer"}}],"responses":{"200":{"description":"The pending commissions.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}},"/organization/{id}/templates":{"get":{"tags":["Organization"],"operationId":"listOrganizationTemplates","summary":"The organization's lesson templates","description":"Partner organizations only. The key's owner must be an owner or admin of the organization (a manager is refused). A key holding org:write can read as well as write.","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The templates and the limit.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/Template"}},"limits":{"type":"object","properties":{"max_templates":{"type":"integer"}}}},"required":["templates","limits"]}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}},"post":{"tags":["Organization"],"operationId":"createOrganizationTemplate","summary":"Create a lesson template","description":"Version 1. Never reaches any teacher's catalog by itself: a teacher adopts it. At most 50 templates per organization and 60 template writes per key per day.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateWrite"}}}},"responses":{"201":{"description":"The template.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}}},"/organization/{id}/templates/{tid}":{"get":{"tags":["Organization"],"operationId":"getOrganizationTemplate","summary":"One template with its versions","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"tid","in":"path","required":true,"description":"A template id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The template.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TemplateDetail"}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}},"put":{"tags":["Organization"],"operationId":"replaceOrganizationTemplate","summary":"Edit a template","description":"Send the fields to change. A change to the text, price, length, lock or questions makes a new version; teachers who adopted an earlier version see an update and accept it themselves. Their live service is never changed by an edit.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"tid","in":"path","required":true,"description":"A template id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateWrite"}}}},"responses":{"200":{"description":"The template.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TemplateDetail"}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}},"patch":{"tags":["Organization"],"operationId":"updateOrganizationTemplate","summary":"Edit a template (same as PUT)","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"tid","in":"path","required":true,"description":"A template id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateWrite"}}}},"responses":{"200":{"description":"The template.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TemplateDetail"}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}},"delete":{"tags":["Organization"],"operationId":"deleteOrganizationTemplate","summary":"Delete a template","description":"Soft delete. Teachers keep the services they made, and any price lock on them lifts.","security":[{"partnerApiKey":[]}],"x-scope":"org:write","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"tid","in":"path","required":true,"description":"A template id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}}},"/organization/{id}/templates/{tid}/adopters":{"get":{"tags":["Organization"],"operationId":"getOrganizationTemplateAdopters","summary":"Who offers a template","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}},{"name":"tid","in":"path","required":true,"description":"A template id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Counts, and per coach only the version they offer and whether an update is waiting.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TemplateAdopters"}},"required":["data"]}}}},"400":{"description":"A field is missing or not allowed (fields names them), or the body is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["validation_failed"]},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope (a legacy key is refused on writes), or its owner is not an owner or admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"No such template, or the organization is not a partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["not_found"]},"409":{"description":"version_conflict (expected_version is stale) or template_limit_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["version_conflict","template_limit_reached"]},"429":{"description":"template_write_limit: 60 template writes per key per day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateError"}}},"x-error-codes":["template_write_limit"]}}}},"/organization/{id}/partner-settings":{"get":{"tags":["Organization"],"operationId":"getOrganizationPartnerSettings","summary":"The same settings and checklist as GET /partner/v1/settings","description":"Read only for a key. Every write method on this path is refused to keys: settings are changed by a person signed in, or by Talkspresso.","security":[{"partnerApiKey":[]}],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"description":"The organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Settings and checklist.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PartnerSettings"}},"required":["data"]}}}},"401":{"description":"No key or a bad key (body {\"error\":\"...\"}), or a validation failure inside an organization handler, which also arrives as 401 with the reason in error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"403":{"description":"The key lacks the scope, the route is never available to keys, or the key's owner is not an admin of this organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}},"404":{"description":"Not found. Activity and reporting reads answer a non-admin with 404.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationError"}}}}}}}},"components":{"securitySchemes":{"partnerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"tsp_<48 hex characters>","description":"Send Authorization: Bearer tsp_... on every call. Keep the key on your server. One key belongs to one organization. Each operation lists the scope it needs in x-scope: partner:read, partner:bookings, partner:webhooks for /partner/v1, and read or org:write for the organization routes."}},"schemas":{"PartnerError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"A stable machine-readable code. Branch on this, not on the message."},"message":{"type":"string","description":"A plain-words explanation. Never contains internal detail."},"fields":{"type":"array","items":{"type":"string"},"description":"validation_failed and some 422s: the request fields at fault."},"retry_after_seconds":{"type":"integer","description":"429 only."},"reason":{"type":"string","description":"slot_unavailable and service_not_supported: why. group_paid_not_supported_in_org_collects: a paid group session is not sold through an organization that collects payments for its coaches."},"fee_cents":{"type":"integer","description":"reschedule_fee_required only: the fee the buyer would pay."},"currency":{"type":"string","description":"reschedule_fee_required only."},"next":{"type":"string","description":"payment_required only: the call to make instead."},"allowed_types":{"type":"array","items":{"type":"string"},"description":"validation_failed on an unknown event type: the accepted types."},"opens_at":{"type":"string","description":"Present on some refusals that clear at a known time."}},"required":["code","message"],"additionalProperties":true}},"required":["error"]},"OrganizationError":{"type":"object","properties":{"error":{"description":"Organization routes use the older shape: a string reason, not the partner envelope.","type":"string"},"message":{"type":"string","description":"Present on field_not_allowed_for_keys and invalid_field_value."},"code":{"type":"string","description":"Present on some refusals, for example org_not_found."},"fields":{"type":"array","items":{"type":"string"},"description":"field_not_allowed_for_keys and invalid_field_value: the body fields at fault."}},"required":["error"],"description":"Not the partner envelope. A refusal inside an organization handler can also arrive as 401 with the reason in error (for example a missing email on an invitation); read the text."},"Booking":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","description":"One of active, cancelled, awaiting_payment, completed (the values GET /bookings accepts as a filter)."},"approval_status":{"type":["string","null"]},"start_time":{"type":["string","null"],"format":"date-time"},"end_time":{"type":["string","null"],"format":"date-time"},"duration_minutes":{"type":["integer","null"]},"provider":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"service":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]}},"required":["id","title"]},"buyer":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":["string","null"]}},"required":["name","email"]},"partner_ref":{"type":["string","null"]},"paid_cents":{"type":"integer","description":"Whole US cents."},"currency":{"type":"string","description":"Always USD.","enum":["USD"]},"created_at":{"type":["string","null"],"format":"date-time"},"join_url":{"type":["string","null"],"description":"The buyer's join link. A bearer link: keep it out of logs. Present only on the create response and GET /bookings/{id}, for bookings your platform created, and null for an in-person service. For a seat it is the room of the next session, carrying a signed token tied to this one seat and session (valid until two hours after the session ends, dead once the seat is cancelled). It never contains a client id."},"notes_available":{"type":"boolean","description":"Always false: notes are never returned."},"type":{"type":"string","description":"seat for a seat in a group session. Absent on a one on one booking.","enum":["seat"]},"occurrence_id":{"type":["string","null"],"description":"Seats only: the run this seat belongs to."},"session_count":{"type":"integer","description":"Seats only: how many sessions the run has."},"sessions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"start_time":{"type":"string"},"end_time":{"type":"string"},"join_url":{"type":["string","null"],"description":"Only on the create response and GET /bookings/{id}."}},"required":["index","start_time","end_time"]},"description":"Seats only."}},"required":["id","status","start_time","end_time","provider","service","buyer","paid_cents","currency","notes_available"]},"BookingListRow":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"approval_status":{"type":["string","null"]},"start_time":{"type":["string","null"],"format":"date-time"},"end_time":{"type":["string","null"],"format":"date-time"},"duration_minutes":{"type":["integer","null"]},"provider":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"service":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]}},"required":["id","title"]},"buyer":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":["string","null"]}},"required":["name","email"]},"partner_ref":{"type":["string","null"]},"paid_cents":{"type":"integer","description":"Whole US cents."},"currency":{"type":"string","enum":["USD"]},"created_at":{"type":["string","null"],"format":"date-time"},"notes_available":{"type":"boolean","description":"Always false."},"type":{"type":"string","description":"seat for a seat in a group session. Absent on a one on one booking.","enum":["seat"]},"occurrence_id":{"type":["string","null"],"description":"Seats only."},"session_count":{"type":"integer","description":"Seats only."}},"required":["id","status","start_time","end_time","provider","service","buyer","paid_cents","currency","notes_available"],"description":"A booking in a list. Never carries join_url."},"CreateBookingRequest":{"type":"object","properties":{"provider_id":{"type":"string","description":"The coach's id from GET /providers.","maxLength":100},"service_id":{"type":"string","description":"A service id from GET /providers.","maxLength":100},"start_time":{"type":"string","description":"One on one services: ISO 8601 with an explicit zone offset or Z, for example 2026-11-17T16:00:00Z. A time with no zone is refused. It must be exactly a slot from GET /services/{serviceId}/availability. Send exactly one of start_time and occurrence_id: a group session refuses start_time.","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})$"},"occurrence_id":{"type":"string","description":"Group sessions and clinics: the occurrence_id from GET /services/{serviceId}/availability. Books a seat. Send exactly one of start_time and occurrence_id: a one on one service refuses occurrence_id. Up to 200 characters.","maxLength":200},"buyer":{"type":"object","properties":{"name":{"type":"string","description":"1 to 200 characters.","minLength":1,"maxLength":200},"email":{"type":"string","description":"A usable email address, up to 254 characters.","format":"email","maxLength":254},"phone":{"type":["string","null"],"description":"Up to 50 characters.","maxLength":50},"timezone":{"type":"string","description":"IANA timezone name, for example America/Chicago. Up to 64 characters."}},"required":["name","email"]},"notes":{"type":["string","null"],"description":"Up to 2000 characters.","maxLength":2000},"intake_answers":{"type":"array","items":{"type":"object","properties":{"question_id":{"type":"string","description":"An id from GET /services/{serviceId}/intake-questions.","maxLength":100},"answer":{"oneOf":[{"type":"string","maxLength":5000},{"type":"array","items":{"type":"string","maxLength":5000},"maxItems":20}]}},"required":["question_id","answer"]},"maxItems":50},"partner_ref":{"type":["string","null"],"description":"Your own order or user reference, up to 128 characters. Comes back on the booking, in webhooks and in GET /bookings?partner_ref=.","maxLength":128},"notifications":{"type":"string","description":"Who sends this buyer's booking emails. Absent means the organization's setting. A value the organization is not set up for is refused with 409 notifications_mode_not_enabled.","enum":["talkspresso","branded","partner"]}},"required":["provider_id","service_id","buyer"],"additionalProperties":false,"oneOf":[{"required":["start_time"]},{"required":["occurrence_id"]}],"description":"Free services only (a free seat in a group session included). A paid service answers 402 payment_required: open a checkout instead. Exactly one of start_time (one on one) and occurrence_id (group) is required."},"CreateCheckoutRequest":{"type":"object","properties":{"provider_id":{"type":"string","description":"The coach's id from GET /providers.","maxLength":100},"service_id":{"type":"string","description":"A service id from GET /providers.","maxLength":100},"start_time":{"type":"string","description":"One on one services: ISO 8601 with an explicit zone offset or Z, for example 2026-11-17T16:00:00Z. A time with no zone is refused. It must be exactly a slot from GET /services/{serviceId}/availability. Send exactly one of start_time and occurrence_id: a group session refuses start_time.","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})$"},"occurrence_id":{"type":"string","description":"Group sessions and clinics: the occurrence_id from GET /services/{serviceId}/availability. Books a seat. Send exactly one of start_time and occurrence_id: a one on one service refuses occurrence_id. Up to 200 characters.","maxLength":200},"buyer":{"type":"object","properties":{"name":{"type":"string","description":"1 to 200 characters.","minLength":1,"maxLength":200},"email":{"type":"string","description":"A usable email address, up to 254 characters.","format":"email","maxLength":254},"phone":{"type":["string","null"],"description":"Up to 50 characters.","maxLength":50},"timezone":{"type":"string","description":"IANA timezone name, for example America/Chicago. Up to 64 characters."}},"required":["name","email"]},"notes":{"type":["string","null"],"description":"Up to 2000 characters.","maxLength":2000},"intake_answers":{"type":"array","items":{"type":"object","properties":{"question_id":{"type":"string","description":"An id from GET /services/{serviceId}/intake-questions.","maxLength":100},"answer":{"oneOf":[{"type":"string","maxLength":5000},{"type":"array","items":{"type":"string","maxLength":5000},"maxItems":20}]}},"required":["question_id","answer"]},"maxItems":50},"partner_ref":{"type":["string","null"],"description":"Your own order or user reference, up to 128 characters. Comes back on the booking, in webhooks and in GET /bookings?partner_ref=.","maxLength":128},"notifications":{"type":"string","description":"Who sends this buyer's booking emails. Absent means the organization's setting. A value the organization is not set up for is refused with 409 notifications_mode_not_enabled.","enum":["talkspresso","branded","partner"]},"return_url":{"type":"string","description":"Where the buyer is sent after paying. https only, on a host registered for your organization (else 422 return_url_not_allowed). Up to 2048 characters.","maxLength":2048}},"required":["provider_id","service_id","buyer"],"additionalProperties":false,"oneOf":[{"required":["start_time"]},{"required":["occurrence_id"]}],"description":"Paid services only (a paid seat in a group session included). A free service answers 422 service_is_free: use POST /bookings. Exactly one of start_time (one on one) and occurrence_id (group) is required."},"CancelRequest":{"type":"object","properties":{"reason_code":{"type":"string","description":"Required. Why the booking is cancelled. It is stored with the key id, and the buyer's email gives it in plain words.","enum":["buyer_requested","partner_cause","duplicate","fraud_suspected"]},"reason":{"type":["string","null"],"description":"Free text for your own records, up to 1000 characters. Never shown to the buyer.","maxLength":1000}},"required":["reason_code"],"additionalProperties":false},"RescheduleRequest":{"type":"object","properties":{"start_time":{"type":"string","description":"The new start, ISO 8601 with a zone. Must be exactly a slot the coach offers.","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})$"}},"required":["start_time"],"additionalProperties":false},"Checkout":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","description":"open, paid, expired or cancelled. For a group session or clinic, three more: pending (the buyer paid and the seat is being written), refunded (the buyer paid, the seat could not be given and the payment was returned in full: see the checkout.refunded event) and paid_no_seat (the buyer paid, there is no seat and no refund yet: a person at Talkspresso has it). A status=paid hint on the return redirect can be edited by the buyer: confirm with this call or the checkout.paid webhook.","enum":["open","paid","expired","cancelled","pending","refunded","paid_no_seat"]},"url":{"type":"string","description":"The hosted checkout page for the buyer. Present only on the create response. Carries a signed token: treat it as a secret, send the buyer to it, do not log it."},"expires_at":{"type":"string","format":"date-time"},"partner_ref":{"type":["string","null"]},"booking_id":{"type":["string","null"],"description":"Set once the checkout is paid and the booking exists."},"provider_id":{"type":"string"},"service_id":{"type":"string"},"start_time":{"type":"string","description":"For a seat, the first session start.","format":"date-time"},"type":{"type":"string","description":"one_on_one, or group for a seat in a group session or clinic.","enum":["one_on_one","group"]},"occurrence_id":{"type":["string","null"],"description":"Set for a group checkout, null for a one on one one."}},"required":["id","status","expires_at","provider_id","service_id","start_time"]},"Provider":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"title":{"type":["string","null"],"description":"The member title the organization gave the coach."},"handle":{"type":["string","null"]},"photo_url":{"type":["string","null"]},"headline":{"type":["string","null"]},"readiness":{"type":"object","properties":{"profile":{"type":"boolean","description":"The coach's account is verified and has a name."},"services":{"type":"integer","description":"How many bookable services the coach has published."},"availability":{"type":"boolean","description":"The coach has times a buyer can book (a weekly or dated calendar, or an open group session), and is not away."},"payout_connected":{"type":"boolean","description":"A buyer can pay this coach. A bare yes or no: nothing about why."},"consent":{"type":"boolean","description":"The coach has accepted the organization's current listing terms."},"bookable":{"type":"boolean","description":"The same decision POST /bookings and POST /checkouts make about this coach."},"blocking":{"type":"array","items":{"type":"string","enum":["profile_incomplete","no_service","no_availability","payout_not_ready","consent_missing","share_unset","not_listed","unavailable"]},"description":"Why bookable is false, from this closed list. Any hold Talkspresso has placed on a coach, however it arose, reads as unavailable and nothing more."}},"required":["profile","services","availability","payout_connected","consent","bookable","blocking"],"description":"Whether a buyer can book this coach right now, and why not. The same object GET /providers/{id}/readiness returns."},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"duration_minutes":{"type":"integer"},"price_cents":{"type":"integer","description":"Whole US cents."},"currency":{"type":"string","enum":["USD"]},"free":{"type":"boolean"},"adopted_from_catalog":{"type":"boolean","description":"True when this service is the lesson made from one of the organization's catalog templates, false for a coach's own service (including a copy of one)."},"type":{"type":"string","description":"one_on_one: book with start_time. group: book a seat with occurrence_id.","enum":["one_on_one","group"]}},"required":["id","title","duration_minutes","price_cents","currency","free","type"]}}},"required":["id","name","services"],"description":"A coach the organization has listed. Only approved, consented coaches with bookable services (one on one and group) appear."},"Occurrence":{"type":"object","properties":{"occurrence_id":{"type":"string","description":"Send this as occurrence_id to book a seat. It names the run and its first start, so a run the coach moved answers 409 occurrence_changed instead of booking a different time."},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"session_count":{"type":"integer","description":"1 for a workshop or webinar, more for a course."},"sessions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}},"required":["index","start","end"]}},"capacity":{"type":["integer","null"]},"seats_left":{"type":["integer","null"],"description":"Seats still free, counting seats held by open checkouts."},"status":{"type":"string","enum":["open","sold_out"]}},"required":["occurrence_id","start","end","session_count","sessions","capacity","seats_left","status"]},"Availability":{"type":"object","properties":{"service_id":{"type":"string"},"provider_id":{"type":"string"},"type":{"type":"string","description":"one_on_one: book a slot with start_time. group: book a seat with occurrence_id.","enum":["one_on_one","group"]},"timezone":{"type":"string","description":"The timezone you asked for."},"duration_minutes":{"type":"integer"},"slots":{"type":"array","items":{"type":"object","properties":{"start_time":{"type":"string","description":"ISO 8601."},"end_time":{"type":"string","description":"ISO 8601."}},"required":["start_time","end_time"]},"description":"One on one services. Always empty for a group service."},"occurrences":{"type":"array","items":{"$ref":"#/components/schemas/Occurrence"},"description":"Group services only: the run that can still be booked. from, days and timezone do not narrow it."}},"required":["service_id","provider_id","type","timezone","duration_minutes","slots"]},"IntakeQuestion":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"},"questionType":{"type":"string"},"options":{"description":"Choices for a choice question, otherwise null.","type":["array","null"],"items":{}},"isRequired":{"type":"boolean"},"placeholder":{"type":["string","null"]},"helperText":{"type":["string","null"]}},"required":["id","question","isRequired"]},"IntakeQuestions":{"type":"object","properties":{"service_id":{"type":"string"},"questions":{"type":"array","items":{"$ref":"#/components/schemas/IntakeQuestion"}},"requires_heard_about_us":{"type":"boolean","description":"true when the coach requires a 'how did you hear about us' answer."}},"required":["service_id","questions","requires_heard_about_us"]},"BookingIntake":{"type":"object","properties":{"booking_id":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"answer":{"type":"string"}},"required":["question","answer"]}}},"required":["booking_id","answers"]},"RoomLink":{"type":"object","properties":{"booking_id":{"type":"string"},"role":{"type":"string","enum":["buyer"]},"url":{"type":"string","description":"The buyer's room link. A bearer link: keep it out of logs. For a seat in a group session it carries a signed token tied to this one seat and this one session, valid until two hours after the session ends, and it stops working when the seat is cancelled. It never contains a client id."},"embed_url":{"type":"string","description":"The same link with embed=1, for an iframe on one of parent_origins."},"parent_origins":{"type":"array","items":{"type":"string"},"description":"The origins registered for your organization that may frame the room."},"session_ends_at":{"type":["string","null"],"format":"date-time"}},"required":["booking_id","role","url","embed_url","parent_origins","session_ends_at"]},"BookingObject":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["booking"]},"status":{"type":["string","null"]},"approval_status":{"type":["string","null"]},"start_time":{"type":["string","null"],"format":"date-time"},"end_time":{"type":["string","null"],"format":"date-time"},"duration_minutes":{"type":["integer","null"]},"provider":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}}},"service":{"type":"object","properties":{"id":{"type":["string","null"]},"title":{"type":["string","null"]}}},"buyer":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":["string","null"]}}},"partner_ref":{"type":["string","null"]},"paid_cents":{"type":"integer"},"currency":{"type":"string","enum":["USD"]},"session_outcome":{"type":["string","null"]},"cancelled_by":{"type":["string","null"],"description":"buyer, coach, partner, system or unknown. Only when status is cancelled."},"occurrence_id":{"type":["string","null"],"description":"Set for a seat in a group session, null for a one on one booking."},"updated_at":{"type":["string","null"],"description":"Drop an event whose updated_at is older than the one you already hold.","format":"date-time"}},"required":["id","object","status","approval_status","start_time","end_time","duration_minutes","provider","service","buyer","partner_ref","paid_cents","currency","session_outcome","cancelled_by","occurrence_id","updated_at"],"description":"The booking inside a webhook or event. Never carries a join link, manage link, notes or intake answers: fetch GET /bookings/{id} for those."},"CheckoutObject":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["checkout"]},"status":{"type":"string","description":"paid, expired or refunded: the status that caused the event."},"partner_ref":{"type":["string","null"]},"booking_id":{"type":["string","null"]},"provider_id":{"type":["string","null"]},"service_id":{"type":["string","null"]},"start_time":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"type":{"type":"string","description":"one_on_one, or group for a seat in a group session or clinic.","enum":["one_on_one","group"]},"occurrence_id":{"type":["string","null"],"description":"Set for a group checkout, null for a one on one one."},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","object","status","partner_ref","booking_id","provider_id","service_id","start_time","expires_at","type","occurrence_id","updated_at"]},"OccurrenceObject":{"type":"object","properties":{"id":{"type":"string","description":"The occurrence_id."},"object":{"type":"string","enum":["occurrence"]},"service":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]}}},"provider":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}}},"start_time":{"type":["string","null"],"format":"date-time"},"end_time":{"type":["string","null"],"format":"date-time"},"capacity":{"type":["integer","null"]},"seats_left":{"type":["integer","null"]},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","object","service","provider","start_time","end_time","capacity","seats_left","updated_at"],"description":"data.object of an occurrence.sold_out event: a run ran out of seats. No buyer, no link."},"Product":{"type":"object","properties":{"id":{"type":"string"},"provider_id":{"type":"string","description":"The coach who sells it."},"title":{"type":"string"},"short_description":{"type":"string"},"price_cents":{"type":"integer","description":"Whole US cents, above zero."},"currency":{"type":"string","enum":["USD"]},"thumbnail":{"type":["string","null"],"description":"An image address, or null."},"product_type":{"type":"string","description":"download: a one-time file product. Other types are not sold through the partner API yet.","enum":["download"]}},"required":["id","provider_id","title","short_description","price_cents","currency","thumbnail","product_type"],"description":"A digital product a buyer can buy through your platform. Never carries file addresses, counts, revenue or buyer data."},"CreateProductCheckoutRequest":{"type":"object","properties":{"provider_id":{"type":"string","description":"The coach who sells the product (Product.provider_id).","maxLength":100},"product_id":{"type":"string","description":"A product id from GET /products.","maxLength":100},"buyer":{"type":"object","properties":{"name":{"type":"string","description":"1 to 200 characters.","minLength":1,"maxLength":200},"email":{"type":"string","description":"Where the download links are emailed by Talkspresso. Up to 254 characters.","format":"email","maxLength":254}},"required":["name","email"]},"partner_ref":{"type":["string","null"],"description":"Your own order reference, up to 128 characters. Comes back on the order and in webhooks.","maxLength":128},"return_url":{"type":"string","description":"Where the buyer is sent after paying. https only, on a host registered for your organization (else 422 return_url_not_allowed). Up to 2048 characters.","maxLength":2048}},"required":["provider_id","product_id","buyer"],"additionalProperties":false,"description":"There is no price, discount code or fee field: the price is the product's price when the checkout is opened, and a body that names one is refused."},"ProductCheckout":{"type":"object","properties":{"id":{"type":"string","description":"The order id: use it with GET /product-orders/{id}."},"status":{"type":"string","enum":["awaiting_payment","paid","partially_refunded","refunded","expired"]},"url":{"type":"string","description":"The hosted checkout page for the buyer. Present only on the create response. Carries a signed token: treat it as a secret, send the buyer to it, do not log it."},"expires_at":{"type":"string","format":"date-time"},"partner_ref":{"type":["string","null"]},"product_id":{"type":"string"},"provider_id":{"type":"string"},"amount_cents":{"type":"integer","description":"The price the buyer will pay, fixed when the checkout was opened."},"currency":{"type":"string","enum":["USD"]}},"required":["id","status","expires_at","product_id","provider_id","amount_cents","currency"]},"ProductOrder":{"type":"object","properties":{"id":{"type":"string","description":"The checkout id (not a purchase id)."},"status":{"type":"string","description":"awaiting_payment, paid, partially_refunded, refunded or expired.","enum":["awaiting_payment","paid","partially_refunded","refunded","expired"]},"product_id":{"type":"string"},"provider_id":{"type":"string"},"amount_cents":{"type":"integer"},"currency":{"type":"string","enum":["USD"]},"refunded_cents":{"type":"integer","description":"Cumulative amount refunded or reversed."},"buyer":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":["string","null"]}},"required":["name","email"]},"partner_ref":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"delivery":{"type":"object","properties":{"method":{"type":"string","description":"Always email: Talkspresso emails the download links to the buyer. You never receive a download link.","enum":["email"]},"status":{"type":"string","description":"pending, sent or failed.","enum":["pending","sent","failed"]}},"required":["method","status"]}},"required":["id","status","product_id","provider_id","amount_cents","currency","refunded_cents","buyer","partner_ref","created_at","delivery"]},"ProductOrderObject":{"type":"object","properties":{"id":{"type":"string","description":"The order id (the checkout id)."},"object":{"type":"string","enum":["product_order"]},"status":{"type":"string","enum":["paid","partially_refunded","refunded"]},"product_id":{"type":["string","null"]},"provider_id":{"type":["string","null"]},"amount_cents":{"type":"integer"},"currency":{"type":"string","enum":["USD"]},"buyer":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":["string","null"]}}},"partner_ref":{"type":["string","null"]},"refund":{"type":"object","properties":{"amount_cents":{"type":"integer","description":"This refund or reversal."},"full":{"type":"boolean","description":"true when everything paid has now been taken back."},"reason":{"type":"string","description":"refunded: a refund. reversed: a chargeback or reversal.","enum":["refunded","reversed"]}},"required":["amount_cents","full","reason"],"description":"Present on product.refunded only."},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","object","status","product_id","provider_id","amount_cents","currency","buyer","partner_ref","updated_at"],"description":"data.object of product.purchased and product.refunded. Never carries a download link, token, access code, fee or share."},"Event":{"type":"object","properties":{"id":{"type":"string","description":"evt_ followed by 24 hex characters."},"type":{"type":"string","enum":["booking.created","booking.paid","booking.cancelled","booking.rescheduled","booking.completed","checkout.paid","checkout.expired","checkout.refunded","occurrence.sold_out","provider.readiness_changed","product.purchased","product.refunded","ping"]},"api_version":{"type":"string","enum":["2026-11-12"]},"created":{"type":"string","format":"date-time"},"organization_id":{"type":"string"},"data":{"type":"object","properties":{"object":{"oneOf":[{"$ref":"#/components/schemas/BookingObject"},{"$ref":"#/components/schemas/CheckoutObject"},{"$ref":"#/components/schemas/OccurrenceObject"},{"$ref":"#/components/schemas/ProviderReadinessEventObject"},{"$ref":"#/components/schemas/ProductOrderObject"}],"description":"A ping event carries an empty object."}},"required":["object"]}},"required":["id","type","api_version","created","organization_id","data"],"description":"The same body your endpoint receives, signed there with the Talkspresso-Signature header (t=<unix seconds>,v1=<hex>). Events appear in this feed about 30 seconds after they happen. Payloads are kept for 90 days."},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"},"description":"Empty means every event type."},"status":{"type":"string"},"disabled_reason":{"type":["string","null"]},"consecutive_failures":{"type":"integer"},"last_success_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}},"required":["id","url","events","status","consecutive_failures","created_at"],"description":"Read only. Endpoints and secrets are created and changed by Talkspresso on request; no key can do it."},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string"},"event_id":{"type":"string"},"endpoint_id":{"type":"string"},"status":{"type":"string","enum":["pending","delivered","abandoned"]},"attempts":{"type":"integer"},"next_attempt_at":{"type":["string","null"],"format":"date-time"},"last_status_code":{"type":["integer","null"]},"last_error_class":{"type":["string","null"]},"duration_ms":{"type":["integer","null"]},"delivered_at":{"type":["string","null"],"format":"date-time"},"replays":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"}},"required":["id","event_id","endpoint_id","status","attempts","replays"]},"PartnerSettings":{"type":"object","properties":{"partner_access":{"type":"boolean"},"viewer_can_edit":{"type":"boolean","description":"Always false for a key."},"settings":{"type":"object","properties":{"surface":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: headless, subdomain."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"listing":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: invite_only, approval."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"money":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: coach_direct, org_collects."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"buyer":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: guest."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"notifications":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: talkspresso, branded, partner."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"video":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: page, iframe."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"data":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: partner_created."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]},"compliance":{"type":"object","properties":{"value":{"type":"string","description":"What is set. Built values: adults_only."},"effective":{"type":"string","description":"What actually happens today."},"source":{"type":"string","enum":["default","set"]},"set_by":{"type":"string","description":"you or talkspresso."},"editable_by_you":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"available":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["value","available"]}}},"required":["value","effective","source","set_by","editable_by_you","options"]}},"required":["surface","listing","money","buyer","notifications","video","data","compliance"],"description":"One entry per switch: surface, listing, money, buyer, notifications, video, data, compliance."},"channel_fee":{"type":"object","properties":{"percent":{"type":["number","null"]},"set_by":{"type":"string"}}},"lists":{"type":"object","properties":{"return_hosts":{"type":"array","items":{"type":"string"}},"allowed_sites":{"type":"array","items":{"type":"string"}}}},"identity":{"type":"object","properties":{"contact_email_set":{"type":"boolean"},"support_email_set":{"type":"boolean"}}},"clearances":{"type":"object","properties":{},"additionalProperties":{"type":"boolean"},"description":"Which agreement and test clearances stand, by name. No dates or references."},"checklist":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"item":{"type":"string"},"status":{"type":"string","description":"done, todo, blocked or not_applicable."},"why":{"type":"string","description":"Plain words: what is open and what unblocks it."},"who":{"type":"string","description":"Who does it: talkspresso, org_admin or partner."},"gate":{"type":"string","description":"key (needed for a key) or live (needed to go live)."}},"required":["id","item","status","why","who","gate"]}},"summary":{"type":"object","properties":{"ready_for_key":{"type":"boolean"},"ready_to_go_live":{"type":"boolean"},"sandbox":{"type":"boolean"},"open_items":{"type":"integer"},"blocked_items":{"type":"integer"}},"required":["ready_for_key","ready_to_go_live","sandbox","open_items","blocked_items"]}},"required":["items","summary"]},"last_changes":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"by":{"type":"string","description":"A role label such as Owner or Admin, or Talkspresso. Never a person's name."}},"required":["at","by"]}},"is_partner":{"type":"boolean"}},"required":["settings","checklist"],"description":"Never contains secrets, payee ids, clearance dates or a person's name."},"Organization":{"type":"object","properties":{"id":{},"name":{},"slug":{},"custom_domain":{},"logo_url":{},"icon_url":{},"favicon_url":{},"primary_color":{},"secondary_color":{},"accent_color":{},"tagline":{},"description":{},"hero_image_url":{},"hero_title":{},"hero_subtitle":{},"member_term_singular":{},"member_term_plural":{},"session_term":{},"session_term_plural":{},"locale":{},"is_active":{"type":"boolean"},"is_public":{"type":"boolean"},"require_member_approval":{"type":"boolean"},"allow_member_applications":{"type":"boolean"},"default_category":{},"show_free_label":{"type":"boolean"},"payments_enabled":{"type":"boolean"},"noindex":{"type":"boolean"},"website_url":{},"social_links":{"type":"object","properties":{},"additionalProperties":{"type":"string"}},"browse_rows":{},"total_members":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"What a key may read of an organization. Fees, rates, payee, secrets and contact emails are never returned to a key. Fields not typed here come back as strings or null."},"OrganizationUpdate":{"type":"object","properties":{"logo_url":{"type":["string","null"],"description":"https URL, up to 255 characters. null clears it."},"icon_url":{"type":["string","null"],"description":"https URL, up to 255 characters. null clears it."},"primary_color":{"type":["string","null"],"description":"#rrggbb. null clears it.","pattern":"^#[0-9a-fA-F]{6}$"},"secondary_color":{"type":["string","null"],"description":"#rrggbb. null clears it.","pattern":"^#[0-9a-fA-F]{6}$"},"accent_color":{"type":["string","null"],"description":"#rrggbb. null clears it.","pattern":"^#[0-9a-fA-F]{6}$"},"tagline":{"type":["string","null"],"description":"null clears it."},"description":{"type":["string","null"],"description":"null clears it."},"hero_image_url":{"type":["string","null"],"description":"https URL, up to 255 characters. null clears it."},"hero_title":{"type":["string","null"],"description":"null clears it."},"hero_subtitle":{"type":["string","null"],"description":"null clears it."},"member_term_singular":{"type":["string","null"],"description":"null clears it."},"member_term_plural":{"type":["string","null"],"description":"null clears it."},"session_term":{"type":["string","null"],"description":"null clears it."},"session_term_plural":{"type":["string","null"],"description":"null clears it."},"website_url":{"type":["string","null"],"description":"https URL, up to 255 characters. null clears it."},"social_links":{"type":"object","properties":{"twitter":{"type":"string","description":"https URL."},"linkedin":{"type":"string","description":"https URL."},"instagram":{"type":"string","description":"https URL."},"facebook":{"type":"string","description":"https URL."},"youtube":{"type":"string","description":"https URL."},"tiktok":{"type":"string","description":"https URL."}},"additionalProperties":false,"description":"At most 10 entries."},"default_category":{"type":["string","null"],"description":"null clears it."},"browse_rows":{"type":["string","null"],"description":"null clears it."}},"additionalProperties":false,"description":"Branding and copy only. Any other field (name, slug, locale, is_active, payments_enabled, revenue_share_percent, contact emails and so on) is refused with 400 field_not_allowed_for_keys, naming the fields; nothing is saved. Text limits: tagline 160, description 2000, hero_title 160, hero_subtitle 400, the four term fields 40, default_category 80."},"OrganizationMember":{"type":"object","properties":{"id":{"type":"string","description":"The membership id. Not the user id."},"organization_id":{"type":"string"},"user_id":{"type":"string"},"membership_type":{"type":"string"},"is_featured":{"type":"boolean"},"sort_order":{"type":"integer"},"member_title":{"type":["string","null"]},"member_bio":{"type":["string","null"]},"hide_price":{"type":"boolean"},"status":{"type":"string"},"total_sessions":{"type":"integer"},"user":{"type":"object","description":"The member's user record (public fields)."},"roster":{"type":"object"}},"required":["id","organization_id","user_id","status"],"additionalProperties":true},"MemberUpdate":{"type":"object","properties":{"member_title":{"type":["string","null"]},"member_bio":{"type":["string","null"]},"is_featured":{"type":"boolean"},"sort_order":{"type":"integer"}},"additionalProperties":false,"description":"A key may not change status (approve or suspend a member): that is refused with 400 field_not_allowed_for_keys."},"ProviderReadiness":{"type":"object","properties":{"profile":{"type":"boolean","description":"The coach's account is verified and has a name."},"services":{"type":"integer","description":"How many bookable services the coach has published."},"availability":{"type":"boolean","description":"The coach has times a buyer can book (a weekly or dated calendar, or an open group session), and is not away."},"payout_connected":{"type":"boolean","description":"A buyer can pay this coach. A bare yes or no: nothing about why."},"consent":{"type":"boolean","description":"The coach has accepted the organization's current listing terms."},"bookable":{"type":"boolean","description":"The same decision POST /bookings and POST /checkouts make about this coach."},"blocking":{"type":"array","items":{"type":"string","enum":["profile_incomplete","no_service","no_availability","payout_not_ready","consent_missing","share_unset","not_listed","unavailable"]},"description":"Why bookable is false, from this closed list. Any hold Talkspresso has placed on a coach, however it arose, reads as unavailable and nothing more."}},"required":["profile","services","availability","payout_connected","consent","bookable","blocking"]},"ProviderReadinessResponse":{"type":"object","properties":{"provider_id":{"type":"string"},"profile":{"type":"boolean","description":"The coach's account is verified and has a name."},"services":{"type":"integer","description":"How many bookable services the coach has published."},"availability":{"type":"boolean","description":"The coach has times a buyer can book (a weekly or dated calendar, or an open group session), and is not away."},"payout_connected":{"type":"boolean","description":"A buyer can pay this coach. A bare yes or no: nothing about why."},"consent":{"type":"boolean","description":"The coach has accepted the organization's current listing terms."},"bookable":{"type":"boolean","description":"The same decision POST /bookings and POST /checkouts make about this coach."},"blocking":{"type":"array","items":{"type":"string","enum":["profile_incomplete","no_service","no_availability","payout_not_ready","consent_missing","share_unset","not_listed","unavailable"]},"description":"Why bookable is false, from this closed list. Any hold Talkspresso has placed on a coach, however it arose, reads as unavailable and nothing more."}},"required":["provider_id","profile","services","availability","payout_connected","consent","bookable","blocking"]},"ProviderReadinessEventObject":{"type":"object","properties":{"object":{"type":"string","enum":["provider_readiness"]},"provider_id":{"type":"string"},"bookable":{"type":"boolean"},"previous_bookable":{"type":"boolean"},"blocking":{"type":"array","items":{"type":"string","enum":["profile_incomplete","no_service","no_availability","payout_not_ready","consent_missing","share_unset","not_listed","unavailable"]}},"changed_at":{"type":"string","format":"date-time"}},"required":["object","provider_id","bookable","previous_bookable","blocking","changed_at"],"description":"data.object of a provider.readiness_changed event. Sent when bookable changes, at most once per coach per 10 minutes. No name, email, price or payout detail."},"TemplateError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"current_version":{"type":"integer"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"description":"The template routes use the partner error envelope (code and message), not the older text-only shape."},"Template":{"type":"object","properties":{"id":{"type":"string"},"organization_id":{"type":"string"},"title":{"type":"string","maxLength":120},"short_description":{"type":"string","maxLength":300},"long_description":{"type":"string","maxLength":4000},"duration_minutes":{"type":"integer","minimum":5,"maximum":480},"price_cents":{"type":"integer","description":"Whole US cents. 0 (free) or 100 to 500000."},"currency":{"type":"string","description":"Always USD.","enum":["USD"]},"capacity_type":{"type":"string","description":"One-on-one only for now.","enum":["one_on_one"]},"intake_questions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","maxLength":200},"type":{"type":"string","enum":["text","textarea","select","multiselect","yes_no"]},"required":{"type":"boolean"},"options":{"type":"array","items":{"type":"string","maxLength":80},"minItems":2,"maxItems":10,"description":"select and multiselect only."},"max_length":{"type":"integer","description":"text and textarea only."}},"required":["text","type"]},"maxItems":8,"description":"Question definitions. Each teacher who adopts the template gets their own copies; ids of anyone's questions are never accepted."},"price_locked":{"type":"boolean","description":"When true, a teacher who adopts this version cannot change the price or length of the service. The lock never stops them unpublishing, deleting or leaving."},"is_active":{"type":"boolean","description":"Inactive templates are not offered to new teachers."},"version":{"type":"integer","description":"Starts at 1. Any change to the text, price, length, lock or questions adds 1 and gives every teacher who adopted an earlier version an update to accept. Their live service does not change until they accept."},"created_by":{"type":"string","enum":["admin","api_key"]},"adopters":{"type":"object","properties":{"count":{"type":"integer"},"update_pending_count":{"type":"integer"}},"required":["count","update_pending_count"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","title","duration_minutes","price_cents","currency","price_locked","is_active","version"],"description":"A lesson the organization defines. It is not a service and nobody can book it. A teacher turns it into their own service by adopting it."},"TemplateDetail":{"type":"object","properties":{"id":{"type":"string"},"organization_id":{"type":"string"},"title":{"type":"string","maxLength":120},"short_description":{"type":"string","maxLength":300},"long_description":{"type":"string","maxLength":4000},"duration_minutes":{"type":"integer","minimum":5,"maximum":480},"price_cents":{"type":"integer","description":"Whole US cents. 0 (free) or 100 to 500000."},"currency":{"type":"string","description":"Always USD.","enum":["USD"]},"capacity_type":{"type":"string","description":"One-on-one only for now.","enum":["one_on_one"]},"intake_questions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","maxLength":200},"type":{"type":"string","enum":["text","textarea","select","multiselect","yes_no"]},"required":{"type":"boolean"},"options":{"type":"array","items":{"type":"string","maxLength":80},"minItems":2,"maxItems":10,"description":"select and multiselect only."},"max_length":{"type":"integer","description":"text and textarea only."}},"required":["text","type"]},"maxItems":8,"description":"Question definitions. Each teacher who adopts the template gets their own copies; ids of anyone's questions are never accepted."},"price_locked":{"type":"boolean","description":"When true, a teacher who adopts this version cannot change the price or length of the service. The lock never stops them unpublishing, deleting or leaving."},"is_active":{"type":"boolean","description":"Inactive templates are not offered to new teachers."},"version":{"type":"integer"},"created_by":{"type":"string","enum":["admin","api_key"]},"adopters":{"type":"object","properties":{"count":{"type":"integer"},"update_pending_count":{"type":"integer"}},"required":["count","update_pending_count"]},"versions":{"type":"array","items":{"type":"object","properties":{"version":{"type":"integer"},"title":{"type":"string"},"duration_minutes":{"type":"integer"},"price_cents":{"type":"integer"},"price_locked":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}},"required":["version","price_cents"]}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","version","versions"]},"TemplateWrite":{"type":"object","properties":{"title":{"type":"string","maxLength":120},"short_description":{"type":"string","maxLength":300},"long_description":{"type":"string","maxLength":4000},"duration_minutes":{"type":"integer","minimum":5,"maximum":480},"price_cents":{"type":"integer","description":"Whole US cents. 0 (free) or 100 to 500000."},"currency":{"type":"string","description":"Always USD.","enum":["USD"]},"capacity_type":{"type":"string","description":"One-on-one only for now.","enum":["one_on_one"]},"intake_questions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","maxLength":200},"type":{"type":"string","enum":["text","textarea","select","multiselect","yes_no"]},"required":{"type":"boolean"},"options":{"type":"array","items":{"type":"string","maxLength":80},"minItems":2,"maxItems":10,"description":"select and multiselect only."},"max_length":{"type":"integer","description":"text and textarea only."}},"required":["text","type"]},"maxItems":8,"description":"Question definitions. Each teacher who adopts the template gets their own copies; ids of anyone's questions are never accepted."},"price_locked":{"type":"boolean","description":"When true, a teacher who adopts this version cannot change the price or length of the service. The lock never stops them unpublishing, deleting or leaving."},"is_active":{"type":"boolean","description":"Inactive templates are not offered to new teachers."},"expected_version":{"type":"integer","description":"Updates only. Refused with 409 version_conflict when it is not the current version."}},"additionalProperties":false,"description":"title, duration_minutes and price_cents are required to create. Plain text only: markup and links are refused. Any other field (a webinar flag, group capacity, pay-what-you-can, a meeting link, ids) is refused with 400 validation_failed naming it."},"TemplateAdopters":{"type":"object","properties":{"count":{"type":"integer"},"update_pending_count":{"type":"integer"},"adopters":{"type":"array","items":{"type":"object","properties":{"provider_id":{"type":"string"},"adopted_version":{"type":"integer"},"update_pending":{"type":"boolean"}},"required":["provider_id","adopted_version","update_pending"]}}},"required":["count","update_pending_count","adopters"],"description":"Only coaches who are approved, hold a current consent and still offer the service. Nothing about their service, price or account."},"InvitationRequest":{"type":"object","properties":{"email":{"type":"string","description":"Required. A valid email address.","format":"email"},"name":{"type":"string"},"member_title":{"type":"string"},"template_ids":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Partner organizations only. Ids of this organization's active templates. The teacher sees them on the accept screen and chooses which to offer."},"message":{"type":"string","description":"Partner organizations only. Plain text, up to 500 characters, no links or markup. Shown to the invitee under a fixed 'A message from' label.","maxLength":500},"send_email":{"type":"boolean","description":"Partner organizations only. Asks for the invitation email to be sent in the organization's notification mode, if the platform's invitation email switch is on. Default false."}},"required":["email"],"description":"template_ids, message and send_email also need the org:write scope on the key itself (not just a legacy key)."},"Invitation":{"type":"object","properties":{"id":{"type":"string"},"organization_id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"member_title":{"type":["string","null"]},"status":{"type":"string"},"invite_token":{"type":"string","description":"A bearer join link token: treat it as a secret."}},"required":["id","organization_id","email"],"additionalProperties":true,"description":"Creating an invitation through the API does not send an email unless send_email is true and the platform's invitation email switch is on. A key sends at most 20 invitations a day. template_ids and message come back as sent."},"HostedResolveRequest":{"type":"object","properties":{"token":{"type":"string","description":"The signed checkout token from the hosted checkout URL."}},"required":["token"]},"HostedResolveResponse":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","description":"open, paid, expired or cancelled; for a group session also pending (payment received, seat being written), refunded (payment returned in full) and paid_no_seat (payment received, no seat, a person has it). Show the pay button only for open. Say the buyer is booked ONLY for paid.","enum":["open","paid","expired","cancelled","pending","refunded","paid_no_seat"]},"expires_at":{"type":"string","format":"date-time"},"organization":{"type":"object","properties":{"name":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"primary_color":{"type":["string","null"]}}},"provider":{"type":"object","properties":{"name":{"type":["string","null"]},"handle":{"type":["string","null"]},"photo_url":{"type":["string","null"]}}},"service":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]},"duration_minutes":{"type":"integer"},"price_cents":{"type":"integer"},"currency":{"type":"string"}}},"slot_start":{"type":"string","format":"date-time"},"kind":{"type":"string","description":"one_on_one or group (a seat).","enum":["one_on_one","group"]},"payment_mode":{"type":"string","description":"Who receives the payment, for the page's wording only: org_collects (the organization) or coach_direct (the coach). Never a fee, share or account.","enum":["coach_direct","org_collects"]},"run_end":{"type":"string","description":"Group only: when the run ends.","format":"date-time"},"session_count":{"type":"integer","description":"Group only."},"buyer":{"type":"object","properties":{"first_name":{"type":["string","null"]},"email_masked":{"type":"string"}}},"has_return_url":{"type":"boolean"}},"required":["id","status"]},"HostedProductOrderRequest":{"type":"object","properties":{"token":{"type":"string","description":"The signed token from the hosted product checkout URL."},"payment_source":{"type":"string","description":"card or wallet: the funnel the buyer chose. Absent means wallet.","enum":["card","wallet"]},"turnstileToken":{"type":["string","null"],"description":"The Turnstile token, card funnel only."},"turnstile_token":{"type":["string","null"],"description":"Same, alternate spelling."}},"required":["token"],"additionalProperties":false,"description":"Nothing else is accepted: the product, the price, the buyer and the fee all come from the checkout."},"HostedProductOrderResponse":{"type":"object","properties":{"order_id":{"type":"string","description":"The PayPal order id for the hosted page's PayPal buttons or card fields."},"payment_method":{"type":"string","enum":["paypal"]},"rail":{"type":"string","enum":["connected"]},"provider_merchant_id":{"type":"string"},"amount":{"type":"number","description":"Dollars."},"intent_token":{"type":"string","description":"Sent back with the capture call. Never shown or logged."}},"required":["order_id","payment_method","rail","provider_merchant_id","amount","intent_token"]},"HostedProductResolveResponse":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["product"]},"status":{"type":"string","enum":["awaiting_payment","paid","partially_refunded","refunded","expired"]},"expires_at":{"type":"string","format":"date-time"},"organization":{"type":"object","properties":{"name":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"primary_color":{"type":["string","null"]}}},"provider":{"type":"object","properties":{"name":{"type":["string","null"]},"handle":{"type":["string","null"]},"photo_url":{"type":["string","null"]}}},"product":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]},"short_description":{"type":["string","null"]},"thumbnail":{"type":["string","null"]},"product_type":{"type":["string","null"]},"price_cents":{"type":"integer"},"currency":{"type":"string"}}},"buyer":{"type":"object","properties":{"first_name":{"type":["string","null"]},"email_masked":{"type":"string"}}},"delivery":{"type":"object","properties":{"method":{"type":"string","enum":["email"]}}},"has_return_url":{"type":"boolean"}},"required":["id","kind","status"]},"HostedReturnResponse":{"type":"object","properties":{"redirect_url":{"type":["string","null"],"description":"Where to send the buyer, or null when there is no valid return address."},"status":{"type":"string","description":"paid or cancelled; for a group session also pending, refunded and paid_no_seat (see HostedResolveResponse). Only paid means the buyer holds a seat.","enum":["paid","cancelled","pending","refunded","paid_no_seat"]}},"required":["status"]}}}}