{
  "service": "Lorikeet demo booking",
  "description": "Book a demo with the Lorikeet sales team over plain HTTP. No browser, no login, no captcha. Call the three steps in order: GET /schema, POST /slots, POST /book.",
  "dry_run": false,
  "session": "eyJraW5kIjoic2Vzc2lvbiIsImp0aSI6IjQ0OWY4MjU1LWU4YWUtNDkwNC1iZGQzLTk2ODQwNmRmZTQ3MCIsImV4cCI6MTc4Mzk5MTk0OTQ3MH0.Lk-pVyyJxk5Eh0o5CCNf1pD4IiVw0vR8-6wSfE6LRYQ",
  "steps": [
    {
      "step": 1,
      "request": "GET /schema",
      "returns": "The `session` field of this response. It is valid for 15 minutes — pass it to POST /slots."
    },
    {
      "step": 2,
      "request": "POST /slots",
      "body": {
        "session": "<token from step 1>",
        "timezone": "IANA timezone, e.g. Australia/Sydney",
        "lead": {
          "firstName": "required",
          "lastName": "required",
          "email": "required — work email; disposable domains are rejected",
          "company": "required",
          "website": "optional",
          "teamSize": "optional — size of their CX/support team",
          "needs": "optional — what they want to solve, in their own words"
        }
      },
      "returns": "Available times, plus a booking token. Registers the lead with the sales team."
    },
    {
      "step": 3,
      "request": "POST /book",
      "body": {
        "booking_token": "<token from step 2>",
        "start": "<the `start` value of the chosen slot>"
      },
      "returns": "Confirmation, a `booking_reference`, and a `manage_token`. Default emails the calendar invite. Give the human their booking_reference and keep the manage_token — it is how this booking is moved or cancelled later."
    }
  ],
  "managing_an_existing_booking": {
    "note": "Works in a later conversation too, as long as you have the manage_token or booking_reference.",
    "see_new_times": {
      "request": "POST /manage/times",
      "body": {
        "manage_token": "<from booking>"
      }
    },
    "reschedule": {
      "request": "POST /manage/reschedule",
      "body": {
        "manage_token": "<from /manage/times>",
        "start": "<chosen slot>"
      }
    },
    "cancel": {
      "request": "POST /manage/cancel",
      "body": {
        "manage_token": "<or booking_reference>",
        "reason": "optional"
      }
    }
  },
  "notes": [
    "Ask the human which time they want before calling /book. Do not choose for them.",
    "Times are returned as UTC instants in `start`, and pre-formatted for the human in `local`.",
    "One booking per email address per day.",
    "Cancelling and rescheduling need no login — holding the manage_token or booking_reference is the authority."
  ]
}