SmartBook API
Same-origin REST used by guest booking pages. Not a third-party agent SDK.
Base URL: https://smartbook.now/api/v1
JSON unless noted. POST /bookings, /bookings/cancel, and /payments/create-intent need a smartbook.now Origin and x-csrf-token matching the csrf-token cookie. Field names are camelCase (serviceId, startTime, bookingId).
Machine-readable specs: openapi.json · llms-full.txt · llms.txt
/api/v1/services?slug={businessSlug}Active public services for a known slug. Partner listings are omitted. Price is price_nok (NOK).
Response
{
"data": [
{
"id": "uuid",
"name": "Herreklipp",
"duration_minutes": 30,
"price_nok": 499,
"is_multi_day": false,
"confirmation_mode": "auto",
"capacity": 1
}
]
}/api/v1/packages?slug={businessSlug}Active packages for the business.
Response
{
"data": [
{
"id": "uuid",
"name": "Weekend stay",
"primaryServiceId": "uuid",
"totalPriceNok": 3200,
"items": []
}
]
}/api/v1/availability?serviceId={id}&date={YYYY-MM-DD}Timeslots for one date. data is an array of objects (startTime, endTime, available), not clock strings. Use range for overnight stays.
Response
{
"data": [
{
"startTime": "2026-10-03T08:00:00.000Z",
"endTime": "2026-10-03T08:30:00.000Z",
"available": true,
"remaining": 1
}
],
"timezone": "Europe/Oslo"
}/api/v1/availability/range?serviceId={id}&checkIn={YYYY-MM-DD}&checkOut={YYYY-MM-DD}Availability and priced total for multi-day stays (is_multi_day).
Response
{
"data": {
"available": true,
"nights": 2,
"startTime": "2026-10-03T14:00:00.000Z",
"endTime": "2026-10-05T11:00:00.000Z",
"totalPriceNok": 2400,
"pricePerNightNok": 1200,
"availableResources": [],
"conflicts": []
},
"timezone": "Europe/Oslo"
}/api/v1/bookingsCreate a booking. Requires Origin + x-csrf-token (csrf-token cookie). startTime is ISO-8601, not date+time. customerPhone is required. Payment is a later step.
Request body
{
"serviceId": "uuid",
"startTime": "2026-10-03T08:00:00.000Z",
"customerName": "Jane Doe",
"customerEmail": "jane@example.com",
"customerPhone": "+4791234567"
}Response
{
"data": {
"id": "uuid",
"status": "pending",
"start_time": "2026-10-03T08:00:00.000Z",
"end_time": "2026-10-03T08:30:00.000Z",
"price_nok": 499,
"org_id": "uuid"
},
"manageToken": "opaque-guest-token"
}/api/v1/bookings/cancelCancel with the manageToken from create, not a booking id. CSRF required.
Request body
{
"token": "opaque-guest-token"
}Response
{
"data": {
"status": "cancelled",
"refundAmount": 0
}
}/api/v1/payments/create-intentStripe session for an unpaid booking. Body is bookingId. Amount is computed server-side. Requires a matching guest session or x-management-token, plus CSRF. Vipps is off.
Request body
{
"bookingId": "uuid"
}Response
{
"data": {
"provider": "stripe",
"kind": "embedded",
"clientSecret": "pi_xxx_secret_xxx"
}
}/api/v1/ai/chatIn-page guest booking chat. Field is slug (not business_slug). CSRF-exempt. Response is a Vercel AI SDK data stream, not SSE {"content"} chunks.
Request body
{
"messages": [
{
"role": "user",
"content": "What services do you offer?"
}
],
"slug": "my-business"
}Response
Vercel AI SDK data stream (toDataStreamResponse). Intended for the booking widget.