### X-Doorloom-Signature header example Source: https://doorloom.com/developers/webhooks/signatures Example of the X-Doorloom-Signature header with a timestamp and a v1 signature. ```http X-Doorloom-Signature: t=1759312504,v1=5f2a9c8d1e… ``` -------------------------------- ### List bookings response example Source: https://doorloom.com/developers/api/bookings/retrieve Example JSON response for the listing endpoint. Shows the data array with booking objects and a top-level pagination object. Note that pagination sits beside data, not inside it. ```json { "success": true, "message": "OK", "data": [ { "id": 55231, "external_booking_id": "PMS-100234", "revision": 2, "status": "confirmed", "…": "…" }, { "id": 55240, "external_booking_id": "PMS-100241", "revision": 1, "status": "pending", "…": "…" } ], "pagination": { "page": 1, "per_page": 100, "total": 128, "last_page": 2 } } ``` -------------------------------- ### GET /api/integrations/v1/me with curl Source: https://doorloom.com/developers/api/me Make a GET request to the endpoint with your integration API key. Takes no parameters and changes nothing. ```bash curl https://doorloom.com/api/integrations/v1/me \ -H "Authorization: Bearer $DOORLOOM_API_KEY" ``` -------------------------------- ### List properties response example Source: https://doorloom.com/developers/api/properties Example 200 response from the list properties endpoint. The `sequence` field is a watermark; events with a higher sequence can be applied on top of this snapshot. Only active units are included. ```json { "success": true, "message": "OK", "data": { "sequence": 1047, "properties": [ { "doorloom_id": 902, "external_id": "VILLA-9", "coverage": "active", "name": "Amber Villa, Alibaug", "property_type": "Villa", "status": "active", "is_master": true, "master_property_id": 902, "units": [ { "inventory_id": 31, "external_unit_id": "ROOM-A", "name": "Garden Suite", "code": "GS", "is_active": true, "is_default": true, "max_occupancy": 4, "deleted": false }, { "inventory_id": 32, "external_unit_id": "ROOM-B", "name": "Pool Suite", "code": "PS", "is_active": true, "is_default": false, "max_occupancy": 4, "deleted": false } ] } ] } } ``` -------------------------------- ### Booking Object JSON Example Source: https://doorloom.com/developers/api/bookings/object Example of a booking object returned by the DoorLoom API. Shows the structure with nested objects for property, guest, units, pricing, payment, and source. Useful for understanding the response format. ```json { "id": 55231, "external_booking_id": "PMS-100234", "external_reference": "HM-77", "revision": 2, "origin": "doorloom", "status": "confirmed", "property": { "doorloom_id": 902, "external_id": "VILLA-9" }, "check_in": "2026-10-12", "check_out": "2026-10-14", "guests": { "adults": 4, "children": 1 }, "guest": { "name": "Asha Rao", "phone_code": "+91", "mobile": "9876543210" }, "units": [ { "property": { "doorloom_id": 902, "external_id": "VILLA-9" }, "inventory_id": 31, "external_unit_id": "ROOM-A", "adults": 2, "children": 1, "meal_plan": "CP", "stay_price": 8000, "meal_total": 2600, "line_total": 10600 }, { "property": { "doorloom_id": 902, "external_id": "VILLA-9" }, "inventory_id": 32, "external_unit_id": "ROOM-B", "adults": 2, "children": 0, "meal_plan": "EP", "stay_price": 8000, "meal_total": 0, "line_total": 8000 } ], "pricing": { "currency": "INR", "total": 18600, "advance": 4000, "balance": 14600, "partner_breakdown": { "room": 16000, "meals": 2600 } }, "payment": { "status": "partial", "amount_collected": 4000, "collected_by": "partner", "reference": "pay_123" }, "source": { "channel": "airbnb", "reference": "HM-77" }, "notes": "Late arrival, around 11pm", "cancelled_at": null, "cancellation_note": null, "created_at": "2026-10-01T15:58:12+05:30", "updated_at": "2026-10-01T16:22:40+05:30" } ``` -------------------------------- ### GET /me Source: https://doorloom.com/developers/limits Retrieves information about the authenticated integration. Subject to a rate limit of 60 requests per minute. ```APIDOC ## GET /me ### Description Retrieves information about the authenticated integration. ### Method GET ### Endpoint /me ### Rate Limit - **60** per minute per integration. ### Response #### Success Response (200) - No response body details provided in the source. #### Error Response (429) - **code** (string) - `RATE_LIMITED` - **message** (string) - Description of the rate limit exceeded. - **errors.retry_after** (integer) - Seconds to wait before retrying. #### Response Example ```json { "success": false, "code": "RATE_LIMITED", "message": "Too many requests. Retry after 34 seconds.", "errors": { "retry_after": 34 } } ``` ``` -------------------------------- ### GET /api/integrations/v1/me Source: https://doorloom.com/developers/api/me Retrieves the current integration's status, webhook health, event sequence, and property coverage. Takes no parameters and changes nothing. ```APIDOC ## [GET] /api/integrations/v1/me ### Description Read your own integration: status, webhook health, how far behind you are, and how many properties you cover. The right first call, and a good health check. ### Method GET ### Endpoint https://doorloom.com/api/integrations/v1/me ### Parameters No parameters. ### Request Example ```bash curl https://doorloom.com/api/integrations/v1/me \ -H "Authorization: Bearer $DOORLOOM_API_KEY" ``` ### Response #### Success Response (200) - **success** (boolean) - Indicates the request succeeded. - **message** (string) - Response message, typically "OK". - **data** (object) - Contains integration details. - **id** (integer) - Your integration id. - **slug** (string) - Your integration slug. Also sent as the `X-Doorloom-Integration` header on every webhook. - **name** (string) - Display name Doorloom staff gave the integration. - **status** (string) - `active`, `paused` or `disabled`. A **paused** integration still has full API access — only webhook delivery is stopped. - **brand** (object) - Brand information. - **id** (integer) - The brand this integration belongs to. - **name** (string) - The brand name. - **api_version** (string) - The version your payloads are shaped by. Currently `2026-09`. - **webhook** (object) - Webhook configuration and health. - **configured** (boolean) - False when no webhook URL is registered. Nothing will be delivered until one is. - **url** (string|null) - Where deliveries go. - **event_types** (array) - The event types you are subscribed to. All of them unless staff narrowed it. - **last_sequence** (integer) - The highest sequence Doorloom has issued you. Compare against your own cursor to see whether you are behind. - **undelivered_events** (integer) - Events waiting or being retried. Should sit at 0 in a healthy integration. - **consecutive_failures** (integer) - Failed deliveries since the last success. Five, plus six hours without a success, triggers an auto-pause. - **last_success_at** (string|null) - ISO-8601. Last time a delivery was accepted. - **last_failure_at** (string|null) - ISO-8601. Last time one was not. - **paused_at** (string|null) - ISO-8601. When delivery was paused, if it is. - **paused_reason** (string|null) - `manual` (staff), `auto` (sustained failure) or `gone` (your endpoint returned 410). - **horizon_days** (integer) - How far ahead Doorloom generates events for you. Dates beyond this are not pushed until they come into range. - **covered_properties** (integer) - How many properties your integration currently covers, including the ones you created through the API. #### Response Example ```json { "success": true, "message": "OK", "data": { "id": 12, "slug": "acme-pms", "name": "Acme PMS", "status": "active", "brand": { "id": 4, "name": "Amber Stays" }, "api_version": "2026-09", "webhook": { "configured": true, "url": "https://acme.example.com/hooks/doorloom", "event_types": [ "availability.changed", "rates.changed", "restrictions.changed", "inventory.changed", "property.changed", "booking.changed" ], "last_sequence": 1047, "undelivered_events": 0, "consecutive_failures": 0, "last_success_at": "2026-10-01T16:30:04+05:30", "last_failure_at": null, "paused_at": null, "paused_reason": null }, "horizon_days": 365, "covered_properties": 6 } } ``` ### Errors | Status | Code | Meaning | |--------|------|---------| | 401 | `UNAUTHENTICATED` | No API key, or a key that is not valid. Rotating your API key invalidates the previous one immediately. | | 403 | `NOT_INTEGRATION_TOKEN` | The bearer token is valid but is not an integration API key — it belongs to another Doorloom token surface. Integration keys are the only credential this API accepts. | | 403 | `INTEGRATION_DISABLED` | Doorloom staff disabled this integration. No events are recorded and no API call succeeds. This is distinct from **paused** : a paused integration keeps full API access and only stops receiving webhooks. | | 429 | `RATE_LIMITED` | You exceeded one of the rate limits. The standard `Retry-After` and `X-RateLimit-*` headers are set on the response. | ``` -------------------------------- ### GET availability with curl Source: https://doorloom.com/developers/api/snapshots Example curl request to fetch availability for a property and date range. Uses the `from` and `to` query parameters and an Authorization header with a bearer token. ```bash curl -G "https://doorloom.com/api/integrations/v1/properties/VILLA-9/availability" \ -H "Authorization: Bearer $DOORLOOM_API_KEY" \ --data-urlencode "from=2026-10-12" \ --data-urlencode "to=2026-10-15" ``` -------------------------------- ### Create a property with POST /properties Source: https://doorloom.com/developers/quickstart Creates a property with its units, opening rates, and your id mapping in one call. Requires the DOORLOOM_API_KEY and an Idempotency-Key. The 201 response returns data.doorloom_id and each unit's inventory_id; store that mapping. A portfolio can be created via POST /properties/bulk, 25 at a time. ```bash curl -X POST https://doorloom.com/api/integrations/v1/properties \ -H "Authorization: Bearer $DOORLOOM_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 2c5d0b7e-1f7a-4c1b-9b3e-3e7d9a4f6c21" \ -d '{ "external_id": "VILLA-9", "name": "Amber Villa, Alibaug", "property_type": "villa", "description": "Sea-facing villa with a private pool.", "address": { "address_line_1": "12 Kihim Beach Road", "city": "Alibaug", "state": "Maharashtra", "pin_code": "402201" }, "space": { "bedrooms": 3, "washrooms": 3 }, "occupancy": { "max_guests": 8 }, "pricing": { "weekday": { "base_price": 12000 }, "weekend": { "base_price": 15000 } }, "units": [ { "name": "Room A", "external_id": "ROOM-A" }, { "name": "Room B", "external_id": "ROOM-B" } ] }' ``` -------------------------------- ### Response 200 JSON for /api/integrations/v1/me Source: https://doorloom.com/developers/api/me Example successful response showing integration details, webhook configuration, and coverage. The webhook fields indicate health: undelivered_events should be 0, and consecutive_failures of 5 plus six hours without success triggers an auto-pause. ```json { "success": true, "message": "OK", "data": { "id": 12, "slug": "acme-pms", "name": "Acme PMS", "status": "active", "brand": { "id": 4, "name": "Amber Stays" }, "api_version": "2026-09", "webhook": { "configured": true, "url": "https://acme.example.com/hooks/doorloom", "event_types": [ "availability.changed", "rates.changed", "restrictions.changed", "inventory.changed", "property.changed", "booking.changed" ], "last_sequence": 1047, "undelivered_events": 0, "consecutive_failures": 0, "last_success_at": "2026-10-01T16:30:04+05:30", "last_failure_at": null, "paused_at": null, "paused_reason": null }, "horizon_days": 365, "covered_properties": 6 } } ``` -------------------------------- ### List properties with curl Source: https://doorloom.com/developers/api/properties Use this request to fetch all properties and units covered by your integration. No parameters are required. The response is not paginated. ```bash curl https://doorloom.com/api/integrations/v1/properties \ -H "Authorization: Bearer $DOORLOOM_API_KEY" ``` -------------------------------- ### Create a booking with curl Source: https://doorloom.com/developers/quickstart Use this curl command to create a booking via the DoorLoom API. It requires an Idempotency-Key (8-128 characters, UUID recommended) and a Bearer token. A 201 response returns the booking; a 200 with data.duplicate: true means the booking already exists (treat as success); a 409 UNAVAILABLE means nothing was free for the whole stay, with errors.availability providing per-night details. ```bash curl -X POST https://doorloom.com/api/integrations/v1/bookings \ -H "Authorization: Bearer $DOORLOOM_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 6f1c2f2a-6b3a-4a1e-9d2f-8a7c5e3b1d40" \ -d '{ "external_booking_id": "PMS-100234", "property": { "external_id": "VILLA-9" }, "units": [ { "external_unit_id": "ROOM-A", "adults": 2, "children": 1, "meal_plan": "CP" } ], "check_in": "2026-10-12", "check_out": "2026-10-14", "guest": { "name": "Asha Rao", "phone_code": "+91", "mobile": "9876543210" }, "pricing": { "total": 16000, "currency": "INR" }, "status": "confirmed" }' ``` -------------------------------- ### Response 201: Booking created Source: https://doorloom.com/developers/api/bookings/create Example response for a successful booking creation (HTTP 201). The `data` object contains the booking details, including `external_booking_id`, `status`, `property`, `check_in`, `check_out`, `guests`, and `pricing`. The response is abridged, as indicated by the `…` placeholders. ```json { "success": true, "message": "Booking created", "data": { "id": 55231, "external_booking_id": "PMS-100234", "revision": 1, "origin": "partner", "status": "confirmed", "property": { "doorloom_id": 902, "external_id": "VILLA-9" }, "check_in": "2026-10-12", "check_out": "2026-10-14", "guests": { "adults": 4, "children": 1 }, "units": [ "…" ], "pricing": { "currency": "INR", "total": 18600, "advance": 4000, "balance": 14600 }, "…": "…" } } ``` -------------------------------- ### ping Source: https://doorloom.com/developers/webhooks/events/ping Documentation for the ping webhook event, including its purpose, data block, and example envelope. ```APIDOC ## [WEBHOOK] ping ### Description A connectivity check that consumes no sequence. It is sent by Doorloom staff or an automatic probe to verify connectivity, especially for paused endpoints. ### Event Type `ping` ### When it fires - Doorloom staff send a test, or an automatic probe checks whether a paused endpoint has recovered. - Probes run every 30 minutes while an integration is paused. - This event carries neither `property` nor `window`. ### What to do with it - A ping is **never persisted and consumes no sequence**. Its `sequence` field reports the integration's current `last_sequence`, so you can compare it against your own cursor to see whether you have fallen behind. - Do not apply a ping to any state. Just answer 2xx. - If your integration was auto-paused, the first 2xx you return to a probe resumes delivery and the accumulated backlog drains in sequence order. - `property` and `window` are always null. ### The `data` block | Field | Type | Description | |-------|------|-------------| | `message` | string | Human-readable text describing why the ping was sent. | | `sent_by` | string | `"admin"` for a staff test, `"probe"` for the automatic recovery check. | ### Example ```json { "id": "01J6Y0X3V6X9A1C3E5G7J9L1M3", "type": "ping", "version": "2026-09", "sequence": 1047, "occurred_at": "2026-10-01T16:30:00+05:30", "integration": { "id": 12, "slug": "acme-pms" }, "property": null, "window": null, "data": { "message": "Test webhook sent from the Doorloom admin panel.", "sent_by": "admin" } } ``` ``` -------------------------------- ### Minimal request: curl POST to create a villa Source: https://doorloom.com/developers/api/properties/create Creates a single-unit villa with one default unit, priced from the day it exists. Uses the Authorization header with $DOORLOOM_API_KEY and an Idempotency-Key. ```bash curl -X POST https://doorloom.com/api/integrations/v1/properties \ -H "Authorization: Bearer $DOORLOOM_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 2c5d0b7e-1f7a-4c1b-9b3e-3e7d9a4f6c21" \ -d '{ "external_id": "VILLA-001", "name": "Amber Villa, Alibaug", "property_type": "villa", "description": "Sea-facing villa with a private pool and staff.", "address": { "address_line_1": "12 Kihim Beach Road", "city": "Alibaug", "state": "Maharashtra", "pin_code": "402201" }, "space": { "bedrooms": 3, "washrooms": 3 }, "occupancy": { "max_guests": 8 }, "pricing": { "weekday": { "base_price": 12000 }, "weekend": { "base_price": 15000 } } }' ``` -------------------------------- ### GET /properties Source: https://doorloom.com/developers/limits Retrieves property data. Shares a rate limit budget with availability, rates, and restriction snapshots. ```APIDOC ## GET /properties ### Description Retrieves property data. Shares a rate limit budget with availability, rates, and restriction snapshots. ### Method GET ### Endpoint /properties ### Rate Limit - **120** per minute per integration (shared with availability, rates, and restriction snapshots). ### Response #### Success Response (200) - No response body details provided in the source. #### Error Response (429) - **code** (string) - `RATE_LIMITED` - **message** (string) - Description of the rate limit exceeded. - **errors.retry_after** (integer) - Seconds to wait before retrying. #### Response Example ```json { "success": false, "code": "RATE_LIMITED", "message": "Too many requests. Retry after 34 seconds.", "errors": { "retry_after": 34 } } ``` ``` -------------------------------- ### Create booking request JSON Source: https://doorloom.com/developers/api/bookings/create Example request body for creating a booking. Include external_booking_id, property.external_id, and units[] with either inventory_id or external_unit_id to pin a unit, or neither to let Doorloom allocate any free unit. If a pinned unit is unavailable, the request is refused with 409 UNAVAILABLE and nothing is written. ```json { "external_booking_id": "PMS-100234", "property": { "external_id": "VILLA-9" }, "units": [ { "external_unit_id": "ROOM-A", "adults": 2, "children": 1, "meal_plan": "CP", "stay_price": 8000 } ] } ``` -------------------------------- ### GET /api/integrations/v1/bookings Source: https://doorloom.com/developers/api/bookings/retrieve List bookings with optional filtering and pagination. Results are ordered by last updated, oldest first. ```APIDOC ## GET /api/integrations/v1/bookings ### Description List bookings with optional filtering and pagination. Results are ordered by when they were last updated, oldest first. This ordering makes `updated_since` safe to page through. ### Method GET ### Endpoint https://doorloom.com/api/integrations/v1/bookings ### Parameters #### Query Parameters - **updated_since** (string) - Optional - Any parseable date or timestamp. Returns bookings changed since then. This is the polling parameter. - **status** (string) - Optional - One of `pending`, `confirmed`, `cancelled`, `completed`, `refunded`. - **property_id** (integer) - Optional - Doorloom property id. - **check_in_from** (string) - Optional - `YYYY-MM-DD`. Earliest check-in. - **check_in_to** (string) - Optional - `YYYY-MM-DD`. Latest check-in. - **page** (integer) - Optional - 1-based. Defaults to 1. - **per_page** (integer) - Optional - 1 to 200. Defaults to 50. ### Request Example ```bash curl -G https://doorloom.com/api/integrations/v1/bookings \ -H "Authorization: Bearer $DOORLOOM_API_KEY" \ --data-urlencode "updated_since=2026-10-01T00:00:00+05:30" \ --data-urlencode "status=confirmed" \ --data-urlencode "per_page=100" ``` ### Response #### Success Response (200) Returns a list of booking objects and pagination information. #### Response Example ```json { "success": true, "message": "OK", "data": [ { "id": 55231, "external_booking_id": "PMS-100234", "revision": 2, "status": "confirmed", "…": "…" }, { "id": 55240, "external_booking_id": "PMS-100241", "revision": 1, "status": "pending", "…": "…" } ], "pagination": { "page": 1, "per_page": 100, "total": 128, "last_page": 2 } } ``` Note: `pagination` is a top-level key of the response object, not inside `data`. ### Errors - **422** - `VALIDATION_FAILED` - The request body failed validation. `errors` is Laravel's field bag: an object keyed by field path, each holding an array of messages. - **404** - `NOT_FOUND` - No such booking or property for this integration. Another integration's booking or property is not found rather than forbidden. - **401** - `UNAUTHENTICATED` - No API key, or a key that is not valid. - **429** - `RATE_LIMITED` - Rate limit exceeded. ``` -------------------------------- ### GET /api/integrations/v1/bookings/external/{external_booking_id} Source: https://doorloom.com/developers/api/bookings/retrieve Retrieve a single booking by your own external booking id. Useful when your system holds only its own reference. ```APIDOC ## GET /api/integrations/v1/bookings/external/{external_booking_id} ### Description Retrieve a single booking by your own external booking id. Useful when your system holds only its own reference, for example after a create whose response you lost. ### Method GET ### Endpoint https://doorloom.com/api/integrations/v1/bookings/external/{external_booking_id} ### Parameters #### Path Parameters - **external_booking_id** (string) - Required - Your own booking reference. URL-encode the id if it contains anything exotic. ### Request Example ```bash curl https://doorloom.com/api/integrations/v1/bookings/external/PMS-100234 \ -H "Authorization: Bearer $DOORLOOM_API_KEY" ``` ### Response #### Success Response (200) Returns the booking object. #### Response Example (Not provided in source) ### Errors - **404** - `NOT_FOUND` - No such booking for this integration. Another integration's booking is not found rather than forbidden. - **401** - `UNAUTHENTICATED` - No API key, or a key that is not valid. - **429** - `RATE_LIMITED` - Rate limit exceeded. ``` -------------------------------- ### POST /properties Source: https://doorloom.com/developers/api/properties/create Creates a new property listing. The request body must include required fields such as name, description, address, space, occupancy, and pricing. Optional fields allow specifying external IDs, property type, units, and features. ```APIDOC ## POST /properties ### Description Creates a new property listing. The request body must include required fields such as name, description, address, space, occupancy, and pricing. Optional fields allow specifying external IDs, property type, units, and features. ### Method POST ### Endpoint /properties ### Parameters #### Request Body - `external_id` (string) - Optional - Your id for this property. Max 128 characters of `A-Z a-z 0-9 . _ : -`. Unique within your integration. It becomes the `external_id` you may use anywhere the API takes a property reference. - `name` (string) - Required - The listing name guests see. Max 255 characters. Returned as `name`. - `property_type` (string) - Optional - One of `villa`, `apartment`, `farm_stay`, `home_stay`, `hostel`, `bed_and_breakfast`, `resort`, `cottage`, `guest_house`, `room`, `suite`, `dorm`, `hotel`. - `property_category` (string) - Optional - `vacation_rental` or `resort_hotel`. - `description` (string) - Required - The guest-facing description. Max 2000 characters. - `address` (object) - Required - Where the property is. - `address.address_line_1` (string) - Required - Max 255 characters. - `address.address_line_2` (string) - Optional - Max 255 characters. - `address.landmark` (string) - Optional - Max 255 characters. - `address.city` (string) - Required - Max 100 characters. - `address.state` (string) - Required - Max 100 characters. - `address.country` (string) - Optional - Max 100 characters. Defaults to `India`. - `address.pin_code` (string) - Required - Postal code, max 20 characters. - `address.latitude` (number) - Optional - -90 to 90. - `address.longitude` (number) - Optional - -180 to 180. - `address.formatted_address` (string) - Optional - Max 500 characters. Derived from the other address fields when omitted. - `space` (object) - Required - Room counts. - `space.bedrooms` (integer) - Required - 0 to 500. - `space.washrooms` (integer) - Required - 0 to 500. - `occupancy` (object) - Required - Guest limits for the property as a whole. - `occupancy.min_guests` (integer) - Optional - 1 or more. Defaults to 1. - `occupancy.max_guests` (integer) - Required - 1 to 500, not below `min_guests`. - `pricing` (object) - Required - The opening base rates. Doorloom owns pricing from here on: the host edits it in the app and you receive `rates.changed`. You may correct these base rates later with `PUT`. - `pricing.weekday` (object) - Required - Monday to Thursday nights. - `pricing.weekday.base_price` (number) - Required - INR per night, 0 or more. - `pricing.weekday.per_night_occupancy` (integer) - Optional - Guests included in the base price. Defaults to `occupancy.max_guests`. - `pricing.weekday.extra_adult_price` (number) - Optional - INR per extra adult per night. Defaults to 0. - `pricing.weekday.extra_child_price` (number) - Optional - INR per extra child per night. Defaults to 0. - `pricing.weekend` (object) - Required - Friday and Saturday nights. Same fields as `weekday`. - `units` (array) - Optional - The sellable units (rooms, cottages, tents). 1 to 50 entries. **Omit it for a single-unit listing** and Doorloom seeds one default unit. - `units[].name` (string) - Required - Max 255 characters. Unique within the request. - `units[].external_id` (string) - Optional - Your id for the unit — the `external_unit_id` you may use on bookings. Same character rules as `external_id`; unique within your integration. - `units[].code` (string) - Optional - A short code, max 64 characters. - `units[].max_occupancy` (integer) - Optional - Guests the unit sleeps. Not enforced by Doorloom. - `features` (object) - Optional - House rules and facts. - `features.is_private` (boolean) - Optional - The whole place, not shared. Defaults to false. - `features.is_pet_friendly` (boolean) - Optional - Defaults to false. - `features.max_pets` (integer) - Optional - 0 to 50. - `features.pet_charges` (number) - Optional - INR per pet. - `features.is_veg` (boolean) - Optional - Vegetarian-only kitchen. Defaults to false. - `features.is_smoking_in_rooms` (boolean) - Optional - Defaults to false. ### Request Example ```json { "external_id": "prop_123", "name": "Cozy Villa", "property_type": "villa", "property_category": "vacation_rental", "description": "A beautiful villa with garden.", "address": { "address_line_1": "123 Main St", "city": "Goa", "state": "Goa", "country": "India", "pin_code": "403001" }, "space": { "bedrooms": 3, "washrooms": 2 }, "occupancy": { "min_guests": 1, "max_guests": 6 }, "pricing": { "weekday": { "base_price": 5000 }, "weekend": { "base_price": 6000 } } } ``` ### Response #### Success Response (200) No response schema is provided in the source. #### Response Example No response example is provided in the source. ```