{
  "openapi": "3.1.0",
  "info": {
    "title": "Lorikeet Demo Booking API",
    "version": "1.0.0",
    "summary": "Book a demo with the Lorikeet sales team over plain HTTP.",
    "description": "A browserless booking API for AI agents. No login, no API key, no captcha, no browser.\n\nLorikeet is an AI customer support platform for complex and regulated businesses.\nThis API books a demo with its sales team on behalf of a human the agent is talking to.\n\n## Flow\n\n1. `GET /schema` — returns the questions to ask and a short-lived `session` token.\n2. Ask the human every question and read the answers back for confirmation.\n   A **work email is required**; personal providers (Gmail, Outlook, Yahoo, iCloud,\n   Proton, etc.) are rejected.\n3. `POST /slots` — returns real availability plus a `booking_token`.\n   This is a pure read: it registers nothing and can be retried freely.\n4. Let the **human** choose a time. Never choose for them.\n5. `POST /book` — registers the lead with sales and books the meeting. A calendar\n   invite is sent immediately. This is the only step with side effects.\n\nA booking can later be moved or cancelled with no login via `/manage/times`,\n`/manage/reschedule` and `/manage/cancel`.\n\n## Versioning and deprecation\n\nThe current major version is **v1**. Every path is available both\nversion-pinned (`/v1/slots`) and unversioned (`/slots`); they are the same\nsurface. Pin to `/v1` if you want to be insulated from a future `/v2`. The\nunversioned paths remain canonical and are not going away — existing\nintegrations and llms.txt use them.\n\nEvery response carries an `API-Version` header naming the version that served it.\nA request to an unsupported version (e.g. `/v9/slots`) returns `404`.\n\nBreaking changes ship under a new major version, never in place. When a version\nis retired it will first return `Deprecation` and `Sunset` response headers\n(RFC 9745 / RFC 8594) for at least 90 days before removal.\n\n## Rate limits\n\nAvailability lookups are capped per IP (60/hour) and new leads per IP (8/hour),\nwith a global ceiling of 30 bookings/hour. There is one live booking per email\naddress; a repeat returns the existing booking instead of double-booking.\n\nRate-limited endpoints advertise quota with the RFC 9910 `RateLimit-Policy` and\n`RateLimit` fields, plus the `X-RateLimit-*` compatibility trio, so an agent can\npace itself rather than discovering the limit by being refused. A `429` always\ncarries `Retry-After` in seconds.\n\n## Usage policy\n\nOnly book with the knowledge and consent of the human you are acting for, and only\nwith details they gave you.",
    "contact": {
      "name": "Lorikeet",
      "url": "https://www.lorikeetcx.ai/contact"
    },
    "license": {
      "name": "Proprietary",
      "identifier": "LicenseRef-Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://book.lorikeetcx.ai/v1",
      "description": "Production, version-pinned (v1)"
    },
    {
      "url": "https://book.lorikeetcx.ai",
      "description": "Production, unversioned — the same surface, kept for existing clients"
    }
  ],
  "x-deprecation-policy": {
    "policy": "Breaking changes ship under a new major version, never in place. A retiring version returns Deprecation and Sunset response headers for at least 90 days before it stops responding.",
    "minimumNoticeDays": 90,
    "signalledBy": [
      "Deprecation",
      "Sunset",
      "Link; rel=\"deprecation\""
    ],
    "specifications": [
      "RFC 9745",
      "RFC 8594"
    ],
    "currentVersion": "v1",
    "supportedVersions": [
      "v1"
    ]
  },
  "x-cli": {
    "name": "@lorikeet-cxjobs/mcp",
    "registry": "npm",
    "url": "https://www.npmjs.com/package/@lorikeet-cxjobs/mcp",
    "install": "npx @lorikeet-cxjobs/mcp",
    "description": "Official CLI and stdio MCP server for the Lorikeet CX + AI jobs board. Read-only, no authentication."
  },
  "externalDocs": {
    "description": "Agent-facing guidance for lorikeetcx.ai",
    "url": "https://www.lorikeetcx.ai/llms.txt"
  },
  "security": [],
  "tags": [
    {
      "name": "Booking",
      "description": "Discover questions, browse availability, and book a demo."
    },
    {
      "name": "Manage",
      "description": "Move or cancel an existing booking without logging in."
    },
    {
      "name": "Service",
      "description": "Operational status of the booking service."
    }
  ],
  "paths": {
    "/schema": {
      "get": {
        "operationId": "getBookingSchema",
        "tags": [
          "Booking"
        ],
        "summary": "Get the booking questions and a session token",
        "description": "Returns the exact questions to ask the human, the allowed values for every dropdown, and a short-lived `session` token required by POST /slots. Start here. Creates nothing.",
        "responses": {
          "200": {
            "description": "The questions to ask and a session token.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingSchema"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request — see `error` and, for lead problems, `details`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/slots": {
      "post": {
        "operationId": "listAvailableSlots",
        "tags": [
          "Booking"
        ],
        "summary": "List real available demo times",
        "description": "Returns genuine availability grouped by day, plus a `booking_token` to pass to POST /book. Registers no lead and creates nothing, so it is safe to call repeatedly. Pass `date` (YYYY-MM-DD) to ask about one specific day. If the email already has a live booking, responds with `already_booked` instead of new availability.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SlotsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Availability, or the caller's existing booking when one is already live.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/SlotsResponse"
                    },
                    {
                      "$ref": "#/components/schemas/AlreadyBooked"
                    },
                    {
                      "$ref": "#/components/schemas/DateUnavailable"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid request — see `error` and, for lead problems, `details`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Token missing, malformed, or expired. Restart from the step named in `error`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. Wait for `Retry-After` seconds before retrying.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Always present on a 429.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Upstream or store outage. Retry later with the SAME details; do not vary them.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/book": {
      "post": {
        "operationId": "createBooking",
        "tags": [
          "Booking"
        ],
        "summary": "Book the demo (registers the lead)",
        "description": "Books the chosen time and registers the lead with the sales team. A calendar invite is sent immediately. This is the only endpoint with side effects — call it only after the human has picked a time from POST /slots and confirmed their details. `start` must be one of the slots that call offered.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The confirmed booking.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingConfirmation"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request — see `error` and, for lead problems, `details`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Token missing, malformed, or expired. Restart from the step named in `error`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. Wait for `Retry-After` seconds before retrying.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Always present on a 429.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Upstream or store outage. Retry later with the SAME details; do not vary them.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/manage/times": {
      "post": {
        "operationId": "listRescheduleTimes",
        "tags": [
          "Manage"
        ],
        "summary": "List new times for an existing booking",
        "description": "Returns availability for moving a booking that already exists, plus a refreshed `manage_token` to pass to POST /manage/reschedule. Identify the booking with `manage_token`, or with `booking_reference` plus the booking `email`. Creates nothing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ManageRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Availability for the reschedule.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ManageTimesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request — see `error` and, for lead problems, `details`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Token missing, malformed, or expired. Restart from the step named in `error`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. Wait for `Retry-After` seconds before retrying.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Always present on a 429.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Upstream or store outage. Retry later with the SAME details; do not vary them.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/manage/reschedule": {
      "post": {
        "operationId": "rescheduleBooking",
        "tags": [
          "Manage"
        ],
        "summary": "Move an existing booking to a new time",
        "description": "Moves the booking to `start`, which must be one of the times returned by POST /manage/times. An updated calendar invite is sent.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RescheduleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The rescheduled booking.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RescheduleConfirmation"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request — see `error` and, for lead problems, `details`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Token missing, malformed, or expired. Restart from the step named in `error`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. Wait for `Retry-After` seconds before retrying.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Always present on a 429.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Upstream or store outage. Retry later with the SAME details; do not vary them.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/manage/cancel": {
      "post": {
        "operationId": "cancelBooking",
        "tags": [
          "Manage"
        ],
        "summary": "Cancel an existing booking",
        "description": "Cancels the booking and removes the calendar invite. Identify it with `manage_token`, or with `booking_reference` plus the booking `email`.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ManageRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The cancellation.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CancelConfirmation"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request — see `error` and, for lead problems, `details`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Token missing, malformed, or expired. Restart from the step named in `error`.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. Wait for `Retry-After` seconds before retrying.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9910 quota policy in effect, as `\"name\";q=<quota>;w=<window seconds>`.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";q=60;w=3600"
                  ]
                }
              },
              "RateLimit": {
                "description": "RFC 9910 remaining quota, as `\"name\";r=<remaining>;t=<seconds until reset>`. Omitted when the limiter could not report a count.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"slots\";r=57;t=3540"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Compatibility form of the quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Compatibility form of seconds until reset.",
                "schema": {
                  "type": "integer"
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Always present on a 429.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Upstream or store outage. Retry later with the SAME details; do not vary them.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "operationId": "getServiceHealth",
        "tags": [
          "Service"
        ],
        "summary": "Check whether booking is currently working",
        "description": "Reports reachability of the rate-limit store, not just configuration. Returns 503 when /slots and /book are failing closed.",
        "responses": {
          "200": {
            "description": "The service is healthy.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          },
          "503": {
            "description": "The service is degraded and bookings are failing closed.",
            "headers": {
              "API-Version": {
                "description": "Major version of the API that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "description": "RFC 9745. Absent while this version is current. When the version is deprecated this carries the IMF-fixdate at which deprecation was announced.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Wed, 01 Oct 2026 00:00:00 GMT"
                  ]
                }
              },
              "Sunset": {
                "description": "RFC 8594. Absent while this version is current. When set, it is the date the version stops responding — never less than 90 days after the Deprecation date.",
                "required": false,
                "schema": {
                  "type": "string",
                  "examples": [
                    "Tue, 30 Dec 2026 00:00:00 GMT"
                  ]
                }
              },
              "Link": {
                "description": "When deprecated, carries `rel=\"deprecation\"` pointing at the migration notes.",
                "required": false,
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Lead": {
        "type": "object",
        "title": "Lead",
        "description": "The human's details. Dropdown fields must be sent as one of their exact enum strings. A work email is required.",
        "required": [
          "firstName",
          "lastName",
          "email",
          "company",
          "teamSize",
          "industry"
        ],
        "properties": {
          "firstName": {
            "type": "string",
            "maxLength": 200,
            "description": "What is your first name?"
          },
          "lastName": {
            "type": "string",
            "maxLength": 200,
            "description": "What is your last name?"
          },
          "email": {
            "type": "string",
            "description": "What is your work email? A business email is required — personal providers (Gmail, Outlook, Yahoo, iCloud, etc.) are not accepted.",
            "format": "email",
            "maxLength": 2000
          },
          "company": {
            "type": "string",
            "description": "What company do you work for?",
            "maxLength": 2000
          },
          "teamSize": {
            "type": "string",
            "description": "What's the size of your CX or support team?",
            "enum": [
              "Less than 10",
              "Less than 100",
              "Less than 1000",
              "More than 1000"
            ]
          },
          "industry": {
            "type": "string",
            "description": "What industry are you in?",
            "enum": [
              "Healthcare",
              "Financial Services/Fintech",
              "Insurance",
              "saas",
              "E-commerce",
              "Other"
            ]
          },
          "otherIndustry": {
            "type": "string",
            "description": "Please specify your industry. Required when industry is \"Other\".",
            "maxLength": 2000
          },
          "website": {
            "type": "string",
            "description": "What is your company's website?",
            "maxLength": 2000
          },
          "extraInfo": {
            "type": "string",
            "description": "Is there any other information you'd like to share with us?",
            "maxLength": 2000
          }
        },
        "additionalProperties": false
      },
      "Error": {
        "type": "object",
        "title": "Error",
        "description": "Every non-2xx response has this shape.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable explanation of what went wrong."
          },
          "details": {
            "type": "array",
            "description": "Per-field validation messages, when the lead was rejected.",
            "items": {
              "type": "string"
            }
          },
          "retry_after_seconds": {
            "type": "integer",
            "minimum": 0,
            "description": "How long to wait before retrying, on a 429."
          }
        }
      },
      "AskedQuestion": {
        "type": "object",
        "title": "AskedQuestion",
        "description": "One question to put to the human.",
        "required": [
          "field",
          "question",
          "required"
        ],
        "properties": {
          "field": {
            "type": "string",
            "description": "Key to send back inside `lead`."
          },
          "question": {
            "type": "string",
            "description": "Ask the human this."
          },
          "required": {
            "type": "boolean",
            "description": "Whether an answer is mandatory."
          },
          "must_be_one_of": {
            "type": "array",
            "description": "Allowed values. Send one of these exact strings; do not invent one.",
            "items": {
              "type": "string"
            }
          },
          "required_when": {
            "type": "string",
            "description": "Condition under which an otherwise-optional field becomes required."
          }
        }
      },
      "BookingSchema": {
        "type": "object",
        "title": "BookingSchema",
        "description": "The questions to ask, the rules to follow, and a session token.",
        "required": [
          "service",
          "description",
          "session",
          "ask",
          "flow",
          "rules"
        ],
        "properties": {
          "service": {
            "type": "string",
            "description": "Name of the service."
          },
          "description": {
            "type": "string",
            "description": "What this API does."
          },
          "dry_run": {
            "type": "boolean",
            "description": "True when writes are stubbed (non-production)."
          },
          "booking_available": {
            "type": "boolean",
            "description": "False when booking is switched off; send the human to the web form instead."
          },
          "session": {
            "type": "string",
            "description": "Short-lived signed token. Pass to POST /slots. Expires in 15 minutes."
          },
          "agent_instructions": {
            "type": "string",
            "description": "How to run the conversation with the human."
          },
          "ask": {
            "type": "array",
            "description": "The questions to ask, in order.",
            "items": {
              "$ref": "#/components/schemas/AskedQuestion"
            }
          },
          "flow": {
            "type": "object",
            "description": "The subsequent calls and what each one does.",
            "additionalProperties": true
          },
          "rules": {
            "type": "array",
            "description": "Constraints an agent must respect.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "SlotsRequest": {
        "type": "object",
        "title": "SlotsRequest",
        "required": [
          "session",
          "lead"
        ],
        "properties": {
          "session": {
            "type": "string",
            "description": "The `session` token from GET /schema."
          },
          "timezone": {
            "type": "string",
            "default": "UTC",
            "description": "IANA timezone of the human, e.g. \"Australia/Sydney\". Times are rendered in it.",
            "examples": [
              "Australia/Sydney",
              "America/New_York"
            ]
          },
          "date": {
            "type": "string",
            "format": "date",
            "description": "Restrict the answer to one day (YYYY-MM-DD)."
          },
          "lead": {
            "$ref": "#/components/schemas/Lead"
          }
        },
        "additionalProperties": false
      },
      "Slot": {
        "type": "object",
        "title": "Slot",
        "description": "One bookable time.",
        "required": [
          "start",
          "local",
          "local_time"
        ],
        "properties": {
          "start": {
            "type": "string",
            "format": "date-time",
            "description": "Exact start time (ISO 8601, UTC). Send this back to POST /book."
          },
          "local": {
            "type": "string",
            "description": "Full day and time in the requested timezone."
          },
          "local_time": {
            "type": "string",
            "description": "Time of day in the requested timezone."
          },
          "outside_business_hours": {
            "type": "boolean",
            "description": "Present and true when this is the middle of the night for the human. Offer only if nothing else is available, and say so."
          }
        }
      },
      "Day": {
        "type": "object",
        "title": "Day",
        "description": "One day of availability.",
        "required": [
          "date",
          "label",
          "total",
          "slots"
        ],
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "description": "YYYY-MM-DD in the requested timezone."
          },
          "label": {
            "type": "string",
            "description": "Weekday name."
          },
          "total": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of slots that day."
          },
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Slot"
            }
          }
        }
      },
      "AvailableDate": {
        "type": "object",
        "title": "AvailableDate",
        "description": "Summary of one day with availability.",
        "required": [
          "date",
          "label",
          "times_available"
        ],
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "label": {
            "type": "string"
          },
          "times_available": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "SlotsResponse": {
        "type": "object",
        "title": "SlotsResponse",
        "description": "Real availability. No lead has been registered at this point.",
        "required": [
          "lead_registered",
          "timezone",
          "days",
          "booking_token"
        ],
        "properties": {
          "dry_run": {
            "type": "boolean"
          },
          "timezone": {
            "type": "string",
            "description": "Timezone the times are rendered in."
          },
          "lead_registered": {
            "type": "boolean",
            "const": false,
            "description": "Always false — the lead is registered only at POST /book."
          },
          "available_dates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AvailableDate"
            }
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Day"
            }
          },
          "total_slots": {
            "type": "integer",
            "minimum": 0
          },
          "booking_token": {
            "type": "string",
            "description": "Signed token carrying the lead and offered slots. Pass to POST /book."
          },
          "next": {
            "type": "string",
            "description": "What to do next."
          }
        }
      },
      "DateUnavailable": {
        "type": "object",
        "title": "DateUnavailable",
        "description": "Returned when `date` was supplied and that day has nothing free.",
        "required": [
          "requested_date",
          "available_on_that_date"
        ],
        "properties": {
          "requested_date": {
            "type": "string",
            "format": "date"
          },
          "available_on_that_date": {
            "type": "boolean",
            "const": false
          },
          "message": {
            "type": "string"
          },
          "available_dates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AvailableDate"
            }
          }
        }
      },
      "AlreadyBooked": {
        "type": "object",
        "title": "AlreadyBooked",
        "description": "This email already has a live demo. Offer to move or cancel it rather than booking another.",
        "required": [
          "already_booked",
          "start",
          "booking_reference"
        ],
        "properties": {
          "already_booked": {
            "type": "boolean",
            "const": true
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "local": {
            "type": "string"
          },
          "timezone": {
            "type": "string"
          },
          "booking_reference": {
            "type": "string",
            "description": "Identifies the booking to /manage/*."
          },
          "message": {
            "type": "string"
          },
          "manage": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "BookRequest": {
        "type": "object",
        "title": "BookRequest",
        "required": [
          "booking_token",
          "start"
        ],
        "properties": {
          "booking_token": {
            "type": "string",
            "description": "The token from POST /slots."
          },
          "start": {
            "type": "string",
            "format": "date-time",
            "description": "The slot the HUMAN chose. Must be one POST /slots offered."
          }
        },
        "additionalProperties": false
      },
      "BookingConfirmation": {
        "type": "object",
        "title": "BookingConfirmation",
        "description": "The demo is booked and an invite has been sent.",
        "required": [
          "confirmed",
          "start",
          "timezone",
          "attendee"
        ],
        "properties": {
          "dry_run": {
            "type": "boolean"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "local": {
            "type": "string",
            "description": "Day and time in the human's timezone. Tell them this."
          },
          "timezone": {
            "type": "string"
          },
          "attendee": {
            "type": "string",
            "format": "email"
          },
          "host": {
            "type": [
              "object",
              "null"
            ],
            "description": "Who from Lorikeet is taking the call.",
            "additionalProperties": true
          },
          "meeting_link": {
            "type": [
              "string",
              "null"
            ],
            "description": "Join URL. Give this to the human."
          },
          "message": {
            "type": "string"
          },
          "booking_reference": {
            "type": [
              "string",
              "null"
            ]
          },
          "manage_token": {
            "type": [
              "string",
              "null"
            ],
            "description": "Keep this to move or cancel the booking later, even in a new conversation."
          },
          "manage": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          }
        }
      },
      "ManageRequest": {
        "type": "object",
        "title": "ManageRequest",
        "description": "Identify the booking with `manage_token`, or with `booking_reference` plus the booking `email`.",
        "properties": {
          "manage_token": {
            "type": "string",
            "description": "Token issued by POST /book."
          },
          "booking_reference": {
            "type": "string",
            "description": "Reference from the confirmation."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "The booking email. Required with `booking_reference`."
          },
          "timezone": {
            "type": "string",
            "default": "UTC",
            "description": "IANA timezone for rendering times."
          }
        },
        "anyOf": [
          {
            "required": [
              "manage_token"
            ]
          },
          {
            "required": [
              "booking_reference",
              "email"
            ]
          }
        ],
        "additionalProperties": false
      },
      "ManageTimesResponse": {
        "type": "object",
        "title": "ManageTimesResponse",
        "required": [
          "timezone",
          "days",
          "manage_token"
        ],
        "properties": {
          "dry_run": {
            "type": "boolean"
          },
          "timezone": {
            "type": "string"
          },
          "available_dates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AvailableDate"
            }
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Day"
            }
          },
          "total_slots": {
            "type": "integer",
            "minimum": 0
          },
          "manage_token": {
            "type": "string",
            "description": "Refreshed token. Pass to POST /manage/reschedule."
          },
          "next": {
            "type": "string"
          }
        }
      },
      "RescheduleRequest": {
        "type": "object",
        "title": "RescheduleRequest",
        "required": [
          "manage_token",
          "start"
        ],
        "properties": {
          "manage_token": {
            "type": "string",
            "description": "The token from POST /manage/times."
          },
          "start": {
            "type": "string",
            "format": "date-time",
            "description": "New time the human chose, from POST /manage/times."
          }
        },
        "additionalProperties": false
      },
      "RescheduleConfirmation": {
        "type": "object",
        "title": "RescheduleConfirmation",
        "required": [
          "rescheduled",
          "start"
        ],
        "properties": {
          "dry_run": {
            "type": "boolean"
          },
          "rescheduled": {
            "type": "boolean",
            "const": true
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "local": {
            "type": "string"
          },
          "timezone": {
            "type": "string"
          },
          "booking_reference": {
            "type": "string"
          },
          "manage_token": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "CancelConfirmation": {
        "type": "object",
        "title": "CancelConfirmation",
        "required": [
          "cancelled"
        ],
        "properties": {
          "dry_run": {
            "type": "boolean"
          },
          "cancelled": {
            "type": "boolean",
            "const": true
          },
          "booking_reference": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "Health": {
        "type": "object",
        "title": "Health",
        "required": [
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "False when bookings are failing closed."
          },
          "dry_run": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean",
            "description": "The kill switch."
          },
          "rate_limit_backend": {
            "type": "string",
            "enum": [
              "redis",
              "memory"
            ]
          },
          "store_reachable": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          }
        }
      }
    }
  }
}
