--- name: booking-pro-api description: >- Use this skill whenever you need to interact with the Booking Pro API - to read a service business's availability, catalog, contacts, bookings, gift cards, packages, or memberships, or to create/cancel/reschedule appointments, manage contacts, and check members in (kiosk, turnstile, biometric device) programmatically. Booking Pro is a SaaS for salons, barbershops, spas, gyms, and wellness studios. Trigger on: "book an appointment", "check availability", "create a contact", "list bookings", "check a member in", "Booking Pro API", "bp_sk_" keys. license: Proprietary metadata: homepage: https://developers.bookingpro.ai repository: https://github.com/Automate-Anything/bookingpro-api-docs --- # Booking Pro API You can operate a Booking Pro account programmatically over its REST API. This one file tells you everything you need: how to authenticate, the conventions, the full endpoint catalog, and where to find deeper detail. It is written to the open [agentskills.io](https://agentskills.io) format, so it installs into Claude, Cursor, Codex, GitHub Copilot, Gemini, and any agent that reads an `AGENTS.md` or a skills directory. Install instructions are at the end. ## What Booking Pro is A booking + point-of-sale platform for service businesses (salons, barbershops, spas, gyms, wellness studios). Through this API you can read a business's availability and catalog, manage its contacts, create and change appointments, read its stored value (gift cards, packages, memberships), and run member check-in for a door, kiosk, turnstile, or biometric device. ## Authentication Every request needs an API key sent as a bearer token: ``` Authorization: Bearer bp_sk_live_xxxxxxxxxxxx ``` Keys are minted by an account owner/admin in the Booking Pro dashboard under **Settings -> Developers**. A key is bound to ONE company and carries a set of scopes plus a location scope. A key is a robot credential, not a logged-in user: it can only do what its scopes allow. Never put a live key in client-side or mobile code; treat it like a password. If a call returns `401` the key is missing/invalid/revoked; `403` means the key lacks the required scope or the target is outside its locations. ## Scopes A call that needs a scope the key lacks returns `403 insufficient_scope`. Ask the account owner to mint a key with exactly the scopes your integration needs. | Tag | Scope | | --- | --- | | General | `(any valid key)` | | Availability | `read:availability` | | Catalog | `read:catalog` | | Contacts | `read:contacts (read), write:contacts (create/update)` | | Bookings | `read:bookings (read), write:bookings (create/cancel/reschedule)` | | Gift Cards | `read:giftcards` | | Packages | `read:packages` | | Memberships | `read:memberships` | | Members | `checkin:members` | ## Conventions - Base URL: `https://api.bookingpro.ai/api/v1` - All money is integer **cents** (e.g. `price_cents: 5000` is $50.00). - All timestamps are ISO 8601 UTC. - Responses are JSON. Errors use one envelope: `{ "error": { "type", "code", "message", "param?", "request_id" } }`. Branch on `type`, switch on `code`, quote `request_id` to support. - Paginated list endpoints return `{ data: [...], next_cursor }`. Pass the `next_cursor` back as `?cursor=` for the next page; `null` means the end. - Create endpoints accept an `Idempotency-Key` header; reuse the same key on a retry so you never create a duplicate. - Rate limit is per key (default 100 req/min), with `X-RateLimit-*` headers and `Retry-After` on `429`. ## Full endpoint catalog Every endpoint in `v1`. Each is fully specified (parameters, request body, response) in `reference/endpoints.md` in this skill, and rendered with an interactive playground at https://developers.bookingpro.ai. | Method | Path | Summary | | --- | --- | --- | | GET | `/ping` | Verify a key | | GET | `/availability` | List open slots | | GET | `/services` | List services | | GET | `/services/{id}` | Retrieve a service | | GET | `/locations` | List locations | | GET | `/contacts` | List contacts | | POST | `/contacts` | Create a contact | | GET | `/contacts/{id}` | Retrieve a contact | | PATCH | `/contacts/{id}` | Update a contact | | GET | `/bookings` | List bookings | | POST | `/bookings` | Create a booking | | GET | `/bookings/{id}` | Retrieve a booking | | POST | `/bookings/{id}/cancel` | Cancel a booking | | POST | `/bookings/{id}/reschedule` | Reschedule a booking | | GET | `/gift-cards` | List gift cards | | GET | `/gift-cards/{id}` | Retrieve a gift card | | GET | `/packages` | List package templates | | GET | `/memberships` | List membership plans | | GET | `/contacts/{id}/memberships` | List a contact's memberships | | POST | `/members/resolve` | Resolve a member and check eligibility | | POST | `/members/check-in` | Check a member in | | GET | `/members/{id}/visits` | List a membership's check-ins | | GET | `/classes` | List classes (the timetable) | | GET | `/classes/{id}` | Retrieve a class with its roster | | POST | `/classes/{id}/book` | Book a contact into a class | | POST | `/classes/{id}/cancel` | Cancel a contact's spot | | POST | `/classes/{id}/check-in` | Check a booked contact in | ## Common recipes ### Check availability then book 1. `GET /availability?location_id=...&service_id=...&date=2026-09-10` -> pick a `slots[].start`. 2. `POST /bookings` with `{ location_id, service_id, start, contact: { first_name, phone } }` (or an existing `contact_id`). Send an `Idempotency-Key`. 3. A `409` means the slot was taken between steps 1 and 2 - re-fetch availability. ### Create a contact `POST /contacts` with `{ first_name, phone }`. Phone is normalized to E.164 and de-duplicated: if the contact already exists it is returned, not duplicated. ### Check a member in (kiosk / turnstile / biometric device) 1. `POST /members/resolve` with `{ identifier, location_id }` -> returns the member and `valid_for_checkin` with a `reason`, recording nothing. A biometric device maps a face to the member's code or fob UID on your side, then sends that identifier. 2. If eligible, `POST /members/check-in` with the same `identifier` (or the `membership_id` + `contact_id`) and an `Idempotency-Key` so a double-scan logs one visit. A `422` means not allowed, with the reason in the message. ## Where to find more - **Live interactive docs + playground**: https://developers.bookingpro.ai - **Full endpoint detail**: `reference/endpoints.md` in this skill. - **OpenAPI contract**: https://raw.githubusercontent.com/Automate-Anything/bookingpro-api-docs/main/openapi.yaml (or https://developers.bookingpro.ai/openapi.yaml) - **Guides** (quickstart, auth, errors, pagination, idempotency, versioning, members, AI agents): the `docs/` folder of https://github.com/Automate-Anything/bookingpro-api-docs - **LLM indexes**: https://developers.bookingpro.ai/llms.txt (compact) and https://developers.bookingpro.ai/llms-full.txt (every page concatenated for a context window). Append `.md` to any docs page URL for its Markdown. ## How to install this skill This skill is a folder (`SKILL.md` + `reference/endpoints.md`). Give it to your agent one of these ways: - **Pull it from the public repo** (no download): point your agent at https://raw.githubusercontent.com/Automate-Anything/bookingpro-api-docs/main/skill/SKILL.md and tell it to read that file plus https://raw.githubusercontent.com/Automate-Anything/bookingpro-api-docs/main/skill/reference/endpoints.md. That is enough to use the API. - **Download the bundle**: https://developers.bookingpro.ai/skill/booking-pro-api.zip , unzip it, then: - **Claude / Claude Code**: drop the `booking-pro-api` folder into your `.claude/skills/` directory (project or `~/.claude/skills/`). It loads by its `name` and `description`. - **Cursor**: put `SKILL.md`'s content into a `.cursor/rules/` rule, or add the folder to your project and reference it. - **Codex / GitHub Copilot / Gemini and other agents**: add this file's content to your `AGENTS.md` (or the agent's equivalent context/instructions file). The format is plain Markdown with YAML frontmatter, so any agent can read it. - **Hand it to a chat model directly**: paste the contents of `SKILL.md` (and `reference/endpoints.md` for full detail) into the conversation, along with your `bp_sk_live_...` key, and ask it to call the API. Once installed, the agent has everything it needs to authenticate and call the Booking Pro API correctly.