{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"6bab56a6-9b2d-4c42-9ea8-1f9e56d1f6e5","name":"Kenko Partner Public API","description":"**Want to become a Partner? Fill out this** [Form.](https://tally.so/r/D4OBZl)\n\n**External partner integration (classes / appointments / bookings / contacts)**\n\n**Base path:** `/api/public/v1`\n\n---\n\n## 1\\. Table of contents\n\n1. Overview\n    \n2. Authentication & scopes\n    \n3. Errors\n    \n4. List authorized centers\n    \n5. Schedules (classes)\n    \n    1. List schedules\n        \n    2. Get schedule\n        \n    3. Availability\n        \n6. Appointments\n    \n    1. List appointments\n        \n    2. List bookables (Instructors & Facilities)\n        \n    3. Appointment slots\n        \n7. Contacts\n    \n    1. Lookup contacts\n        \n    2. Create / upsert contact\n        \n8. Bookings\n    \n    1. `external_reference_id`\n        \n    2. List bookings\n        \n    3. Create class booking\n        \n    4. Create appointment booking\n        \n    5. Cancel booking\n        \n9. Webhooks\n    \n\n---\n\n## 2\\. Overview\n\nPartners call Kenko’s public partner API using a per-center API key issued when a studio connects the partner in Kenko.\n\n**Implemented today (this document):**\n\n- Discover authorized center(s)\n    \n- List / get class schedules + availability\n    \n- Appointment catalog, Instructors & Facilities (bookables), and available slots\n    \n- Lookup / create customer (contact) by email or name\n    \n- Create class or appointment booking (idempotent by partner + external reference)\n    \n- List bookings (classes and appointments)\n    \n- Cancel booking (partner-owned only)\n    \n- Outbound webhooks (booking confirmed/cancelled, availability, authorization)\n    \n\n### Terminology\n\n| Kenko term | API value | Description |\n| --- | --- | --- |\n| **Instructor** | `instructor` / `INSTRUCTOR` | Staff who delivers an appointment. `bookable_id` = instructor user ID from `/bookables`. |\n| **Facility** | `facility` / `RESOURCE` | Room or equipment. `bookable_id` = facility ID. |\n| **Schedule** | — | A single public class session (group fitness). |\n| **Appointment** | — | Bookable 1:1 or small-group service type. |\n| **Booking** | — | Confirmed reservation (class or appointment). |\n| **Connection ID** | `connection_id` | Studio connection identifier returned by Kenko when a center connects your partner. |\n| **Center ID** | `center_id` | Kenko center UUID for the connected studio. |\n\nSlot responses include an `instructor` object and a `facility` object. Booking requests use `bookables[].type` = `INSTRUCTOR` or `RESOURCE` (case-insensitive; `instructor` and `facility` are also accepted).\n\n### Connection summary\n\n| Item | Value |\n| --- | --- |\n| Base URL | `{API_HOST}/api/public/v1` |\n| Protocol | HTTPS + JSON |\n| Auth | `X-API-Key: {api_key}` |\n| Key model | One or more named keys per partner + studio connection |\n| Center context | Implied by the API key. Optional `center_id` / `X-Center-Id` must match the connected studio UUID or the request is rejected. |\n\nStudio hands partner: **Connection ID**, **Center ID**, and **API key**.\n\n---\n\n## 3\\. Authentication & scopes\n\n### Headers\n\n| Header | Required | Description |\n| --- | --- | --- |\n| `X-API-Key` | Yes | API key — shown once when the studio connects the partner or creates a key |\n| `Content-Type` | For POST | `application/json` |\n| `Accept` | Recommended | `application/json` |\n| `X-Center-Id` | No | Optional center UUID. If sent, must equal the connected studio UUID |\n\nAlternatively, `center_id` may be sent as a query/body field. Same mismatch rule applies. If omitted, the studio is taken from the API key.\n\n### Scopes\n\n| Scope | Default rate limit | Used by |\n| --- | --- | --- |\n| `read:schedules` | 120 / min | `GET` centers, schedules, schedule by id, appointments, bookables, list bookings |\n| `read:availability` | 60 / min | `GET` class availability, appointment slots |\n| `read:contacts` | 60 / min | `GET` contacts (lookup) |\n| `write:contacts` | 30 / min | `POST` contacts |\n| `write:bookings` | 20 / min | `POST` / `DELETE` bookings |\n\nMissing scope → `403` with `{\"message\":\"Insufficient scope\"}`.\n\n### Rate limit headers\n\nEvery response includes:\n\n```\nX-RateLimit-Limit: 120\nX-RateLimit-Remaining: 119\n\n ```\n\nExceeded → `429 Too Many Requests`.\n\nEach API key is limited to the scopes enabled for that studio connection. Rate limits apply per scope; the studio connection may use custom limits.\n\n---\n\n## 4\\. Errors\n\n| HTTP | When | Body (typical) |\n| --- | --- | --- |\n| 401 | Missing/invalid API key | `{\"message\":\"Unauthorized\"}` |\n| 403 | Revoked connection, wrong center, or missing scope | `{\"message\":\"Authorization revoked or inactive\"}` / `Center scope mismatch` / `Insufficient scope` |\n| 400 | Business / validation failure | `{\"message\":\"...\"}` or field validation errors |\n| 422 | Validation failed | Field errors |\n| 429 | Rate limit exceeded | Rate-limit response |\n\n---\n\n## 5\\. List authorized centers\n\n`GET /api/public/v1/centers` · scope: `read:schedules`\n\nReturns the center(s) the API key is authorized for. With a per-center key this is typically one row. Useful to confirm `connection_id`, `center_id`, and timezone.\n\n### Query parameters\n\nNone.\n\n### Sample request\n\n```\nGET /api/public/v1/centers\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/centers' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n### Sample response\n\n``` json\n{\n  \"data\": [\n    {\n      \"connection_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n      \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n      \"name\": \"Downtown Studio\",\n      \"address\": {\n        \"address_line1\": \"12 Example St\",\n        \"city\": \"London\",\n        \"state\": null,\n        \"zip\": \"SW1A 1AA\",\n        \"country\": \"GB\"\n      },\n      \"timezone\": \"Europe/London\",\n      \"connected_at\": \"2026-06-24T10:00:00+00:00\",\n      \"status\": \"active\"\n    }\n  ]\n}\n\n ```\n\n### Response fields\n\n| Field | Description |\n| --- | --- |\n| `connection_id` | Studio connection identifier for this integration |\n| `center_id` | Kenko center UUID |\n| `name` | Studio display name |\n| `address` | Address object (`address_line1`, `city`, `state`, `zip`, `country` ISO-2) |\n| `timezone` | IANA timezone of the center region |\n| `connected_at` | When the studio connection was authorized (ISO-8601) |\n| `status` | Connection status (e.g. `active`) |\n\n---\n\n## 6\\. Schedules (classes)\n\nSchedules are **public class sessions** at the connected studio. Only classes marked public for partners are returned. Times in responses are converted to the studio’s timezone (ISO-8601).\n\n### 6.1 List schedules\n\n`GET /api/public/v1/schedules` · scope: `read:schedules`\n\nLists upcoming (or filtered) public class sessions available for booking by partners.\n\n#### Query parameters / filters\n\n| Param | Type | Required | Rules / default | Description |\n| --- | --- | --- | --- | --- |\n| `start_date` | date | No | Valid date | Include events with `start_date` >= value |\n| `end_date` | date | No | Valid date; must be >= `start_date` if both set | Include events with `start_date` <= value |\n| `per_page` | integer | No | 1–100; default 50 | Pagination page size |\n| `page` | integer | No | Default pagination | Page number |\n| `center_id` | uuid | No | Must match connection if provided | Optional center check |\n\n**Implicit filters (not query params):** only sessions for the connected studio; only public class sessions. Ordered by start date, then id.\n\n#### Sample request\n\n```\nGET /api/public/v1/schedules?start_date=2026-07-22&end_date=2026-07-29&per_page=50\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/schedules?start_date=2026-07-22&end_date=2026-07-29&per_page=50' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response (collection wrapped in `data`)\n\n``` json\n{\n  \"data\": [\n    {\n      \"id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n      \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n      \"name\": \"Reformers — Morning\",\n      \"class\": {\n        \"id\": \"12\",\n        \"name\": \"Reformers — Morning\",\n        \"description\": \"All levels\",\n        \"type\": null\n      },\n      \"starts_at\": \"2026-07-22T09:00:00+01:00\",\n      \"ends_at\": \"2026-07-22T10:00:00+01:00\",\n      \"capacity\": 12,\n      \"available_spots\": 3,\n      \"instructors\": [\n        {\n          \"id\": \"b2c3d4e5-f6a7-8901-bcde-f12345678901\",\n          \"first_name\": \"Alex\",\n          \"last_name\": \"Smith\"\n        }\n      ],\n      \"is_cancelled\": false,\n      \"updated_at\": \"2026-07-01T12:00:00+00:00\"\n    }\n  ],\n  \"links\": { \"...\": \"pagination links\" },\n  \"meta\": { \"...\": \"pagination meta (current_page, total, ...)\" }\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `id` | Schedule / event UUID — use as `schedule_id` when booking |\n| `center_id` | Center UUID |\n| `name` | Event or class name |\n| `class` | Class metadata (`id`, `name`, `description`, `type`) or `null` |\n| `starts_at` / `ends_at` | ISO-8601 in center timezone |\n| `capacity` | Max spots |\n| `available_spots` | Remaining bookable spots (capacity minus currently booked) |\n| `instructors` | Active event instructors (user UUID + names) |\n| `is_cancelled` | True if event status is cancelled |\n| `updated_at` | ISO-8601 UTC (typical) |\n\n---\n\n### 6.2 Get schedule\n\n`GET /api/public/v1/schedules/{schedule_id}` · scope: `read:schedules`\n\nReturns a single public class schedule by UUID. Same shape as one item from list schedules.\n\n#### Path parameters\n\n| Param | Type | Description |\n| --- | --- | --- |\n| `schedule_id` | uuid | Event UUID (= schedule `id` from list) |\n\n#### Sample request\n\n```\nGET /api/public/v1/schedules/f47ac10b-58cc-4372-a567-0e02b2c3d479\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/schedules/{SCHEDULE_ID}' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Errors\n\n| Message | Meaning |\n| --- | --- |\n| `Schedule not found.` | Wrong id, not public class, or other center |\n\n#### Sample response\n\n``` json\n{\n  \"data\": {\n    \"id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"name\": \"Reformers — Morning\",\n    \"class\": {\n      \"id\": \"12\",\n      \"name\": \"Reformers — Morning\",\n      \"description\": \"All levels\",\n      \"type\": null\n    },\n    \"starts_at\": \"2026-07-22T09:00:00+01:00\",\n    \"ends_at\": \"2026-07-22T10:00:00+01:00\",\n    \"capacity\": 12,\n    \"available_spots\": 3,\n    \"instructors\": [],\n    \"is_cancelled\": false,\n    \"updated_at\": \"2026-07-01T12:00:00+00:00\"\n  }\n}\n\n ```\n\n---\n\n### 6.3 Availability\n\n`GET /api/public/v1/availability` · scope: `read:availability`\n\nLightweight capacity snapshot for class schedules (same public-class filter as list schedules). Use after listing schedules to refresh spot counts without re-fetching full schedule payloads.\n\n#### Query parameters / filters\n\n| Param | Type | Required | Description |\n| --- | --- | --- | --- |\n| `schedule_ids` | string | No | Comma-separated event UUIDs. If omitted, returns availability for all matching public class schedules at the center (can be large). |\n\nThere is currently **no** `start_date` / `end_date` filter on availability. Prefer passing an explicit `schedule_ids` list from a prior schedules query.\n\n#### Sample request\n\n```\nGET /api/public/v1/availability?schedule_ids=f47ac10b-58cc-4372-a567-0e02b2c3d479\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/availability?schedule_ids={SCHEDULE_ID}' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": [\n    {\n      \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n      \"capacity\": 12,\n      \"available_spots\": 3,\n      \"is_cancelled\": false\n    }\n  ]\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `schedule_id` | Event UUID |\n| `capacity` | Max spots |\n| `available_spots` | Remaining bookable spots |\n| `is_cancelled` | True if schedule cancelled |\n\n---\n\n## 7\\. Appointments\n\nAppointments are **public, active appointment products** at the connected studio (not class schedules). Booked appointments appear under `GET /bookings` with `event_type=appointment` — never under `GET /schedules`.\n\n### 7.1 List appointments\n\n`GET /api/public/v1/appointments` · scope: `read:schedules`\n\nReturns active public appointment types (service products) partners can book against.\n\n#### Query parameters\n\n| Param | Type | Required | Rules / default | Description |\n| --- | --- | --- | --- | --- |\n| `per_page` | integer | No | 1–100; default 50 | Pagination page size |\n\n**Implicit filters:** connected studio only; public and active appointment products.\n\n#### Sample request\n\n```\nGET /api/public/v1/appointments?per_page=50\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/appointments?per_page=50' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": [\n    {\n      \"id\": \"42\",\n      \"name\": \"Private Pilates\",\n      \"description\": \"1:1 session\",\n      \"duration_minutes\": 60,\n      \"max_allowed\": 1,\n      \"start_time_increment\": 15\n    }\n  ],\n  \"links\": { \"...\": \"pagination links\" },\n  \"meta\": { \"...\": \"pagination meta\" }\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `id` | Appointment product ID — use as `appointment_id` when booking |\n| `name` | Display name |\n| `description` | Optional description |\n| `duration_minutes` | Session length in minutes |\n| `max_allowed` | Max concurrent bookings per slot |\n| `start_time_increment` | Slot grid increment (minutes), if configured |\n\n---\n\n### 7.2 List bookables (Instructors & Facilities)\n\n`GET /api/public/v1/bookables` · scope: `read:schedules`\n\nReturns **Instructors** and **Facilities** linked to public appointments at the connected studio. Each bookable lists which appointment `services` (IDs) it supports.\n\n#### Terminology mapping\n\n| Kenko term | API `type` | `bookable_id` | Name fields |\n| --- | --- | --- | --- |\n| Instructor | `instructor` | Instructor user ID | `first_name`, `last_name` |\n| Facility | `facility` | Facility ID (string) | `display_name` |\n\n#### Query parameters\n\nNone.\n\n#### Sample request\n\n```\nGET /api/public/v1/bookables\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/bookables' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": [\n    {\n      \"type\": \"instructor\",\n      \"bookable_id\": \"b2c3d4e5-f6a7-8901-bcde-f12345678901\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Smith\",\n      \"services\": [\"42\"]\n    },\n    {\n      \"type\": \"facility\",\n      \"bookable_id\": \"7\",\n      \"display_name\": \"Reformer Room 1\",\n      \"services\": [\"42\"]\n    }\n  ]\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `type` | `instructor` or `facility` |\n| `bookable_id` | Instructor user ID or facility ID — pass into booking `bookables[]` |\n| `first_name` / `last_name` | Present for Instructors |\n| `display_name` | Present for Facilities |\n| `services` | Array of appointment IDs this bookable can serve |\n\n---\n\n### 7.3 Appointment slots\n\n`GET /api/public/v1/appointments/{appointment_id}/slots` · scope: `read:availability`\n\nReturns available appointment time slots for a given appointment product. Spot counts reflect **all bookings at the center** for that Instructor or Facility (Kenko CRM, webstore, partners, etc.) — use this as the single source of truth for appointment availability. Pass `user_id` (Instructor) or `facility_id` from `/bookables` to scope slots.\n\n#### Path parameters\n\n| Param | Type | Description |\n| --- | --- | --- |\n| `appointment_id` | string/int | Appointment product ID from list appointments |\n\n#### Query parameters / filters\n\n| Param | Type | Required | Description |\n| --- | --- | --- | --- |\n| `start_date` | date | Yes | Start of date range (YYYY-MM-DD) |\n| `end_date` | date | No | End of range; must be >= `start_date` if set |\n| `user_id` | integer | Yes\\* | Instructor user ID from `/bookables` |\n| `facility_id` | integer | Yes\\* | Facility ID from `/bookables` |\n| `dates_only` | boolean | No | If true, return dates only (no slot times) |\n\n\\* Pass **one of** `user_id` or `facility_id`.\n\n#### Sample request\n\n```\nGET /api/public/v1/appointments/42/slots?start_date=2026-07-22&end_date=2026-07-29&user_id=15\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/appointments/{APPOINTMENT_ID}/slots?start_date=2026-07-22&end_date=2026-07-29&user_id={INSTRUCTOR_ID}' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": {\n    \"appointment_id\": \"42\",\n    \"slots\": [\n      {\n        \"starts_at\": \"2026-07-22T10:00:00+01:00\",\n        \"ends_at\": \"2026-07-22T11:00:00+01:00\",\n        \"date\": \"2026-07-22\",\n        \"duration_minutes\": 60,\n        \"instructor\": {\n          \"id\": \"b2c3d4e5-f6a7-8901-bcde-f12345678901\",\n          \"first_name\": \"Alex\",\n          \"last_name\": \"Smith\"\n        },\n        \"facility\": {\n          \"id\": \"7\",\n          \"name\": \"Reformer Room 1\"\n        },\n        \"max_allowed\": 1,\n        \"booked_count\": 0,\n        \"available\": true\n      }\n    ],\n    \"slot_dates\": [\"2026-07-22\", \"2026-07-23\"]\n  }\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `appointment_id` | Appointment product ID |\n| `slots[]` | Available time slots |\n| `slots[].starts_at` / `ends_at` | ISO-8601 in center timezone |\n| `slots[].instructor` | Assigned Instructor (`id`, names) or `null` |\n| `slots[].facility` | Assigned **Facility** (`id`, `name`) or `null` |\n| `slots[].available` | True if `booked_count` < `max_allowed` |\n| `slot_dates` | Distinct dates with availability |\n| `next_available_date` | Present when `dates_only=true` (if available) |\n\n#### Errors\n\n| Message | Meaning |\n| --- | --- |\n| `Appointment not found.` | Unknown / non-public / inactive appointment |\n\n---\n\n## 8\\. Contacts\n\nCustomers map to Kenko **center contacts**. Naming: this endpoint is `/contacts` (not `/clients`).\n\n### 8.1 Lookup contacts\n\n`GET /api/public/v1/contacts` · scope: `read:contacts`\n\nSearch existing customers at the connected studio by name, email, or phone. Returns up to 50 matches among **all non-archived customers** at that center (not limited to subscription holders or partner-created contacts).\n\n#### Query parameters / filters\n\n| Param | Type | Required | Rules | Description |\n| --- | --- | --- | --- | --- |\n| `query` | string | Yes | min 1, max 255 | Search term matched against name, email, or phone |\n| `limit` | integer | No | 1–50 (default 50) | Maximum results to return |\n\n**Implicit filters:** connected studio only; archived contacts excluded.\n\n#### Sample request\n\n```\nGET /api/public/v1/contacts?query=jane@example.com\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/contacts?query=jane@example.com' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/contacts?query=Jane&limit=10' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": [\n    {\n      \"id\": \"c1d2e3f4-a5b6-7890-cdef-1234567890ab\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"email\": \"jane@example.com\",\n      \"phone\": \"+447700900123\"\n    }\n  ]\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `id` | Center contact UUID (or string id) |\n| `first_name` / `last_name` | Contact name |\n| `email` | Contact email |\n| `phone` | Phone if present |\n\n---\n\n### 8.2 Create / upsert contact\n\n`POST /api/public/v1/contacts` · scope: `write:contacts`\n\nFind-or-create a center contact by email. If a contact with that email already exists for the business/center, the existing record is returned (no duplicate create). New contacts are attributed with channel / lead source = partner slug.\n\n#### Body fields\n\n| Field | Type | Required | Rules | Description |\n| --- | --- | --- | --- | --- |\n| `email` | string | Yes | Valid email | Lookup key |\n| `first_name` | string | No | max 255 | Defaults to email local-part if creating |\n| `last_name` | string | No | max 255 | Defaults to empty string if creating |\n| `phone` | string | No | max 50 | Optional phone |\n\n#### Sample request\n\n```\nPOST /api/public/v1/contacts\nX-API-Key: {API_KEY}\nContent-Type: application/json\nAccept: application/json\n{\n  \"email\": \"jane@example.com\",\n  \"first_name\": \"Jane\",\n  \"last_name\": \"Doe\",\n  \"phone\": \"+447700900123\"\n}\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/contacts' \\\n  --header 'Accept: application/json' \\\n  --header 'Content-Type: application/json' \\\n  --header 'X-API-Key: {API_KEY}' \\\n  --data '{\n    \"email\": \"jane@example.com\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"phone\": \"+447700900123\"\n  }'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": {\n    \"id\": \"c1d2e3f4-a5b6-7890-cdef-1234567890ab\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"email\": \"jane@example.com\",\n    \"phone\": \"+447700900123\"\n  }\n}\n\n ```\n\n---\n\n## 9\\. Bookings\n\nBookings are reservations created by your partner at the connected studio. Payment is recorded as paid externally (partner-managed). Booking is attributed with your partner slug and `external_reference_id`.\n\n### `external_reference_id`\n\nYour **unique booking identifier** in the partner system. Kenko stores it on every partner booking and uses it across create, read, cancel, and webhooks.\n\n| Use | Behaviour |\n| --- | --- |\n| **Create booking** (`POST /bookings`) | **Required.** Max 255 characters. You choose the value (e.g. your checkout or order id). |\n| **Idempotency** | If Kenko already has an **active** booking for your partner with the same `external_reference_id`, `POST /bookings` returns that booking (no duplicate). Safe to retry after network errors. |\n| **Cancel booking** (`DELETE /bookings/{booking_id}`) | Path accepts Kenko numeric `booking_id` **or** your `external_reference_id`. |\n| **List / response** | Returned on every booking resource as `external_reference_id`. |\n| **Webhooks** | Included in `booking.confirmed`, `booking.cancelled`, and `booking.updated` payloads so you can match events to your order. |\n\n**Partner scope:** `external_reference_id` is unique per partner. Two different partners can use the same string without conflict.\n\n**After cancel:** You may reuse the same `external_reference_id` on a later `POST /bookings`. Kenko clears the reference from the cancelled row and creates a new booking.\n\n### 9.1 List bookings\n\n`GET /api/public/v1/bookings` · scope: `read:schedules`\n\nLists **all booked reservations at the connected center** (any booking channel — partner API, Kenko CRM, webstore, etc.). Includes both **classes** and **appointments**. Use this as a single source of truth for what is booked at the studio.\n\nCreate and cancel remain partner-scoped: you can only create/cancel bookings attributed to your partner key.\n\n**Booked appointments appear here only — never under** **`GET /schedules`****.**\n\n#### Query parameters / filters\n\n| Param | Type | Required | Rules / default | Description |\n| --- | --- | --- | --- | --- |\n| `start_date` | date | No | Valid date | Filter events starting on/after |\n| `end_date` | date | No | \\>= `start_date` if both set | Filter events starting on/before |\n| `event_type` | string | No | `class` or `appointment` | Filter by event type |\n| `per_page` | integer | No | 1–100; default 50 | Pagination page size |\n\n#### Sample request\n\n```\nGET /api/public/v1/bookings?start_date=2026-07-22&end_date=2026-07-29&event_type=class&per_page=50\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/bookings?start_date=2026-07-22&end_date=2026-07-29&event_type=class&per_page=50' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": [\n    {\n      \"id\": \"1\",\n      \"booking_id\": \"1849201\",\n      \"external_reference_id\": \"rp-booking-98765\",\n      \"partner_slug\": \"your-partner\",\n      \"event_type\": \"class\",\n      \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n      \"appointment_id\": null,\n      \"event_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n      \"event_name\": \"Reformers — Morning\",\n      \"starts_at\": \"2026-07-22T09:00:00+01:00\",\n      \"ends_at\": \"2026-07-22T10:00:00+01:00\",\n      \"staff\": [\n        {\n          \"id\": \"b2c3d4e5-f6a7-8901-bcde-f12345678901\",\n          \"first_name\": \"Alex\",\n          \"last_name\": \"Smith\"\n        }\n      ],\n      \"facility\": null,\n      \"center_contact_id\": \"c1d2e3f4-a5b6-7890-cdef-1234567890ab\",\n      \"status\": 1,\n      \"payment_status\": 1,\n      \"booked_via\": \"your-partner\",\n      \"created_at\": \"2026-07-15T08:30:00+00:00\"\n    }\n  ],\n  \"links\": { \"...\": \"pagination links\" },\n  \"meta\": { \"...\": \"pagination meta\" }\n}\n\n ```\n\n#### Response fields\n\n| Field | Description |\n| --- | --- |\n| `id` | Booking UUID (or string id) |\n| `booking_id` | Kenko numeric booking id (string) — use for cancel |\n| `external_reference_id` | Your partner booking id — see [<code>external_reference_id</code>](#external_reference_id) |\n| `partner_slug` | Partner slug |\n| `event_type` | `class` or `appointment` |\n| `schedule_id` | Class schedule UUID (class bookings) or `null` |\n| `appointment_id` | Appointment product ID (appointment bookings) or `null` |\n| `event_id` | Underlying event UUID |\n| `event_name` | Event / class / appointment name |\n| `starts_at` / `ends_at` | ISO-8601 in center timezone |\n| `staff` | Instructors assigned to the event |\n| `facility` | Facility object (`id`, `name`) or `null` |\n| `center_contact_id` | Customer center contact UUID |\n| `status` | Booking status — see table below |\n| `payment_status` | Payment status — see table below |\n| `booked_via` | Partner slug attribution |\n| `created_at` | ISO-8601 |\n\n---\n\n### 9.2 Create class booking\n\n`POST /api/public/v1/bookings` · scope: `write:bookings`\n\nBooks a customer into a public class schedule.\n\n#### Body fields\n\n| Field | Type | Required | Rules | Description |\n| --- | --- | --- | --- | --- |\n| `schedule_id` | uuid | Yes\\* | UUID of public class event | From schedules list/show `id` |\n| `external_reference_id` | string | Yes | max 255 | Your unique partner booking id (idempotency key) |\n| `customer` | object | Yes | — | Customer payload (find-or-create) |\n| `customer.email` | string | Yes | email | Contact lookup / create |\n| `customer.first_name` | string | No | max 255 |  |\n| `customer.last_name` | string | No | max 255 |  |\n| `customer.phone` | string | No | max 50 |  |\n\n\\* Provide `schedule_id` **or** `appointment_id` (see 9.3), not both. For class booking use `schedule_id`.\n\n#### Behaviour\n\n- **Idempotent:** same partner + `external_reference_id` returns the existing booking (see [<code>external_reference_id</code>](#external_reference_id)).\n    \n- Resolves / creates contact via same logic as `POST /contacts` (email).\n    \n- Rejects if schedule missing / not public class, cancelled, or no available spots.\n    \n- Classes only for this body shape — non-class events are rejected when using `schedule_id`.\n    \n\n#### Sample request\n\n```\nPOST /api/public/v1/bookings\nX-API-Key: {API_KEY}\nContent-Type: application/json\nAccept: application/json\n{\n  \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n  \"external_reference_id\": \"rp-booking-98765\",\n  \"customer\": {\n    \"email\": \"jane@example.com\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"phone\": \"+447700900123\"\n  }\n}\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/bookings' \\\n  --header 'Accept: application/json' \\\n  --header 'Content-Type: application/json' \\\n  --header 'X-API-Key: {API_KEY}' \\\n  --data '{\n    \"schedule_id\": \"{SCHEDULE_ID}\",\n    \"external_reference_id\": \"rp-booking-98765\",\n    \"customer\": {\n      \"email\": \"jane@example.com\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"phone\": \"+447700900123\"\n    }\n  }'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": {\n    \"id\": \"1\",\n    \"booking_id\": \"1849201\",\n    \"external_reference_id\": \"rp-booking-98765\",\n    \"partner_slug\": \"your-partner\",\n    \"event_type\": \"class\",\n    \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"appointment_id\": null,\n    \"event_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"event_name\": \"Reformers — Morning\",\n    \"starts_at\": \"2026-07-22T09:00:00+01:00\",\n    \"ends_at\": \"2026-07-22T10:00:00+01:00\",\n    \"staff\": [],\n    \"facility\": null,\n    \"center_contact_id\": \"c1d2e3f4-a5b6-7890-cdef-1234567890ab\",\n    \"status\": 1,\n    \"payment_status\": 1,\n    \"booked_via\": \"your-partner\",\n    \"created_at\": \"2026-07-15T08:30:00+00:00\"\n  }\n}\n\n ```\n\n#### Booking status values\n\n| `status` | Meaning |\n| --- | --- |\n| `1` | Booked |\n| `2` | Waitlist |\n| `3` | Cancelled |\n| `4` | Cancelled by contact |\n| `5` | Waitlist cancelled |\n| `6` | Blocked |\n| `7` | Failed |\n\nThese are integer codes. Any future change to string enums will be announced before it ships.\n\n#### Payment status values\n\n| `payment_status` | Meaning |\n| --- | --- |\n| `1` | Paid |\n| `2` | Unpaid |\n| `3` | Failed |\n| `4` | Refunded |\n\n#### Errors (examples)\n\n| Message | Meaning |\n| --- | --- |\n| `Schedule not found.` | Unknown / non-public / wrong center schedule |\n| `Schedule is cancelled.` | Cannot book cancelled event |\n| `Schedule has no available spots.` | Capacity full |\n| `Could not acquire booking lock.` | Transient concurrency — retry |\n| `Only class bookings are supported.` | Non-class event used with schedule path |\n\n---\n\n### 9.3 Create appointment booking\n\n`POST /api/public/v1/bookings` · scope: `write:bookings`\n\nBooks an appointment for a customer with one or more **Instructors** and/or **Facilities**.\n\n#### Body fields\n\n| Field | Type | Required | Rules | Description |\n| --- | --- | --- | --- | --- |\n| `appointment_id` | string/int | Yes\\* | From list appointments | Appointment product ID |\n| `starts_at` | datetime | Yes (with appointment) | ISO-8601 | Must match an available slot |\n| `bookables` | array | Yes (with appointment) | min 1 | Instructor and/or Facility selections |\n| `bookables[].type` | string | Yes | `INSTRUCTOR` or `RESOURCE` (case-insensitive; `instructor` / `facility` accepted) | Instructor or Facility |\n| `bookables[].bookable_id` | string | Yes | Instructor user ID or facility ID | From `/bookables` |\n| `external_reference_id` | string | Yes | max 255 | Your unique partner booking id (idempotency key) |\n| `customer` | object | Yes | — | Customer payload (find-or-create) |\n| `customer.email` | string | Yes | email | Contact lookup / create |\n| `customer.first_name` | string | No | max 255 |  |\n| `customer.last_name` | string | No | max 255 |  |\n| `customer.phone` | string | No | max 50 |  |\n\n\\* Use `appointment_id` (not `schedule_id`) for this path.\n\n#### Behaviour\n\n- Same idempotency as class booking (same partner + `external_reference_id`; see [<code>external_reference_id</code>](#external_reference_id)).\n    \n- Contact find-or-create by email.\n    \n- Requires at least one bookable; rejects unavailable / non-public appointments.\n    \n- `starts_at` should come from `GET /appointments/{id}/slots`.\n    \n\n#### Sample request\n\n```\nPOST /api/public/v1/bookings\nX-API-Key: {API_KEY}\nContent-Type: application/json\nAccept: application/json\n{\n  \"appointment_id\": \"42\",\n  \"starts_at\": \"2026-07-22T10:00:00+01:00\",\n  \"bookables\": [\n    { \"type\": \"INSTRUCTOR\", \"bookable_id\": \"15\" },\n    { \"type\": \"RESOURCE\", \"bookable_id\": \"7\" }\n  ],\n  \"external_reference_id\": \"rp-appt-54321\",\n  \"customer\": {\n    \"email\": \"jane@example.com\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\"\n  }\n}\n\n ```\n\n``` bash\ncurl --location '{API_HOST}/api/public/v1/bookings' \\\n  --header 'Accept: application/json' \\\n  --header 'Content-Type: application/json' \\\n  --header 'X-API-Key: {API_KEY}' \\\n  --data '{\n    \"appointment_id\": \"{APPOINTMENT_ID}\",\n    \"starts_at\": \"2026-07-22T10:00:00+01:00\",\n    \"bookables\": [\n      { \"type\": \"INSTRUCTOR\", \"bookable_id\": \"{INSTRUCTOR_ID}\" },\n      { \"type\": \"RESOURCE\", \"bookable_id\": \"{FACILITY_ID}\" }\n    ],\n    \"external_reference_id\": \"rp-appt-54321\",\n    \"customer\": {\n      \"email\": \"jane@example.com\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\"\n    }\n  }'\n\n ```\n\n#### Errors (examples)\n\n| Message | Meaning |\n| --- | --- |\n| `Appointment not found.` | Unknown / non-public appointment |\n| `Appointment is not available.` | Inactive or not public |\n| `At least one bookable is required.` | Empty `bookables` |\n| `Staff bookable not found.` | Invalid Instructor ID for center |\n| `Facility bookable not found.` | Invalid Facility ID for center |\n| `Invalid bookable type.` | Type not Instructor/Facility |\n| `Appointment slot has no available spots.` | Capacity full |\n| `Could not acquire booking lock.` | Transient concurrency — retry |\n\n---\n\n### 9.4 Cancel booking\n\n`DELETE /api/public/v1/bookings/{booking_id}` · scope: `write:bookings`\n\nCancels a partner booking. Path accepts Kenko numeric `booking_id` **or** partner `external_reference_id`.\n\n#### Path parameters\n\n| Param | Type | Description |\n| --- | --- | --- |\n| `booking_id` | string | Kenko booking numeric id or partner `external_reference_id` |\n\n#### Behaviour\n\n- Only bookings for the same partner and connected studio can be cancelled.\n    \n- Already-cancelled bookings return successfully (idempotent cancel).\n    \n- Uses Kenko free cancellation path, attributed to partner slug.\n    \n\n#### Sample request\n\n```\nDELETE /api/public/v1/bookings/rp-booking-98765\nX-API-Key: {API_KEY}\nAccept: application/json\n\n ```\n\n``` bash\ncurl --location --request DELETE '{API_HOST}/api/public/v1/bookings/{BOOKING_ID}' \\\n  --header 'Accept: application/json' \\\n  --header 'X-API-Key: {API_KEY}'\n\n ```\n\n#### Sample response\n\n``` json\n{\n  \"data\": {\n    \"id\": \"1\",\n    \"booking_id\": \"1849201\",\n    \"external_reference_id\": \"rp-booking-98765\",\n    \"partner_slug\": \"your-partner\",\n    \"event_type\": \"class\",\n    \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"appointment_id\": null,\n    \"status\": 3,\n    \"payment_status\": 1,\n    \"booked_via\": \"your-partner\",\n    \"created_at\": \"2026-07-15T08:30:00+00:00\"\n  }\n}\n\n ```\n\n#### Errors\n\n| Message | Meaning |\n| --- | --- |\n| `Booking not found.` | Unknown id / wrong center / not your booking |\n| `Booking does not belong to this partner.` | Should be rare if lookup is scoped |\n\n---\n\n## 10\\. Webhooks\n\nKenko sends outbound webhooks to URLs configured for your partner integration. Each delivery is signed with HMAC-SHA256. Use `connection_id` on every event to route updates to the correct studio in your system.\n\n### Subscription and signing secret\n\nKenko ops configures webhook subscriptions for your partner (URL + signing secret + event types). The secret is shared with you out-of-band when the subscription is provisioned. Kenko delivers only to partners with an **active** studio connection (grant) for the center that generated the event.\n\n### Request headers\n\n| Header | Description |\n| --- | --- |\n| `Content-Type` | `application/json` |\n| `X-Partner-Event` | Event type (e.g. `booking.confirmed`) |\n| `X-Partner-Signature` | `sha256=` + HMAC-SHA256 of the raw JSON body using your subscription secret |\n| `X-Partner-Delivery-Id` | Unique delivery UUID |\n| `X-Partner-Connection-Id` | Studio connection identifier (`connection_id` from payload `data`) |\n\n**Verification:** compute `HMAC-SHA256(raw_json_body, subscription_secret)`, prefix with `sha256=`, and compare to `X-Partner-Signature` using a constant-time compare. Sign the exact request body bytes Kenko sent (JSON with unescaped slashes).\n\n### Payload envelope\n\n``` json\n{\n  \"id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n  \"event\": \"booking.confirmed\",\n  \"created_at\": \"2026-07-22T10:00:00+00:00\",\n  \"data\": { }\n}\n\n ```\n\nEvery `data` object includes `connection_id` and `center_id`.\n\n### Event types and delivery rules\n\n| Event | When delivered |\n| --- | --- |\n| `authorization.created` | Studio connects your partner at a center |\n| `class.schedule.changed` | Class schedule is created, updated, or deleted |\n| `availability.changed` | Class capacity or available spots change (on create/delete; on update only when capacity or spots change; also after bookings/cancellations affect spots) |\n| `booking.confirmed` | A booking created via your partner API is confirmed |\n| `booking.cancelled` | A partner-owned booking is cancelled |\n| `booking.updated` | Start/end time of an event changes for a partner-owned booked reservation (class or appointment), including staff reschedules in Kenko CRM |\n\n**Booking events** (`booking.confirmed`, `booking.cancelled`, `booking.updated`) are sent only to the partner that owns the booking (`partner_id` on the booking).\n\n**Schedule events** are sent to every partner with an active connection and subscription for that center.\n\n### `authorization.created`\n\n``` json\n{\n  \"id\": \"…\",\n  \"event\": \"authorization.created\",\n  \"created_at\": \"2026-07-22T10:00:00+00:00\",\n  \"data\": {\n    \"connection_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"partner_slug\": \"your-partner\"\n  }\n}\n\n ```\n\n### `class.schedule.changed`\n\n``` json\n{\n  \"id\": \"…\",\n  \"event\": \"class.schedule.changed\",\n  \"created_at\": \"2026-07-22T10:00:00+00:00\",\n  \"data\": {\n    \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"connection_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"name\": \"Reformer Flow\",\n    \"starts_at\": \"2026-07-22T10:00:00+00:00\",\n    \"ends_at\": \"2026-07-22T11:00:00+00:00\",\n    \"capacity\": 12,\n    \"is_cancelled\": false\n  }\n}\n\n ```\n\n### `availability.changed`\n\n``` json\n{\n  \"id\": \"…\",\n  \"event\": \"availability.changed\",\n  \"created_at\": \"2026-07-22T10:00:00+00:00\",\n  \"data\": {\n    \"schedule_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"connection_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"capacity\": 12,\n    \"available_spots\": 5\n  }\n}\n\n ```\n\n### `booking.confirmed` / `booking.cancelled` / `booking.updated`\n\n``` json\n{\n  \"id\": \"…\",\n  \"event\": \"booking.confirmed\",\n  \"created_at\": \"2026-07-22T10:00:00+00:00\",\n  \"data\": {\n    \"booking_id\": \"1849201\",\n    \"external_reference_id\": \"rp-booking-98765\",\n    \"partner_slug\": \"your-partner\",\n    \"event_type\": \"appointment\",\n    \"schedule_id\": null,\n    \"appointment_id\": \"42\",\n    \"connection_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"center_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"starts_at\": \"2026-07-22T10:00:00+01:00\",\n    \"ends_at\": \"2026-07-22T11:00:00+01:00\",\n    \"status\": 1,\n    \"client\": {\n      \"email\": \"jane@example.com\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\"\n    }\n  }\n}\n\n ```\n\nFor class bookings, `event_type` is `class`, `schedule_id` is the class event UUID, and `appointment_id` is `null`.\n\nUse `booking.updated` when staff change appointment or class start/end times in Kenko so reminder SMS and calendars stay in sync. The booking keeps the same `booking_id` and `external_reference_id`; `partner_id` is unchanged.\n\n#### Booking status values\n\n| `status` | Meaning |\n| --- | --- |\n| `1` | Booked |\n| `2` | Waitlist |\n| `3` | Cancelled |\n| `4` | Cancelled by contact |\n| `5` | Waitlist cancelled |\n| `6` | Blocked |\n| `7` | Failed |\n\n### Retries\n\nFailed deliveries are retried with exponential backoff (default: up to 5 attempts, 60-second base backoff). Respond with `2xx` to acknowledge receipt.\n\n---\n\nKenko — Partner Public API\n\nContact your Kenko account manager for sandbox credentials and production cutover.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"29834338","team":2283979,"collectionId":"6bab56a6-9b2d-4c42-9ea8-1f9e56d1f6e5","publishedId":"2sBY4VJweq","public":true,"publicUrl":"https://documenter-api.postman.tech/view/29834338/2sBY4VJweq","privateUrl":"https://go.postman.co/documentation/29834338-6bab56a6-9b2d-4c42-9ea8-1f9e56d1f6e5","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.12.6","publishDate":"2026-08-11T07:35:20.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[{"name":"Kenko Partner Public API","id":"c1d660b5-e6ae-4701-9e35-440879eca690","owner":"29834338","values":[{"key":"base_url","value":"https://api.gokenko.com","enabled":true,"sessionValue":"https://api.gokenko.com","completeSessionValue":"https://api.gokenko.com","sessionIndex":0},{"key":"api_key","value":"","enabled":true,"sessionValue":"0eySycl68j9hRRJpIi9583ein6nqLNMs9pqVwv3h","completeSessionValue":"0eySycl68j9hRRJpIi9583ein6nqLNMs9pqVwv3h","sessionIndex":1},{"key":"connection_id","value":"","enabled":true,"sessionValue":"","completeSessionValue":"","sessionIndex":2},{"key":"schedule_id","value":"","enabled":true,"sessionValue":"3a9b4395-9b0a-4717-8aea-947f65836619","completeSessionValue":"3a9b4395-9b0a-4717-8aea-947f65836619","sessionIndex":3},{"key":"appointment_id","value":"","enabled":true,"sessionValue":"704","completeSessionValue":"704","sessionIndex":4},{"key":"booking_id","value":"","enabled":true,"sessionValue":"75711","completeSessionValue":"75711","sessionIndex":5},{"key":"external_reference_id","value":"","enabled":true,"sessionValue":"","completeSessionValue":"","sessionIndex":6}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/d0a6e48471a06c6a5d8551804bade99d0b790f1e9f5201658f306caa21b57186","favicon":""},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"Kenko Partner Public API","value":"29834338-c1d660b5-e6ae-4701-9e35-440879eca690"}],"canonicalUrl":"https://documenter.gw.postman.com/view/metadata/2sBY4VJweq"}