{"openapi":"3.1.0","info":{"title":"splose (BYOK) API","version":"0.1.0","description":"splose (BYOK) lets an AI assistant read your own splose data through the splose API with a key you supply (splose API key). Read-only: 12 tools (get_api_key_owner, list_services, list_locations, list_practitioners, list_appointments, list_invoices, list_payments, list_credit_notes, list_payment_methods, list_cancellation_reasons, list_busy_times, get_practitioner_availability). The BYOK key...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-splose.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-splose/docs"},"termsOfService":"https://connectorbay.com/byok-splose/terms"},"servers":[{"url":"https://byok-splose.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-splose/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_api_key_owner":{"post":{"operationId":"get_api_key_owner","summary":"Show which splose organisation and practitioner the API key belongs to and when the key expires. Use for \"Which splose w","description":"Show which splose organisation and practitioner the API key belongs to and when the key expires. Use for \"Which splose workspace is my API key connected to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_api_key_ownerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_services":{"post":{"operationId":"list_services","summary":"List the practice's services (appointment types and support activities) with type, code, duration, price, group size and","description":"List the practice's services (appointment types and support activities) with type, code, duration, price, group size and tags. Use for \"What services does my splose practice offer and what do they cost\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only services whose name matches.","title":"Name"},"service_tag":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only services with this tag, for example NDIS.","title":"Service Tag"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_servicesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_locations":{"post":{"operationId":"list_locations","summary":"List the practice's locations with address, phone, timezone and whether online booking is on. Use for \"Which locations d","description":"List the practice's locations with address, phone, timezone and whether online booking is on. Use for \"Which locations does my splose practice have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"title":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only locations whose title matches.","title":"Title"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_locationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_practitioners":{"post":{"operationId":"list_practitioners","summary":"List practitioners (staff) with profession, role, active flag and timezone. Contact details and provider numbers are not","description":"List practitioners (staff) with profession, role, active flag and timezone. Contact details and provider numbers are not returned. Use for \"Which practitioners are active in my splose practice\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"is_active":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Only active ('true') or inactive ('false') practitioners.","title":"Is Active"},"role_name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only practitioners with this role name.","title":"Role Name"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_practitionersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_appointments":{"post":{"operationId":"list_appointments","summary":"List appointments (time, service, location, practitioner, price, group size) without patient details, optionally limited","description":"List appointments (time, service, location, practitioner, price, group size) without patient details, optionally limited to a period or practitioner. Use for \"What appointments are booked at my splose practice next week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"start_gt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only appointments starting after this UTC date or time.","title":"Start Gt"},"start_lt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only appointments starting before this UTC date or time.","title":"Start Lt"},"practitioner_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only items for this practitioner id.","title":"Practitioner Id"},"update_gt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only objects updated after this UTC date or time, for example 2026-01-01 or 2026-01-01T00:00:00Z.","title":"Update Gt"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_appointmentsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_invoices":{"post":{"operationId":"list_invoices","summary":"List invoices with number, dates, location, practitioner, subtotal, tax, total, paid amount and status. Patient and cont","description":"List invoices with number, dates, location, practitioner, subtotal, tax, total, paid amount and status. Patient and contact ids are not returned. Use for \"Which invoices are still awaiting payment at my splose practice\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"status":{"anyOf":[{"enum":["Draft","Awaiting Payment","Paid"],"type":"string"},{"type":"null"}],"default":null,"description":"Only invoices with this status: Draft, Awaiting Payment or Paid.","title":"Status"},"location_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only items for this location id.","title":"Location Id"},"practitioner_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only items for this practitioner id.","title":"Practitioner Id"},"update_gt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only objects updated after this UTC date or time, for example 2026-01-01 or 2026-01-01T00:00:00Z.","title":"Update Gt"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_invoicesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_payments":{"post":{"operationId":"list_payments","summary":"List payments received with number, amount, date, location and payment method id. Patient ids are not returned. Use for ","description":"List payments received with number, amount, date, location and payment method id. Patient ids are not returned. Use for \"What payments did my splose practice receive recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"location_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only items for this location id.","title":"Location Id"},"update_gt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only objects updated after this UTC date or time, for example 2026-01-01 or 2026-01-01T00:00:00Z.","title":"Update Gt"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_paymentsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_credit_notes":{"post":{"operationId":"list_credit_notes","summary":"List credit notes with number, linked invoice, subtotal, tax, total and sent status. Patient ids are not returned. Use f","description":"List credit notes with number, linked invoice, subtotal, tax, total and sent status. Patient ids are not returned. Use for \"Which credit notes have been issued by my splose practice\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"sent_status":{"anyOf":[{"enum":["Sent","Viewed"],"type":"string"},{"type":"null"}],"default":null,"description":"Only credit notes with this sent status: Sent or Viewed.","title":"Sent Status"},"practitioner_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only items for this practitioner id.","title":"Practitioner Id"},"update_gt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only objects updated after this UTC date or time, for example 2026-01-01 or 2026-01-01T00:00:00Z.","title":"Update Gt"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_credit_notesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_payment_methods":{"post":{"operationId":"list_payment_methods","summary":"List the payment methods configured in the practice (name and description). Use for \"Which payment methods are set up in","description":"List the payment methods configured in the practice (name and description). Use for \"Which payment methods are set up in my splose practice\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"}},"title":"list_payment_methodsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_cancellation_reasons":{"post":{"operationId":"list_cancellation_reasons","summary":"List the cancellation reasons that can be recorded against appointments. Use for \"What cancellation reasons does my splo","description":"List the cancellation reasons that can be recorded against appointments. Use for \"What cancellation reasons does my splose practice use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_cancellation_reasonsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_busy_times":{"post":{"operationId":"list_busy_times","summary":"List blocked-out busy times (start, end, location, practitioners, type) without notes. Use for \"When are my splose pract","description":"List blocked-out busy times (start, end, location, practitioners, type) without notes. Use for \"When are my splose practitioners blocked out\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id_gt":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return objects with an id greater than this value, to fetch the next page (use the highest id of the previous page).","title":"Id Gt"},"start_gt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only busy times starting after this UTC date or time.","title":"Start Gt"},"start_lt":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only busy times starting before this UTC date or time.","title":"Start Lt"},"practitioner_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only items for this practitioner id.","title":"Practitioner Id"},"include_archived":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to include archived objects: 'true' or 'false' (default false).","title":"Include Archived"}},"title":"list_busy_timesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_practitioner_availability":{"post":{"operationId":"get_practitioner_availability","summary":"List a practitioner's working availability (date, location, start and end time) for a period of at most 100 days. Use fo","description":"List a practitioner's working availability (date, location, start and end time) for a period of at most 100 days. Use for \"When is practitioner 12 available in January\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"practitioner_id":{"description":"Practitioner id.","minimum":1,"title":"Practitioner Id","type":"integer"},"start_date":{"description":"Start of the period (UTC), for example 2026-11-01T00:00:00.000Z.","maxLength":200,"title":"Start Date","type":"string"},"end_date":{"description":"End of the period (UTC), at most 100 days after the start.","maxLength":200,"title":"End Date","type":"string"},"location_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only availability at this location id.","title":"Location Id"}},"required":["practitioner_id","start_date","end_date"],"title":"get_practitioner_availabilityArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}