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.