SmartBook

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

Booking
Public catalog and booking for a known business slug. POST requires a smartbook.now Origin and the CSRF cookie.
GET/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
    }
  ]
}
GET/api/v1/packages?slug={businessSlug}

Active packages for the business.

Response

{
  "data": [
    {
      "id": "uuid",
      "name": "Weekend stay",
      "primaryServiceId": "uuid",
      "totalPriceNok": 3200,
      "items": []
    }
  ]
}
GET/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"
}
GET/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"
}
POST/api/v1/bookings

Create 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"
}
POST/api/v1/bookings/cancel

Cancel with the manageToken from create, not a booking id. CSRF required.

Request body

{
  "token": "opaque-guest-token"
}

Response

{
  "data": {
    "status": "cancelled",
    "refundAmount": 0
  }
}
Payments
Stripe session for an existing unpaid booking. Not a standalone payments API.
POST/api/v1/payments/create-intent

Stripe 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"
  }
}
AI
The guest-page chatbot. Not a generic chat-completions API.
POST/api/v1/ai/chat

In-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.
SmartBook API — REST booking, payments & AI integration