{
  "info": {
    "_postman_id": "a1d2c3b4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "name": "Maple Developer API",
    "description": "# Maple Developer API\n\nImport this collection together with the **Staging** or **Production** environment, set your API key, and run the requests top to bottom.\n\n## Setup\n1. Import this collection and the `Maple Developer API – Staging` (or `– Production`) environment.\n2. In the environment, paste your API key into `apiKey` (`mpk_test_…` for staging, `mpk_live_…` for production).\n3. Run **Status & Auth → Current app (/me)** to confirm the credential.\n\n## How auth works\nRequests send `Authorization: Bearer {{bearerToken}}`. When `bearerToken` is empty it falls back to your `apiKey`, so just setting `apiKey` is enough. The optional **OAuth** folder issues an access token and switches `bearerToken` to it automatically; clear `bearerToken` to go back to the API key.\n\n## Chaining\nList requests capture the first `id` they return (`locationId`, `orderId`, `subscriptionId`, `eventId`) into the environment, so the get/update/decision requests below them work without copy-paste.\n\nAll money is in integer minor units (cents). Full reference: https://docs.maple.inc/developer-api.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{bearerToken}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Fall back to the API key when no explicit bearer token (e.g. an OAuth access token) is set.",
          "if (!pm.environment.get('bearerToken') && !pm.collectionVariables.get('bearerToken')) {",
          "  const apiKey = pm.environment.get('apiKey') || pm.collectionVariables.get('apiKey');",
          "  if (apiKey) { pm.variables.set('bearerToken', apiKey); }",
          "}"
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": ["pm.test('No server error', function () {", "  pm.expect(pm.response.code).to.be.below(500);", "});"]
      }
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.staging.maple.inc/v1",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Status & Auth",
      "description": "Service readiness and credential introspection.",
      "item": [
        {
          "name": "Ping",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/ping",
              "host": ["{{baseUrl}}"],
              "path": ["ping"]
            },
            "description": "Unauthenticated readiness probe for the Developer API."
          },
          "response": []
        },
        {
          "name": "Current app (/me)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": ["{{baseUrl}}"],
              "path": ["me"]
            },
            "description": "Returns the developer app and effective scopes for the authenticated credential. Run this first to confirm your API key works."
          },
          "response": []
        }
      ]
    },
    {
      "name": "OAuth (optional)",
      "description": "Optional OAuth 2.0 flows. Most integrations just use an API key; use these only if you issue access tokens. The token-capture scripts switch the active `bearerToken` to the issued access token automatically.",
      "item": [
        {
          "name": "Token — client_credentials",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.access_token) {",
                  "  pm.environment.set('accessToken', json.access_token);",
                  "  pm.environment.set('bearerToken', json.access_token);",
                  "  console.log('Saved accessToken and switched bearerToken to the OAuth token.');",
                  "}",
                  "if (json && json.refresh_token) {",
                  "  pm.environment.set('refreshToken', json.refresh_token);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/oauth/token",
              "host": ["{{baseUrl}}"],
              "path": ["oauth", "token"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\",\n  \"scope\": \"locations:read connections:read connections:write orders:read orders:write menus:read menus:write delivery_zones:read delivery_zones:write webhooks:read webhooks:write bookings:read bookings:write bookings:manage bookings:configure\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Exchange an OAuth client id/secret for an access token (and rotating refresh token). Set `clientId` and `clientSecret` in your environment first."
          },
          "response": []
        },
        {
          "name": "Token — refresh_token",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.access_token) {",
                  "  pm.environment.set('accessToken', json.access_token);",
                  "  pm.environment.set('bearerToken', json.access_token);",
                  "  console.log('Saved accessToken and switched bearerToken to the OAuth token.');",
                  "}",
                  "if (json && json.refresh_token) {",
                  "  pm.environment.set('refreshToken', json.refresh_token);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/oauth/token",
              "host": ["{{baseUrl}}"],
              "path": ["oauth", "token"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"grant_type\": \"refresh_token\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\",\n  \"refresh_token\": \"{{refreshToken}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Exchange a refresh token for a new access token. The refresh token is rotated on every use; reusing an old one revokes the whole family."
          },
          "response": []
        },
        {
          "name": "Authorization code — Step 1: generate PKCE",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const CryptoJS = require('crypto-js');",
                  "function base64url(words) {",
                  "  return CryptoJS.enc.Base64.stringify(words).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");",
                  "}",
                  "const verifier = base64url(CryptoJS.lib.WordArray.random(32));",
                  "const challenge = base64url(CryptoJS.SHA256(verifier));",
                  "pm.environment.set('codeVerifier', verifier);",
                  "pm.environment.set('codeChallenge', challenge);",
                  "console.log('code_challenge (S256) for your authorize URL:', challenge);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/ping",
              "host": ["{{baseUrl}}"],
              "path": ["ping"]
            },
            "description": "Generates a PKCE `code_verifier` + `code_challenge` (S256) into your environment. Build your authorize URL with the logged `code_challenge`, complete the merchant consent in a browser, then paste the returned `code` into `authCode` and run Step 2."
          },
          "response": []
        },
        {
          "name": "Authorization code — Step 2: exchange code",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.access_token) {",
                  "  pm.environment.set('accessToken', json.access_token);",
                  "  pm.environment.set('bearerToken', json.access_token);",
                  "  console.log('Saved accessToken and switched bearerToken to the OAuth token.');",
                  "}",
                  "if (json && json.refresh_token) {",
                  "  pm.environment.set('refreshToken', json.refresh_token);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/oauth/token",
              "host": ["{{baseUrl}}"],
              "path": ["oauth", "token"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"grant_type\": \"authorization_code\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\",\n  \"code\": \"{{authCode}}\",\n  \"redirect_uri\": \"{{redirectUri}}\",\n  \"code_verifier\": \"{{codeVerifier}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Exchange the authorization code (with its PKCE verifier) for an access + refresh token. Requires `authCode`, `redirectUri`, and the `codeVerifier` from Step 1."
          },
          "response": []
        },
        {
          "name": "Revoke token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/oauth/revoke",
              "host": ["{{baseUrl}}"],
              "path": ["oauth", "revoke"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\",\n  \"token\": \"{{accessToken}}\",\n  \"token_type_hint\": \"access_token\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Revoke an access or refresh token. Revoking a refresh token revokes its whole rotation family. Succeeds even if the token is unknown."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Locations & Connections",
      "description": "The locations your app has been granted access to, and connecting to a location as its POS order receiver.",
      "item": [
        {
          "name": "List locations",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  pm.environment.set('locationId', json.data[0].id);",
                  "  console.log('Saved locationId =', json.data[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations",
              "host": ["{{baseUrl}}"],
              "path": ["locations"]
            },
            "description": "Lists the locations your app has been granted access to. Requires `locations:read`."
          },
          "response": []
        },
        {
          "name": "Get location",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Returns a single granted location. Requires `locations:read`."
          },
          "response": []
        },
        {
          "name": "Create connection",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/connection",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "connection"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Connects your app to a granted location as its POS receiver, provisioning and activating the integration. Requires `connections:write`."
          },
          "response": []
        },
        {
          "name": "Get connection",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/connection",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "connection"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Returns your app's connection to a granted location, if one exists. Requires `connections:read`."
          },
          "response": []
        },
        {
          "name": "Delete connection",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/connection",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "connection"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Disconnects your app from a location (the location can then be connected to a different POS). Requires `connections:write`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Menu",
      "description": "Publish and read a connected location’s menu. Requires an active connection to the location.",
      "item": [
        {
          "name": "Get location menu",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/menu",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "menu"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "The location's current published menu: categories, items, variations, shared modifier groups, and tax/fee/discount definitions. Money is in integer minor units. Requires `menus:read`."
          },
          "response": []
        },
        {
          "name": "Publish location menu",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/menu",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "menu"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"currency\": \"USD\",\n  \"timezone\": \"America/New_York\",\n  \"taxCategories\": [\n    {\n      \"externalId\": \"tax-standard\",\n      \"name\": \"Standard\"\n    }\n  ],\n  \"taxRates\": [\n    {\n      \"externalId\": \"nyc-sales\",\n      \"name\": \"NYC Sales Tax\",\n      \"taxCategoryId\": \"tax-standard\",\n      \"method\": \"percentage\",\n      \"percentage\": 8.875\n    }\n  ],\n  \"modifierGroups\": [\n    {\n      \"externalId\": \"milk-choice\",\n      \"name\": \"Milk\",\n      \"minSelections\": 0,\n      \"maxSelections\": 1,\n      \"options\": [\n        {\n          \"externalId\": \"oat-milk\",\n          \"name\": \"Oat Milk\",\n          \"price\": {\n            \"amount\": {\n              \"amountMinor\": 75,\n              \"currency\": \"USD\"\n            }\n          }\n        },\n        {\n          \"externalId\": \"whole-milk\",\n          \"name\": \"Whole Milk\"\n        }\n      ]\n    }\n  ],\n  \"categories\": [\n    {\n      \"externalId\": \"coffee\",\n      \"name\": \"Coffee\",\n      \"items\": [\n        {\n          \"externalId\": \"latte\",\n          \"name\": \"Latte\",\n          \"description\": \"Espresso with steamed milk.\",\n          \"taxCategoryId\": \"tax-standard\",\n          \"variations\": [\n            {\n              \"externalId\": \"latte-12oz\",\n              \"name\": \"12 oz\",\n              \"price\": {\n                \"amount\": {\n                  \"amountMinor\": 450,\n                  \"currency\": \"USD\"\n                }\n              }\n            },\n            {\n              \"externalId\": \"latte-16oz\",\n              \"name\": \"16 oz\",\n              \"price\": {\n                \"amount\": {\n                  \"amountMinor\": 525,\n                  \"currency\": \"USD\"\n                }\n              }\n            }\n          ],\n          \"modifierGroups\": [\n            {\n              \"groupId\": \"milk-choice\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Publishes the full menu document for a connected location. Validation is all-or-nothing; the document is applied as a diff, so an identical re-publish is a no-op and object identities stay stable by `externalId`. Requires `menus:write`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Delivery zones",
      "description": "Manage a connected location’s delivery zones and check whether a coordinate is deliverable. Requires an active connection to the location.",
      "item": [
        {
          "name": "List delivery zones",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  pm.environment.set('zoneId', json.data[0].id);",
                  "  console.log('Saved zoneId =', json.data[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/delivery_zones",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "delivery_zones"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Lists the active delivery zones for a connected location. Requires `delivery_zones:read`."
          },
          "response": []
        },
        {
          "name": "Create delivery zone",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'delivery_zone') {",
                  "  pm.environment.set('zoneId', json.id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/delivery_zones",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "delivery_zones"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Downtown\",\n  \"polygon\": {\n    \"type\": \"Polygon\",\n    \"coordinates\": [\n      [\n        [\n          -74.02,\n          40.7\n        ],\n        [\n          -73.99,\n          40.7\n        ],\n        [\n          -73.99,\n          40.73\n        ],\n        [\n          -74.02,\n          40.73\n        ],\n        [\n          -74.02,\n          40.7\n        ]\n      ]\n    ]\n  },\n  \"delivery_fee_cents\": 450,\n  \"priority\": 0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a delivery zone for a connected location; zone names must be unique per location. `polygon` is a GeoJSON Polygon of `[longitude, latitude]` rings — the first ring must be closed. Requires `delivery_zones:write`."
          },
          "response": []
        },
        {
          "name": "Get delivery zone",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/delivery_zones/:zoneId",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "delivery_zones", ":zoneId"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                },
                {
                  "key": "zoneId",
                  "value": "{{zoneId}}"
                }
              ]
            },
            "description": "Returns a single delivery zone belonging to a connected location. Requires `delivery_zones:read`."
          },
          "response": []
        },
        {
          "name": "Update delivery zone",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/delivery_zones/:zoneId",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "delivery_zones", ":zoneId"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                },
                {
                  "key": "zoneId",
                  "value": "{{zoneId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"delivery_fee_cents\": 550\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Updates a delivery zone; only the provided fields change. Requires `delivery_zones:write`."
          },
          "response": []
        },
        {
          "name": "Delete delivery zone",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/delivery_zones/:zoneId",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "delivery_zones", ":zoneId"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                },
                {
                  "key": "zoneId",
                  "value": "{{zoneId}}"
                }
              ]
            },
            "description": "Deactivates a delivery zone belonging to a connected location. Requires `delivery_zones:write`."
          },
          "response": []
        },
        {
          "name": "Check delivery zone coverage",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/delivery_zones/check",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "delivery_zones", "check"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"latitude\": 40.7128,\n  \"longitude\": -74.006\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Checks whether a coordinate falls inside any active delivery zone of a connected location and returns the matching zone and delivery fee. Requires `delivery_zones:read`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Orders",
      "description": "The order loop: read orders, report validation results, accept/deny, and report status transitions for the locations your app is connected to.",
      "item": [
        {
          "name": "List orders",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  pm.environment.set('orderId', json.data[0].id);",
                  "  console.log('Saved orderId =', json.data[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/orders",
              "host": ["{{baseUrl}}"],
              "path": ["orders"]
            },
            "description": "Lists orders (up to 100) for your connected locations. Use `since` for an oldest-first catch-up drain, then repeat with `starting_after` set to the last order id while `has_more` is true. Requires `orders:read`."
          },
          "response": []
        },
        {
          "name": "Get order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "description": "Returns a single order if it belongs to a connected location. Requires `orders:read`."
          },
          "response": []
        },
        {
          "name": "Resend order notification",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/resend",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "resend"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "description": "Publishes a fresh order.notification only for a live order owned by your app connection that missed its webhook. Terminal orders cannot be resent or revived; reconcile them with GET /v1/orders?since=... and GET /v1/orders/{orderId}. Requires `webhooks:write`."
          },
          "response": []
        },
        {
          "name": "Submit validation result",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/validation_result",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "validation_result"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"valid\",\n  \"partner_reference\": \"POS-TICKET-123\",\n  \"warnings\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Report whether an order can be accepted (availability, pricing, POS injectability). A `valid` result lets Maple send the order notification; `invalid` blocks it. For an invalid result send `{ \"status\": \"invalid\", \"reason\": { \"code\": \"item_unavailable\", \"explanation\": \"…\" } }`. Requires `orders:write`."
          },
          "response": []
        },
        {
          "name": "Accept order",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/accept",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "accept"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "description": "Accept the order; it is finalized and the customer confirmed. Requires `orders:write`."
          },
          "response": []
        },
        {
          "name": "Mark order ready",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/ready",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "ready"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "description": "Mark the order ready for pickup/handoff. Requires `orders:write`."
          },
          "response": []
        },
        {
          "name": "Complete order",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/complete",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "complete"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "description": "Mark the order fulfilled. Requires `orders:write`."
          },
          "response": []
        },
        {
          "name": "Deny order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/deny",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "deny"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Item out of stock\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Reject the order; it is rejected and any payment reversed. Requires `orders:write`."
          },
          "response": []
        },
        {
          "name": "Cancel order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/cancel",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "cancel"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Customer requested cancellation\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cancel the order. Requires `orders:write`."
          },
          "response": []
        },
        {
          "name": "Update order status",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/:orderId/status",
              "host": ["{{baseUrl}}"],
              "path": ["orders", ":orderId", "status"],
              "variable": [
                {
                  "key": "orderId",
                  "value": "{{orderId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"ACCEPTED\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Report an order status transition. One of ACCEPTED, READY, IN_DELIVERY, FULFILLED, REJECTED, STORE_CANCELLED. Requires `orders:write`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Event-type catalog, subscriptions, the event ledger, and replay.",
      "item": [
        {
          "name": "List webhook event types",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_event_types",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_event_types"]
            },
            "description": "Lists the event types a subscription can subscribe to."
          },
          "response": []
        },
        {
          "name": "Create webhook subscription",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.subscription) {",
                  "  pm.environment.set('subscriptionId', json.subscription.id);",
                  "  console.log('Saved subscriptionId =', json.subscription.id);",
                  "}",
                  "if (json && json.signing_secret) {",
                  "  pm.environment.set('signingSecret', json.signing_secret);",
                  "  console.log('Saved signingSecret (shown once) — store it securely.');",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhook_subscriptions",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_subscriptions"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"notification_url\": \"https://example.com/webhooks/maple\",\n  \"event_types\": [\n    \"order.validation_requested\",\n    \"order.notification\",\n    \"order.paid\",\n    \"order.cancelled\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Subscribe a notification URL to event types. Returns the HMAC signing secret once — store it now to verify deliveries. Requires `webhooks:write`."
          },
          "response": []
        },
        {
          "name": "List webhook subscriptions",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  pm.environment.set('subscriptionId', json.data[0].id);",
                  "  console.log('Saved subscriptionId =', json.data[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_subscriptions",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_subscriptions"]
            },
            "description": "Lists your app's webhook subscriptions in the credential's environment. Requires `webhooks:read`."
          },
          "response": []
        },
        {
          "name": "Get webhook subscription",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_subscriptions/:subscriptionId",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_subscriptions", ":subscriptionId"],
              "variable": [
                {
                  "key": "subscriptionId",
                  "value": "{{subscriptionId}}"
                }
              ]
            },
            "description": "Retrieves a single subscription owned by your app. Requires `webhooks:read`."
          },
          "response": []
        },
        {
          "name": "Update webhook subscription",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhook_subscriptions/:subscriptionId",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_subscriptions", ":subscriptionId"],
              "variable": [
                {
                  "key": "subscriptionId",
                  "value": "{{subscriptionId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"disabled\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Update the notification URL, event types, or enabled/disabled status. The signing secret is unchanged. Requires `webhooks:write`."
          },
          "response": []
        },
        {
          "name": "Send test webhook",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_subscriptions/:subscriptionId/test",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_subscriptions", ":subscriptionId", "test"],
              "variable": [
                {
                  "key": "subscriptionId",
                  "value": "{{subscriptionId}}"
                }
              ]
            },
            "description": "Delivers a synthetic `webhook.test` event and returns the delivery result. Requires `webhooks:write`."
          },
          "response": []
        },
        {
          "name": "Delete webhook subscription",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_subscriptions/:subscriptionId",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_subscriptions", ":subscriptionId"],
              "variable": [
                {
                  "key": "subscriptionId",
                  "value": "{{subscriptionId}}"
                }
              ]
            },
            "description": "Permanently deletes the subscription; pending deliveries are abandoned. Requires `webhooks:write`."
          },
          "response": []
        },
        {
          "name": "List webhook events",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  pm.environment.set('eventId', json.data[0].id);",
                  "  console.log('Saved eventId =', json.data[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_events",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_events"]
            },
            "description": "Your app's event ledger (most recent first, up to 50). Useful for reconciliation and debugging missed deliveries. Requires `webhooks:read`."
          },
          "response": []
        },
        {
          "name": "Get webhook event",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_events/:eventId",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_events", ":eventId"],
              "variable": [
                {
                  "key": "eventId",
                  "value": "{{eventId}}"
                }
              ]
            },
            "description": "Retrieves a single event from the ledger, including its `data` payload. Requires `webhooks:read`."
          },
          "response": []
        },
        {
          "name": "Replay webhook event",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook_events/:eventId/replay",
              "host": ["{{baseUrl}}"],
              "path": ["webhook_events", ":eventId", "replay"],
              "variable": [
                {
                  "key": "eventId",
                  "value": "{{eventId}}"
                }
              ]
            },
            "description": "Re-delivers the event to currently-matching subscriptions, skipping any already delivered (idempotent). Requires `webhooks:write`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Bookings (v2)",
      "description": "Bookings on the Developer API, rolling out per location. Start with the booking profile: it tells you whether the location takes partner bookings yet, which provider serves it, and which verbs that provider supports.",
      "item": [
        {
          "name": "Get booking profile",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/booking_profile",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "booking_profile"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Whether a granted location accepts partner bookings right now, its booking provider, the capability set (hold release, venue verbs, time-window listing, live floor), and the hold TTL. Requires `bookings:read`."
          },
          "response": []
        },
        {
          "name": "List bookings",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  pm.environment.set('bookingId', json.data[0].id);",
                  "  console.log('Saved bookingId =', json.data[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/bookings",
              "host": ["{{baseUrl}}"],
              "path": ["bookings"]
            },
            "description": "Bookings across your granted locations. Default: the next 7 days by slot start. Pass `start`/`end` (ISO instants, at most 31 days) for another window, or `updated_since` to drain everything updated after a checkpoint oldest-first. Page with `starting_after` + `limit`. Requires `bookings:read`."
          },
          "response": []
        },
        {
          "name": "Get booking",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'booking') {",
                  "  if (pm.environment.get('bookingWriteContextId') !== json.id) {",
                  "    pm.environment.unset('bookingChangeKey');",
                  "    pm.environment.unset('bookingChangeSlotToken');",
                  "    pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "    pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  }",
                  "  pm.environment.set('bookingId', json.id);",
                  "  pm.environment.set('bookingWriteContextId', json.id);",
                  "  pm.environment.set('locationId', json.location_id);",
                  "  pm.environment.set('bookingStartsAtLocal', json.starts_at_local);",
                  "  pm.environment.set('bookingPartySize', String(json.party_size));",
                  "  pm.environment.set('bookingProvider', json.provider);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "description": "A single booking at a granted location. Captures its location, provider, party size and local start for change requests. Requires `bookings:read`."
          },
          "response": []
        },
        {
          "name": "Search booking availability",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.variables.get('bookingDate')) pm.environment.set('bookingDate', new Date(Date.now() + 86400000).toISOString().slice(0, 10));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && Array.isArray(json.data) && json.data.length > 0) {",
                  "  const standard = json.data.find((slot) => slot.experience === null) || json.data[0];",
                  "  pm.environment.set('slotToken', standard.slot_token);",
                  "  console.log('Saved slotToken from the first standard slot.');",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/booking_availability?party_size={{bookingPartySize}}&start={{bookingDate}}T18:00&end={{bookingDate}}T21:00",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "booking_availability"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ],
              "query": [
                {
                  "key": "party_size",
                  "value": "{{bookingPartySize}}"
                },
                {
                  "key": "start",
                  "value": "{{bookingDate}}T18:00"
                },
                {
                  "key": "end",
                  "value": "{{bookingDate}}T21:00"
                }
              ]
            },
            "description": "Bookable slots for a party inside a venue-local window (at most 31 days). Add the query `party_size`, `start`, and `end` (venue-local `YYYY-MM-DDTHH:MM`), e.g. `?party_size=2&start=2026-06-15T18:00&end=2026-06-15T21:00`. Each slot carries an opaque signed `slot_token`; the first standard slot (`experience: null`) is captured as `slotToken`. Where the location offers experiences, their slots are listed too, and `experience_id` narrows the search to one. Requires `bookings:read`."
          },
          "response": []
        },
        {
          "name": "Hold a slot",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.id) {",
                  "  if (pm.environment.get('holdId') !== json.id || !pm.environment.get('bookingCreateKey')) pm.environment.set('bookingCreateKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  pm.environment.set('holdId', json.id);",
                  "  console.log('Saved holdId =', json.id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/booking_holds",
              "host": ["{{baseUrl}}"],
              "path": ["booking_holds"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"slot_token\": \"{{slotToken}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Claims a quoted slot’s capacity until `expires_at`. Pass a `slot_token` from an availability search unchanged. The hold id is captured as `holdId`. Requires `bookings:write`."
          },
          "response": []
        },
        {
          "name": "Release a hold",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/booking_holds/:holdId",
              "host": ["{{baseUrl}}"],
              "path": ["booking_holds", ":holdId"],
              "variable": [
                {
                  "key": "holdId",
                  "value": "{{holdId}}"
                }
              ]
            },
            "description": "Releases a hold early so its capacity is offered again. Idempotent. Requires `bookings:write`."
          },
          "response": []
        },
        {
          "name": "Create booking",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.environment.get('bookingCreateKey')) pm.environment.set('bookingCreateKey', pm.variables.replaceIn('{{$guid}}'));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'booking') {",
                  "  if (pm.environment.get('bookingWriteContextId') !== json.id) {",
                  "    pm.environment.unset('bookingChangeKey');",
                  "    pm.environment.unset('bookingChangeSlotToken');",
                  "    pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "    pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  }",
                  "  pm.environment.set('bookingId', json.id);",
                  "  pm.environment.set('bookingWriteContextId', json.id);",
                  "  pm.environment.set('locationId', json.location_id);",
                  "  pm.environment.set('bookingStartsAtLocal', json.starts_at_local);",
                  "  pm.environment.set('bookingPartySize', String(json.party_size));",
                  "  pm.environment.set('bookingProvider', json.provider);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings",
              "host": ["{{baseUrl}}"],
              "path": ["bookings"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"hold_id\": \"{{holdId}}\",\n  \"guest\": {\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Quinn\",\n    \"phone\": \"+12125551234\",\n    \"email\": \"alex@example.com\"\n  },\n  \"notes\": \"Window table if possible\",\n  \"idempotency_key\": \"{{bookingCreateKey}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Books the party a hold claims and returns the full `booking`. Uses the captured app-owned `holdId` for either provider; the quote is loaded from the persisted hold. `idempotency_key` is body-level and scoped to your app — retry a lost response with the same key and body. The booking id is captured as `bookingId`. Requires `bookings:write`."
          },
          "response": []
        },
        {
          "name": "Change booking",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.environment.get('bookingChangeKey') || !pm.environment.get('bookingChangeSlotToken')) {",
                  "  const day = String(pm.environment.get('bookingStartsAtLocal') || '').slice(0, 10);",
                  "  const current = pm.environment.get('bookingStartsAtLocal');",
                  "  const changing = pm.environment.get('bookingProvider') === 'maple' ? `&changing_booking_id=${pm.environment.get('bookingId')}` : '';",
                  "  const url = `${pm.variables.get('baseUrl')}/locations/${pm.environment.get('locationId')}/booking_availability` +",
                  "    `?party_size=${pm.environment.get('bookingPartySize') || 2}&start=${day}T00:00&end=${day}T23:59${changing}`;",
                  "  pm.sendRequest({ url, method: 'GET', header: { Authorization: `Bearer ${pm.variables.get('bearerToken')}` } }, (err, res) => {",
                  "    if (err || res.code !== 200) { console.log('Change search failed:', err || res.code); pm.execution.skipRequest(); return; }",
                  "    const slots = (res.json() && res.json().data) || [];",
                  "    const pick = slots.find((slot) => slot.starts_at_local !== current);",
                  "    if (!pick) { pm.execution.skipRequest(); return; }",
                  "    pm.environment.set('bookingChangeSlotToken', pick.slot_token);",
                  "    pm.environment.set('bookingChangeKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  });",
                  "}"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'booking') {",
                  "  if (pm.environment.get('bookingWriteContextId') !== json.id) {",
                  "    pm.environment.unset('bookingChangeKey');",
                  "    pm.environment.unset('bookingChangeSlotToken');",
                  "    pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "    pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  }",
                  "  pm.environment.set('bookingId', json.id);",
                  "  pm.environment.set('bookingWriteContextId', json.id);",
                  "  pm.environment.set('locationId', json.location_id);",
                  "  pm.environment.set('bookingStartsAtLocal', json.starts_at_local);",
                  "  pm.environment.set('bookingPartySize', String(json.party_size));",
                  "  pm.environment.set('bookingProvider', json.provider);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/change",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "change"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"slot_token\": \"{{bookingChangeSlotToken}}\",\n  \"idempotency_key\": \"{{bookingChangeKey}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Quotes a new slot using a native reschedule search or an ordinary provider search, then caches the quote and write key for retries. Clear bookingChangeKey and bookingChangeSlotToken before a different intended change, and run Get booking to refresh its current time. Add expected_version for optimistic concurrency. Requires bookings:write."
          },
          "response": []
        },
        {
          "name": "Cancel booking",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.environment.get('bookingCancelKey')) pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'booking') {",
                  "  if (pm.environment.get('bookingWriteContextId') !== json.id) {",
                  "    pm.environment.unset('bookingChangeKey');",
                  "    pm.environment.unset('bookingChangeSlotToken');",
                  "    pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "    pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  }",
                  "  pm.environment.set('bookingId', json.id);",
                  "  pm.environment.set('bookingWriteContextId', json.id);",
                  "  pm.environment.set('locationId', json.location_id);",
                  "  pm.environment.set('bookingStartsAtLocal', json.starts_at_local);",
                  "  pm.environment.set('bookingPartySize', String(json.party_size));",
                  "  pm.environment.set('bookingProvider', json.provider);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/cancel",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "cancel"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"idempotency_key\": \"{{bookingCancelKey}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cancels a booking on the guest’s behalf and returns it as `cancelled_by_guest`. Pass `expected_version` to refuse a cancel on a booking that moved on. Requires `bookings:write`."
          },
          "response": []
        },
        {
          "name": "Venue: confirm",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/confirm",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "confirm"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:manage. Choose the verb for the booking’s current state; do not run mutually exclusive transitions sequentially. Add expected_version for optimistic concurrency. Unsupported providers return 422."
          },
          "response": []
        },
        {
          "name": "Venue: decline",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/decline",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "decline"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:manage. Choose the verb for the booking’s current state; do not run mutually exclusive transitions sequentially. Add expected_version for optimistic concurrency. Unsupported providers return 422."
          },
          "response": []
        },
        {
          "name": "Venue: seat",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/seat",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "seat"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:manage. Choose the verb for the booking’s current state; do not run mutually exclusive transitions sequentially. Add expected_version for optimistic concurrency. Unsupported providers return 422."
          },
          "response": []
        },
        {
          "name": "Venue: no_show",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/no_show",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "no_show"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:manage. Choose the verb for the booking’s current state; do not run mutually exclusive transitions sequentially. Add expected_version for optimistic concurrency. Unsupported providers return 422."
          },
          "response": []
        },
        {
          "name": "Venue: complete",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/complete",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "complete"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:manage. Choose the verb for the booking’s current state; do not run mutually exclusive transitions sequentially. Add expected_version for optimistic concurrency. Unsupported providers return 422."
          },
          "response": []
        },
        {
          "name": "Venue: cancel",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.environment.get('bookingVenueCancelKey')) pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'booking') {",
                  "  if (pm.environment.get('bookingWriteContextId') !== json.id) {",
                  "    pm.environment.unset('bookingChangeKey');",
                  "    pm.environment.unset('bookingChangeSlotToken');",
                  "    pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "    pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  }",
                  "  pm.environment.set('bookingId', json.id);",
                  "  pm.environment.set('bookingWriteContextId', json.id);",
                  "  pm.environment.set('locationId', json.location_id);",
                  "  pm.environment.set('bookingStartsAtLocal', json.starts_at_local);",
                  "  pm.environment.set('bookingPartySize', String(json.party_size));",
                  "  pm.environment.set('bookingProvider', json.provider);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/bookings/:bookingId/venue_cancel",
              "host": ["{{baseUrl}}"],
              "path": ["bookings", ":bookingId", "venue_cancel"],
              "variable": [
                {
                  "key": "bookingId",
                  "value": "{{bookingId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"idempotency_key\": \"{{bookingVenueCancelKey}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cancels a booking on the venue’s behalf and returns it as `cancelled_by_venue`; the guest’s cancellation window does not apply. `idempotency_key` is body-level and scoped to your app, so re-running replays the cancel. Maple-native bookings only. Requires `bookings:manage`."
          },
          "response": []
        },
        {
          "name": "Seat a walk-in",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.environment.get('walkInKey')) pm.environment.set('walkInKey', pm.variables.replaceIn('{{$guid}}'));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'booking') {",
                  "  if (pm.environment.get('bookingWriteContextId') !== json.id) {",
                  "    pm.environment.unset('bookingChangeKey');",
                  "    pm.environment.unset('bookingChangeSlotToken');",
                  "    pm.environment.set('bookingCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "    pm.environment.set('bookingVenueCancelKey', pm.variables.replaceIn('{{$guid}}'));",
                  "  }",
                  "  pm.environment.set('bookingId', json.id);",
                  "  pm.environment.set('bookingWriteContextId', json.id);",
                  "  pm.environment.set('locationId', json.location_id);",
                  "  pm.environment.set('bookingStartsAtLocal', json.starts_at_local);",
                  "  pm.environment.set('bookingPartySize', String(json.party_size));",
                  "  pm.environment.set('bookingProvider', json.provider);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/walk_ins",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "walk_ins"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"party_size\": 2,\n  \"guest\": {\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Quinn\",\n    \"phone\": \"+12125551234\"\n  },\n  \"idempotency_key\": \"{{walkInKey}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Seats a party that just arrived at the earliest table that fits it now and returns the seated `booking`. `idempotency_key` is body-level and scoped to your app: re-running this request with the same `walkInKey` replays the same booking, as a retry after a lost response would. Clear `walkInKey` to seat another party. No table free now answers 409 `slot_unavailable`. Maple-native locations only. Requires `bookings:manage`."
          },
          "response": []
        },
        {
          "name": "Get live booking floor",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/booking_floor",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "booking_floor"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Native locations only. Requires bookings:read. Read on demand or poll at intervals of at least 15 seconds. Guest details exclude full phone and internal notes."
          },
          "response": []
        },
        {
          "name": "Get booking configuration",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/booking_configuration",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "booking_configuration"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Reads the effective booking configuration. Requires bookings:read; 404 until configuration exists."
          },
          "response": []
        },
        {
          "name": "Replace booking blackout dates",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/booking_blackouts",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "booking_blackouts"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"blackout_dates\": [\n    {\n      \"start_date\": \"2099-12-24\",\n      \"end_date\": \"2099-12-26\",\n      \"reason\": \"Holidays\"\n    },\n    {\n      \"start_date\": \"2099-10-10\",\n      \"end_date\": \"2099-10-10\",\n      \"start_time\": \"18:00\",\n      \"end_time\": \"22:00\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:configure. Replaces the whole list of windows when the location takes no reservations (ranges you omit are removed; [] clears them). Native and provider-managed locations. The venue edits the same list in its dashboard: read blackout_dates and blackout_dates_revision on the booking profile and add expected_revision to refuse (409 stale_blackout_dates) a write over a list changed since."
          },
          "response": []
        },
        {
          "name": "Publish booking configuration",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/booking_configuration",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "booking_configuration"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"timeZone\": \"America/New_York\",\n  \"currency\": \"USD\",\n  \"areas\": [\n    {\n      \"poolId\": \"dining\",\n      \"name\": \"Dining Room\",\n      \"units\": [\n        {\n          \"unitId\": \"t1\",\n          \"seats\": {\n            \"min\": 1,\n            \"max\": 4\n          }\n        },\n        {\n          \"unitId\": \"t2\",\n          \"seats\": {\n            \"min\": 1,\n            \"max\": 4\n          }\n        }\n      ]\n    }\n  ],\n  \"turnBands\": [\n    {\n      \"minGuests\": 1,\n      \"maxGuests\": 4,\n      \"minutes\": 90\n    }\n  ],\n  \"shifts\": [\n    {\n      \"day\": \"MON\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    },\n    {\n      \"day\": \"TUE\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    },\n    {\n      \"day\": \"WED\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    },\n    {\n      \"day\": \"THU\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    },\n    {\n      \"day\": \"FRI\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    },\n    {\n      \"day\": \"SAT\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    },\n    {\n      \"day\": \"SUN\",\n      \"start\": \"00:00\",\n      \"end\": \"23:59\"\n    }\n  ],\n  \"bookingPolicy\": {\n    \"minLeadMinutes\": 0,\n    \"maxHorizonDays\": 90,\n    \"slotAlignment\": \"quarter_hourly\",\n    \"autoConfirm\": true\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Requires bookings:configure. Replaces booking geometry and policies while preserving menu objects. Identical publication is a no-op. Does not enable the connection or rollout flags. Run this before availability if your sandbox has no geometry."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Waitlist",
      "description": "The walk-in waitlist at a granted Maple-native location. Uses the bookings scopes: bookings:read for the queue and estimates, bookings:write to add or cancel a party, bookings:manage for notify, seat, remove, open, and close. Maple sends every guest text.",
      "item": [
        {
          "name": "Open the waitlist",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/waitlist/open",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "waitlist", "open"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Lets remote parties join. Idempotent. Requires bookings:manage."
          },
          "response": []
        },
        {
          "name": "Add a party",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (!pm.environment.get('waitlistJoinKey')) pm.environment.set('waitlistJoinKey', pm.variables.replaceIn('{{$guid}}'));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json && json.object === 'waitlist_entry') {",
                  "  pm.environment.set('waitlistEntryId', json.id);",
                  "  console.log('Saved waitlistEntryId =', json.id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/waitlist_entries",
              "host": ["{{baseUrl}}"],
              "path": ["waitlist_entries"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"location_id\": \"{{locationId}}\",\n  \"party_size\": 2,\n  \"guest\": {\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Quinn\",\n    \"phone\": \"+12125551234\"\n  },\n  \"idempotency_key\": \"{{waitlistJoinKey}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Adds a party to the end of the queue. `idempotency_key` is body-level and scoped to your app: re-running this request with the same `waitlistJoinKey` replays the same entry, as a retry after a lost response would. Clear `waitlistJoinKey` to add another party. The entry id is captured as `waitlistEntryId`. Requires bookings:write."
          },
          "response": []
        },
        {
          "name": "Get waitlist",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/waitlist",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "waitlist"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "The active queue, first in line first, and whether remote parties may join. Requires bookings:read."
          },
          "response": []
        },
        {
          "name": "Estimate the wait",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/waitlist_estimate?party_size=2",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "waitlist_estimate"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ],
              "query": [
                {
                  "key": "party_size",
                  "value": "2"
                }
              ]
            },
            "description": "The parties ahead and a minutes band a new party of `party_size` would be quoted now. Requires bookings:read."
          },
          "response": []
        },
        {
          "name": "Get waitlist entry",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/waitlist_entries/:waitlistEntryId",
              "host": ["{{baseUrl}}"],
              "path": ["waitlist_entries", ":waitlistEntryId"],
              "variable": [
                {
                  "key": "waitlistEntryId",
                  "value": "{{waitlistEntryId}}"
                }
              ]
            },
            "description": "One entry in any status. Requires bookings:read."
          },
          "response": []
        },
        {
          "name": "Notify the party",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/waitlist_entries/:waitlistEntryId/notify",
              "host": ["{{baseUrl}}"],
              "path": ["waitlist_entries", ":waitlistEntryId", "notify"],
              "variable": [
                {
                  "key": "waitlistEntryId",
                  "value": "{{waitlistEntryId}}"
                }
              ]
            },
            "description": "Maple texts the guest that their table is ready; the entry becomes `notified` and expires if the guest does not respond in time. 422 guest_messaging_unavailable where Maple is not texting guests (not rolled out yet, or the location turned guest texts off). Requires bookings:manage."
          },
          "response": []
        },
        {
          "name": "Seat the party",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/waitlist_entries/:waitlistEntryId/seat",
              "host": ["{{baseUrl}}"],
              "path": ["waitlist_entries", ":waitlistEntryId", "seat"],
              "variable": [
                {
                  "key": "waitlistEntryId",
                  "value": "{{waitlistEntryId}}"
                }
              ]
            },
            "description": "Seats the party at the earliest table that fits it now and returns the entry with the walk-in `booking_id`. 409 slot_unavailable when no table is free. Requires bookings:manage."
          },
          "response": []
        },
        {
          "name": "Cancel for the guest",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/waitlist_entries/:waitlistEntryId/cancel",
              "host": ["{{baseUrl}}"],
              "path": ["waitlist_entries", ":waitlistEntryId", "cancel"],
              "variable": [
                {
                  "key": "waitlistEntryId",
                  "value": "{{waitlistEntryId}}"
                }
              ]
            },
            "description": "Takes the party out of line on the guest’s behalf (`removed_by_guest`). Run it instead of Seat the party. Requires bookings:write."
          },
          "response": []
        },
        {
          "name": "Remove as the venue",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/waitlist_entries/:waitlistEntryId/remove",
              "host": ["{{baseUrl}}"],
              "path": ["waitlist_entries", ":waitlistEntryId", "remove"],
              "variable": [
                {
                  "key": "waitlistEntryId",
                  "value": "{{waitlistEntryId}}"
                }
              ]
            },
            "description": "Takes the party out of line on the venue’s behalf (`removed_by_venue`). Run it instead of Seat the party. Requires bookings:manage."
          },
          "response": []
        },
        {
          "name": "Close the waitlist",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/locations/:locationId/waitlist/close",
              "host": ["{{baseUrl}}"],
              "path": ["locations", ":locationId", "waitlist", "close"],
              "variable": [
                {
                  "key": "locationId",
                  "value": "{{locationId}}"
                }
              ]
            },
            "description": "Stops remote parties from joining; parties already waiting stay in line. Requires bookings:manage."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Feedback",
      "description": "Tell Maple about a bug, a missing capability, wrong docs, or an error you could not act on.",
      "item": [
        {
          "name": "Send feedback",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/feedback",
              "host": ["{{baseUrl}}"],
              "path": ["feedback"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kind\": \"unclear_error\",\n  \"summary\": \"Order validation answered 400 without naming the field\",\n  \"attempted\": \"Submit a validation result for an order\",\n  \"expected\": \"The error names the field that failed\",\n  \"endpoint\": \"POST /v1/orders/{orderId}/validation_result\",\n  \"request_ids\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Stores a report for Maple to read at its weekly review. Put the `x-request-id` of any request involved in `request_ids`. No scope is required."
          },
          "response": []
        }
      ]
    }
  ]
}
