{"openapi":"3.0.3","info":{"title":"TDO Distribution API","version":"1.0.0","description":"Hotel inventory for partner systems. One credential, one host.\n\n**Integration order.** Download geography, then property content, then build the\nbooking flow. The first two are prerequisites — search takes property identifiers\nthat come from the content feed.\n\n**The chain.** Every step consumes something the previous step produced:\n`property_id` → `rate_token` → `book_token` → `booking_ref`. You never construct\nan identifier yourself.\n\n**Batch limit.** Up to 50 properties per search.\nLarger sets should be split and sent in parallel. Over-limit requests are rejected\nnaming the cap rather than silently truncated.\n\n**Caching.** Geography and property content must be cached locally and refreshed\nfrom the delta feed. Calling them live per search will breach your ratio limits.","contact":{"name":"TDO Partner Support","email":"api-support@tdonline.co"}},"servers":[{"url":"https://api.sandbox.tdonline.co/v1","description":"sandbox"}],"security":[{"TdoSignature":[]}],"tags":[{"name":"Reference","description":"Connectivity, limits and the error taxonomy."},{"name":"Geography","description":"Places. Download once, refresh by delta."},{"name":"Content","description":"Property content. Download once, refresh by delta."},{"name":"Shopping","description":"Live availability. Never cached."},{"name":"Booking","description":"Create, retrieve and cancel. Money moves here."},{"name":"Notifications","description":"Supplier-initiated changes pushed to you."}],"paths":{"/ping":{"get":{"tags":["Reference"],"summary":"Verify your credentials and see which environment you are in","description":"Your first call. Confirms the key, the signature and the environment in one round trip.","responses":{"200":{"description":"Credentials valid","content":{"application/json":{"example":{"data":{"status":"ok","environment":"sandbox","partner_id":"prt_4417","rate_mode":"both","products":["hotels"],"server_time":"2026-08-13T09:14:02.418Z"}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/errors":{"get":{"tags":["Reference"],"summary":"The full error taxonomy with causes and remedies","responses":{"200":{"description":"Every code this API can return","content":{"application/json":{"example":{"data":[{"code":"INVALID_CREDENTIALS","http_status":401,"message":"Your credentials could not be verified. Check the key, the signature and the timestamp.","remedy":"Confirm the key belongs to this environment, recompute the signature as SHA-512(key + secret + timestamp), and ensure your clock is within 5 minutes of ours."},{"code":"NOT_ENTITLED","http_status":403,"message":"Your credentials are valid but are not permitted to perform this operation.","remedy":"Booking unlocks once certification passes. For anything else, contact your account manager to adjust the configuration on your key."},{"code":"VALIDATION_FAILED","http_status":400,"message":"The request could not be processed as sent.","remedy":"Correct the fields listed in the details and retry."}]}}}}}}},"/limits":{"get":{"tags":["Reference"],"summary":"Your configured limits and current consumption","responses":{"200":{"description":"Limits and usage"}}}},"/currencies":{"get":{"tags":["Reference"],"summary":"Supported currencies","responses":{"200":{"description":"Currency list"}}}},"/geo/countries":{"get":{"tags":["Geography"],"summary":"List countries","parameters":[{"name":"country_code","in":"query","schema":{"type":"string","minLength":2,"maxLength":2},"description":"ISO 3166-1 alpha-2 country code."},{"name":"parent_id","in":"query","schema":{"type":"string"},"description":"Restrict to children of this place."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text name match."},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lon","in":"query","schema":{"type":"number"}},{"name":"radius_km","in":"query","schema":{"type":"number","maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"List countries","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/geo/regions":{"get":{"tags":["Geography"],"summary":"List states, provinces and administrative regions","parameters":[{"name":"country_code","in":"query","schema":{"type":"string","minLength":2,"maxLength":2},"description":"ISO 3166-1 alpha-2 country code."},{"name":"parent_id","in":"query","schema":{"type":"string"},"description":"Restrict to children of this place."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text name match."},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lon","in":"query","schema":{"type":"number"}},{"name":"radius_km","in":"query","schema":{"type":"number","maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"List states, provinces and administrative regions","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/geo/cities":{"get":{"tags":["Geography"],"summary":"List cities — the primary search input","parameters":[{"name":"country_code","in":"query","schema":{"type":"string","minLength":2,"maxLength":2},"description":"ISO 3166-1 alpha-2 country code."},{"name":"parent_id","in":"query","schema":{"type":"string"},"description":"Restrict to children of this place."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text name match."},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lon","in":"query","schema":{"type":"number"}},{"name":"radius_km","in":"query","schema":{"type":"number","maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"List cities — the primary search input","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/geo/districts":{"get":{"tags":["Geography"],"summary":"List neighbourhoods and districts","parameters":[{"name":"country_code","in":"query","schema":{"type":"string","minLength":2,"maxLength":2},"description":"ISO 3166-1 alpha-2 country code."},{"name":"parent_id","in":"query","schema":{"type":"string"},"description":"Restrict to children of this place."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text name match."},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lon","in":"query","schema":{"type":"number"}},{"name":"radius_km","in":"query","schema":{"type":"number","maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"List neighbourhoods and districts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/geo/airports":{"get":{"tags":["Geography"],"summary":"List airports","parameters":[{"name":"country_code","in":"query","schema":{"type":"string","minLength":2,"maxLength":2},"description":"ISO 3166-1 alpha-2 country code."},{"name":"parent_id","in":"query","schema":{"type":"string"},"description":"Restrict to children of this place."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text name match."},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lon","in":"query","schema":{"type":"number"}},{"name":"radius_km","in":"query","schema":{"type":"number","maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"List airports","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/geo/landmarks":{"get":{"tags":["Geography"],"summary":"List points of interest","parameters":[{"name":"country_code","in":"query","schema":{"type":"string","minLength":2,"maxLength":2},"description":"ISO 3166-1 alpha-2 country code."},{"name":"parent_id","in":"query","schema":{"type":"string"},"description":"Restrict to children of this place."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text name match."},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lon","in":"query","schema":{"type":"number"}},{"name":"radius_km","in":"query","schema":{"type":"number","maximum":500}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"List points of interest","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"INVALID_CREDENTIALS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/geo/delta":{"get":{"tags":["Geography"],"summary":"Everything that changed since a cursor","parameters":[{"name":"changed_since","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":500}}],"responses":{"200":{"description":"Changed places","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}}}}},"/content/properties":{"get":{"tags":["Content"],"summary":"Bookable, deduplicated properties","description":"Returns only properties that can actually be booked. Place-shaped rows are excluded and the same physical property is collapsed to a single row.","parameters":[{"name":"country_code","in":"query","schema":{"type":"string"}},{"name":"city_id","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":100}}],"responses":{"200":{"description":"Properties","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Property"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/content/properties/{property_id}":{"get":{"tags":["Content"],"summary":"Full detail for one property","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Property","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Property"}}}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/content/properties/{property_id}/images":{"get":{"tags":["Content"],"summary":"Images for one property","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Images"}}}},"/content/properties/{property_id}/rooms":{"get":{"tags":["Content"],"summary":"Room catalogue for one property","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Rooms"}}}},"/content/amenities":{"get":{"tags":["Content"],"summary":"Amenity vocabulary for mapping","responses":{"200":{"description":"Amenities"}}}},"/content/chains":{"get":{"tags":["Content"],"summary":"Chains and brands","responses":{"200":{"description":"Chains"}}}},"/content/delta":{"get":{"tags":["Content"],"summary":"Incremental property changes including removals","parameters":[{"name":"changed_since","in":"query","required":true,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Changed properties"}}}},"/content/snapshots":{"get":{"tags":["Content"],"summary":"Signed links to full catalogue files","description":"Use these for your initial load. Paged retrieval cannot cover the whole catalogue — page through the delta feed for ongoing sync instead.","responses":{"200":{"description":"Snapshot manifest"},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/hotels/search":{"post":{"tags":["Shopping"],"summary":"Start a search","description":"Asynchronous. Returns a search_id immediately; poll GET /hotels/search/{search_id} until is_completed is true. Maximum 50 properties per request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"},"example":{"property_ids":["hp_88213","hp_88214"],"checkin":"2026-09-14","checkout":"2026-09-17","rooms":[{"adults":2,"children":1,"child_ages":[7]}],"currency":"AED","nationality":"AE"}}}},"responses":{"200":{"description":"Search started","content":{"application/json":{"example":{"data":{"search_id":"srch_01J8XK","is_completed":false,"properties":[]}}}}},"400":{"description":"BATCH_LIMIT_EXCEEDED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"NOT_ENTITLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"LOOK_TO_BOOK_EXCEEDED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/hotels/search/{search_id}":{"get":{"tags":["Shopping"],"summary":"Poll search results","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Results so far","content":{"application/json":{"example":{"data":{"search_id":"srch_01J8XK","is_completed":true,"properties":[{"property_id":"hp_88213","name":"Marina Bay Hotel","rate":{"currency":"AED","net":{"base":820,"taxes_and_fees":98.4,"total":918.4},"gross":{"base":902,"taxes_and_fees":108.24,"total":1010.24},"commission":{"amount":91.84,"percent":9.09}},"refundable":true,"rate_token":"tdo_v1_KmFsZ2ci…"}]}}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/hotels/search/{search_id}/properties/{property_id}":{"get":{"tags":["Shopping"],"summary":"All rooms and rates for one property","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"property_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Offers"},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/hotels/price-check":{"post":{"tags":["Shopping"],"summary":"Revalidate a rate and obtain a booking token","description":"Mandatory before every booking. Consumes a rate_token and returns a book_token plus the confirmed price. If price_changed is true you must surface the new price to the guest before booking.","requestBody":{"required":true,"content":{"application/json":{"example":{"rate_token":"tdo_v1_KmFsZ2ci…"}}}},"responses":{"200":{"description":"Rate confirmed","content":{"application/json":{"example":{"data":{"book_token":"tdo_v1_eyJhbGci…","price_changed":false,"rate":{"currency":"AED","gross":{"base":902,"taxes_and_fees":108.24,"total":1010.24}}}}}}},"409":{"description":"RATE_UNAVAILABLE","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"TOKEN_EXPIRED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/hotels/policies":{"post":{"tags":["Shopping"],"summary":"Cancellation terms and rate rules","description":"Must be displayed to the guest before payment is taken.","requestBody":{"required":true,"content":{"application/json":{"example":{"book_token":"tdo_v1_eyJhbGci…"}}}},"responses":{"200":{"description":"Policies"},"410":{"description":"TOKEN_EXPIRED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bookings":{"post":{"tags":["Booking"],"summary":"Create a booking","description":"Requires an Idempotency-Key header. Retrying with the same key and body returns the original booking; retrying with a different body is rejected. Funds are authorised before any supplier is contacted.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"},"description":"A unique value per booking attempt. Reuse it on retries."}],"requestBody":{"required":true,"content":{"application/json":{"example":{"book_token":"tdo_v1_eyJhbGci…","rooms":[{"guests":[{"type":"adult","first_name":"Aisha","last_name":"Rahman","lead":true}]}],"contact":{"email":"aisha@example.com","phone":"+971500000000"},"client_reference":"ORDER-99213"}}}},"responses":{"201":{"description":"Booking confirmed","content":{"application/json":{"example":{"data":{"booking_ref":"TDO-8842119","status":"confirmed","client_reference":"ORDER-99213"}}}}},"409":{"description":"DUPLICATE_REQUEST","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"TOKEN_EXPIRED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"INSUFFICIENT_FUNDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Booking"],"summary":"List your bookings","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["confirmed","cancelled","pending","failed"]}},{"name":"client_reference","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":50}}],"responses":{"200":{"description":"Bookings"}}}},"/bookings/{booking_ref}":{"get":{"tags":["Booking"],"summary":"Retrieve a booking","parameters":[{"name":"booking_ref","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Booking"},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bookings/{booking_ref}/cancel":{"post":{"tags":["Booking"],"summary":"Cancel a booking","description":"By our reference. Returns the refund and any penalty applied.","parameters":[{"name":"booking_ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"reason":"Guest cancelled"}}}},"responses":{"200":{"description":"Cancelled","content":{"application/json":{"example":{"data":{"booking_ref":"TDO-8842119","status":"cancelled","refund":{"currency":"AED","amount":918.4,"penalty":0}}}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notifications/endpoints":{"post":{"tags":["Notifications"],"summary":"Register a receiving URL","description":"The signing secret is returned once. Verify every delivery against it.","requestBody":{"required":true,"content":{"application/json":{"example":{"url":"https://partner.example.com/hooks/tdo"}}}},"responses":{"201":{"description":"Registered"}}},"get":{"tags":["Notifications"],"summary":"Your registered endpoint","responses":{"200":{"description":"Endpoint"},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notifications/events":{"get":{"tags":["Notifications"],"summary":"Event history — the fallback when a webhook was missed","responses":{"200":{"description":"Events"}}}},"/notifications/events/{id}/replay":{"post":{"tags":["Notifications"],"summary":"Redeliver a single event","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Replayed"}}}},"/notifications/test":{"post":{"tags":["Notifications"],"summary":"Send a test event to your endpoint","description":"Receiving and acknowledging this is a certification requirement.","responses":{"200":{"description":"Sent"}}}}},"components":{"securitySchemes":{"TdoSignature":{"type":"apiKey","in":"header","name":"Authorization","description":"`Authorization: TDO key=<key>, ts=<unix-seconds>, sig=<hex>`\n\n`sig = SHA-512(key + sha256(secret) + ts)`\n\nThe secret is never transmitted. Requests older than 5 minutes are rejected,\nso your clock must be reasonably accurate."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"correlation_id":{"type":"string","description":"Quote this to support."},"details":{"type":"array","items":{"type":"object"}}}}}},"Meta":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"count":{"type":"integer"},"has_more":{"type":"boolean"}}},"Place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"country_code":{"type":"string"},"parent_id":{"type":"string","nullable":true},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"Property":{"type":"object","properties":{"property_id":{"type":"string"},"name":{"type":"string"},"address":{"type":"string"},"country_code":{"type":"string"},"city_id":{"type":"string"},"star_rating":{"type":"number"},"latitude":{"type":"number"},"longitude":{"type":"number"},"description":{"type":"string"},"amenities":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"object"}}}},"MoneyBlock":{"type":"object","properties":{"base":{"type":"number"},"taxes_and_fees":{"type":"number"},"total":{"type":"number"}}},"Rate":{"type":"object","description":"Which blocks are present depends on the rate mode configured on your credential. The shape is otherwise constant.","properties":{"currency":{"type":"string"},"net":{"$ref":"#/components/schemas/MoneyBlock"},"gross":{"$ref":"#/components/schemas/MoneyBlock"},"commission":{"type":"object","properties":{"amount":{"type":"number"},"percent":{"type":"number"}}}}},"SearchRequest":{"type":"object","required":["property_ids","checkin","checkout","rooms"],"properties":{"property_ids":{"type":"array","items":{"type":"string"},"maxItems":50,"description":"Up to 50 per request."},"checkin":{"type":"string","format":"date"},"checkout":{"type":"string","format":"date"},"rooms":{"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":1},"children":{"type":"integer","minimum":0},"child_ages":{"type":"array","items":{"type":"integer"}}}}},"currency":{"type":"string"},"nationality":{"type":"string"}}}}}}