{"openapi":"3.1.0","info":{"title":"Phorest Europe (BYOK) API","version":"0.1.0","description":"Phorest Europe (BYOK) lets an AI assistant read your own Phorest Europe data through the Phorest Europe API with a key you supply (Phorest API username (starts with global/)). Read-only: 10 tools (list_branches, list_services, list_service_categories, list_service_packages, list_special_offers, list_products, list_appointments, list_reviews, list_courses, list_tax_rates). The BYOK key travels...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-phorest-eu.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-phorest-eu/docs"},"termsOfService":"https://connectorbay.com/byok-phorest-eu/terms"},"servers":[{"url":"https://byok-phorest-eu.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-phorest-eu/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/list_branches":{"post":{"operationId":"list_branches","summary":"List the salon branches of a business with name, time zone, address, currency and branch id. Use for \"Which branches doe","description":"List the salon branches of a business with name, time zone, address, currency and branch id. Use for \"Which branches does my Phorest business have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id"],"title":"list_branchesArguments","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 services of one branch with name, category, duration, price, online-booking flags and archived flag. Use for \"W","description":"List the services of one branch with name, category, duration, price, online-booking flags and archived flag. Use for \"What services and prices does this branch offer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"category_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only services of this service category id.","title":"Category Id"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include archived services.","title":"Include Archived"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"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_service_categories":{"post":{"operationId":"list_service_categories","summary":"List the service categories of one branch with name, description and colour. Use for \"What service categories does this ","description":"List the service categories of one branch with name, description and colour. Use for \"What service categories does this branch use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_service_categoriesArguments","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_service_packages":{"post":{"operationId":"list_service_packages","summary":"List the service packages (bundles of services sold together) of one branch. Use for \"Which service packages does this b","description":"List the service packages (bundles of services sold together) of one branch. Use for \"Which service packages does this branch sell\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"category_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only packages of this service category id.","title":"Category Id"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_service_packagesArguments","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_special_offers":{"post":{"operationId":"list_special_offers","summary":"List the service special offers of one branch. Use for \"Which special offers are running at this branch\".","description":"List the service special offers of one branch. Use for \"Which special offers are running at this branch\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"category_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only offers of this service category id.","title":"Category Id"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_special_offersArguments","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_products":{"post":{"operationId":"list_products","summary":"List the retail products of one branch with brand, category, price, barcode and quantity in stock; can show only low or ","description":"List the retail products of one branch with brand, category, price, barcode and quantity in stock; can show only low or out-of-stock items. Use for \"Which products are low on stock at this branch\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"search_query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Search products by name or barcode.","title":"Search Query"},"low_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list only products that are low in stock.","title":"Low Stock"},"out_of_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list only products that are out of stock.","title":"Out Of Stock"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_productsArguments","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 of one branch in a date range (at most one month) with service, staff, times, price, state and activat","description":"List appointments of one branch in a date range (at most one month) with service, staff, times, price, state and activation state; client names are not included. Use for \"What appointments are booked at this branch next week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"from_date":{"description":"First day to include, YYYY-MM-DD.","maxLength":10,"title":"From Date","type":"string"},"to_date":{"description":"Last day to include (inclusive), YYYY-MM-DD; at most one month after from_date.","maxLength":10,"title":"To Date","type":"string"},"staff_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only appointments of this staff member id.","title":"Staff Id"},"fetch_canceled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include canceled appointments.","title":"Fetch Canceled"},"sort":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Sort as property,direction, for example appointmentDate,desc (properties: appointmentDate, creationDate).","title":"Sort"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id","from_date","to_date"],"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_reviews":{"post":{"operationId":"list_reviews","summary":"List client reviews of one branch with rating, text, review and visit dates, the client's name and the staff member revi","description":"List client reviews of one branch with rating, text, review and visit dates, the client's name and the staff member reviewed. Use for \"What reviews has this branch received lately\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"staff_name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only reviews of staff whose first name or surname matches.","title":"Staff Name"},"review_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only reviews written on this date, YYYY-MM-DD.","title":"Review Date"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_reviewsArguments","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_courses":{"post":{"operationId":"list_courses","summary":"List the courses (multi-visit treatment plans) of one branch with name, price and spacing rules. Use for \"Which treatmen","description":"List the courses (multi-visit treatment plans) of one branch with name, price and spacing rules. Use for \"Which treatment courses does this branch offer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include archived courses.","title":"Include Archived"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_coursesArguments","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_tax_rates":{"post":{"operationId":"list_tax_rates","summary":"List the tax rates configured for one branch, for services and products. Use for \"Which tax rates does this branch use\".","description":"List the tax rates configured for one branch, for services and products. Use for \"Which tax rates does this branch use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"business_id":{"description":"Phorest business id (the businessId given with your API access).","maxLength":200,"title":"Business Id","type":"string"},"branch_id":{"description":"Branch id of the salon location (see list_branches).","maxLength":200,"title":"Branch Id","type":"string"},"size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (1 to 50, default 20).","title":"Size"},"page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["business_id","branch_id"],"title":"list_tax_ratesArguments","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}}}}