Developer API · v1
Your availability, on your site.
A small, read-only API for professionals on Raymond: pull your real availability, services, and profile into your own website, link tree, or tooling. Booking itself always happens in the hosted flow — that's where pricing is resolved and double-booking is impossible.
Authentication
Create a key in Dashboard → Settings → Developer API. Send it on every request:
curl https://www.raymondbooking.com/api/v1/me \ -H "Authorization: Bearer rk_live_YOUR_KEY"
Keys are scoped to your Raymond profile and read-only. Rate limit: 60 requests/minute per key. Treat keys like passwords — revoke from the dashboard if one leaks.
SDK & OpenAPI spec
Prefer types over curl? Copy the one-file, zero-dependency TypeScript SDK and you have a typed client for the whole surface:
import { RaymondClient } from "./raymond";
const raymond = new RaymondClient({ apiKey: process.env.RAYMOND_API_KEY! });
const { barber } = await raymond.me();
const slots = await raymond.availability({ date: "2026-06-20", days: 7 });
const quote = await raymond.price({ intake, service_ids: [serviceId] });The full machine-readable contract lives at /api/v1/openapi (OpenAPI 3.1 — point Swagger UI or a code generator at it). New here? The quickstart takes you from zero to a live price quote in under ten minutes.
GET/api/v1/me
The profile your key is scoped to, including the canonicalbooking_url to deep-link clients into.
{
"barber": {
"slug": "marcus-webb",
"display_name": "Marcus Webb",
"bio": "…",
"timezone": "America/New_York",
"is_published": true,
"booking_url": "https://www.raymondbooking.com/book/marcus-webb"
}
}GET/api/v1/services
Active services, add-ons, and your published price range. Money is integer cents. This endpoint returns the range, not a number for a specific appointment — for that, quote a real intake against /api/v1/price below.
{
"price_range": {
"floor_cents": 4000,
"ceiling_cents": 8000,
"currency": "USD",
"formatted": "$40.00–$80.00",
"note": "Final price is resolved in the booking flow from intake + chosen time."
},
"services": [
{ "id": "…", "name": "Cut + style", "description": null, "duration_minutes": 45 }
],
"addons": [
{ "id": "…", "name": "Deep conditioning", "duration_minutes": 15 }
]
}GET/api/v1/availability?date=YYYY-MM-DD&days=7
Open slots, computed by the exact same engine as the booking page (working hours, Google Calendar busy, time off, existing appointments). days up to 28; optional duration in minutes. Slots are UTC ISO strings — display them in the returned timezone.
{
"timezone": "America/New_York",
"slot_minutes": 45,
"byDate": {
"2026-06-15": {
"slots": ["2026-06-15T14:00:00.000Z", "2026-06-15T14:45:00.000Z"],
"busy": [{ "start": "…", "end": "…" }]
}
}
}POST/api/v1/price
A price quotefor a real appointment, computed by the exact same resolver the booking page uses — so your UI never shows a number checkout won't honor. Send the client's intake and the chosen services; pass an optional starts_atto quote a specific time. It's a quote, not a lock: nothing is booked and no price is frozen until a booking is made in the hosted flow. Money is integer cents.
curl -X POST https://www.raymondbooking.com/api/v1/price \
-H "Authorization: Bearer rk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"intake": {
"hair_type": "straight",
"desired_style": "Silk press with a trim",
"length_preference": "medium",
"last_cut_value": 3,
"last_cut_unit": "weeks",
"big_transformation": false
},
"service_ids": ["…"],
"starts_at": "2026-06-20T15:00:00.000Z"
}'{
"total_price_cents": 5500,
"base_price_cents": 5500,
"total_duration_minutes": 45,
"reason": "medium length, peak slot",
"addons": [],
"booking_fee_cents": 0,
"currency": "USD",
"quote": true
}On a traditional-flow profile, intake may be null. If you turned on a client-paid booking fee, the quote includes it as booking_fee_cents — the same line the client sees before paying.
Why is there no booking-create endpoint?
On purpose. Booking runs through one flow so the price is locked once, payment is collected up front, and two clients can never take the same slot. Deep-link to booking_url and let the hosted flow do the rest. If your integration genuinely needs more, tell us at /support.