{"items":[{"type":"link","fsPath":"en/b2b-v3/quickstart.md","metadata":{"type":"markdown"},"label":"Quickstart","link":"/en/b2b-v3/quickstart","routeSlug":"/en/b2b-v3/quickstart"},{"type":"link","label":"Business Management","link":"/en/b2b-v3/openapi","routeSlug":"/en/b2b-v3/openapi"},{"type":"link","label":"Overview","link":"/en/b2b-v3/openapi/section/overview","routeSlug":"/en/b2b-v3/openapi/section/overview"},{"type":"group","label":"Authorization","link":"/en/b2b-v3/openapi/section/authorization","routeSlug":"/en/b2b-v3/openapi/section/authorization","items":[{"type":"link","label":"Client Credentials + ","link":"/en/b2b-v3/openapi/section/authorization/client-credentials-+","routeSlug":"/en/b2b-v3/openapi/section/authorization/client-credentials-+"},{"type":"link","label":"Authorization Code + PKCE (user-delegated)","link":"/en/b2b-v3/openapi/section/authorization/authorization-code-+-pkce-(user-delegated)","routeSlug":"/en/b2b-v3/openapi/section/authorization/authorization-code-+-pkce-(user-delegated)"},{"type":"link","label":"Restricted key (single-business integrations)","link":"/en/b2b-v3/openapi/section/authorization/restricted-key-(single-business-integrations)","routeSlug":"/en/b2b-v3/openapi/section/authorization/restricted-key-(single-business-integrations)"}]},{"type":"link","label":"Access model","link":"/en/b2b-v3/openapi/section/access-model","routeSlug":"/en/b2b-v3/openapi/section/access-model"},{"type":"link","label":"Conventions","link":"/en/b2b-v3/openapi/section/conventions","routeSlug":"/en/b2b-v3/openapi/section/conventions"},{"type":"link","label":"Errors","link":"/en/b2b-v3/openapi/section/errors","routeSlug":"/en/b2b-v3/openapi/section/errors"},{"type":"link","label":"Idempotency & concurrency","link":"/en/b2b-v3/openapi/section/idempotency-and-concurrency","routeSlug":"/en/b2b-v3/openapi/section/idempotency-and-concurrency"},{"type":"link","label":"PII & redaction","link":"/en/b2b-v3/openapi/section/pii-and-redaction","routeSlug":"/en/b2b-v3/openapi/section/pii-and-redaction"},{"type":"link","label":"HTTP negotiation and caching","link":"/en/b2b-v3/openapi/section/http-negotiation-and-caching","routeSlug":"/en/b2b-v3/openapi/section/http-negotiation-and-caching"},{"type":"separator","label":"Authorization"},{"type":"group","label":"Authorization","link":"/en/b2b-v3/openapi/authorization","routeSlug":"/en/b2b-v3/openapi/authorization","items":[{"label":"Get authorization server metadata","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/authorization/getoauthauthorizationservermetadata","routeSlug":"/en/b2b-v3/openapi/authorization/getoauthauthorizationservermetadata","metadata":{"seo":{"title":"Get authorization server metadata","description":"Machine-readable OAuth 2.0 authorization server metadata (RFC 8414): endpoint URLs, supported grant types, PKCE methods, and scopes. Agents and MCP hosts use this document to discover the authorization and token endpoints automatically."}},"httpPath":"/.well-known/oauth-authorization-server"},{"label":"Issue an access token","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/authorization/createoauthtoken","routeSlug":"/en/b2b-v3/openapi/authorization/createoauthtoken","metadata":{"seo":{"title":"Issue an access token","description":"OAuth 2.0 token endpoint (RFC 6749). Supports three grants:"}},"httpPath":"/oauth/token"},{"label":"Revoke a token","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/authorization/revokeoauthtoken","routeSlug":"/en/b2b-v3/openapi/authorization/revokeoauthtoken","metadata":{"seo":{"title":"Revoke a token","description":"OAuth 2.0 token revocation (RFC 7009). Revokes an access token or a refresh token;revoking a refresh token revokes its whole token family. The endpoint returns 200even when the token is already invalid, as required by the RFC."}},"httpPath":"/oauth/revoke"},{"label":"Register an OAuth client (DCR)","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/authorization/registeroauthclient","routeSlug":"/en/b2b-v3/openapi/authorization/registeroauthclient","metadata":{"seo":{"title":"Register an OAuth client (DCR)","description":"Minimal Dynamic Client Registration (RFC 7591) for MCP hosts and other clients thatare not pre-registered. Registration only issues a client_id — access to any datastill requires the user login/consent flow and granted scopes."}},"httpPath":"/oauth/register"},{"label":"List the resources the current token can access","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/authorization/listaccessibleresources","routeSlug":"/en/b2b-v3/openapi/authorization/listaccessibleresources","metadata":{"seo":{"title":"List the resources the current token can access","description":"Returns the resources this token is actually granted — not everything the user orapplication could reach. Each entry carries the scopes granted on that resource, so aclient knows which location_id to use in a path and which chain-level calls it may make."}},"httpPath":"/oauth/accessible-resources"}]},{"type":"separator","label":"Location Setup"},{"type":"group","label":"Locations","link":"/en/b2b-v3/openapi/locations","routeSlug":"/en/b2b-v3/openapi/locations","items":[{"label":"List cities","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/locations/listcities","routeSlug":"/en/b2b-v3/openapi/locations/listcities","metadata":{"seo":{"title":"List cities","description":"Cursor-paginated list. Default ordering: country_id, name, id tie-breaker. Cursors use the cursor query parameter, expire after 15 minutes, and are bound to the credential, tenant, and filters. Expired, malformed, or foreign cursors fail with 422 validation_failed using field codes expired_cursor, invalid_cursor, or foreign_cursor."}},"httpPath":"/reference/cities"},{"label":"List business types","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/locations/listbusinesstypes","routeSlug":"/en/b2b-v3/openapi/locations/listbusinesstypes","metadata":{"seo":{"title":"List business types","description":"Cursor-paginated list. Default ordering: title, id tie-breaker. Cursors use the cursor query parameter, expire after 15 minutes, and are bound to the credential, tenant, and filters. Expired, malformed, or foreign cursors fail with 422 validation_failed using field codes expired_cursor, invalid_cursor, or foreign_cursor."}},"httpPath":"/reference/business_types"},{"label":"Create a location","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/locations/createlocation","routeSlug":"/en/b2b-v3/openapi/locations/createlocation","metadata":{"seo":{"title":"Create a location","description":"Creates a standalone Location for the current authenticated user."}},"httpPath":"/locations"},{"label":"Get a location","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/locations/getlocation","routeSlug":"/en/b2b-v3/openapi/locations/getlocation","metadata":{"seo":{"title":"Get a location","description":"Returns the Location resource: name, address, contacts, timezone, andcurrency. The response carries an ETag header for a subsequent PATCH."}},"httpPath":"/locations/{location_id}"},{"label":"Update a location","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/locations/updatelocation","routeSlug":"/en/b2b-v3/openapi/locations/updatelocation","metadata":{"seo":{"title":"Update a location","description":"Partially updates partner-relevant Location settings with a merge-patch body.Requires If-Match with the ETag from a previous read."}},"httpPath":"/locations/{location_id}"}]},{"type":"group","label":"Services","link":"/en/b2b-v3/openapi/services","routeSlug":"/en/b2b-v3/openapi/services","items":[{"label":"List services","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/listservices","routeSlug":"/en/b2b-v3/openapi/services/listservices","metadata":{"seo":{"title":"List services","description":"Returns the services of the Location as a cursor-paginated list. Prices are integerminor units; duration_seconds is the default duration, and team_members[] carriesper-member price/duration overrides."}},"httpPath":"/locations/{location_id}/services"},{"label":"Create a service","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/createservice","routeSlug":"/en/b2b-v3/openapi/services/createservice","metadata":{"seo":{"title":"Create a service","description":"Creates a service in the Location catalog. Link Team Members inline throughteam_members[] — a service without at least one bookable Team Member link does notappear in availability search. Requires Idempotency-Key."}},"httpPath":"/locations/{location_id}/services"},{"label":"Get a service","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/getservice","routeSlug":"/en/b2b-v3/openapi/services/getservice","metadata":{"seo":{"title":"Get a service","description":"Returns a single service with its category, pricing, duration, Team Member links, andpackage components when type is package.The response carries an ETag header for a subsequent PATCH or DELETE."}},"httpPath":"/locations/{location_id}/services/{service_id}"},{"label":"Update a service","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/updateservice","routeSlug":"/en/b2b-v3/openapi/services/updateservice","metadata":{"seo":{"title":"Update a service","description":"Partially updates a service with a merge-patch body. team_members[], when present,replaces the full set of Team Member links (use [] to unlink everyone). type isimmutable; for package services, package.components replaces the full componentlist when present. Requires If-Match."}},"httpPath":"/locations/{location_id}/services/{service_id}"},{"label":"Delete a service","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/deleteservice","routeSlug":"/en/b2b-v3/openapi/services/deleteservice","metadata":{"seo":{"title":"Delete a service","description":"Deletes a service from the catalog. Requires If-Match with the version last seen."}},"httpPath":"/locations/{location_id}/services/{service_id}"},{"label":"List service categories","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/listservicecategories","routeSlug":"/en/b2b-v3/openapi/services/listservicecategories","metadata":{"seo":{"title":"List service categories","description":"Returns the service categories of the Location. Use a category id as category_idwhen creating services."}},"httpPath":"/locations/{location_id}/service_categories"},{"label":"Create a service category","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/createservicecategory","routeSlug":"/en/b2b-v3/openapi/services/createservicecategory","metadata":{"seo":{"title":"Create a service category","description":"Creates a service category. Requires Idempotency-Key. The 201 response carries anETag header for subsequent updates."}},"httpPath":"/locations/{location_id}/service_categories"},{"label":"Update a service category","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/updateservicecategory","routeSlug":"/en/b2b-v3/openapi/services/updateservicecategory","metadata":{"seo":{"title":"Update a service category","description":"Partially updates a service category with a merge-patch body. Requires If-Match."}},"httpPath":"/locations/{location_id}/service_categories/{service_category_id}"},{"label":"Delete a service category","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/services/deleteservicecategory","routeSlug":"/en/b2b-v3/openapi/services/deleteservicecategory","metadata":{"seo":{"title":"Delete a service category","description":"Deletes a service category. Requires If-Match with the version last seen."}},"httpPath":"/locations/{location_id}/service_categories/{service_category_id}"}]},{"type":"group","label":"Products","link":"/en/b2b-v3/openapi/products","routeSlug":"/en/b2b-v3/openapi/products","items":[{"label":"List products","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/products/listproducts","routeSlug":"/en/b2b-v3/openapi/products/listproducts","metadata":{"seo":{"title":"List products","description":"Returns the minimal product catalog fields available in P0: id, title,price_minor, and unit. Inventory levels, balances, cost, and standalone productsales are not part of the preview scope."}},"httpPath":"/locations/{location_id}/products"}]},{"type":"group","label":"Team Members","link":"/en/b2b-v3/openapi/team-members","routeSlug":"/en/b2b-v3/openapi/team-members","items":[{"label":"List team members","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/listteammembers","routeSlug":"/en/b2b-v3/openapi/team-members/listteammembers","metadata":{"seo":{"title":"List team members","description":"Returns the Team Members of the Location as a cursor-paginated list. The baserepresentation contains name, position, and bookable services; Team Member personalcontact data is not exposed in the preview scope."}},"httpPath":"/locations/{location_id}/team_members"},{"label":"Create a team member","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/createteammember","routeSlug":"/en/b2b-v3/openapi/team-members/createteammember","metadata":{"seo":{"title":"Create a team member","description":"Creates a Team Member in the Location. After creating, set the working schedule(PATCH .../schedule) and link services — otherwise the member does not appear inavailability search. Requires Idempotency-Key."}},"httpPath":"/locations/{location_id}/team_members"},{"label":"Get a team member","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/getteammember","routeSlug":"/en/b2b-v3/openapi/team-members/getteammember","metadata":{"seo":{"title":"Get a team member","description":"Returns a single Team Member. The response carries an ETag header for a subsequentPATCH or DELETE."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}"},{"label":"Update a team member","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/updateteammember","routeSlug":"/en/b2b-v3/openapi/team-members/updateteammember","metadata":{"seo":{"title":"Update a team member","description":"Partially updates a Team Member with a merge-patch body. services, when present,replaces the full set of bookable service links; each link is keyed by service_id andcarries the same override fields as on Service. Missing services leaves links unchanged,services: [] unlinks every service, and null override fields inherit the Servicedefault. Requires If-Match; changing links moves the ETag on both the Team Member andaffected Service resources."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}"},{"label":"Delete a team member","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/deleteteammember","routeSlug":"/en/b2b-v3/openapi/team-members/deleteteammember","metadata":{"seo":{"title":"Delete a team member","description":"Removes a Team Member from the Location. Requires If-Match with the version lastseen."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}"},{"label":"Get a team member's schedule","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/getteammemberschedule","routeSlug":"/en/b2b-v3/openapi/team-members/getteammemberschedule","metadata":{"seo":{"title":"Get a team member's schedule","description":"Returns the configured working schedule of a Team Member for a date range — thedays and working slots set by the business. This is not availability: free bookableslots come from GET /locations/{location_id}/availability."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}/schedule"},{"label":"Update a team member's schedule","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/updateteammemberschedule","routeSlug":"/en/b2b-v3/openapi/team-members/updateteammemberschedule","metadata":{"seo":{"title":"Update a team member's schedule","description":"Updates the working schedule as a merge-patch map keyed by date: each key is aYYYY-MM-DD date, the value sets the working slots of that day, and null clears theday. Dates absent from the body are left unchanged. Times are wall-clock HH:MM inthe Location's timezone. Requires If-Match with the ETag from the schedule read."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}/schedule"},{"label":"List location access roles","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/listlocationaccessroles","routeSlug":"/en/b2b-v3/openapi/team-members/listlocationaccessroles","metadata":{"seo":{"title":"List location access roles","description":"Returns public role ids and titles only; internal permission slugs are never exposed."}},"httpPath":"/locations/{location_id}/access_roles"},{"label":"Get team member access","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/getteammemberaccess","routeSlug":"/en/b2b-v3/openapi/team-members/getteammemberaccess","metadata":{"seo":{"title":"Get team member access","description":"Returns current system-access status for a Team Member: none, invited, or active, plus public role_id and pending invitation timestamps. The response carries a strong ETag for a subsequent access PATCH."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}/access"},{"label":"Update team member access","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/updateteammemberaccess","routeSlug":"/en/b2b-v3/openapi/team-members/updateteammemberaccess","metadata":{"seo":{"title":"Update team member access","description":"Merge-patch access settings. Only role_id is mutable; unavailable roles fail with 422 role_not_assignable. Requires If-Match with the ETag from getTeamMemberAccess (or a prior successful write)."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}/access"},{"label":"Revoke team member access","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/revoketeammemberaccess","routeSlug":"/en/b2b-v3/openapi/team-members/revoketeammemberaccess","metadata":{"seo":{"title":"Revoke team member access","description":"Revokes pending or active system access and returns the Team Member to none; the Team Member record is not deleted. The last location owner cannot be revoked (409 last_location_owner). Requires Idempotency-Key. The 200 response carries a fresh access ETag."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}/access"},{"label":"Send team member invitation","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/team-members/sendteammemberinvitation","routeSlug":"/en/b2b-v3/openapi/team-members/sendteammemberinvitation","metadata":{"seo":{"title":"Send team member invitation","description":"Sends or resends delivery for the single pending invitation of this Team Member.Delivery contact is set only at Team Member create via write-only access_invitation.phone /access_invitation.email; this resend uses the stored delivery target and does not accepta contact override in the body. 422 invitation_contact_required when no delivery contactexists; 409 invitation_already_pending when a distinct pending invitation already exists;409 access_already_active when the Team Member already has active access. RequiresIdempotency-Key."}},"httpPath":"/locations/{location_id}/team_members/{team_member_id}/invitation"}]},{"type":"group","label":"Positions","link":"/en/b2b-v3/openapi/positions","routeSlug":"/en/b2b-v3/openapi/positions","items":[{"label":"List positions","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/positions/listpositions","routeSlug":"/en/b2b-v3/openapi/positions/listpositions","metadata":{"seo":{"title":"List positions","description":"Returns the position directory of the Location. Reference a position from a TeamMember via position_id."}},"httpPath":"/locations/{location_id}/positions"},{"label":"Create a position","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/positions/createposition","routeSlug":"/en/b2b-v3/openapi/positions/createposition","metadata":{"seo":{"title":"Create a position","description":"Creates a position. Requires Idempotency-Key."}},"httpPath":"/locations/{location_id}/positions"},{"label":"Get a position","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/positions/getposition","routeSlug":"/en/b2b-v3/openapi/positions/getposition","metadata":{"seo":{"title":"Get a position","description":"Returns a single position. The response carries an ETag header for a subsequentPATCH or DELETE."}},"httpPath":"/locations/{location_id}/positions/{position_id}"},{"label":"Update a position","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/positions/updateposition","routeSlug":"/en/b2b-v3/openapi/positions/updateposition","metadata":{"seo":{"title":"Update a position","description":"Partially updates a position with a merge-patch body. Requires If-Match."}},"httpPath":"/locations/{location_id}/positions/{position_id}"},{"label":"Delete a position","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/positions/deleteposition","routeSlug":"/en/b2b-v3/openapi/positions/deleteposition","metadata":{"seo":{"title":"Delete a position","description":"Deletes a position. Requires If-Match with the version last seen."}},"httpPath":"/locations/{location_id}/positions/{position_id}"}]},{"type":"separator","label":"Clients"},{"type":"group","label":"Clients","link":"/en/b2b-v3/openapi/clients","routeSlug":"/en/b2b-v3/openapi/clients","items":[{"label":"List and search clients","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/clients/listclients","routeSlug":"/en/b2b-v3/openapi/clients/listclients","metadata":{"seo":{"title":"List and search clients","description":"Searches the client base of the Location. Exact phone and email contact searches require clients:read_contact plus the subject contact permission; without that scope the API returns 403 missing_scope/permission_denied, not an empty result. Free-text query remains under clients:read. Contact fields use the redaction contract when contact access is absent. This endpoint is rate-limited.\\n\\nCursor-paginated list. Default ordering: display_name, id tie-breaker. Cursors use the cursor query parameter, expire after 15 minutes, and are bound to the credential, tenant, and filters. Expired, malformed, or foreign cursors fail with 422 validation_failed using field codes expired_cursor, invalid_cursor, or foreign_cursor."}},"httpPath":"/locations/{location_id}/clients"},{"label":"Create a client","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/clients/createclient","routeSlug":"/en/b2b-v3/openapi/clients/createclient","metadata":{"seo":{"title":"Create a client","description":"Creates a client. name and phone are required. The phone number is deduplicatedwithin the Location: if another (non-deleted) client already owns it, the requestfails with 422 phone_taken. That signal is part of clients:write (noclients:read_contact required); it does not reveal the other client's id or contacts.Phone-bearing writes are audited and rate-limited against enumeration. RequiresIdempotency-Key."}},"httpPath":"/locations/{location_id}/clients"},{"label":"Get a client","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/clients/getclient","routeSlug":"/en/b2b-v3/openapi/clients/getclient","metadata":{"seo":{"title":"Get a client","description":"Returns a single client. Contact fields (phone, email, additional_phone)require clients:read_contact plus the subject's contact permission — otherwise theyare returned as null and listed in redacted_fields instead of exposing a contact string. The response carries anETag header for a subsequent PATCH or DELETE."}},"httpPath":"/locations/{location_id}/clients/{client_id}"},{"label":"Update a client","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/clients/updateclient","routeSlug":"/en/b2b-v3/openapi/clients/updateclient","metadata":{"seo":{"title":"Update a client","description":"Partially updates a client with a merge-patch body. Requires If-Match. Changing thephone to a number owned by another client fails with 422 phone_taken — the sameclients:write signal as on create (audited and rate-limited; no other client identityis returned). Clearing a nullable field is done with null; clearing contact fieldsrequires contact write access."}},"httpPath":"/locations/{location_id}/clients/{client_id}"},{"label":"Delete a client","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/clients/deleteclient","routeSlug":"/en/b2b-v3/openapi/clients/deleteclient","metadata":{"seo":{"title":"Delete a client","description":"Deletes a client (soft delete). A client with the same phone can be created againafterwards. Requires If-Match with the version last seen."}},"httpPath":"/locations/{location_id}/clients/{client_id}"}]},{"type":"separator","label":"Scheduling"},{"type":"group","label":"Availability","link":"/en/b2b-v3/openapi/availability","routeSlug":"/en/b2b-v3/openapi/availability","items":[{"label":"Search availability slots","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/availability/getavailability","routeSlug":"/en/b2b-v3/openapi/availability/getavailability","metadata":{"seo":{"title":"Search availability slots","description":"Computes available start times for the given services within a date range —optionally narrowed to one Team Member. Slots are derived from configured schedules,existing appointments, and service durations; starts_at values carry the Location'slocal UTC offset and can be passed directly to createAppointment."}},"httpPath":"/locations/{location_id}/availability"}]},{"type":"group","label":"Resources","link":"/en/b2b-v3/openapi/resources","routeSlug":"/en/b2b-v3/openapi/resources","items":[{"label":"List resources","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/resources/listresources","routeSlug":"/en/b2b-v3/openapi/resources/listresources","metadata":{"seo":{"title":"List resources","description":"Returns the bookable resources of the Location (rooms, chairs, equipment) with theirinstances. Pass instance ids as resource_instance_ids when creating an appointmentfor services that require a resource. Resource management (create/update/delete) isnot part of the preview scope."}},"httpPath":"/locations/{location_id}/resources"}]},{"type":"group","label":"Appointments","link":"/en/b2b-v3/openapi/appointments","routeSlug":"/en/b2b-v3/openapi/appointments","items":[{"label":"Create an appointment","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/appointments/createappointment","routeSlug":"/en/b2b-v3/openapi/appointments/createappointment","metadata":{"seo":{"title":"Create an appointment","description":"Creates an appointment for a client with a Team Member at a chosen start time."}},"httpPath":"/locations/{location_id}/appointments"},{"label":"List appointments","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/appointments/listappointments","routeSlug":"/en/b2b-v3/openapi/appointments/listappointments","metadata":{"seo":{"title":"List appointments","description":"Returns the appointments of the Location as a cursor-paginated list, newest windowfirst by start time with a stable tie-breaker. Client contact data insideexpand[]=client uses redacted contact fields without clients:read_contact."}},"httpPath":"/locations/{location_id}/appointments"},{"label":"Get an appointment","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/appointments/getappointment","routeSlug":"/en/b2b-v3/openapi/appointments/getappointment","metadata":{"seo":{"title":"Get an appointment","description":"Returns a single appointment. visit_id links to the billing visit (it is nullonly on appointments created without a client). Re-read the appointment to obtain afresh visit_id — visit grouping may change when the appointments of the day are edited. Theresponse carries an ETag header for a subsequent PATCH."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}"},{"label":"Update (reschedule) an appointment","deprecated":false,"httpVerb":"patch","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/appointments/updateappointment","routeSlug":"/en/b2b-v3/openapi/appointments/updateappointment","metadata":{"seo":{"title":"Update (reschedule) an appointment","description":"Edits or reschedules an appointment with a merge-patch body: start time, Team Member,services, duration, comment. The appointment status is not editable here — use thestatus command. Cancellation is a separate cancel command."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}"},{"label":"Cancel an appointment","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/appointments/cancelappointment","routeSlug":"/en/b2b-v3/openapi/appointments/cancelappointment","metadata":{"seo":{"title":"Cancel an appointment","description":"Cancels an appointment as a command: the response is the appointment withstatus: \"cancelled\" and cancelled_at set. Optionally stores a reason andwhether to notify the client."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/cancel"},{"label":"Set appointment status","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/appointments/setappointmentstatus","routeSlug":"/en/b2b-v3/openapi/appointments/setappointmentstatus","metadata":{"seo":{"title":"Set appointment status","description":"Moves an appointment through its status lifecycle: waiting → confirmed →arrived / no_show. Marking a past visit as arrived finalizes it when nothingis left to pay (a fully paid or free visit)."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/status"}]},{"type":"separator","label":"Visits & Payments"},{"type":"group","label":"Visits","link":"/en/b2b-v3/openapi/visits","routeSlug":"/en/b2b-v3/openapi/visits","items":[{"label":"Get the visit for an appointment","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/visits/getvisit","routeSlug":"/en/b2b-v3/openapi/visits/getvisit","metadata":{"seo":{"title":"Get the visit for an appointment","description":"Returns the billing state resolved from appointment_id: service and products, payment methods applicable to this visit, payments from money and loyalty sources, and amount_to_pay_minor. visit_id remains a response field but is not a path key because appointments without a client may not have a visit id while still being payable. The first call may materialize the billing document; repeated calls resolve to the same document."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/visit"},{"label":"Add a product line to the appointment's visit","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/visits/addvisititem","routeSlug":"/en/b2b-v3/openapi/visits/addvisititem","metadata":{"seo":{"title":"Add a product line to the appointment's visit","description":"Adds one product line to the visit resolved from appointment_id — the \"came for a haircut,bought shampoo, one receipt\" case."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/visit/items"}]},{"type":"group","label":"Payments","link":"/en/b2b-v3/openapi/payments","routeSlug":"/en/b2b-v3/openapi/payments","items":[{"label":"List payment methods","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/payments/listpaymentmethods","routeSlug":"/en/b2b-v3/openapi/payments/listpaymentmethods","metadata":{"seo":{"title":"List payment methods","description":"Returns the payment methods configured for the Location - what the business accepts and howeach method settles. This is the only source of payment_method_id for createPayment."}},"httpPath":"/locations/{location_id}/payment_methods"},{"label":"List accounts","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/payments/listaccounts","routeSlug":"/en/b2b-v3/openapi/payments/listaccounts","metadata":{"seo":{"title":"List accounts","description":"Returns the cash/settlement accounts of the Location. Use an account's id asaccount_id in createPayment — either as the target of an account payment or asan override of a payment method's default account."}},"httpPath":"/locations/{location_id}/accounts"},{"label":"Find a gift card or membership by number","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/payments/searchloyaltyinstrument","routeSlug":"/en/b2b-v3/openapi/payments/searchloyaltyinstrument","metadata":{"seo":{"title":"Find a gift card or membership by number","description":"Looks up a gift card or membership by its number and reports whether it can pay the visitresolved from appointment_id."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/payment_methods/search"},{"label":"Record a payment on the appointment's visit","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/payments/createpayment","routeSlug":"/en/b2b-v3/openapi/payments/createpayment","metadata":{"seo":{"title":"Record a payment on the appointment's visit","description":"Records a money, deposit, loyalty, gift card, membership, or referral-program payment against the visit resolved from appointment_id. This records that payment was received (cash, card terminal, cashless, or a loyalty instrument) — Altegio does not move funds through a payment provider on this call. amount_minor must not exceed amount_to_pay_minor; for membership, amount_minor is 0 and coverage is reported through covers_items. Gift card and membership addressed by number use the same anti-enumeration policy as searchLoyaltyInstrument (422 instrument_not_applicable, shared rate limit). Requires Idempotency-Key; a retry returns the original payment instead of recording it twice. A free visit (amount_to_pay_minor is 0) needs no payment; finalize it through setAppointmentStatus."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/payments"},{"label":"Reverse a recorded payment","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/en/b2b-v3/openapi/payments/refundpayment","routeSlug":"/en/b2b-v3/openapi/payments/refundpayment","metadata":{"seo":{"title":"Reverse a recorded payment","description":"Locally reverses one payment action in full for the visit resolved from appointment_id.Partial reversal is not part of the contract. This is a local cancellation of posting inAltegio, not a payment-provider refund. Requires Idempotency-Key."}},"httpPath":"/locations/{location_id}/appointments/{appointment_id}/payments/{payment_id}/refund"}]}]}