{
 "info": {
  "name": "Kamra PMS API",
  "description": "The full Kamra REST surface. Set base_url (e.g. https://pms.yourhotel.com), api_key and api_secret in the collection variables, then call away. Docs: https://kamrapms.com/docs/api-reference",
  "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
 },
 "variable": [
  {
   "key": "base_url",
   "value": "https://pms.yourhotel.com"
  },
  {
   "key": "api_key",
   "value": ""
  },
  {
   "key": "api_secret",
   "value": ""
  }
 ],
 "item": [
  {
   "name": "Core (front desk, folios, guests, rooms)",
   "item": [
    {
     "name": "enabled_modules",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.enabled_modules",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.enabled_modules"
       ]
      },
      "description": "Which parts of Kamra this property runs. Empty setting = all of\nthem, so an existing property keeps working untouched.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_enabled_modules",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_enabled_modules",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_enabled_modules"
       ]
      },
      "description": "Turn parts of the product on or off for one property.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"modules\": \"<modules>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "whoami",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.whoami",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.whoami"
       ]
      },
      "description": "Current user + roles - drives which modules the UI shows.\n\nallow_guest so the SPA's initial \"am I logged in?\" probe returns\n{user: \"Guest\"} cleanly instead of a 403 in the console."
     }
    },
    {
     "name": "developer_info",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.developer_info",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.developer_info"
       ]
      },
      "description": "REST base URL + whether the current user already has an API key.\n\nDrives the on-site Developers page. The secret itself is never returned\nhere - Frappe stores it hashed; it's only shown once, at generation time."
     }
    },
    {
     "name": "generate_api_key",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.generate_api_key",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.generate_api_key"
       ]
      },
      "description": "Generate (or rotate) the current user's REST API key + secret.\n\nSelf-service: acts only on the signed-in user, so any authenticated staff\nmember can mint a key scoped to their own roles. The secret is returned\nonce here and stored hashed thereafter."
     }
    },
    {
     "name": "upload_room_image",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.upload_room_image",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.upload_room_image"
       ]
      },
      "description": "Uploads an image file for room types / properties to public files."
     }
    },
    {
     "name": "set_room_rate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_room_rate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_room_rate"
       ]
      },
      "description": "Set the nightly rate for a room type over a date range - bounded by\nthe owner's Rate Guardrails (PRD FR-30). This is the Revenue Agent's\nwrite tool: it can never price outside the rails.\n\nGuardrails still clamp the rate; the change is recorded in the action log.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"start_date\": \"2026-08-01\",\n  \"end_date\": \"2026-08-31\",\n  \"rate\": \"<rate>\",\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "owner_briefing",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.owner_briefing",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.owner_briefing"
       ]
      },
      "description": "Deterministic numbers for the owner's morning briefing (PRD FR-70).\nAn LLM turns this into prose; it never invents the figures.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "setup_property",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.setup_property",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.setup_property"
       ]
      },
      "description": "One-call property onboarding - the wizard's submit button and the\nmigration agent's tool. payload = {property:{property_name, city,\ngstin?, phone?, ...}, room_types:[{code,name,base_price,adults?,\nextra_adult_price?,tax_percent?}], rooms:[{room_type_code,\nnumbers:[\"101\",\"102\"]}], meal_plans:[{code,label?,price_per_adult}]}",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"payload\": \"<payload>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "import_bookings",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.import_bookings",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.import_bookings"
       ]
      },
      "description": "Bulk booking import - the switch-over tool. Each row: {guest_name,\nphone?, room_type_code, check_in, check_out, adults?, children?,\namount_after_tax?, channel?, status?}. Rows with a fixed amount keep\nit (auto_price off); others are priced by the engine.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"bookings\": \"<bookings>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "registration_card",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.registration_card",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.registration_card"
       ]
      },
      "description": "Everything the printed GRC (guest registration card) needs.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cash_summary",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.cash_summary",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.cash_summary"
       ]
      },
      "description": "Cashier reconciliation: what the system says was collected today,\nper payment mode - the number the drawer must match at shift close.\n\nPrefers Cashier Transaction totals (FO + POS); falls back to folio\npayments for properties that have not opened a till yet.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "record_advance",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.record_advance",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.record_advance"
       ]
      },
      "description": "Take a deposit / advance on a booking before arrival (#114). Opens\nthe guest folio early so the money sits on the stay from day one and\nthe balance at check-in is right; recorded through add_folio_payment,\nso the till, cashier PIN and ledger see it like any other payment.\nA Held / Pending Payment booking is confirmed by it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"amount\": 1000,\n  \"mode\": \"Cash\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "deposit_payment_link",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.deposit_payment_link",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.deposit_payment_link"
       ]
      },
      "description": "A payment link for the booking deposit - the deposit still due by\ndefault, or any amount the desk agrees with the guest. Paid through the\ngateway, it posts to the folio as an Advance (settle_payment_link).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"amount\": 1000\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "simulate_payment_link",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.simulate_payment_link",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.simulate_payment_link"
       ]
      },
      "description": "Test mode only: act as the gateway and mark the outstanding link\npaid - for demos and training, never on a live gateway.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "security_deposit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.security_deposit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.security_deposit"
       ]
      },
      "description": "The stay's refundable security (damage) deposit: policy amount, what\nis held, withheld and refunded, its history and which actions are open.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "collect_security_deposit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.collect_security_deposit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.collect_security_deposit"
       ]
      },
      "description": "Take a refundable security deposit (villas: the damage deposit). Lands\non the guest folio as a Security Deposit payment and in the Deposit\nledger - a liability held for the guest, never revenue. Cashier PIN and\nopen till as for any payment.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"amount\": 1000,\n  \"mode\": \"Cash\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "waive_security_deposit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.waive_security_deposit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.waive_security_deposit"
       ]
      },
      "description": "Waive the property's security deposit for this stay (reason required).\nRefused once money has been taken - refund it instead.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "withhold_security_deposit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.withhold_security_deposit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.withhold_security_deposit"
       ]
      },
      "description": "Keep all or part of the held deposit against damage (reason required).\nThe withheld part posts as a damage charge on the guest folio and moves\nfrom the Deposit ledger to the Guest ledger to pay it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"amount\": 1000,\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "refund_security_deposit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.refund_security_deposit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.refund_security_deposit"
       ]
      },
      "description": "Refund what is still held (all of it by default) through the folio\nrefund path - till, folio and a Deposit-ledger debit. Cashier PIN.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"amount\": 1000\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "release_access_instructions",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.release_access_instructions",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.release_access_instructions"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"force\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "confirm_pending_reservation",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.confirm_pending_reservation",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.confirm_pending_reservation"
       ]
      },
      "description": "Mark Held / Pending Payment / Requested as Confirmed (host or payment).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "folio_payment_link",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.folio_payment_link",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.folio_payment_link"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_queue",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_queue",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_queue"
       ]
      },
      "description": "The housekeeper's phone view: prioritized task queue + room board.\nCheckout cleans for rooms with an arrival today jump the queue.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_update_task",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_update_task",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_update_task"
       ]
      },
      "description": "Start or complete a housekeeping task from the phone.\n\nAn Inspection is completed by passing it: Done on an inspection is taken\nas Verified, which moves the room to Ready (inspection required by the\nturnover profile) or Inspected - never back to plain Clean. Verifying -\nan inspection or anyone's clean - is a supervisor's call, the same rule\nset_housekeeping_status applies to Inspected / Ready.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_upload_media",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_upload_media",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_upload_media"
       ]
      },
      "description": "Attach a completion photo/video (proof of clean) to a housekeeping task.\n\nUploaded from the housekeeper's phone while the room is being serviced. Stored\npublic and attached to the task, so it stays with the record after the task\ncloses and drops out of the live queue.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_delete_media",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_delete_media",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_delete_media"
       ]
      },
      "description": "Remove a completion photo/video from a housekeeping task.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\",\n  \"file_url\": \"<file_url>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_task_media",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_task_media",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_task_media"
       ]
      },
      "description": "Completion photos/videos attached to one housekeeping task (newest first).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_room_media",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_room_media",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_room_media"
       ]
      },
      "description": "Photos/videos from the room's LATEST cleaning only - so the front desk\nsees just the most recent clean, not older cycles. Lets reception confirm a\nroom is genuinely guest-ready.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_staff",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_staff",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_staff"
       ]
      },
      "description": "Who a supervisor can hand a housekeeping task to at this property.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_assign_task",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_assign_task",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_assign_task"
       ]
      },
      "description": "A supervisor hands a task to a specific housekeeper (awaits accept).\nAttendants take work from the pool with hk_claim_task; handing a task to\nsomeone else is the supervisor's (or desk's) call, and only to a\nhousekeeper who can work this property.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\",\n  \"user\": \"<user>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_claim_task",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_claim_task",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_claim_task"
       ]
      },
      "description": "A housekeeper takes an unassigned task from the pool for themselves.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_accept_task",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_accept_task",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_accept_task"
       ]
      },
      "description": "The assigned housekeeper accepts the task handed to them.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_reject_task",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_reject_task",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_reject_task"
       ]
      },
      "description": "Decline a task - it drops back into the pool for someone else,\nkeeping the reason on record.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"task\": \"<task>\",\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_log_item",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_log_item",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_log_item"
       ]
      },
      "description": "A floor housekeeper logs a lost/found/missing/damaged item from the\nphone. Lands in the Lost & Found register for the desk to reconcile.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"item_description\": \"<item_description>\",\n  \"condition\": \"Found\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hk_post_consumable",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hk_post_consumable",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hk_post_consumable"
       ]
      },
      "description": "Housekeeping posts what they find in the room - minibar consumption or\nlaundry - onto the in-house guest's folio. Scoped to those two types so\nthe floor can't touch discounts, allowances or room charges.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"room\": \"Your Property-101\",\n  \"charge_type\": \"<charge_type>\",\n  \"description\": \"<description>\",\n  \"amount\": 1000\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.create_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.create_ticket"
       ]
      },
      "description": "Create a guest-request ticket. This is also the agent tool for\n'guest wants towels / AC is broken' - PRD FR-42.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"subject\": \"<subject>\",\n  \"category\": \"<category>\",\n  \"priority\": \"Medium\",\n  \"room\": \"Your Property-101\",\n  \"reservation\": \"RES-2026-00001\",\n  \"guest\": \"G-00001\",\n  \"source\": \"Manual\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "tickets_list",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.tickets_list",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.tickets_list"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"show_closed\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "advance_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.advance_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.advance_ticket"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "get_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.get_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.get_folio"
       ]
      },
      "description": "Folio for a reservation - opens one if the guest is checked in.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_folio_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.add_folio_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.add_folio_charge"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"charge_type\": \"<charge_type>\",\n  \"description\": \"<description>\",\n  \"amount\": 1000,\n  \"gst_rate\": 0,\n  \"is_alcohol\": 0,\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_folio_payment",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.add_folio_payment",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.add_folio_payment"
       ]
      },
      "description": "Record money received on the stay ledger. kind labels WHY it came\nin - Payment (against the bill), Advance (collected before/at\ncheck-in) or Security Deposit (held, refundable). Refunds go through\nrefund_folio_payment so they can never be entered by accident.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"mode\": \"<mode>\",\n  \"amount\": 1000,\n  \"kind\": \"Payment\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "refund_folio_payment",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.refund_folio_payment",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.refund_folio_payment"
       ]
      },
      "description": "Give money back on an open folio - a held security deposit at\ncheckout, or an over-collected advance. Stored as a negative ledger\nrow so every balance still sums exactly; a reason is mandatory.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"amount\": 1000,\n  \"mode\": \"<mode>\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_actual_times",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_actual_times",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_actual_times"
       ]
      },
      "description": "Correct the recorded arrival/departure moments - early check-ins\nand late checkouts should show what actually happened, not just when\nthe button was pressed. Early/late charges stay explicit folio lines.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "void_folio_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.void_folio_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.void_folio_charge"
       ]
      },
      "description": "Remove a wrong charge line from an open folio (the bill-correction\npath). PIN-guarded like other money actions for humans; agents are\naccountable through the action log. Posts a ledger reversal.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"charge_row\": \"<charge_row>\",\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "post_stay_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.post_stay_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.post_stay_charge"
       ]
      },
      "description": "Post a charge to a stay letting the billing rules pick the folio -\ncorporate room/meals land on the Company folio, alcohol and anything\nunruled lands on the guest. The agent-facing way to post charges.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"charge_type\": \"<charge_type>\",\n  \"description\": \"<description>\",\n  \"amount\": 1000,\n  \"gst_rate\": 0,\n  \"is_alcohol\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_billing_rules",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_billing_rules",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_billing_rules"
       ]
      },
      "description": "Replace a company's billing rules. rules = [{charge_type, pay_by}].",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"company\": \"<company>\",\n  \"rules\": \"<rules>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "get_billing_rules",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.get_billing_rules",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.get_billing_rules"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"company\": \"<company>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "company_billing_default",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.company_billing_default",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.company_billing_default"
       ]
      },
      "description": "What this company pays when it has no billing rules: the property's\n`default_company_billing` for a credit company, nothing otherwise.\n`charge_types` is None when every charge type (except liquor) is covered.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"company\": \"<company>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "update_occupants",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.update_occupants",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.update_occupants"
       ]
      },
      "description": "Replace the stay's occupant register.\noccupants = [{full_name, age, gender, nationality, id_type, id_number, phone}]\nA child keeps name and age only: no phone, and ID details only where the\ncountry's register needs them (see localization.minor_id_kept).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"occupants\": \"<occupants>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "split_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.split_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.split_folio"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"folio_type\": \"Extra\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.delete_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.delete_folio"
       ]
      },
      "description": "Remove an empty split/extra folio created by mistake.\n\nGuards: never the primary Guest folio, and only when it carries no\ncharges and no payments - money is never dropped this way.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "transfer_folio_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.transfer_folio_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.transfer_folio_charge"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"from_folio\": \"<from_folio>\",\n  \"charge_row\": \"<charge_row>\",\n  \"to_folio\": \"<to_folio>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "transfer_folio_charges",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.transfer_folio_charges",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.transfer_folio_charges"
       ]
      },
      "description": "Bulk move: several charge lines to another folio of the stay.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"from_folio\": \"<from_folio>\",\n  \"charge_rows\": \"<charge_rows>\",\n  \"to_folio\": \"<to_folio>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "split_folio_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.split_folio_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.split_folio_charge"
       ]
      },
      "description": "Split one charge line between two folios - by percent or amount.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"from_folio\": \"<from_folio>\",\n  \"charge_row\": \"<charge_row>\",\n  \"to_folio\": \"<to_folio>\",\n  \"amount\": 1000\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reservation_folios",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.reservation_folios",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.reservation_folios"
       ]
      },
      "description": "All folios of a stay (guest + splits) with balances - plus the\ngroup master folio when the stay belongs to a group, so charges can\nbe moved between a guest's bill and the company's consolidated one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "group_master_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.group_master_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.group_master_folio"
       ]
      },
      "description": "Get-or-create the group's consolidated company folio.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"group_booking\": \"<group_booking>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "group_folios",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.group_folios",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.group_folios"
       ]
      },
      "description": "The whole group's billing picture: the master folio plus every\nmember reservation's folios, with balances.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"group_booking\": \"<group_booking>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "close_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.close_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.close_folio"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "post_allowance",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.post_allowance",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.post_allowance"
       ]
      },
      "description": "Write off part of a bill against a specific folio, with a reason.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"amount\": 1000,\n  \"reason\": \"<reason>\",\n  \"gst_rate\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "part_settle_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.part_settle_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.part_settle_folio"
       ]
      },
      "description": "Interim invoice mid-stay: freeze the paid folio, open a fresh one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cancel_invoice",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.cancel_invoice",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.cancel_invoice"
       ]
      },
      "description": "Void an invoice into the register and reopen the folio for correction.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "folio_invoice",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.folio_invoice",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.folio_invoice"
       ]
      },
      "description": "Everything the bill needs to print itself.\n\nA tax invoice is a legal document, not a screenshot of a table: the\nservice code belongs on each LINE (a room night, a restaurant cover\nand a laundry bag are three different supplies), the tax has to be\nnamed the way the country names it, the total has to appear in words,\nand the guest wants a summary by what they bought before they read\nforty lines. All of that is assembled here so every surface that\nprints a bill - the folio screen, a PDF, an email - agrees.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "run_night_audit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.run_night_audit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.run_night_audit"
       ]
      },
      "description": "Close the current business date. Refused while a blocking pre-check\n(kamra.night_audit.night_audit_precheck) has items, unless each is\nlisted in `acknowledge` (check keys) with a `note` giving the reason.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"business_date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "gstr1_rows",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.gstr1_rows",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.gstr1_rows"
       ]
      },
      "description": "Invoice-level rows for a GSTR-1 style export (v0: B2C summary).\nFilter by property - each GSTIN files its own return. The return is the\nIndia pack's: a property elsewhere is refused, and without a property\nonly the user's India properties are included.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "guests_with_stats",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.guests_with_stats",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.guests_with_stats"
       ]
      },
      "description": "Guest list with stay stats - the CRM index."
     }
    },
    {
     "name": "guest_search",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.guest_search",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.guest_search"
       ]
      },
      "description": "Typeahead for attaching a booking to an existing profile.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"q\": \"<q>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "guest_alert",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.guest_alert",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.guest_alert"
       ]
      },
      "description": "Is the guest a booking would attach to blacklisted? The desk asks\nbefore booking so the warning shows up front, not as a refusal at the\nend. Resolves exactly like create_booking: the chosen profile, else the\nprofile with this phone number.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\",\n  \"phone\": \"+91 90000 00000\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_guest_blacklist",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_guest_blacklist",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_guest_blacklist"
       ]
      },
      "description": "Blacklist a guest, or lift it. Hotel Admin only; a reason is required\neither way and lands in the activity log with the before/after.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\",\n  \"blacklisted\": \"<blacklisted>\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "merge_guests",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.merge_guests",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.merge_guests"
       ]
      },
      "description": "Merge a duplicate profile into the surviving one: every linked\ndocument is repointed, missing contact fields are copied over, and\nthe duplicate is deleted. Money is untouched - folios keep their\nlines and totals.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"source\": \"<source>\",\n  \"target\": \"<target>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "anonymize_guest",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.anonymize_guest",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.anonymize_guest"
       ]
      },
      "description": "Right to erasure (DPDP s.12): see kamra.privacy.erase_guest. Stays\nand bills stay for the books. Irreversible.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "guest_journey",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.guest_journey",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.guest_journey"
       ]
      },
      "description": "One guest's full story: profile, stats, chronological timeline.\nThis is the CRM detail view - and the context an AI concierge loads\nbefore speaking to a returning guest.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "my_properties",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.my_properties",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.my_properties"
       ]
      },
      "description": "Properties the current user may work with. frappe.get_list applies\nUser Permissions, so a property-restricted user sees only theirs."
     }
    },
    {
     "name": "front_desk_snapshot",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.front_desk_snapshot",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.front_desk_snapshot"
       ]
      },
      "description": "Everything the front desk needs for one day, in one call.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "find_reservations",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.find_reservations",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.find_reservations"
       ]
      },
      "description": "Search reservations by guest name, room number, or reference - optionally\nfiltered by status. The way to resolve a room number or a name to an actual\nreservation before acting on it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"limit\": 20\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "find_invoices",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.find_invoices",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.find_invoices"
       ]
      },
      "description": "Resolve an invoice number (or partial) to its folio and stay, so the\ncommand palette can jump straight from 'INV-KDP-26-00042' to the bill.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"limit\": 8\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "stay_instructions",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.stay_instructions",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.stay_instructions"
       ]
      },
      "description": "The special instructions on a stay (a VIP amenity, a 6am wake-up, a\nno-feather pillow) - each for one department, Open until someone marks\nit Done.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_stay_instruction",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.add_stay_instruction",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.add_stay_instruction"
       ]
      },
      "description": "Add an instruction to a stay for one department. Written as its own\nchild row so it never re-saves (and re-validates) the whole booking.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"department\": \"<department>\",\n  \"instruction\": \"<instruction>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_stay_instruction_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_stay_instruction_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_stay_instruction_status"
       ]
      },
      "description": "Mark one instruction Done (stamping who and when), or reopen it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"row\": \"<row>\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reservation_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.reservation_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.reservation_detail"
       ]
      },
      "description": "Everything about one booking in a single call - stay, money, guest,\nbooker and the actions currently available. Powers the reservation drawer.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "upload_id_document",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.upload_id_document",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.upload_id_document"
       ]
      },
      "description": "Capture the guest's ID at the counter, when they never uploaded one.\n\nSame storage as the guest path, different gate: there the token proves\nownership, here @require_roles does. This exists so that \"never block\ncheck-in\" has somewhere to go - the desk flags a missing document, then\nfixes it in the same breath instead of turning the guest away.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"data\": \"<data>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "id_document_image",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.id_document_image",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.id_document_image"
       ]
      },
      "description": "The ID scan as a data URL, for the desk to eyeball.\n\nWhy not just point an <img> at the /private/files/ URL: Frappe would\nauthorise that through File.has_permission -> the Reservation's own\ndoctype permissions. On a site whose Custom DocPerm rows omit Front Desk\n(as ours do - any custom perm on a doctype REPLACES all its standard\nperms), that check says no, and the desk gets a broken image while a\nHotel Admin sees it. Kamra's authorization has always lived on the\nendpoint rather than the doctype (see authz.py), so the image is served\nthe same way as everything else here: one gate, one rule, works for\nevery role the app actually grants.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "verify_precheckin",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.verify_precheckin",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.verify_precheckin"
       ]
      },
      "description": "The desk has held the document against the human and agrees.\n\nThis is the write that finally makes precheckin_status=\"Verified\" real -\nthe enum has existed since pre-arrival check-in shipped and no code path\never set it. precheckin_submit already refuses to touch a Verified\nbooking, so the guest is locked out of rewriting a checked card the\nmoment this lands; that guard was clearly written for this.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "checkin_context",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.checkin_context",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.checkin_context"
       ]
      },
      "description": "Everything the check-in flow needs in one round trip: how complete\nthe guest's registration is, the assigned room - or the allocator's\nsuggestion plus every room the desk may hand over instead.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "check_in",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.check_in",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.check_in"
       ]
      },
      "description": "Check the guest in: the last step of the guided check-in.\n\nRefused while a check-in step the property marks required (Settings >\nFront desk > Check-in steps) is not done for this stay - the ID, who\npays, the deposit, the registration card... - so neither the desk, the\nAPI nor an AI agent can skip them. kamra.checkin.check_in_readiness says\nwhat is missing. Records who checked the guest in and when; a connected\ndoor-lock system then makes the keys recorded in the Keys step.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "walk_in",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.walk_in",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.walk_in"
       ]
      },
      "description": "Walk-in in one step: book, register the ID, check into the chosen\nroom and take the money - the counter flow that used to be four screens.\n\ndefer_check_in=1 books, assigns the room and takes the money (as an\nadvance) but leaves the stay Confirmed, so the desk finishes it in the\nguided check-in, where the property's required steps apply. Without it\nthe required steps are enforced here as well: the walk-in records the\nsteps it does itself (room, who pays, the ID when given) and refuses,\nrolling the booking back, if another required step is still open.\n\nIt is the same writers chained (create_booking \u2192 check_in \u2192\nadd_folio_payment), inside one request, so it is all-or-nothing: a\nrefused PIN or a room that just sold rolls the booking back too.\nArrival is always today (calendar, like every new booking - a lagging\nnight audit must not turn walk-ins away); a future stay is a normal\nbooking, not a walk-in.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"room\": \"Your Property-101\",\n  \"check_out_date\": \"2026-08-03\",\n  \"guest_name\": \"A. Guest\",\n  \"phone\": \"+91 90000 00000\",\n  \"guest\": \"G-00001\",\n  \"adults\": 2,\n  \"children\": 0,\n  \"payment_amount\": 0,\n  \"defer_check_in\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "upload_occupant_id",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.upload_occupant_id",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.upload_occupant_id"
       ]
      },
      "description": "ID document for one occupant on the stay register. Same security\npipeline as every ID image: decoded, re-encoded through PIL (the\nsanitisation boundary), stored private, attached to the reservation\nso checkout retention rules find it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"row\": \"<row>\",\n  \"image\": \"<image>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "upload_guest_document",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.upload_guest_document",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.upload_guest_document"
       ]
      },
      "description": "The desk captures or replaces a guest's document while preparing\nthe GRC - walk-ins, or a newer copy over last visit's. kind is 'id'\nor 'address'; stored privately, one current copy per slot.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\",\n  \"kind\": \"<kind>\",\n  \"image\": \"<image>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cancellation_preview",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.cancellation_preview",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.cancellation_preview"
       ]
      },
      "description": "What cancelling right now would cost - shown before confirming.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cancel_reservation",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.cancel_reservation",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.cancel_reservation"
       ]
      },
      "description": "Cancel a booking, applying the property's cancellation policy:\nfree outside the window, else the configured fee lands on the folio.\nIssues a cancellation number the guest can hold on to. Pass\nwaive_fee=1 to cancel graciously (logged).\n\nThe cancellation is recorded in the action log.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"reason\": \"Guest request\",\n  \"waive_fee\": 0,\n  \"issue_credit_note\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cancellation_letter",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.cancellation_letter",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.cancellation_letter"
       ]
      },
      "description": "Everything the printable cancellation confirmation needs.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "checkout_context",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.checkout_context",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.checkout_context"
       ]
      },
      "description": "Everything the guided check-out needs in one round trip, without\nchanging anything: each folio with its lines and invoice, as it will\nstand once check-out posts the remaining nights (worked out inside a\nsavepoint that is always rolled back), bills not on the folio yet (open\nrestaurant orders, laundry), a late check-out, what the guest owes\n(`collect`) or is owed (`refunds`: a held security deposit first, through\nits own refund path), what moves to the city ledger and its credit\ncheck, whether a cashier PIN and an open till are needed, every refusal\ncheck-out would give (`blockers`, each tied to its step) and the\nproperty's check-out SOP. check_out judges the balances with the same\nhelper (kamra.checkout.settlement_position), so the two never disagree.\nSafe to call again and again: opening the sheet writes nothing.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "check_out",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.check_out",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.check_out"
       ]
      },
      "description": "Check a guest out. What the company pays moves to the city ledger,\nafter the property's credit control: a warning comes back in\n`credit_warnings`; a block refuses (CREDIT_BLOCKED) unless Finance or a\nHotel Admin passes `credit_override_reason` (logged). Agents can't\noverride.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_housekeeping_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_housekeeping_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_housekeeping_status"
       ]
      },
      "description": "Change a room's housekeeping status - role, property and DocPerm\nchecked (#99): an attendant can mark Clean / Dirty, only a supervisor\ncan pass a room or take it out of order, nobody can touch a room of a\nproperty they aren't assigned to, and removing Write on Room in the\nrole permissions actually removes the ability.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"room\": \"Your Property-101\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_board",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.room_board",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.room_board"
       ]
      },
      "description": "Every room at a glance for the housekeeping supervisor: status,\noccupancy, who is in it, and its open task - the board the desk has,\ninside the Housekeeping module (#99).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "availability_calendar",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.availability_calendar",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.availability_calendar"
       ]
      },
      "description": "Per room-type, per date: rooms available and the 2-adult rate.\nPowers the calendar view and, later, the agent's availability tool.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"start_date\": \"2026-08-01\",\n  \"days\": 14\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "tape_chart",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.tape_chart",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.tape_chart"
       ]
      },
      "description": "Rooms \u00d7 dates grid with reservation bars - the front desk's home.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"start_date\": \"2026-08-01\",\n  \"days\": 14\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "send_precheckin_link",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.send_precheckin_link",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.send_precheckin_link"
       ]
      },
      "description": "Send the guest their self check-in link (mints a token if needed). Sends\nover a connected channel when there is one; otherwise returns the link for\nthe desk to share. Marks when it went out so the arrivals board can show it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"channel\": \"WhatsApp\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_stay_times",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_stay_times",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_stay_times"
       ]
      },
      "description": "Set the planned arrival (ETA) and departure (ETD) times for any stay.\nThese drive the hotel-position view on the tape chart: back-to-back\nrooms conflict when the incoming guest lands before the outgoing one\nleaves, and the day's arrival flow is planned around them.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_day_use_times",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_day_use_times",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_day_use_times"
       ]
      },
      "description": "Set planned check-in/out times for a day-use booking (drives the hourly\ntape view).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"from_time\": \"<from_time>\",\n  \"to_time\": \"<to_time>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "position_briefing",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.position_briefing",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.position_briefing"
       ]
      },
      "description": "The GM / front-desk position briefing - what Kamra Agent reads out\nat the morning meeting: today's occupancy against the overbooking\nceiling, arrivals with ETAs, departures with ETDs and balances,\nback-to-back conflicts, the demand tier pricing is applying, and a\n7-day outlook.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hurdle_rates",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.hurdle_rates",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.hurdle_rates"
       ]
      },
      "description": "The demand tiers: at each occupancy threshold, the premium applied\nand the minimum sell rate enforced. A row with a room type applies to\nthat type only and beats the property-wide row at the same threshold.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_hurdle_rate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.save_hurdle_rate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.save_hurdle_rate"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"occupancy_from\": \"<occupancy_from>\",\n  \"premium_pct\": 0,\n  \"min_rate\": 0,\n  \"room_type\": \"Your Property-DLX\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_hurdle_rate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.delete_hurdle_rate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.delete_hurdle_rate"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "tape_chart_hourly",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.tape_chart_hourly",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.tape_chart_hourly"
       ]
      },
      "description": "Single-day, rooms x hours. Day-use bookings sit at their planned times;\nan overnight stay covering this day shows as a full-width occupied band.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "venue_calendar",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.venue_calendar",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.venue_calendar"
       ]
      },
      "description": "Venues \u00d7 dates with their bookings - the banquet/function diary. Shows\neach venue's schedule so you can see availability and spot conflicts.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"start_date\": \"2026-08-01\",\n  \"days\": 14\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "move_reservation",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.move_reservation",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.move_reservation"
       ]
      },
      "description": "Room move / upgrade - mid-stay or before arrival. Overlap guard re-runs.\nOne writer for the tape chart, the reservation drawer and the GRC (#113).\n\nThe new room may be a DIFFERENT room type (e.g. Standard -> Suite): the\nreservation's room type follows the room it moves into, so upgrades and\ndowngrades are allowed. If the booking auto-prices, the new type's rate\nis quoted and locked - shown first by room_move_preview, and refused\nunless confirm_price=1 when it changes the bill. A same-type move keeps\nthe locked nightly rates; a manually-priced booking keeps its amount.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"new_room\": \"<new_room>\",\n  \"confirm_price\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_move_preview",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.room_move_preview",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.room_move_preview"
       ]
      },
      "description": "What a move would do to the bill before the desk confirms it: a\nsame-type swap keeps the price (and the locked nightly rates); an\nupgrade / downgrade on an auto-priced booking is re-quoted at the new\ntype's rate by the pricing engine, and move_reservation then needs\nconfirm_price=1.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"new_room\": \"<new_room>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "movable_rooms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.movable_rooms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.movable_rooms"
       ]
      },
      "description": "Every room the booking could move into - across ALL room types, so the\nfront desk can upgrade (Standard -> Suite) as well as swap same-type. Each\nroom is flagged free/occupied for the dates and carries its type name; the\nbooking's current type is listed first.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "amend_stay_preview",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.amend_stay_preview",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.amend_stay_preview"
       ]
      },
      "description": "What new dates would do to the bill, before anything changes: the\ncurrent and new totals and the new nightly rates, priced by the engine\nfrom today's rules. amend_stay needs confirm_price=1 when the total\nchanges.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "amend_stay",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.amend_stay",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.amend_stay"
       ]
      },
      "description": "Extend / shorten a stay; the overlap guard validates the new window.\n\nAn auto-priced stay is re-quoted for its new dates and its nightly\nrates re-locked. That changes what the guest pays, so call\namend_stay_preview first, show the new price, and pass confirm_price=1;\nwithout it a change in the total is refused. A manually-priced stay\nkeeps its amount.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"confirm_price\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_late_arrival",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_late_arrival",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_late_arrival"
       ]
      },
      "description": "Flag (or unflag) a confirmed arrival as arriving late, optionally with\nthe ETA the guest gave. With the property's late-arrival protection on,\nthe night audit holds a flagged arrival as Due In instead of marking it\na no-show; the next audit decides.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"late_arrival\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "booking_options",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.booking_options",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.booking_options"
       ]
      },
      "description": "Everything the booking form needs to render its dropdowns.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "get_quote",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.get_quote",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.get_quote"
       ]
      },
      "description": "Price a stay. With a company and no rate plan, the company's\nnegotiated plan applies - the same plan create_booking stores.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"adults\": 2,\n  \"children\": 0,\n  \"over_capacity_charge\": 0,\n  \"pets\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_booking",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.create_booking",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.create_booking"
       ]
      },
      "description": "One-call booking: attach to an existing guest profile when given,\nelse dedup by phone / create one. Optional auto room assignment,\nvoucher applied, price computed by the engine.\n\nwaitlist=1 parks the stay with no room and status Waitlist - for dates\nthat are sold out or restricted; promote it later when a room frees.\n\nstatus / idempotency_key / hold_expires_on support Instant public booking\n(ADR-006 / ADR-007). Desk callers leave them unset \u2192 Confirmed.\n\nDay use: check_out_date == check_in_date books a same-day stay, priced\nby the quote engine (one billable date). check_in_time / check_out_time\n(HH:MM) are its slot - they place it on the hourly tape and tell\nhousekeeping when the room turns; on an overnight stay they are the\nETA / ETD.\n\nA stay billed to a company on credit runs the property's credit control\n(kamra.credit) for its amount: a warning comes back as `credit_warning`;\na block refuses (CREDIT_BLOCKED) unless Finance or a Hotel Admin passes\n`credit_override_reason`, which is logged. Agents can't override.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"guest_name\": \"A. Guest\",\n  \"phone\": \"+91 90000 00000\",\n  \"adults\": 2,\n  \"children\": 0,\n  \"booking_type\": \"Individual\",\n  \"source\": \"Manual\",\n  \"assign_room\": 1,\n  \"guest\": \"G-00001\",\n  \"waitlist\": 0,\n  \"room\": \"Your Property-101\",\n  \"over_capacity_guests\": 0,\n  \"over_capacity_charge\": 0,\n  \"pets\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "waitlist",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.waitlist",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.waitlist"
       ]
      },
      "description": "All waitlisted stays for the property, by arrival date.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "promote_waitlist",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.promote_waitlist",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.promote_waitlist"
       ]
      },
      "description": "Promote a waitlisted stay to Confirmed when a room is free for its\ndates. Assigns the first free room; the overlap guard validates it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "waitlist_ready",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.waitlist_ready",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.waitlist_ready"
       ]
      },
      "description": "Waitlisted stays that CAN now be accommodated - a room is free for\ntheir dates. This is the signal the voice/WhatsApp agent watches so it\ncan proactively reach the guest the moment a room opens.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_group_booking",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.create_group_booking",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.create_group_booking"
       ]
      },
      "description": "Create a Group Booking plus one reservation per requested room.\n`rooms` = [{\"room_type\": <name>, \"count\": 2}, ...] (JSON string ok).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"group_name\": \"<group_name>\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"rooms\": \"<rooms>\",\n  \"guest_name\": \"A. Guest\",\n  \"phone\": \"+91 90000 00000\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "inventory_availability",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.inventory_availability",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.inventory_availability"
       ]
      },
      "description": "Sellable Unit availability (ADR-003). Prefer this over ad-hoc room SQL.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"room_type\": \"Your Property-DLX\",\n  \"include_reasons\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "available_rooms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.available_rooms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.available_rooms"
       ]
      },
      "description": "Rooms of a type with no overlapping live reservation - the same\nlogic the double-booking guard enforces, exposed as a query. Confirmed\ngroup blocks hold their unsold rooms out of general sale; pass the\ngroup to book against its own block.\n\nA stay may start on another's departure date, so a room whose guest\ndeparts today is \"free\" for a booking. Pass ready_now=1 when the guest\nis being put in the room now (check-in, walk-in, allocation for today):\na room whose occupant is still Checked In is then left out until they\ncheck out - the same rule Reservation.validate_room_vacant enforces.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"ready_now\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_blocks",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.room_blocks",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.room_blocks"
       ]
      },
      "description": "Rooms held out of sale (house use, VIP, maintenance).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"active_only\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_room_block",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.create_room_block",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.create_room_block"
       ]
      },
      "description": "Hold a room out of sale for a date range. Refused if the room is\nalready booked in that window (move the guest first).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room\": \"Your Property-101\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\",\n  \"reason\": \"House Use\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "release_room_block",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.release_room_block",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.release_room_block"
       ]
      },
      "description": "Free a held room before its end date (the room returns to sale).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cashier_pin_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.cashier_pin_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.cashier_pin_status"
       ]
      },
      "description": "Does this property demand a PIN on money actions, and does the\nsigned-in user have one set yet? Includes unlock / lockout state.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_cashier_pin",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.set_cashier_pin",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.set_cashier_pin"
       ]
      },
      "description": "Set or change your own cashier PIN (4-8 digits). Changing an existing\nPIN needs the current one \u2014 unless must_reset was set by an admin.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"pin\": \"<pin>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reset_cashier_pin",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.reset_cashier_pin",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.reset_cashier_pin"
       ]
      },
      "description": "Admin reset: wipe the user's PIN and force re-enrollment.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"user\": \"<user>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "verify_cashier_pin",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.verify_cashier_pin",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.verify_cashier_pin"
       ]
      },
      "description": "PinPad unlock: validate PIN and open a 15-minute sliding window.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"pin\": \"<pin>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "group_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.group_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.group_detail"
       ]
      },
      "description": "Everything Group Rooms Control needs: the block, per-type pickup,\nthe rooming list, the tied event and the master folio.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"group_booking\": \"<group_booking>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_group_blocks",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.save_group_blocks",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.save_group_blocks"
       ]
      },
      "description": "Set the room block (list of {room_type, rooms_blocked, block_rate})\nand optionally the cutoff/status. Confirmed blocks hold inventory.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"group_booking\": \"<group_booking>\",\n  \"blocks\": \"<blocks>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "pickup_group_room",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.pickup_group_room",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.pickup_group_room"
       ]
      },
      "description": "Name a guest into the block: creates a reservation on the group's\ndates against its held inventory. Every call books a room (a block is\nseveral identical rooms for one party); pass idempotency_key to make a\nretry safe.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"group_booking\": \"<group_booking>\",\n  \"room_type\": \"Your Property-DLX\",\n  \"guest_name\": \"A. Guest\",\n  \"phone\": \"+91 90000 00000\",\n  \"adults\": 2,\n  \"children\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_group_block",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.create_group_block",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.create_group_block"
       ]
      },
      "description": "One call drafts the whole piece of MICE business: the group, its room\nblock, and (optionally) the banquet event - the agent wedge: an inquiry\nagent turns \"30 rooms + a 200-pax wedding on Dec 12\" into a proposal.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"group_name\": \"<group_name>\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"blocks\": \"<blocks>\",\n  \"venue\": \"Your Property-Grand Ballroom\",\n  \"event_date\": \"2026-12-12\",\n  \"attendees\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "my_connector_credentials",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.my_connector_credentials",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.my_connector_credentials"
       ]
      },
      "description": "Personal MCP credentials for connecting Claude (or any MCP client)\nAS YOURSELF. The key acts with exactly your roles - Frappe enforces the\nsame gates as the UI, so a front-desk connection can do front-desk\nthings and nothing more. Regenerating invalidates the old secret.\n\nPlatform-wide / service keys stay on the Developers page (IT admin).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "linked_records",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.linked_records",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.linked_records"
       ]
      },
      "description": "The connective tissue: for any record, everything it's attached to -\nguest, reservation(s), folio(s), company, group, event - so every screen\ncan offer one-tap paths to billing and editing. One endpoint, all types.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"doctype\": \"<doctype>\",\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "property_locale",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.property_locale",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.property_locale"
       ]
      },
      "description": "Currency, number locale and tax vocabulary for this property, from its\nlocalization pack. Drives the frontend's money formatting and tax dropdowns\nso no screen hardcodes \u20b9 or GST %. `integrations` says which country\nintegrations (gateways, tax return, ID checks) this property has.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "verify_tax_id",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.verify_tax_id",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.verify_tax_id"
       ]
      },
      "description": "Check a buyer's tax ID before the invoice goes out, where the\nproperty's country pack offers it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"tax_id\": \"<tax_id>\",\n  \"business_name\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "verify_guest_id",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.verify_guest_id",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.verify_guest_id"
       ]
      },
      "description": "Read the guest's ID document on file into the profile, where the\nproperty's country pack offers it. consent: the desk confirms the guest\nwas told.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"guest\": \"G-00001\",\n  \"id_type\": \"<id_type>\",\n  \"consent\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "zatca_settings",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.zatca_settings",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.zatca_settings"
       ]
      },
      "description": "The property's ZATCA (Saudi e-invoicing) settings, created from the\nproperty on first use, plus what is still missing for a valid invoice\nand where the invoice chain stands.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "zatca_invoice_xml",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.zatca_invoice_xml",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.zatca_invoice_xml"
       ]
      },
      "description": "The UBL XML behind an issued invoice or credit note - for the\naccountant, an auditor or a ZATCA query.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"invoice_number\": \"<invoice_number>\",\n  \"property\": \"Your Property\",\n  \"document_type\": \"Invoice\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "localization_countries",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.localization_countries",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.localization_countries"
       ]
      },
      "description": "Countries with a dedicated tax & invoicing pack, with the currency,\ntime zone and tax vocabulary picking one sets up. Read-only reference\ndata for the setup wizard and Settings."
     }
    },
    {
     "name": "pending_deposit_refunds",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.api.pending_deposit_refunds",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.api.pending_deposit_refunds"
       ]
      },
      "description": "Returns a list of checked-out reservations with pending security deposit refunds\nfor NEFT processing (e.g. Tuesday/Saturday payout batches).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Request to Book (accept / decline)",
   "item": [
    {
     "name": "booking_requests",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.booking_requests.booking_requests",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.booking_requests.booking_requests"
       ]
      },
      "description": "Pending Request-to-Book stays (status Requested), oldest first, each\nwith whether it can be accepted right now. Requests hold no inventory\nuntil accepted - rooms_free is live availability, not a reservation.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "accept_booking_request",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.booking_requests.accept_booking_request",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.booking_requests.accept_booking_request"
       ]
      },
      "description": "Accept a Request-to-Book stay: confirm it and take the inventory,\nassigning a free room of its type (or `room`). Every booking rule runs\nagain - double-booking guard, villa <-> room lockout, category capacity,\ngroup-block holds - so a request whose dates sold in the meantime is\nrefused with the reason; decline it instead.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "decline_booking_request",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.booking_requests.decline_booking_request",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.booking_requests.decline_booking_request"
       ]
      },
      "description": "Decline a Request-to-Book stay with a reason (required). The stay is\ncancelled with no cancellation fee - a request was never confirmed - and\nany room it pointed at is freed. The guest is told by WhatsApp / email\nwhen the property has them set up; otherwise the decline is just logged.\nAn OTA request must also be declined on the OTA's side.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Restaurant POS & kitchen",
   "item": [
    {
     "name": "outlets",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.outlets",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.outlets"
       ]
      },
      "description": "Open outlets, each with `auto_kot` already resolved against the F&B\nsetting, so the till never has to know where the answer came from.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "pos_menu",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.pos_menu",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.pos_menu"
       ]
      },
      "description": "The digital menu for an outlet: available items grouped by category.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "in_house_rooms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.in_house_rooms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.in_house_rooms"
       ]
      },
      "description": "Rooms with a checked-in guest, for the till's room picker: only these\ncan take a room charge. \"101 \u00b7 Guest Name\". `room_charges_allowed` is the\ncheck-in's decision; a blocked room is shown but cannot be charged.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "charge_to_room",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.charge_to_room",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.charge_to_room"
       ]
      },
      "description": "Point a running bill (a dine-in table, say) at an in-house guest's\nroom, so Deliver posts it to their folio through the same controller\npath as room service - billing rules and the alcohol rule included.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.create_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.create_order"
       ]
      },
      "description": "Captain takes an order. A room (room service, or a dine-in guest\ncharging to their room) must have a checked-in stay: it is resolved now\nso the bill posts to that folio on delivery. A room with nobody in house\nis refused - take it as a walk-in bill instead. Takeaway and delivery\ncarry the customer's details instead of a table/room. `guest` ties the\nbill to a guest profile (a walk-in found or added with find_customer or\nattach_customer); a room bill takes the in-house guest by itself.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"items\": \"<items>\",\n  \"property\": \"Your Property\",\n  \"room\": \"Your Property-101\",\n  \"reservation\": \"RES-2026-00001\",\n  \"source\": \"Manual\",\n  \"customer_name\": \"A. Customer\",\n  \"guest\": \"G-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "open_orders",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.open_orders",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.open_orders"
       ]
      },
      "description": "Every running tab at an outlet - the tables/rooms being served right\nnow, so a captain can juggle several at once. A bill nobody has sent to\nthe kitchen carries its age in minutes and turns `stale` after the F&B\nsetting's limit, so a forgotten order is sent or cancelled.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "table_map",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.table_map",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.table_map"
       ]
      },
      "description": "The table view a captain starts from: every table at the outlet with\nits live state - vacant, running (open bill), fired (KOT in the kitchen)\nor ready (everything prepared, awaiting service/settle). A table holds\nany number of bills (separate parties, split bills); the tile carries\nthem all and shows the most urgent state.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reserve_table",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.reserve_table",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.reserve_table"
       ]
      },
      "description": "Reserve a table - it shows as Reserved on the map from an hour\nbefore the time until it's seated, cancelled or marked a no-show.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"table_no\": \"<table_no>\",\n  \"guest_name\": \"A. Guest\",\n  \"reserved_at\": \"<reserved_at>\",\n  \"phone\": \"+91 90000 00000\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_reservation",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.set_reservation",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.set_reservation"
       ]
      },
      "description": "Seat / cancel / no-show a table reservation.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "mark_table_clean",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.mark_table_clean",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.mark_table_clean"
       ]
      },
      "description": "Housekeeping done - the table goes back to vacant on the map.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"table_no\": \"<table_no>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "recent_orders",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.recent_orders",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.recent_orders"
       ]
      },
      "description": "The outlet's latest bills, newest first - open or settled - so a\ncaptain can jump back to a running bill or reprint a settled one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"limit\": 8\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "split_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.split_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.split_order"
       ]
      },
      "description": "Split a bill: move the chosen lines to a new bill on the same table\n(or a named one) - separate bills for two parties sharing a table, or\none party paying separately. Fired lines keep their kitchen status, and\nthe two bills conserve the original total.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"item_rows\": \"<item_rows>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "order_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.order_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.order_detail"
       ]
      },
      "description": "One order's full contents - to load a running tab back into the till,\nor to look at a closed one from the orders list. `kitchen_lines` counts\nthe live lines the kitchen already has: while it is zero the captain can\ncancel the bill alone; after that a supervisor approves.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_items",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.add_items",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.add_items"
       ]
      },
      "description": "Add rounds to a running tab - new lines are priced from the menu and\nstart as New (a later fire_kot sends them to the kitchen).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"items\": \"<items>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "confirm_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.confirm_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.confirm_order"
       ]
      },
      "description": "Captain confirmation for a Placed order that has no captain yet\n(legacy guest QR). Sets the captain and moves Placed -> Confirmed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "apply_discount",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.apply_discount",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.apply_discount"
       ]
      },
      "description": "The guest-discount popup - a captain grants a discount with a reason.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"amount\": 1000,\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "fire_kot",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.fire_kot",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.fire_kot"
       ]
      },
      "description": "Send the order to the kitchen: new lines become Fired and show on the\nkitchen display. Stamps the KOT number (a daily sequence per outlet) and\nreturns just-fired lines so the till can print the thermal KOT ticket.\n\nPass a course to send only that course and hold the rest - the table\norders once, the kitchen cooks the mains when the starters are cleared.\nEach line is stamped with the moment it was fired: that, not when the\ncaptain opened the tab, is when the cook's clock starts.\n\nWith auto KOT on (the F&B setting, or the outlet's override) this also\naccepts the ticket, so the kitchen does not press Start, and the\nresponse tells the till to print.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "send_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.send_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.send_order"
       ]
      },
      "description": "A captain's new bill straight to the kitchen, in one call: what\ncreate_order, apply_discount, confirm_order and fire_kot do one after\nanother, in one request and one transaction. The till waits for one\nround trip instead of four, and the kitchen gets a single update.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"items\": \"<items>\",\n  \"property\": \"Your Property\",\n  \"room\": \"Your Property-101\",\n  \"reservation\": \"RES-2026-00001\",\n  \"customer_name\": \"A. Customer\",\n  \"discount\": 0,\n  \"discount_reason\": \"\",\n  \"guest\": \"G-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "send_round",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.send_round",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.send_round"
       ]
      },
      "description": "Another round on a running bill, straight to the kitchen: add_items\nand fire_kot in one call and one save.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"items\": \"<items>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "kitchen_queue",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.kitchen_queue",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.kitchen_queue"
       ]
      },
      "description": "The kitchen display: fired orders the kitchen still has work on. Scope\nto one outlet (each restaurant's own kitchen) and/or one station.\n\nEach line carries a `state` the screen renders directly:\n  cooking   - fired, still to make\n  held      - a later course, or a round added to a running tab; the\n              kitchen can see it coming but must not start it\n  cancelled - voided after the KOT fired; the chef may be cooking it right\n              now, so it stays on the ticket (loudly) until acknowledged\n  done      - already prepared; kept for context and to allow a recall\n\nA ticket is on the board while it has cooking, held or cancelled lines.\nDone lines ride along but never hold a ticket open, so \"all ready\" still\nclears it.\n\n`fired_at` per line is what the display ages against - a table that sat an\nhour over drinks must not hand the kitchen a ticket that is already red.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "mark_prepared",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.mark_prepared",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.mark_prepared"
       ]
      },
      "description": "Kitchen marks one line (or every cooking line) prepared. Voided lines\nare never swept up by \"all ready\" - that food is cancelled, not cooked.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "accept_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.accept_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.accept_ticket"
       ]
      },
      "description": "The kitchen takes the ticket on. Until a ticket is accepted the floor\nhas no evidence anyone has seen it - a KOT can print to an empty pass.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "recall_prepared",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.recall_prepared",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.recall_prepared"
       ]
      },
      "description": "Undo a mark-prepared: the line goes back to Fired and reappears on the\ndisplay. A mis-tap on a greasy touchscreen must not be one-way.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "acknowledge_void",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.acknowledge_void",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.acknowledge_void"
       ]
      },
      "description": "The chef has seen that a fired line was cancelled and can stop cooking\nit; drop it from the display. The void itself stays on the order.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"item_row\": \"<item_row>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "deliver_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.deliver_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.deliver_order"
       ]
      },
      "description": "Order served - moves to Delivered, which posts it to the room folio\n(controller) when there's a linked stay.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "pay_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.pay_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.pay_order"
       ]
      },
      "description": "Settle a bill at the outlet (walk-ins, takeaway - or a guest who'd\nrather pay now than post to the room). Records the payment mode and\ncloses the order without touching any folio. Posts into the open\ncashier session so FO + POS cash reconcile together.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"mode\": \"<mode>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "change_payment_mode",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.change_payment_mode",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.change_payment_mode"
       ]
      },
      "description": "Correct the tender on a bill that was settled with the wrong mode (Card\npressed for Cash). The till keeps its history: a reversing entry for the\nold mode and a new entry for the right one, same till session, with a\ncomment on the bill. Only while that till is still open - once it is\ncounted and closed, the day's cash is final and a manager must correct it\nfrom the till screens.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"mode\": \"<mode>\",\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "mark_nc",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.mark_nc",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.mark_nc"
       ]
      },
      "description": "Mark a bill NC (no charge / complimentary). Needs who authorized it\n(captain, chef, GM, management\u2026) and takes a free-text reference (the\noccasion, the complaint ticket, the promise made). The items still fire\nto the kitchen and print on the KOT - the bill just closes at zero and\nnever touches a folio. `undo=1` lifts it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"authorized_by\": \"<authorized_by>\",\n  \"note\": \"\",\n  \"undo\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cancel_order",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.cancel_order",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.cancel_order"
       ]
      },
      "description": "Cancel an open bill with a reason. Nothing sent to the kitchen yet: the\ncaptain (or an agent) cancels alone. Items already sent: every live line\nis voided rather than deleted, the kitchen gets a VOID slip and sees the\nticket as cancelled, and a supervisor approves (`supervisor` +\n`supervisor_pin`, or a supervisor's own session). Paid, posted or\nalready cancelled bills are refused. Who, why and who approved are kept\non the bill and in the activity log; the table is freed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "void_item",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.void_item",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.void_item"
       ]
      },
      "description": "Void one line with a reason. The line stays on the order (struck\nthrough, amount zero) so the KOT-vs-bill audit holds up. A line the\nkitchen already has needs a supervisor's approval (see cancel_order) and\nprints a VOID slip; a line never sent is simpler to remove_item.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"item_row\": \"<item_row>\",\n  \"reason\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "remove_item",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.remove_item",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.remove_item"
       ]
      },
      "description": "Take a line off a bill before it goes to the kitchen: a mis-tap or a\nchange of mind. No reason and no approval, because nothing was cooked.\nA line the kitchen has is refused (void it instead), and so is the last\nline (cancel the bill instead).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"item_row\": \"<item_row>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "void_approvers",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.void_approvers",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.void_approvers"
       ]
      },
      "description": "Who can approve a void at this outlet's till: enabled Hotel Admin and\nFinance users with access to the property and a cashier PIN set. Names\nonly.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "orders_list",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.orders_list",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.orders_list"
       ]
      },
      "description": "The outlet's bills for a day, or a range of up to a year, newest\nfirst: open (not sent to the kitchen), sent, paid, posted to a room, NC,\nclosed or cancelled, with the table, who it was for, the amount and the\ntime. `q` searches the bill and KOT number, table, room, customer name\nand phone, and the in-house guest's name. `state` keeps one state,\n`order_type` one kind of order and `mode` one way of paying (Cash, Card,\nUPI, Room). Pages come back `limit` at a time from `offset`; `total`,\n`has_more`, `counts` and `totals` always cover every bill the filters\nmatch, not only the page, so nothing is hidden by paging.\nLooking at today also brings in bills still open from earlier days\n(`carried`), so a forgotten order cannot hide. Only this outlet's bills.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\",\n  \"limit\": 200,\n  \"offset\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "orders_export",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.orders_export",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.orders_export"
       ]
      },
      "description": "The outlet's bill history as CSV for a day or up to a year: every\nbill with its state, payment mode, amount, discount, who it was for and\nwho cancelled it. Same search and state filters as the orders list;\n`mode` keeps one payment mode (Cash, Card, UPI). A phone number is masked\nexcept to a supervisor, as on the till. Returns {filename, csv, rows}.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "find_customer",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.find_customer",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.find_customer"
       ]
      },
      "description": "Find a guest profile for a bill by phone (4+ digits) or name (3+\nletters): the same guest records the front desk uses. Each match says\nhow often they ate at this outlet and whether they are in house now.\nPhones show their last digits only.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"q\": \"<q>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "attach_customer",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.attach_customer",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.attach_customer"
       ]
      },
      "description": "Say who a walk-in bill is for: an existing guest profile (`guest`),\nor a name and phone. A phone that matches a profile reuses it; otherwise\na lightweight guest profile is added (name and phone only), the same\nrecord the front desk uses. Without `order` it only finds or adds the\nprofile, for a bill the till is about to create. `clear=1` takes the\ncustomer off the bill. A room bill is always for its in-house guest.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"order\": \"ORD-2026-00001\",\n  \"guest\": \"G-00001\",\n  \"customer_name\": \"A. Customer\",\n  \"phone\": \"+91 90000 00000\",\n  \"clear\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "guest_panel",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.guest_panel",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.guest_panel"
       ]
      },
      "description": "Who a bill is for, without leaving the till. For a room bill: the\nin-house guest, room, stay dates and whether the stay can take room\ncharges (the check-in's decision, which posting also enforces). For a\nwalk-in: the attached guest profile. Either way: VIP, the guest's notes\n(preferences, allergies), the bill's allergy note, and their past bills\nat this outlet. Pass `order`, or `guest` / `room` for a bill not created\nyet.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"order\": \"ORD-2026-00001\",\n  \"guest\": \"G-00001\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "bill_data",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.bill_data",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.bill_data"
       ]
      },
      "description": "Everything the thermal bill print needs: outlet and property names,\nlive lines, the discount, and the CGST/SGST split at the outlet's rate.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "outlet_dashboard",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.outlet_dashboard",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.outlet_dashboard"
       ]
      },
      "description": "One shift at a glance: what the outlet sold, what's still open, the\nexceptions that need a manager's eye (NC, voids, cancellations), and how\nfast the kitchen is turning tickets. Defaults to today.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"outlet\": \"Your Property-Restaurant\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "speed_check",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos.speed_check",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos.speed_check"
       ]
      },
      "description": "Why does the POS feel slow here? Times what a till and a kitchen\ndisplay ask for on every refresh and reports the server's set-up, so\nsupport can tell our code from the hosting in a minute. Read-only.\n\nWith echo=1 it also sends a realtime ping to the caller; the browser\ntimes how long it takes to arrive, which proves live updates work.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"echo\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Setup checklist (finish setting up a property)",
   "item": [
    {
     "name": "setup_checklist",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.onboarding.setup_checklist",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.onboarding.setup_checklist"
       ]
      },
      "description": "What is set up and what is still to do, for the Finish setup screen.\nOnly items that matter for the modules this property runs.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Rates (rate calendar, what moves a rate)",
   "item": [
    {
     "name": "rate_calendar",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rates.rate_calendar",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rates.rate_calendar"
       ]
      },
      "description": "Every room type's rate for each of the next `days` dates, with what\nmoved it. A room type's own days are read with the same functions the\nquote uses; nothing here sets a price.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"from_date\": \"2026-08-01\",\n  \"days\": 14,\n  \"adults\": 2,\n  \"children\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "rate_options",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rates.rate_options",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rates.rate_options"
       ]
      },
      "description": "For the booking dialog: this stay night by night (BAR, season,\ndemand), the whole stay under each active rate plan against the plain\nrate, and what the voucher would do. Each total is a real quote.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"adults\": 2,\n  \"children\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Service tickets (assign, resolve, timeline)",
   "item": [
    {
     "name": "tickets_search",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.tickets_search",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.tickets_search"
       ]
      },
      "description": "Tickets for a property with the filters a supervisor needs.\n\nview: open (default), mine, unassigned, overdue, resolved, all. Old\ntickets are never hidden: 'all' and 'resolved' go back as far as the\ndata does, and older_than_days narrows to the ones still open past that.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"view\": \"open\",\n  \"older_than_days\": 0,\n  \"limit\": 200\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "ticket_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.ticket_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.ticket_detail"
       ]
      },
      "description": "One ticket in full: its fields, SLA, and the timeline.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "ticket_assignees",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.ticket_assignees",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.ticket_assignees"
       ]
      },
      "description": "Staff a ticket can be handed to.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "assign_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.assign_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.assign_ticket"
       ]
      },
      "description": "Hand a ticket to someone, or clear the assignee (user empty).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "claim_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.claim_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.claim_ticket"
       ]
      },
      "description": "Take a ticket yourself.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "start_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.start_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.start_ticket"
       ]
      },
      "description": "Begin work: moves it to In Progress and, if nobody has it, gives it to you.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_ticket_note",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.add_ticket_note",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.add_ticket_note"
       ]
      },
      "description": "A comment on the timeline (what was tried, who was called).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\",\n  \"note\": \"<note>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "resolve_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.resolve_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.resolve_ticket"
       ]
      },
      "description": "Mark a ticket solved, recording who did it and what was done.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\",\n  \"close\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reopen_ticket",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.tickets.reopen_ticket",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.tickets.reopen_ticket"
       ]
      },
      "description": "A solved ticket that came back. Needs a reason; it is kept in the timeline.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ticket\": \"<ticket>\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Guest documents (photo, ID and address proof images)",
   "item": [
    {
     "name": "save_guest_file",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.guest_documents.save_guest_file",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.guest_documents.save_guest_file"
       ]
      },
      "description": "Keep a photo, ID image or address proof on the profile, replacing the\nprevious one. A property on Verify & Discard keeps no ID images, so only\nthe photo is accepted there (the check-in ID step verifies and discards).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\",\n  \"kind\": \"<kind>\",\n  \"data\": \"<data>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "guest_file",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.guest_documents.guest_file",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.guest_documents.guest_file"
       ]
      },
      "description": "One of the profile's images as a data URL.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\",\n  \"kind\": \"<kind>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "remove_guest_file",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.guest_documents.remove_guest_file",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.guest_documents.remove_guest_file"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"guest\": \"G-00001\",\n  \"kind\": \"<kind>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Kitchen printers (routing, print stations, print queue)",
   "item": [
    {
     "name": "print_bill",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.print_bill",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.print_bill"
       ]
      },
      "description": "Send a bill to the station set up to print bills. No bill printer\nconfigured: nothing is queued and the till prints from its own device,\nexactly as before.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "claim_jobs",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.claim_jobs",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.claim_jobs"
       ]
      },
      "description": "A print station asks for its printer's work. Hands over every queued\njob (and any claimed one nobody confirmed within a minute) and marks\nthem Printing. The station prints them and calls ack_jobs.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"printer\": \"<printer>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "ack_jobs",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.ack_jobs",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.ack_jobs"
       ]
      },
      "description": "The station's answer. Printed jobs are done; failed ones move to the\nprinter's fallback, or stay Failed for a reprint.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"printer\": \"<printer>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "printers",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.printers",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.printers"
       ]
      },
      "description": "Every printer with its routes and whether it's online - for the\nF&B Printers screen and for a kitchen screen choosing what to print for.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_printer",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.save_printer",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.save_printer"
       ]
      },
      "description": "Add or change a printer and its routes. Logged to the Activity log.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"printer\": \"<printer>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_printer",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.delete_printer",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.delete_printer"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "test_print",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.test_print",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.test_print"
       ]
      },
      "description": "Queue a test page on one printer.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reprint",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.reprint",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.reprint"
       ]
      },
      "description": "Print a job again - on its own printer or another one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"job\": \"<job>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "order_print_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.printing.order_print_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.printing.order_print_status"
       ]
      },
      "description": "Where an order's tickets went and whether they printed - for the till.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Laundry (housekeeping)",
   "item": [
    {
     "name": "laundry_rates",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.laundry_rates",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.laundry_rates"
       ]
      },
      "description": "The property's laundry price list (the card the attendant quotes\nfrom). Grouped by item for the pickers.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_laundry_rate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.save_laundry_rate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.save_laundry_rate"
       ]
      },
      "description": "Add or edit one line of the rate card.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"item_name\": \"<item_name>\",\n  \"service_type\": \"<service_type>\",\n  \"rate\": \"<rate>\",\n  \"disabled\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_laundry_rate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.delete_laundry_rate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.delete_laundry_rate"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "import_laundry_rates",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.import_laundry_rates",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.import_laundry_rates"
       ]
      },
      "description": "Bulk-load or bulk-update the rate card from a CSV - the same file\nthe Export button produces (item, service, rate, express rate).\nUpserts by (item, service): existing rows update, new rows are\ncreated, nothing is deleted. Headers are matched tolerantly.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "request_pickup",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.request_pickup",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.request_pickup"
       ]
      },
      "description": "Log that a guest wants laundry picked up - it lands on the floor\nteam's queue. Items are counted at the door, not here. A House order\n(staff uniforms / hotel linen) needs no room or guest and is never billed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room\": \"Your Property-101\",\n  \"express\": 0,\n  \"order_type\": \"Guest\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "collect_laundry",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.collect_laundry",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.collect_laundry"
       ]
      },
      "description": "The attendant counts the bag with the guest. Prices come from the\nrate card (express uses the express column, or 1.5x). Pass `order` to\nfulfil a pickup request, or omit it to log a walk-up collection. A House\nwalk-up (uniforms / linen) needs no room or guest and is never billed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room\": \"Your Property-101\",\n  \"order\": \"ORD-2026-00001\",\n  \"order_type\": \"Guest\",\n  \"complimentary\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "laundry_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.laundry_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.laundry_status"
       ]
      },
      "description": "Move the bag along: Collected -> In Process -> Ready.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "return_items",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.return_items",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.return_items"
       ]
      },
      "description": "Tick items back in as they return from the laundry. rows =\n{child_row_name: returned_qty} - counts, not deltas.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"rows\": \"<rows>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "deliver_laundry",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.deliver_laundry",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.deliver_laundry"
       ]
      },
      "description": "Hand the bag back and bill the stay. If pieces are still pending, a\nshortage note is required - the discrepancy is recorded, never silent.\nPosting rides the governed agent path (HK can only bill laundry).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "cancel_laundry",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.cancel_laundry",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.cancel_laundry"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"order\": \"ORD-2026-00001\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "laundry_board",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.laundry_board",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.laundry_board"
       ]
      },
      "description": "Everything the floor and the desk need at a glance: open bags by\nstatus with piece counts and what's still pending, plus the last few\ndelivered ones for reprints/queries.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "laundry_revenue",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.laundry.laundry_revenue",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.laundry.laundry_revenue"
       ]
      },
      "description": "Delivered-laundry revenue over the last N days, with a per-service\nbreakdown. Only billed guest orders count as revenue; House and\ncomplimentary bags are counted as volume but earn nothing.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"days\": 30\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Banquets (functions, quotations, event orders)",
   "item": [
    {
     "name": "banquet_catalogue",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.banquet_catalogue",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.banquet_catalogue"
       ]
      },
      "description": "What the property sells: the menu packages (with their courses) and\nthe service list. This is the picker behind every line item.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_banquet_menu",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.save_banquet_menu",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.save_banquet_menu"
       ]
      },
      "description": "Add or edit one menu package. Courses replace wholesale - the grid\nthe user is looking at is the truth.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"menu_name\": \"<menu_name>\",\n  \"rate_per_pax\": \"<rate_per_pax>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_banquet_menu",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.delete_banquet_menu",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.delete_banquet_menu"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_service_item",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.save_service_item",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.save_service_item"
       ]
      },
      "description": "Add or edit one service - a projector, an LED wall, a DJ, a podium,\na stage, a decor package, bar service. `chargeable = 0` marks the ones\nthe hotel throws in as standard; they still appear on the event order\nand the pack list.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"item_name\": \"<item_name>\",\n  \"category\": \"<category>\",\n  \"rate\": 0,\n  \"uom\": \"Per Event\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_service_item",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.delete_service_item",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.delete_service_item"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "create_enquiry",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.create_enquiry",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.create_enquiry"
       ]
      },
      "description": "Open a function sheet from an enquiry. The hall's rack rental goes on\nas the first line (that's the number the conversation starts from), and\na follow-up lands in the diary so the enquiry doesn't go quiet.\n\nsession is how the hall is sold (Morning / Afternoon / Evening / Full\nDay): a named session sets the clock itself, so times sent alongside it\nare ignored. Custom Hours, or no session with times, keeps the times.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"venue\": \"Your Property-Grand Ballroom\",\n  \"event_date\": \"2026-12-12\",\n  \"customer_name\": \"A. Customer\",\n  \"event_type\": \"Wedding\",\n  \"attendees\": 0,\n  \"end_date\": \"2026-08-31\",\n  \"source\": \"Phone\",\n  \"with_venue_line\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "function_sheet",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.function_sheet",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.function_sheet"
       ]
      },
      "description": "One function, everything about it - the sheet the banquet screen\nrenders and Kamra Agent reads.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "update_function",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.update_function",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.update_function"
       ]
      },
      "description": "Edit the sheet's own fields (not its tables - those have their own\ncalls, because each one means something different).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"fields\": \"<fields>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "linkable_groups",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.linkable_groups",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.linkable_groups"
       ]
      },
      "description": "Group bookings this function could ride: same property, not\ncancelled, staying within a month either side of the event.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "link_group",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.link_group",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.link_group"
       ]
      },
      "description": "Tie a function to a group booking so its bill can ride the group's\nmaster folio (post_to_folio), or untie it (group_booking empty).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.set_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.set_status"
       ]
      },
      "description": "Move the function along its pipeline. Confirming takes the hall -\nthe controller refuses a clash with another confirmed function.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"status\": \"<status>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_menu",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.add_menu",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.add_menu"
       ]
      },
      "description": "Put a menu package on the function. Left alone the quantity follows\nthe pax rule (guaranteed, or actual if more turned up) and the price is\nthe package's own plate price - pass `rate` when it's been negotiated.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"menu\": \"BMENU-00001\",\n  \"chargeable\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_service",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.add_service",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.add_service"
       ]
      },
      "description": "Put a service on the function - projector, LED wall, DJ, podium,\nstage, decor, laptop, bar. The catalogue decides whether it's chargeable\nby default; pass `chargeable` to override for this function.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"service_item\": \"BSVC-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_items",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.save_items",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.save_items"
       ]
      },
      "description": "Replace the line grid wholesale - what the user is looking at is the\ntruth. Rows keep their catalogue links so the event order can still\nprint a menu's courses.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"items\": \"<items>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "remove_item",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.remove_item",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.remove_item"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"row\": \"<row>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "negotiate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.negotiate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.negotiate"
       ]
      },
      "description": "The price moves. `rows` is {line_row_name: new_rate} - or pass\n`venue_rental` to move just the hall - and `discount_amount` is the\nheadline reduction on the whole quote.\n\nEvery move is snapshotted with what the quote was worth before and\nafter, so the fourth revision of a wedding quote can be explained.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_open_items",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.save_open_items",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.save_open_items"
       ]
      },
      "description": "What is still unsettled while the price is being agreed - the\nsangeet stage, whether the bar is on consumption, who pays for the\nextra generator. Each carries what agreeing it would do to the price.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"rows\": \"<rows>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_payment_terms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.set_payment_terms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.set_payment_terms"
       ]
      },
      "description": "The schedule the customer signs up to. A term stated as a percentage\nfollows the quote as it moves; one stated as an amount is a number both\nsides agreed and stays put.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"terms\": \"<terms>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "default_payment_terms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.default_payment_terms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.default_payment_terms"
       ]
      },
      "description": "The usual three-milestone schedule, dated off this function: an\nadvance to hold the hall, a second call before the date, the rest on\ncompletion. Editable afterwards like any other term. Unset arguments\ncome from Settings -> Banquets & Groups.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "record_receipt",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.record_receipt",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.record_receipt"
       ]
      },
      "description": "Money in against the function. Pass `settle_term` to tick off the\npayment-term row it pays, so the schedule and the ledger agree.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"amount\": 1000,\n  \"mode\": \"Bank Transfer\",\n  \"kind\": \"Advance\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "assign_green_room",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.assign_green_room",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.assign_green_room"
       ]
      },
      "description": "Hold a changing room for the wedding party. The controller puts a\nRoom Block on it so it genuinely leaves the sellable inventory; pass\n`complimentary=0` (with a rate) to bill it as an Accommodation line.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"room\": \"Your Property-101\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\",\n  \"complimentary\": 1,\n  \"rate\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "venue_availability",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.venue_availability",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.venue_availability"
       ]
      },
      "description": "Which halls are free for these dates and hours. A confirmed function\ntakes the hall; a tentative one is shown as a soft hold you can still\nsell over. Halls too small for the pax are flagged, not hidden.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"event_date\": \"2026-12-12\",\n  \"end_date\": \"2026-08-31\",\n  \"pax\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "banquet_calendar",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.banquet_calendar",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.banquet_calendar"
       ]
      },
      "description": "The function diary - halls down the side, days across the top, every\nfunction in its cell with what it's worth and what's still owed.\nMulti-day functions appear on each of their days.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"start_date\": \"2026-08-01\",\n  \"days\": 31\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "banquet_pipeline",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.banquet_pipeline",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.banquet_pipeline"
       ]
      },
      "description": "The sales view: where the business is by month and by status, what\nconverted, what died and why. Dated on the event, not the enquiry -\na banquet team's month is the month the function happens.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\",\n  \"months\": 6\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "banquet_reminders",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.banquet_reminders",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.banquet_reminders"
       ]
      },
      "description": "Everything across the property that needs chasing - the banquet\nteam's morning list.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"days\": 30\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "banquet_document",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.banquet_document",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.banquet_document"
       ]
      },
      "description": "The paper. One shape for every document so the front end can print\nthem all the same way:\n\n  quote      what it costs, line by line, with the terms\n  contract   the quote plus the terms, the policy and signature blocks\n  beo        the banquet event order - the running sheet for the day\n  pack_list  what physically has to reach the hall, and by when\n  invoice    the bill, against what's already been received",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"kind\": \"quote\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "generate_quote",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.generate_quote",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.generate_quote"
       ]
      },
      "description": "Stamp a quotation. Bumps the version, dates it, and snapshots what\nit was worth - so 'the price we sent on the 3rd' is answerable.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"valid_days\": 15\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "generate_beo",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.generate_beo",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.generate_beo"
       ]
      },
      "description": "Issue the banquet event order - the sheet the banquet, kitchen and\nAV teams run the day from. Only a confirmed function gets one; the\nteams shouldn't be preparing for business that isn't sold.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "generate_invoice",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.generate_invoice",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.generate_invoice"
       ]
      },
      "description": "Raise the tax invoice for a function.\n\nThe number is assigned once and never moves - re-printing an invoice\nmust give the same document, because the customer's books and ours\nhave to agree on what it was called.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "post_to_folio",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.post_to_folio",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.post_to_folio"
       ]
      },
      "description": "Push the chargeable lines onto a bill. A function tied to a group\nrides the group's master folio; otherwise pass one explicitly.\n\nAlcohol is reported back rather than posted when the bill is a company\nor group folio - the same rule the folio itself enforces - so it can be\nsettled separately instead of failing the whole post.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "close_out",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.close_out",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.close_out"
       ]
      },
      "description": "Hand the hall back. The last ritual of a function, and the one that\nusually happens on a WhatsApp message and a scrap of paper: walk the\nroom, count the actual covers, note what got broken, take that off the\ndeposit and give the rest back.\n\nDoing it here means the deduction has a reason attached, the refund is\na real ledger line, and the function closes in one motion instead of\nthree people remembering to do three things.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"damage_amount\": 0,\n  \"refund_deposit\": 1,\n  \"refund_mode\": \"Bank Transfer\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reopen_function",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.reopen_function",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.reopen_function"
       ]
      },
      "description": "Reopen a closed (Completed) function so its sheet can be corrected.\nIt goes back to Confirmed; receipts, refunds and the damage line stay\nas they were, and closing it again re-counts covers only. Needs a\nreason, and lands on the activity log.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "receipt_document",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.receipt_document",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.receipt_document"
       ]
      },
      "description": "One receipt, as a document the customer can keep. Every advance a\nbanquet office takes needs a piece of paper against it - this is that\npiece of paper.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"receipt\": \"<receipt>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "menu_card",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.menu_card",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.menu_card"
       ]
      },
      "description": "The menu the customer signs off - what will actually be served,\ncourse by course, with nothing about money on it. The kitchen and the\ncustomer read the same sheet, which is the whole point.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "month_availability",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.month_availability",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.month_availability"
       ]
      },
      "description": "Every hall \u00d7 every session, across a whole month.\n\nThe question a banquet office is actually asked - \"do you have the\n14th of December?\" - is about a hall and a session, not a range of\nhours. This is the grid that answers it in one look: halls down the\nside split by session, days across the top, and what's in each cell.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "banquet_register",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.banquet_register",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.banquet_register"
       ]
      },
      "description": "The listings a banquet office runs the week on - the same five books\nevery hall has kept on paper forever, dated and totalled:\n\n  functions   every booking in the window, with pax, rate and value\n  quotations  what was quoted, and whether it converted\n  enquiries   what came in, and what happened to it\n  receipts    the cash book: every payment, by mode\n  sales       revenue by hall, event type and month",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"register\": \"functions\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "dish_library",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.dish_library",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.dish_library"
       ]
      },
      "description": "Every dish the banquet kitchen can produce, with what it costs to\nmake. This is the picker behind menu building and the spine of margin.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_dish",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.save_dish",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.save_dish"
       ]
      },
      "description": "Add or edit a dish. The recipe is what makes it cost something -\nwithout one the dish is free, and so is the margin it reports.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"dish_name\": \"<dish_name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_dish",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.delete_dish",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.delete_dish"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "recost_dishes",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.recost_dishes",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.recost_dishes"
       ]
      },
      "description": "Ingredient prices moved - re-cost every dish. Run it after a delivery\nor a price revision, so quotes stop being priced off last season's\nonions.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "menu_cost",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.menu_cost",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.menu_cost"
       ]
      },
      "description": "What one plate of this menu costs to make, and what it earns.\n\nCosts the DEFAULT selection - one dish per choice where the course\noffers a choice, everything where it doesn't - so a menu can be judged\nbefore anyone has booked it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"menu\": \"BMENU-00001\",\n  \"pax\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "menu_choices",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.menu_choices",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.menu_choices"
       ]
      },
      "description": "The course-by-course picker for one menu on one function: what the\ncourse offers, how many the guest may take, and what's chosen so far.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"menu\": \"BMENU-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "compose_menu",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.compose_menu",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.compose_menu"
       ]
      },
      "description": "Record what the customer actually chose - \"one soup of these two, the\npaneer not the mushroom\".\n\nThe dish NAME is stored alongside the link on purpose: renaming a dish\nnext season must not rewrite a menu card the customer already signed.\nAny supplement the choice carries goes on as its own line, because an\nupgrade is a price change and should be visible as one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"menu\": \"BMENU-00001\",\n  \"picks\": \"<picks>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "kitchen_indent",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.kitchen_indent",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.kitchen_indent"
       ]
      },
      "description": "What the kitchen has to buy and pull for this function.\n\nThe artifact that has always sat between the event order and the store\nroom, written by hand: chosen dishes x portions x guaranteed pax,\nexploded through the recipes into ingredient quantities, checked against\nwhat's actually on the shelf.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "issue_indent",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.issue_indent",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.issue_indent"
       ]
      },
      "description": "Pull the indent off the shelf. Writes real stock movements through\nthe same single writer the restaurant uses, so the store room reflects\na banquet the way it reflects a table.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "record_consumption",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.record_consumption",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.record_consumption"
       ]
      },
      "description": "What was actually served, against what was quoted.\n\nThe quote said 300 plates; 318 people ate and the bar went through\nanother two cases. Until this is recorded the bill is a forecast -\nrows = {line_row_name: actual_qty}.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "add_supplementary",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.add_supplementary",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.add_supplementary"
       ]
      },
      "description": "Something ordered on the night that wasn't on the quote - another\nround at the bar, twenty extra plates, a second cake. It bills on top\nand is marked so the final bill can show it apart from what was\nagreed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"item_name\": \"<item_name>\",\n  \"qty\": \"<qty>\",\n  \"rate\": \"<rate>\",\n  \"item_type\": \"Food & Beverage\",\n  \"uom\": \"Unit\",\n  \"cost_rate\": 0,\n  \"is_alcohol\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "function_economics",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.function_economics",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.function_economics"
       ]
      },
      "description": "The P&L of one function: what it sold, what it cost, what the input\ncredit is worth, and what's left - plus where the quote and the night\ndisagreed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "link_customer",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.link_customer",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.link_customer"
       ]
      },
      "description": "Tie the function to a real guest record instead of a name in a box.\n\nWithout this a banquet customer is a string: no history, no notes, no\n'they complained about the AC last time'. With it, the banquet office\nsees the same person the front desk does.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"guest\": \"G-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "customer_profile",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.customer_profile",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.customer_profile"
       ]
      },
      "description": "Everything the banquet office should know before picking up the\nphone: what this client has run with us, what they spent, what they\nusually book, and what's still owed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"guest\": \"G-00001\",\n  \"phone\": \"+91 90000 00000\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "quote_advisor",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.quote_advisor",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.quote_advisor"
       ]
      },
      "description": "Would this function make money at the price we're about to send?\n\nMargin after the event is an autopsy. The number that changes a\ndecision is the one on screen while the discount is still being typed\n- so this answers, for the price as it stands: what's left, how much\nmore could be given away before it stops being worth doing, and where\nthe cost actually sits.\n\n`at_discount` prices a what-if without touching the quote.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "offer_amenities",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.offer_amenities",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.offer_amenities"
       ]
      },
      "description": "Put the hall's chargeable extras on the function.\n\nA hall's air-conditioning and generator come with it; its extra mics,\nits valet parking and its second generator do not. Those live on the\nvenue, and this is how they reach a quote - either priced onto it, or\nparked as open items when the customer hasn't decided yet, which is\nwhere most of them actually sit while a wedding is being agreed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"function\": \"EVT-2026-0001\",\n  \"as_open_items\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "venue_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.banquet.venue_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.banquet.venue_detail"
       ]
      },
      "description": "One hall in full: what it holds, what it comes with, what it costs\nto open, and which other spaces it shares its floor with.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"venue\": \"Your Property-Grand Ballroom\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Migration (CSV import)",
   "item": [
    {
     "name": "preview_import",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.migrate.preview_import",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.migrate.preview_import"
       ]
      },
      "description": "Dry run: how the file's columns map, which date convention was\ndetected, and every row that would be skipped - nothing is written.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\",\n  \"preset\": \"auto\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "run_import",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.migrate.run_import",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.migrate.run_import"
       ]
      },
      "description": "Import the file (see _run_import). Migrated stays are not new\nbusiness, so they never reach outbound webhook subscribers.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\",\n  \"preset\": \"auto\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Go-live data (companies, opening balances, reconciliation)",
   "item": [
    {
     "name": "csv_template",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.golive.csv_template",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.golive.csv_template"
       ]
      },
      "description": "The header row of one of Kamra's go-live CSV templates.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"kind\": \"<kind>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "preview_companies",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.golive.preview_companies",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.golive.preview_companies"
       ]
      },
      "description": "Dry run of the companies file: column mapping, which companies are\nnew and which already exist (they are updated, never duplicated).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "run_companies",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.golive.run_companies",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.golive.run_companies"
       ]
      },
      "description": "Create or update each company (an upsert, so a re-run changes\nnothing) and, for a company on credit, its city ledger account at this\nproperty with the credit limit.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "preview_opening",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.golive.preview_opening",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.golive.preview_opening"
       ]
      },
      "description": "Dry run of the opening-balance file: what each row matched, totals\nper category, what is already posted (a re-run skips it) and every row\nthat can't be posted. Nothing is written.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "run_opening",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.golive.run_opening",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.golive.run_opening"
       ]
      },
      "description": "Post the opening balances. Each item is posted once: a re-run of the\nsame file finds it in Kamra and skips it (and says so). Company bills\ngo in before company credits, so a credit settles the oldest bill.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reconcile",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.golive.reconcile",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.golive.reconcile"
       ]
      },
      "description": "Counts and totals in each go-live file against what is now in Kamra,\nper category. `ready` is true only when every category matches and no\nrow of any file was left out - the gate before the hotel goes live.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Inventory & recipes",
   "item": [
    {
     "name": "ingredients",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.ingredients",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.ingredients"
       ]
      },
      "description": "The ingredient master - the picker behind the recipe editor.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"active_only\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "menu_recipe",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.menu_recipe",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.menu_recipe"
       ]
      },
      "description": "One dish's recipe, with each line's unit and what the dish's own outlet\nhas on hand right now - so the editor can say \"you have 0.4 kg left\".",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"menu_item\": \"<menu_item>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "recipe_overview",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.recipe_overview",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.recipe_overview"
       ]
      },
      "description": "Every dish and whether it has a recipe yet. Dishes without one are not\na problem to be nagged about - most menus will only ever cost their big\nmovers - but you cannot decide that without seeing the list.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_recipe",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.save_recipe",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.save_recipe"
       ]
      },
      "description": "Replace a dish's recipe wholesale. An empty list is valid and means\n\"this dish never touches inventory\" - the optional in the requirement.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"menu_item\": \"<menu_item>\",\n  \"rows\": \"<rows>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_ingredient",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.save_ingredient",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.save_ingredient"
       ]
      },
      "description": "Create or update one ingredient.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"ingredient_name\": \"<ingredient_name>\",\n  \"uom\": \"<uom>\",\n  \"cost_per_unit\": 0,\n  \"is_active\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_ingredient",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.delete_ingredient",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.delete_ingredient"
       ]
      },
      "description": "Refuse if it is on a recipe or has history - deleting it would orphan a\nrecipe or punch a hole in the ledger. Deactivate instead.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "receive_stock",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.receive_stock",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.receive_stock"
       ]
      },
      "description": "Goods in. rows = [{ingredient, qty, cost_per_unit?}]. One batch_id ties\nthe delivery together, which is why this needs no Stock Receipt doctype:\na receipt is just its ledger rows plus a supplier and an invoice number.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"rows\": \"<rows>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "adjust_stock",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.adjust_stock",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.adjust_stock"
       ]
      },
      "description": "The stock take, and the escape hatch for everything this module cannot\nknow. rows = [{ingredient, counted_qty}] - COUNTS, not deltas, exactly\nlike laundry's return_items: a human reports what is physically on the\nshelf and the system works out its own error.\n\nThe note is required on purpose. A write-off with no reason is precisely\nthe silence this module exists to remove - the same call laundry's\nshortage guard makes when it refuses to deliver a short bag unexplained.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"rows\": \"<rows>\",\n  \"note\": \"<note>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "record_wastage",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.record_wastage",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.record_wastage"
       ]
      },
      "description": "Stock destroyed OUTSIDE a sale: a crate of tomatoes rots, a bottle\nbreaks. No POS line exists, so only a real ledger row can say it happened.\n\nNote what this is NOT for: food that was cooked and then voided. That\nalready left the shelf at fire and already has its Consumed row - writing\na Wastage row too would deduct it twice. Use wastage_report() for those.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"ingredient\": \"<ingredient>\",\n  \"qty\": \"<qty>\",\n  \"reason_note\": \"<reason_note>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "stock_list",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.stock_list",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.stock_list"
       ]
      },
      "description": "Everything this outlet holds. Stock is per outlet, so there is no such\nthing as a merged total across outlets and this never offers one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "ingredient_ledger",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.ingredient_ledger",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.ingredient_ledger"
       ]
      },
      "description": "Where did my paneer go? Newest first, each row carrying the balance it\nproduced, so the history explains the number on the shelf.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"ingredient\": \"<ingredient>\",\n  \"limit\": 50\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "low_stock",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.low_stock",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.low_stock"
       ]
      },
      "description": "Everything at or under par, out, or negative - and, for each, the\ndishes that use it. That last part is what makes the flag actionable:\n\"Paneer is out\" means nothing until you know it takes Paneer Tikka with\nit. We flag and offer; a human decides. Nothing is ever auto-86'd.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "wastage_report",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.wastage_report",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.wastage_report"
       ]
      },
      "description": "Food that was cooked and then binned: lines voided after they fired.\n\nDerived, deliberately. The stock already left at the fire and the Consumed\nrow is the truth - a second Wastage row would deduct it twice, and a\ncompensating pair would churn the ledger without changing a balance. This\nonly asks which of those consumptions turned out to be waste, and what\nthey cost. reason=\"Wastage\" in the ledger stays reserved for stock\ndestroyed outside a sale, so SUM(qty_change) always equals reality.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"days\": 30\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_menu_availability",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.set_menu_availability",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.set_menu_availability"
       ]
      },
      "description": "86 a dish, or put it back. This is the ONLY thing that ever pulls an\nitem off the menu for stock reasons, and a human has to press it.\n\nNothing auto-86s on a zero balance, deliberately: the count is the least\ntrustworthy number in the building (see this module's docstring), and a\nstale one would silently hide a dish the kitchen can actually cook. The\nscreen flags what is out and offers the button; the decision stays with\nsomeone who can walk over and look at the shelf.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"menu_item\": \"<menu_item>\",\n  \"available\": \"<available>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_par_level",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.inventory.set_par_level",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.inventory.set_par_level"
       ]
      },
      "description": "Where LOW starts for this ingredient at this outlet. Zero = no par.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"ingredient\": \"<ingredient>\",\n  \"par_level\": \"<par_level>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Menu bulk import",
   "item": [
    {
     "name": "preview_menu_import",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.menu_import.preview_menu_import",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.menu_import.preview_menu_import"
       ]
      },
      "description": "Dry run: how the columns map, what would be created vs updated, and\nevery row that would be skipped. Nothing is written.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\",\n  \"outlet\": \"Your Property-Restaurant\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "run_menu_import",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.menu_import.run_menu_import",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.menu_import.run_menu_import"
       ]
      },
      "description": "Import the file. Upserts by (property, outlet, item_name): a dish\nalready on that outlet's menu is updated (price/flags), never duplicated.\nOne bad row never aborts the batch.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"csv_text\": \"<csv_text>\",\n  \"outlet\": \"Your Property-Restaurant\",\n  \"update_existing\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "menu_template",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.menu_import.menu_template",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.menu_import.menu_template"
       ]
      },
      "description": "The CSV headers + one sample row, so the file starts out right."
     }
    }
   ]
  },
  {
   "name": "Guest ID documents",
   "item": []
  },
  {
   "name": "Central reservations (chain)",
   "item": [
    {
     "name": "crs_search",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.crs.crs_search",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.crs.crs_search"
       ]
      },
      "description": "Find a room across the chain: for every property the user can access,\nthe room types with space for these dates and their all-in rate.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"adults\": 2,\n  \"children\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Dashboards",
   "item": [
    {
     "name": "property_dashboard",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.dashboards.property_dashboard",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.dashboards.property_dashboard"
       ]
      },
      "description": "Everything one hotel's dashboard needs, by department.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "portfolio_dashboard",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.dashboards.portfolio_dashboard",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.dashboards.portfolio_dashboard"
       ]
      },
      "description": "The chain's central view: headline metrics rolled up across every\nproperty the signed-in user may access, plus a per-property table.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Reports",
   "item": [
    {
     "name": "void_allowance_report",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.reports.void_allowance_report",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.reports.void_allowance_report"
       ]
      },
      "description": "Audit trail of every void, allowance and invoice cancellation on a\nproperty: who reversed what, when, and why. The compliance answer to\n\"show me every write-off\" - read straight from the action log, so it\ncannot drift from what actually happened.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "manager_flash",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.reports.manager_flash",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.reports.manager_flash"
       ]
      },
      "description": "The daily flash: yesterday's performance, month to date, today's\nmovement, collections by mode, and the 7-day outlook.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "budget_vs_actual",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.reports.budget_vs_actual",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.reports.budget_vs_actual"
       ]
      },
      "description": "Monthly target vs actual: room revenue, occupancy %, ADR, RevPAR - with\nvariance. period is 'YYYY-MM' (defaults to the current month).\n\n\"Actual\" is posted money: Room charges on folios, dated inside the month.\nA room night reaches a folio when End of Day (night audit) posts it, so a\nstay in-house tonight counts once its night is audited - not before.\nOccupancy and RevPAR divide by the room nights elapsed so far (to the\nbusiness date), not the whole month, so a month-to-date figure compares\nwith a monthly occupancy target. `on_books_nights` / `unposted_nights`\nsay how many sold nights in the same window are still waiting for End\nof Day, so a zero is explained rather than mysterious.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_budget",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.reports.save_budget",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.reports.save_budget"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"period\": \"<period>\",\n  \"room_revenue_target\": 0,\n  \"occupancy_target\": 0,\n  \"adr_target\": 0,\n  \"revpar_target\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "contribution",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.reports.contribution",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.reports.contribution"
       ]
      },
      "description": "Who brings the business: revenue + room nights + share, grouped by\nbooking source, company or travel agent. by = source | company | travel_agent.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\",\n  \"by\": \"source\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "sla_report",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.reports.sla_report",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.reports.sla_report"
       ]
      },
      "description": "Operations SLA health from Service Tickets over a window: overall\nresolution and breach rates, a breakdown by category and by priority,\nand the currently-overdue queue aged by how long it's past its due time.\n\nTime-to-resolve is measured creation -> resolved_on; a ticket counts as\nbreached if it was resolved after due_by, or is still open past due_by.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"from_date\": \"2026-08-01\",\n  \"to_date\": \"2026-08-31\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Ledgers (trial balance, city ledger / AR, FX desk)",
   "item": [
    {
     "name": "ledger_balances",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.ledger_balances",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.ledger_balances"
       ]
      },
      "description": "Four-ledger trial balance for a property (optionally as-of a date).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"business_date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "journal_by_transaction_code",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.journal_by_transaction_code",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.journal_by_transaction_code"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"business_date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "financial_activity",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.financial_activity",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.financial_activity"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"business_date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "city_ledger_transfer",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.city_ledger_transfer",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.city_ledger_transfer"
       ]
      },
      "description": "Move a folio's unpaid balance to the company's city ledger. Runs the\nproperty's credit control: over the credit limit or with overdue bills\nit warns, or refuses (CREDIT_BLOCKED) unless Finance or a Hotel Admin\npasses `credit_override_reason`. Agents can't override.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "city_ledger_settle",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.city_ledger_settle",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.city_ledger_settle"
       ]
      },
      "description": "Record a company's payment against its city ledger account and clear\nthe AR it pays. By default it pays the oldest open bills first;\n`allocations` ([{folio, amount}]) names the folios instead. Any excess\nstays on the account as unapplied credit and settles the company's next\nbill.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"account\": \"<account>\",\n  \"amount\": 1000,\n  \"mode\": \"Bank Transfer\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "city_ledger_aging",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.city_ledger_aging",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.city_ledger_aging"
       ]
      },
      "description": "Every company's AR at the property, aged by due date (not_due,\nd1_30, d31_60, d61_90, d90p and their sum `overdue`). The invoice-age\nkeys (current, b30, b60, b90, b90p) are kept for older callers.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "city_ledger_account",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.city_ledger_account",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.city_ledger_account"
       ]
      },
      "description": "One company's city ledger: balance, aging, each open bill (oldest\nfirst) and recent payments - what the payment screen needs.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"account\": \"<account>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "force_advance_bill",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.force_advance_bill",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.force_advance_bill"
       ]
      },
      "description": "Post future room (+ meal) charges ahead of night audit.\n\nnights: 'tonight' | 'entire' | integer string of nights.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"nights\": \"entire\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "generate_proforma",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.generate_proforma",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.generate_proforma"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "issue_credit_note",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.issue_credit_note",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.issue_credit_note"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"amount\": 1000,\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "record_folio_reprint",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.record_folio_reprint",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.record_folio_reprint"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folio\": \"FOLIO-2026-00001\",\n  \"document\": \"Guest Folio\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "folio_history",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.folio_history",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.folio_history"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "batch_post_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.batch_post_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.batch_post_charge"
       ]
      },
      "description": "Post the same charge to many folios (group / event).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folios\": \"<folios>\",\n  \"charge_type\": \"<charge_type>\",\n  \"amount\": 1000\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "batch_print_folios",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.batch_print_folios",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.batch_print_folios"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"folios\": \"<folios>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "quick_checkout",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.quick_checkout",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.quick_checkout"
       ]
      },
      "description": "Check out and close the guest folio in one step. check_out settles the\nstay the one way: the company's folio (Company, or the group master)\nmoves to the city ledger when the company has credit, and the guest's\nown folio must already be paid - liquor and extras are never billed to\nthe company.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "group_checkout",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.group_checkout",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.group_checkout"
       ]
      },
      "description": "Quick-checkout every Checked In reservation on a group.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"group\": \"<group>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "list_exchange_rates",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.list_exchange_rates",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.list_exchange_rates"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "upsert_exchange_rate",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.upsert_exchange_rate",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.upsert_exchange_rate"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"currency\": \"<currency>\",\n  \"buy_rate\": \"<buy_rate>\",\n  \"sell_rate\": \"<sell_rate>\",\n  \"service_tax_pct\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "currency_calculator",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.currency_calculator",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.currency_calculator"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"currency\": \"<currency>\",\n  \"fx_amount\": \"<fx_amount>\",\n  \"direction\": \"Buy\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "post_exchange",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.post_exchange",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.post_exchange"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"currency\": \"<currency>\",\n  \"fx_amount\": \"<fx_amount>\",\n  \"direction\": \"Buy\",\n  \"folio\": \"FOLIO-2026-00001\",\n  \"guest\": \"G-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "exchange_history",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.exchange_history",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.exchange_history"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"business_date\": \"2026-08-01\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "list_reason_codes",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.ledger.list_reason_codes",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.ledger.list_reason_codes"
       ]
      },
      "description": ""
     }
    }
   ]
  },
  {
   "name": "Company credit (payment terms, credit limit, overdue check)",
   "item": [
    {
     "name": "company_credit_status",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.credit.company_credit_status",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.credit.company_credit_status"
       ]
      },
      "description": "The credit check for billing `amount` more to a company, without\ndoing anything: what the booking dialog shows before a company stay is\nbooked. `applies` is False for a company not on credit.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"company\": \"<company>\",\n  \"property\": \"Your Property\",\n  \"amount\": 1000\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "checkout_credit_preview",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.credit.checkout_credit_preview",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.credit.checkout_credit_preview"
       ]
      },
      "description": "Before check-out: the credit check for each company the stay's bills\nwould move to, so the desk can warn, or ask Finance / a Hotel Admin to\noverride a block. Check-out re-runs the same check itself.\n\nCheck-out first posts any night not yet on the folio, so the preview\ndoes the same inside a savepoint it rolls back - the amounts match\nwhat check-out will move, and nothing is written.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "company_credit_terms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.credit.company_credit_terms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.credit.company_credit_terms"
       ]
      },
      "description": "A company's credit terms at one property: limit, credit days and\nwhat it owes (for the corporate account editor).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"company\": \"<company>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_company_credit_terms",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.credit.set_company_credit_terms",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.credit.set_company_credit_terms"
       ]
      },
      "description": "Set a company's credit limit (0 = no limit) and payment terms at one\nproperty: `use_default_credit_days` 1 follows the property's default\npayment terms; 0 uses `credit_days` as given (0 = due on the invoice\ndate). Creates its city ledger account if it has none. Logged with\nbefore / after.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"company\": \"<company>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Night audit (End of Day checklist, audit pack)",
   "item": [
    {
     "name": "night_audit_precheck",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.night_audit_precheck",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.night_audit_precheck"
       ]
      },
      "description": "The night audit checklist for the property's current business date.\nRead-only. Each check: key, title, severity (block | warn | info),\ncount, items (with reservation / folio / room / guest / amount /\noutlet and bill no where they apply) and a suggested action. A manual\naudit refuses while a blocking check has items, unless each one is\nacknowledged with a reason (run_night_audit acknowledge=[keys], note).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "night_audit_pack",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.night_audit_pack",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.night_audit_pack"
       ]
      },
      "description": "The saved audit pack of one Night Audit Run. A run from before packs\nwere saved answers has_pack: false with a message, not an error.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"audit\": \"<audit>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "night_audit_history",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.night_audit_history",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.night_audit_history"
       ]
      },
      "description": "Recent Night Audit Runs of a property, newest first, with whether\neach has a saved audit pack.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"limit\": 20\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "eod_session",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.eod_session",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.eod_session"
       ]
      },
      "description": "Open (or resume) End of Day for the property's current business date:\nthe draft run that keeps the wizard's progress, every pre-check and\nthe step list with each step's status (pending, done, blocked). With\n`audit`, a finished run is shown at its final reports.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "eod_progress",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.eod_progress",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.eod_progress"
       ]
      },
      "description": "Save the wizard's place: the current step (1-based), a step's status\n(`key` + `status`: done | skipped | pending) and the manager notes.\nA blocked step cannot be marked done - acknowledge it first.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "eod_acknowledge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.eod_acknowledge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.eod_acknowledge"
       ]
      },
      "description": "Acknowledge a blocking check with a reason so End of Day can go on.\nWho and when are recorded on the run and in the Activity log.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"key\": \"<key>\",\n  \"reason\": \"<reason>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "eod_mark_no_show",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.eod_mark_no_show",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.eod_mark_no_show"
       ]
      },
      "description": "End of Day: mark an arrival that did not come a No Show now, with the\nproperty's no-show fee policy applied exactly as the audit applies it\n(fee posted on the business date, or waived for an OTA booking).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "eod_overview",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.night_audit.eod_overview",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.night_audit.eod_overview"
       ]
      },
      "description": "Manage End of Day: one row per property the user can access - the\nbusiness date, the property's local time, arrivals and departures\npending, open cashiers and POS bills, and the number of blockers."
     }
    }
   ]
  },
  {
   "name": "Activity ledger",
   "item": [
    {
     "name": "activity_feed",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.agents_api.activity_feed",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.agents_api.activity_feed"
       ]
      },
      "description": "The one ledger: every action anyone took - human or AI - newest first.\nactor_kind filters to \"human\" or \"agent\".",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"limit\": 50,\n  \"start\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "activity_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.agents_api.activity_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.agents_api.activity_detail"
       ]
      },
      "description": "Everything one ledger row knows \u2014 including the before/after\nsnapshots that are too heavy for the feed.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "staff_sign_ins",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.agents_api.staff_sign_ins",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.agents_api.staff_sign_ins"
       ]
      },
      "description": "Who signed in to and out of Kamra, newest first: Frappe's own Login /\nLogout records (Activity Log), limited to this property's staff. Only\nwhat Frappe already stores is shown - who, when, in or out, and whether\nthe attempt worked. IP addresses are left out.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"limit\": 50,\n  \"start\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Settings hub (module settings)",
   "item": [
    {
     "name": "menu_masters",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.settings.menu_masters",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.settings.menu_masters"
       ]
      },
      "description": "Allergen tags, prep stations, courses and category suggestions for\nthe Menu form and kitchen display. Edited under Settings \u2192 F&B \u2192 Menu\nmaster lists.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "settings_schema",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.settings.settings_schema",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.settings.settings_schema"
       ]
      },
      "description": "Every settings page this user may see for the property, with current\nvalues. Pages they can't change come back read-only (can_edit=False).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_settings",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.settings.save_settings",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.settings.save_settings"
       ]
      },
      "description": "Change some settings on one module page. Validates every key against\nthe registry, refuses keys from another module, and writes one\nActivity log row with the before/after values.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"module\": \"<module>\",\n  \"changes\": \"<changes>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_module_enabled",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.settings.set_module_enabled",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.settings.set_module_enabled"
       ]
      },
      "description": "Switch one module on or off for the property.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"module\": \"<module>\",\n  \"enabled\": \"<enabled>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Rooms (room board, room detail and history, insights)",
   "item": [
    {
     "name": "rooms_board",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rooms.rooms_board",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rooms.rooms_board"
       ]
      },
      "description": "Every room of the property as a tile: housekeeping status, who is in\nit, who arrives or leaves today, whether it is out of service, and its\nopen housekeeping task. One call, a fixed number of queries.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rooms.room_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rooms.room_detail"
       ]
      },
      "description": "Everything about one room right now: what it is, its status, who is\nin it (with the balance), who arrives next, whether it is held out of\nservice, and its open housekeeping work.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_availability",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rooms.room_availability",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rooms.room_availability"
       ]
      },
      "description": "This room, night by night: booked (by whom), held out of service, or\nfree. Same overlap rules as the tape chart and the block guard (the\ncheck-out night is free; a day-use stay holds its own date).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"room\": \"Your Property-101\",\n  \"start_date\": \"2026-08-01\",\n  \"days\": 14\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_history",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rooms.room_history",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rooms.room_history"
       ]
      },
      "description": "Who stayed in this room lately (nights, room revenue), who cleaned\nand checked it and when, its service tickets, and the guests moved in\nor out of it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"room\": \"Your Property-101\",\n  \"limit\": 15\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "room_insights",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.rooms.room_insights",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.rooms.room_insights"
       ]
      },
      "description": "Per-room numbers for the last `days` nights (7, 30, 90, 180 or 365,\nup to yesterday): room nights sold and occupancy, room revenue posted to\nfolios, out-of-service nights, and how long cleans take. Cached for a\nfew minutes (refresh=1 recomputes); one query per measure, never one\nper room.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"days\": 30,\n  \"refresh\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Today layout (per-user widgets, hotel default)",
   "item": [
    {
     "name": "get_today_layout",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.today_layout.get_today_layout",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.today_layout.get_today_layout"
       ]
      },
      "description": "The layout this person sees on Today, and where it came from\n(\"user\", \"property\" or \"default\").",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_today_layout",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.today_layout.save_today_layout",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.today_layout.save_today_layout"
       ]
      },
      "description": "Save this person's own Today layout.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"layout\": \"<layout>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "reset_today_layout",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.today_layout.reset_today_layout",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.today_layout.reset_today_layout"
       ]
      },
      "description": "Drop this person's own layout: back to the hotel default.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_today_layout_default",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.today_layout.save_today_layout_default",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.today_layout.save_today_layout_default"
       ]
      },
      "description": "Hotel Admin: the layout everyone at this property sees until they\ncustomise their own. Pass no layout to go back to the built-in one.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Desk procedures (check-out, check-in and other SOPs)",
   "item": [
    {
     "name": "get_sop",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.sop.get_sop",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.sop.get_sop"
       ]
      },
      "description": "Return evaluated SOP steps for a procedure.\n\ncontext is optional JSON (checkout_context shape for key=checkout). When\nomitted, steps return as todo with template tips only.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"key\": \"<key>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "list_sops",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.sop.list_sops",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.sop.list_sops"
       ]
      },
      "description": "List SOP templates for the settings editor.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "get_sop_template",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.sop.get_sop_template",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.sop.get_sop_template"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_sop_template",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.sop.save_sop_template",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.sop.save_sop_template"
       ]
      },
      "description": "Create or update an SOP template and its steps.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"active\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "seed_sop_templates",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.sop.seed_sop_templates",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.sop.seed_sop_templates"
       ]
      },
      "description": "",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Guided check-in (steps, who did each, room-charges permission)",
   "item": [
    {
     "name": "checkin_flow",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.checkin_flow",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.checkin_flow"
       ]
      },
      "description": "Everything the guided check-in shows, in one round trip: the steps\n(required or optional, done, skipped or to do, and who did them), plus\nwhat each step screen needs.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "check_in_readiness",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.check_in_readiness",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.check_in_readiness"
       ]
      },
      "description": "Read-only: which check-in steps are done, which are still required,\nand whether check_in would go through now. Agents read this; they\ncannot do the desk's steps for it.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "complete_checkin_step",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.complete_checkin_step",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.complete_checkin_step"
       ]
      },
      "description": "The desk marks a step done (a confirm-only step, or the review of\nwhat the guest sent online). Refused while what the step stands for is\nnot true yet - an ID still missing, a deposit not taken.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"step\": \"<step>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "skip_checkin_step",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.skip_checkin_step",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.skip_checkin_step"
       ]
      },
      "description": "Skip an optional step. A required one cannot be skipped.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"step\": \"<step>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_guest_details",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.save_guest_details",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.save_guest_details"
       ]
      },
      "description": "Correct the primary guest's contact and ID details at the desk. Only\nwhat is passed changes; an ID type must be one the country recognises.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"phone\": \"+91 90000 00000\",\n  \"email\": \"guest@example.com\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "confirm_billing",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.confirm_billing",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.confirm_billing"
       ]
      },
      "description": "The desk confirms who pays (OTA, guest, company, group).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"payer\": \"<payer>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "assign_checkin_room",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.assign_checkin_room",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.assign_checkin_room"
       ]
      },
      "description": "Keep the assigned room, or put the guest in another free room of\nthe booked type. Upgrades and downgrades (a different type, maybe a\nnew price) go through the room move screen (room_move_preview +\nmove_reservation), which also records who assigned the room.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "sign_registration_card",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.sign_registration_card",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.sign_registration_card"
       ]
      },
      "description": "The guest signs the registration card on screen (stored like the\nonline signature) or on the printed card (on_paper=1).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"on_paper\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "issue_keys",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.issue_keys",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.issue_keys"
       ]
      },
      "description": "Record the keys handed to the guest, and who handed them. With a\nconnected lock system the keys are made by it as soon as the guest is\nchecked in (now, if already in house); with no lock system the desk\nencodes the cards at the encoder and notes the card numbers here.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"key_count\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "log_checkin_requests",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.log_checkin_requests",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.log_checkin_requests"
       ]
      },
      "description": "Quick requests at check-in become service tickets (one each); a free\nnote is kept on the step and, if given alone, raised as one ticket.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "set_room_charges",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.checkin.set_room_charges",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.checkin.set_room_charges"
       ]
      },
      "description": "May the guest charge outlets, laundry and minibar to the room? POS,\nlaundry and minibar postings check this flag. Changeable later in the\nstay by the desk or finance (logged).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"reservation\": \"RES-2026-00001\",\n  \"allowed\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Staff & access",
   "item": [
    {
     "name": "staff_roles",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.staff.staff_roles",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.staff.staff_roles"
       ]
      },
      "description": "The roles a person can hold, and whether the caller may hand each out."
     }
    },
    {
     "name": "list_staff",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.staff.list_staff",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.staff.list_staff"
       ]
      },
      "description": "Everyone with a Kamra role who can reach this property.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_staff",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.staff.save_staff",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.staff.save_staff"
       ]
      },
      "description": "Add a person, or change an existing person's roles, property access\nand whether they can sign in.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"email\": \"guest@example.com\",\n  \"full_name\": \"A. Guest\",\n  \"roles\": \"<roles>\",\n  \"enabled\": 1,\n  \"send_welcome\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "role_matrix",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.staff.role_matrix",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.staff.role_matrix"
       ]
      },
      "description": "Per role, the settings pages it may change (admins: all of them)."
     }
    }
   ]
  },
  {
   "name": "Outbound webhooks (subscriptions, delivery log)",
   "item": [
    {
     "name": "webhook_events",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.webhook_events",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.webhook_events"
       ]
      },
      "description": "The events a webhook can subscribe to."
     }
    },
    {
     "name": "list_webhooks",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.list_webhooks",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.list_webhooks"
       ]
      },
      "description": "This property's webhook subscriptions (never the secrets).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "save_webhook",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.save_webhook",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.save_webhook"
       ]
      },
      "description": "Create or update a subscription. A new one gets a signing secret,\nreturned once in `secret` - store it on the receiving side now.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"url\": \"<url>\",\n  \"events\": \"<events>\",\n  \"active\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "rotate_webhook_secret",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.rotate_webhook_secret",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.rotate_webhook_secret"
       ]
      },
      "description": "Issue a new signing secret (returned once); the old one stops working.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delete_webhook",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.delete_webhook",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.delete_webhook"
       ]
      },
      "description": "Remove a subscription and its delivery log.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "webhook_deliveries",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.webhook_deliveries",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.webhook_deliveries"
       ]
      },
      "description": "The delivery log, newest first.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"limit\": 50\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "delivery_detail",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.delivery_detail",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.delivery_detail"
       ]
      },
      "description": "One delivery with the exact payload that was (or will be) sent.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"delivery\": \"<delivery>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "resend_delivery",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.resend_delivery",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.resend_delivery"
       ]
      },
      "description": "Send a delivery again now - same event id, so the receiver can tell\nit is the same event.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"delivery\": \"<delivery>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "send_test_event",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.webhooks.send_test_event",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.webhooks.send_test_event"
       ]
      },
      "description": "Send a signed `ping` to one endpoint right now and report the result.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"<name>\",\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "External POS (room charges from a third-party POS)",
   "item": [
    {
     "name": "pos_room_lookup",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos_interface.pos_room_lookup",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos_interface.pos_room_lookup"
       ]
      },
      "description": "In-house stays matching a room number and/or the guest's last name.\nOnly checked-in guests, only this property, only what a cashier needs to\nconfirm the charge: room, guest name, reservation and departure date.\nAsk with a room or a last name (2+ letters) - never the whole list.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room\": \"Your Property-101\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "pos_post_room_charge",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       },
       {
        "key": "Authorization",
        "value": "token {{api_key}}:{{api_secret}}"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.pos_interface.pos_post_room_charge",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.pos_interface.pos_post_room_charge"
       ]
      },
      "description": "Post one POS ticket to an in-house guest's bill.\n\n`ticket_id` is the idempotency key: the same ticket again returns the\nfirst posting with duplicate=true. Name the stay by room (number or id)\nand/or reservation. The billing rules choose the folio; anything with\nalcohol (is_alcohol=1) always goes to the guest's own folio, never the\ncompany's. Tax is the hotel's rule for the charge type, not the POS's.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"ticket_id\": \"<ticket_id>\",\n  \"amount\": 1000,\n  \"description\": \"<description>\",\n  \"room\": \"Your Property-101\",\n  \"reservation\": \"RES-2026-00001\",\n  \"charge_type\": \"Food & Beverage\",\n  \"is_alcohol\": 0,\n  \"tax_rate\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  },
  {
   "name": "Public (no auth - booking page, check-in)",
   "item": [
    {
     "name": "catalog_index",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.catalog_index",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.catalog_index"
       ]
      },
      "description": "Entry point for /book \u2014 how many properties, sites, or listings to show.\n\nSeveral properties live: mode \"properties\" lists them, and the guest\npicks one - /book?property=<slug> (or /stay/<slug>) calls back with\nthat property's slug and gets its own sites / listings / catalog."
     }
    },
    {
     "name": "resolve_slug",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.resolve_slug",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.resolve_slug"
       ]
      },
      "description": "Resolve /stay/:slug to a listing or multi-listing site.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"slug\": \"<slug>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "site_info",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.site_info",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.site_info"
       ]
      },
      "description": "Public site metadata for the login/boot screen.\n\ndemo_mode is true only on the seeded demo site (seed_demo sets the\n`kamra_demo_mode` default), so a real install never advertises the\ndemo login accounts. The running version is public on purpose: it is\nwhat a bug report and the login screen quote."
     }
    },
    {
     "name": "default_property",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.default_property",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.default_property"
       ]
      },
      "description": "Which Property the public booking engine (``/book``) should show.\n\nEach Kamra deploy is single-tenant: one site = one hotel/villa. The\nfrontend used to hardcode the demo property name, which only worked\non the seeded demo site and broke the booking engine on every other\ntenant (``Property <name> not found`` / permission error for Guest).\n\nPicks the Property with booking_engine_enabled=1; if none are flagged\n(fresh install) or several are, falls back to the first Property so\nthe page still renders instead of hanging on a guest permission error."
     }
    },
    {
     "name": "showcase",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.showcase",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.showcase"
       ]
      },
      "description": "Everything the public booking page needs to render.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "search_stay",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.search_stay",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.search_stay"
       ]
      },
      "description": "Availability + real quoted price per room type for the stay.\n\n`child_ages` (e.g. [3, 8, 13]) lets each room type's age bands decide who\nis free, a child or an adult; without it `children` are all children.\nEach row says whether the room type can take the party: `available`, a\n`reason` when it cannot, and `needs_confirmation` when the party is above\nwhat it sleeps but within the extra guests it allows by arrangement.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"adults\": 2,\n  \"children\": 0,\n  \"pets\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "precheckin_info",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.precheckin_info",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.precheckin_info"
       ]
      },
      "description": "Stay summary for the pre-arrival check-in page.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"token\": \"<token>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "precheckin_submit",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.precheckin_submit",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.precheckin_submit"
       ]
      },
      "description": "Guest completes pre-arrival check-in and signs the registration card\n(PRD FR-20 - details + declaration + e-signature; the signed card becomes\nthe paperless GRC the desk views at arrival). The guest can attach a\nphoto of their ID - camera capture or upload - stored privately.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"token\": \"<token>\",\n  \"id_type\": \"<id_type>\",\n  \"id_number\": \"<id_number>\",\n  \"email\": \"guest@example.com\",\n  \"nationality\": \"\",\n  \"address_line\": \"\",\n  \"city\": \"\",\n  \"eta\": \"\",\n  \"special_requests\": \"\",\n  \"signature\": \"\",\n  \"consent\": 0,\n  \"id_image\": \"\",\n  \"address_image\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "precheckin_upload_id",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.precheckin_upload_id",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.precheckin_upload_id"
       ]
      },
      "description": "The guest photographs their ID during pre-arrival check-in.\n\nDeliberately NOT Frappe's upload_file. That endpoint would need the\nsite-wide `allow_guests_to_upload_files` setting, which opens\nunauthenticated upload to the whole site; on its guest branch it sets\nignore_permissions and never sees a token, so it cannot tell whether this\nguest owns this booking; and it takes is_private from the client - i.e.\nit trusts the browser to protect an Aadhaar scan. Here the token is the\ngate, the rate limit is real, and privacy is not negotiable.\n\nOptional by design: nothing downstream requires a document. A guest with\na cracked camera or a bad lobby connection must still be able to\npre-register, so the submit gate never mentions this.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"token\": \"<token>\",\n  \"data\": \"<data>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "laundry_info",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.laundry_info",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.laundry_info"
       ]
      },
      "description": "Laundry price list + stay context for the in-stay guest page.\nRead-only \u2014 the guest sees what things cost, never a folio.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"token\": \"<token>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "request_guest_laundry",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.request_guest_laundry",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.request_guest_laundry"
       ]
      },
      "description": "In-house guest asks housekeeping to pick their laundry up. Written on\nthe guest's behalf by the governed agent \u2014 the guest never touches pricing\nor the folio; staff count and price the bag at the door (status\n'Requested', exactly where a staff-logged pickup lands).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"token\": \"<token>\",\n  \"notes\": \"\",\n  \"express\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "book",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.book",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.book"
       ]
      },
      "description": "Create a Website booking. Guest identity is the phone number; staff\nverify at check-in. The advance owed is computed from the property's\ncurrent payment policy and snapshotted onto the booking.\n\nInstant mode (default): Confirmed when nothing is due now, else\nPending Payment with a hold window. Request to Book: Requested (no\ninventory) until the host approves. A party above what the room sleeps,\nwithin the extra guests it allows, is also Requested: the host confirms\nthe sleeping arrangement and agrees the price for them.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"room_type\": \"Your Property-DLX\",\n  \"check_in_date\": \"2026-08-01\",\n  \"check_out_date\": \"2026-08-03\",\n  \"guest_name\": \"A. Guest\",\n  \"phone\": \"+91 90000 00000\",\n  \"email\": \"guest@example.com\",\n  \"adults\": 2,\n  \"children\": 0,\n  \"meal_plan\": \"\",\n  \"special_requests\": \"\",\n  \"voucher_code\": \"\",\n  \"idempotency_key\": \"\",\n  \"pets\": 0\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "access_info",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.access_info",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.access_info"
       ]
      },
      "description": "Guest access instructions when gates pass (precheckin token).",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"token\": \"<token>\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "check_voucher",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.check_voucher",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.check_voucher"
       ]
      },
      "description": "Live promo-code feedback on the booking page. Never throws - returns\n{ok, message, discount_type, value} so the guest sees a friendly note.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"property\": \"Your Property\",\n  \"code\": \"<code>\",\n  \"nights\": 1\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    },
    {
     "name": "hosting_enquiry",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{base_url}}/api/method/kamra.public_api.hosting_enquiry",
       "host": [
        "{{base_url}}"
       ],
       "path": [
        "api",
        "method",
        "kamra.public_api.hosting_enquiry"
       ]
      },
      "description": "Hosting / implementation enquiry from kamrapms.com. Stored first (a lead is\nnever lost even without SMTP), then a best-effort email to the team.\n\nLeads are System Manager\u2013only and purged after\n``hosting_enquiry_retention_months`` (default 24) unless status is Won.",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"full_name\": \"A. Guest\",\n  \"email\": \"guest@example.com\",\n  \"phone\": \"+91 90000 00000\",\n  \"property_name\": \"\",\n  \"rooms\": 0,\n  \"city\": \"\",\n  \"message\": \"\",\n  \"country\": \"\",\n  \"interest\": \"\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     }
    }
   ]
  }
 ]
}