Overview
An API key lets a system you control talk to Bella on your business’s behalf. The two things people build most often are:- A booking form on your own website — read your services, check availability, then create the client and the appointment.
- A sync into another system — pull your clients and appointment history into a CRM, a data warehouse or a backup.
A key belongs to one location. If you run more than one location, switch to that location before creating its key. A key can never be moved to a different location.
Quickstart
Four calls take a visitor from “what do you offer?” to a booked appointment.Authentication
Send the key in thex-api-key header on every request. You never need to say which location — the key already knows.
Managing keys
1
Open Settings → Integrations
You’ll need permission to manage settings. You can only grant a key permissions you hold yourself.
2
Name it after what will use it
“Website booking”, “CRM sync”, “Ops bot” — so the Last used column tells you something useful later.
3
Choose what it can do
Tick only what that integration actually needs. You can change this later without reissuing the key.
4
Copy the key
It’s shown once. Store it as an environment variable on your server. If you lose it, revoke it and create another.
- Edit — rename it or change its permissions. The key itself never changes, so whoever is using it doesn’t have to do anything.
- Revoke — stop it working, keep the row so you can still see when it was last used. This cannot be undone.
- Delete — remove it from the list entirely. If the key was still active this also stops it working.
Edits, revocations and deletions all take effect within a minute rather than instantly — keys are cached briefly to keep requests fast.
Permissions
Everything else returns
403. A key cannot reach sales, reports, payments, team management, settings, or the API keys themselves — no key can ever create another key.
API reference
Base URL:https://api.bellabooking.com
Requests and responses are JSON. All ids are strings. Dates are YYYY-MM-DD; times of day are HH:MM:SS.
List the catalogue
Check availability
variantId and any addons in the cart where the service uses them, so the slots you get back match the real length of the appointment.
Availability reflects rosters, existing appointments and blocked time. It uses your dashboard’s view rather than your booking page’s, so it does not apply your minimum-notice period or gap-reduction settings — see Booking rules.
Create or match a client
If the email or phone already belongs to one of your active clients, that client’s id is returned instead of a duplicate being created — so a returning client filling in your form doesn’t create a second record.
Create an appointment
Pricing your booking correctly
Bella records theprice and durationInMinutes you send. It does not re-read them from your catalogue. That means:
- Always read them from
GET /api/servicecategoriesat booking time. Hard-coded prices go stale the moment you change a price in Bella. - Where a service uses variants, take the price and duration from the chosen variant, not the base service.
- Where a service uses pricing tiers, take them from the tier matching the assigned team member.
- Add-ons add their own price and duration on top of the service line.
Booking rules
Bookings made with an API key are recorded with the same checks your front desk gets, not the stricter ones your public booking page gets. Bella will accept a booking that:- double-books a team member
- is in the past, or inside your minimum-notice period
- is with a team member who isn’t qualified for that service
- is a members-only service for someone without a membership
- has unmet prerequisite services (a treatment that online booking would lock until a consult is booked or completed)
- would have needed your approval if it came through your own booking page
Services that need a room or piece of equipment can’t be booked through the API yet. Your own booking page assigns one automatically; the API doesn’t, so it returns a clear error asking for a resource.
Reschedule an appointment
Every service line moves together, keeping the gaps between them. The client gets your usual reschedule message.
Cancel an appointment
Packages, memberships, gift-card balances, loyalty points and promo codes the appointment used are restored automatically.
Cancelling through the API does not apply your cancellation-fee policy — no fee is charged and no policy-based refund is calculated, the same as a front-desk cancellation. If you charge for late cancellations, apply that in your own system or from the dashboard.
Read clients
search accepts filter (name, email or phone), limit, skip and a range of filters including createdAfter, createdBefore, lastAppointmentAfter and tags.
Read appointments
search requires startDate and endDate, and accepts teamMemberIds, serviceIds, statusIds, clientFilter, limit, skip and orderBy.
There’s no incremental cursor yet. A sync re-reads the date or page range it asks for. Deleted records leave no tombstone, so a full reconciliation is more reliable than a running total.
Errors
Errors are returned as JSON with an HTTP status and adetail explaining what went wrong.
Rate limits
Limits are applied per key, per minute.
Exceeding a limit returns
429 with a Retry-After header. Wait that many seconds and retry — don’t retry immediately in a loop.
The write limit is sized for a real booking form rather than a bulk import — so if you’re migrating data or running a busier site, ask us to raise it rather than working around it. These limits protect your business’s own performance and may change; they aren’t a service guarantee.
Keeping your key safe
- Store it as an environment variable or in a secrets manager, never in your source code.
- Give each integration its own key, so you can revoke one without breaking the others.
- Revoke a key the moment it’s no longer needed, or the moment you suspect it’s been exposed.
- Narrow a key’s permissions when an integration stops needing something — editing is safer than leaving a key more capable than it has to be.
- Your key can read and change real client data. Treat it like the password to your dashboard.