{"openapi":"3.1.0","info":{"title":"Prime Index Inventory API","version":"1.1.0","summary":"Normalized residential inventory for banking marketplaces.","description":"Read-only access to published developer inventory for authorized financial institutions.\n\n**Authentication** — send your key as `Authorization: Bearer pik_…` (or `X-API-Key`). Keys are issued per bank by a platform administrator, shown once, and can be revoked at any time. Never embed keys in browsers or mobile apps; call the API from your servers.\n\n**Scope** — a key only sees inventory its consumer has been explicitly granted (per developer or per project), and only items that are published. Drafts, archived items, internal notes and private documents are never returned.\n\n**Money** — `{ \"amount\": \"1250000.00\", \"currency\": \"SAR\" }`; `amount` is an exact decimal string. Areas are square metres.\n\n**Languages** — content is available in English (default) and Arabic. Pass `lang=ar` or `Accept-Language: ar`; missing Arabic fields fall back to English, and `availableLanguages` lists what the developer provided. Responses carry `Content-Language`. Enum values never change with the language; `GET /metadata` returns localized labels.\n\n**Pagination** — list endpoints use opaque cursors (`pagination.nextCursor`). Ordering is deterministic (sort field, then id).\n\n**Synchronization** — use `GET /units/changes` to maintain a local copy: start without a cursor, page until `hasMore` is false, persist `nextCursor`, and poll with it. `unit.removed` tombstones tell you when a unit leaves your feed (unpublished, archived, access revoked …), which distinguishes removal from simply not appearing on a page.\n\n**Rate limits** — per key, per minute (default 120). Responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`."},"servers":[{"url":"https://primeindex.app/api/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Units","description":"Individual properties (apartments, villas, …)."},{"name":"Projects","description":"Developments and their buildings."},{"name":"Synchronization","description":"Incremental change feed with tombstones."},{"name":"Reference","description":"Filter metadata and media."}],"paths":{"/units":{"get":{"tags":["Units"],"operationId":"listUnits","summary":"List published units","description":"Paginated list of published units you are authorized to see. Defaults to `availability=AVAILABLE`; pass `availability=all` or a comma-separated list for other statuses.","parameters":[{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). Missing Arabic fields fall back to English. `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). Missing Arabic fields fall back to English. `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}},{"name":"projectId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"developerId","in":"query","required":false,"description":"Developer (organization) ID","schema":{"type":"string","format":"uuid"}},{"name":"buildingId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"city","in":"query","required":false,"description":"City name in English or Arabic","schema":{"description":"City name in English or Arabic","type":"string","maxLength":80}},{"name":"district","in":"query","required":false,"schema":{"type":"string","maxLength":80}},{"name":"propertyType","in":"query","required":false,"description":"Comma-separated, e.g. APARTMENT,PENTHOUSE","schema":{"description":"Comma-separated, e.g. APARTMENT,PENTHOUSE","type":"string"}},{"name":"availability","in":"query","required":false,"description":"Comma-separated statuses or `all`. Defaults to AVAILABLE.","schema":{"description":"Comma-separated statuses or `all`. Defaults to AVAILABLE.","anyOf":[{"type":"string","const":"all"},{"type":"string"}]}},{"name":"minPrice","in":"query","required":false,"description":"Minimum asking price (inclusive), decimal string","schema":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"}},{"name":"maxPrice","in":"query","required":false,"description":"Maximum asking price (inclusive), decimal string","schema":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"}},{"name":"minBedrooms","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":30}},{"name":"maxBedrooms","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":30}},{"name":"updatedSince","in":"query","required":false,"description":"Only units whose public representation changed at or after this ISO-8601 timestamp","schema":{"type":"string","format":"date-time"}},{"name":"sort","in":"query","required":false,"description":"`-updated_at` (default), `updated_at`, `price`, `-price`, `-published_at`","schema":{"default":"-updated_at","type":"string","enum":["-updated_at","updated_at","price","-price","-published_at"]}},{"name":"limit","in":"query","required":false,"description":"Page size (1–100, default 20)","schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"`pagination.nextCursor` from the previous page (same `sort` required)","schema":{"type":"string","maxLength":500}}],"responses":{"200":{"description":"A page of units","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitList"},"example":{"data":[{"id":"0199f3a2-7c1e-7b55-9a1f-4f2d8c6a1e01","object":"unit","developerReference":"GVR-A-0302","unitNumber":"A302","propertyType":"APARTMENT","title":"3-Bedroom Apartment in Green Valley Residences","description":"Corner apartment with a private balcony overlooking the central gardens.","availability":"AVAILABLE","availableFrom":"2026-12-01","price":{"amount":"1185000.00","currency":"SAR"},"appraisal":{"value":{"amount":"1150000.00","currency":"SAR"},"validUntil":"2027-03-31"},"specifications":{"bedrooms":3,"bathrooms":3,"livingRooms":1,"kitchens":1,"parkingSpaces":1,"floorNumber":3,"levels":1,"hasMaidRoom":true,"hasDriverRoom":false,"internalArea":168.5,"externalArea":12,"totalArea":180.5,"landArea":null,"areaUnit":"sqm","furnishing":"UNFURNISHED","finishing":"FULLY_FINISHED","orientation":"SOUTH_EAST","view":"Garden view"},"features":["Central AC","Private balcony"],"amenities":["Swimming pool","Gym"],"developer":{"id":"0199f3a2-0000-7000-8000-000000000001","name":"Nakhla Urban Developments","slug":"nakhla","logoUrl":null},"project":{"id":"0199f3a2-0000-7000-8000-000000000010","name":"Green Valley Residences","city":"Riyadh","district":"Al Malqa"},"building":{"id":"0199f3a2-0000-7000-8000-000000000020","name":"Building A"},"location":{"country":"SA","region":"Riyadh Region","city":"Riyadh","district":"Al Malqa","address":"Anas Ibn Malik Rd","latitude":24.8093,"longitude":46.6156},"media":[{"id":"6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d","kind":"IMAGE","category":"COVER_IMAGE","title":null,"altText":"Living room","mimeType":"image/webp","width":2400,"height":1600,"url":"https://inventory.example.com/api/v1/media/6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d?size=md","renditions":{"sm":{"url":"https://inventory.example.com/api/v1/media/6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d?size=sm","width":480,"height":320}}}],"publishedAt":"2026-10-01T09:30:00.000Z","updatedAt":"2026-10-20T14:05:11.000Z"}],"pagination":{"limit":20,"hasMore":true,"nextCursor":"eyJzIjoiLXVwZGF0ZWRfYXQiLC4uLn0"}}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/units/{id}":{"get":{"tags":["Units"],"operationId":"getUnit","summary":"Get a unit","parameters":[{"name":"id","in":"path","required":true,"description":"Unit ID","schema":{"type":"string","format":"uuid"}},{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}}],"responses":{"200":{"description":"The unit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitResponse"},"example":{"data":{"id":"0199f3a2-7c1e-7b55-9a1f-4f2d8c6a1e01","object":"unit","developerReference":"GVR-A-0302","unitNumber":"A302","propertyType":"APARTMENT","title":"3-Bedroom Apartment in Green Valley Residences","description":"Corner apartment with a private balcony overlooking the central gardens.","availability":"AVAILABLE","availableFrom":"2026-12-01","price":{"amount":"1185000.00","currency":"SAR"},"appraisal":{"value":{"amount":"1150000.00","currency":"SAR"},"validUntil":"2027-03-31"},"specifications":{"bedrooms":3,"bathrooms":3,"livingRooms":1,"kitchens":1,"parkingSpaces":1,"floorNumber":3,"levels":1,"hasMaidRoom":true,"hasDriverRoom":false,"internalArea":168.5,"externalArea":12,"totalArea":180.5,"landArea":null,"areaUnit":"sqm","furnishing":"UNFURNISHED","finishing":"FULLY_FINISHED","orientation":"SOUTH_EAST","view":"Garden view"},"features":["Central AC","Private balcony"],"amenities":["Swimming pool","Gym"],"developer":{"id":"0199f3a2-0000-7000-8000-000000000001","name":"Nakhla Urban Developments","slug":"nakhla","logoUrl":null},"project":{"id":"0199f3a2-0000-7000-8000-000000000010","name":"Green Valley Residences","city":"Riyadh","district":"Al Malqa"},"building":{"id":"0199f3a2-0000-7000-8000-000000000020","name":"Building A"},"location":{"country":"SA","region":"Riyadh Region","city":"Riyadh","district":"Al Malqa","address":"Anas Ibn Malik Rd","latitude":24.8093,"longitude":46.6156},"media":[{"id":"6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d","kind":"IMAGE","category":"COVER_IMAGE","title":null,"altText":"Living room","mimeType":"image/webp","width":2400,"height":1600,"url":"https://inventory.example.com/api/v1/media/6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d?size=md","renditions":{"sm":{"url":"https://inventory.example.com/api/v1/media/6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d?size=sm","width":480,"height":320}}}],"publishedAt":"2026-10-01T09:30:00.000Z","updatedAt":"2026-10-20T14:05:11.000Z"}}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found or not accessible with this key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/units/changes":{"get":{"tags":["Synchronization"],"operationId":"listUnitChanges","summary":"Incremental unit changes","description":"Ordered change feed. Each entry is either `unit.upserted` (store the embedded unit) or `unit.removed` (delete your copy). A unit appears at most once per page with its latest state. `nextCursor` is always returned — persist it even when `data` is empty.","parameters":[{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). Missing Arabic fields fall back to English. `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). Missing Arabic fields fall back to English. `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}},{"name":"cursor","in":"query","required":false,"description":"Omit (or use `0`) to start a full sync from the beginning.","schema":{"description":"Omit (or use `0`) to start a full sync from the beginning.","type":"string","maxLength":100}},{"name":"limit","in":"query","required":false,"description":"Page size (1–500, default 100)","schema":{"default":100,"type":"integer","minimum":1,"maximum":500}}],"responses":{"200":{"description":"A page of change events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeFeed"},"example":{"data":[{"type":"unit.upserted","id":"0199f3a2-7c1e-7b55-9a1f-4f2d8c6a1e01","sequence":"1042","occurredAt":"2026-10-20T14:05:11.000Z","unit":{"id":"0199f3a2-7c1e-7b55-9a1f-4f2d8c6a1e01","object":"unit","developerReference":"GVR-A-0302","unitNumber":"A302","propertyType":"APARTMENT","title":"3-Bedroom Apartment in Green Valley Residences","description":"Corner apartment with a private balcony overlooking the central gardens.","availability":"AVAILABLE","availableFrom":"2026-12-01","price":{"amount":"1185000.00","currency":"SAR"},"appraisal":{"value":{"amount":"1150000.00","currency":"SAR"},"validUntil":"2027-03-31"},"specifications":{"bedrooms":3,"bathrooms":3,"livingRooms":1,"kitchens":1,"parkingSpaces":1,"floorNumber":3,"levels":1,"hasMaidRoom":true,"hasDriverRoom":false,"internalArea":168.5,"externalArea":12,"totalArea":180.5,"landArea":null,"areaUnit":"sqm","furnishing":"UNFURNISHED","finishing":"FULLY_FINISHED","orientation":"SOUTH_EAST","view":"Garden view"},"features":["Central AC","Private balcony"],"amenities":["Swimming pool","Gym"],"developer":{"id":"0199f3a2-0000-7000-8000-000000000001","name":"Nakhla Urban Developments","slug":"nakhla","logoUrl":null},"project":{"id":"0199f3a2-0000-7000-8000-000000000010","name":"Green Valley Residences","city":"Riyadh","district":"Al Malqa"},"building":{"id":"0199f3a2-0000-7000-8000-000000000020","name":"Building A"},"location":{"country":"SA","region":"Riyadh Region","city":"Riyadh","district":"Al Malqa","address":"Anas Ibn Malik Rd","latitude":24.8093,"longitude":46.6156},"media":[{"id":"6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d","kind":"IMAGE","category":"COVER_IMAGE","title":null,"altText":"Living room","mimeType":"image/webp","width":2400,"height":1600,"url":"https://inventory.example.com/api/v1/media/6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d?size=md","renditions":{"sm":{"url":"https://inventory.example.com/api/v1/media/6f1c1f0e-3d7b-4b8e-9d6a-2c1b0a9f8e7d?size=sm","width":480,"height":320}}}],"publishedAt":"2026-10-01T09:30:00.000Z","updatedAt":"2026-10-20T14:05:11.000Z"}},{"type":"unit.removed","id":"0199f3a2-7c1e-7b55-9a1f-4f2d8c6a1e02","sequence":"1043","occurredAt":"2026-10-20T14:07:40.000Z","reason":"unpublished"}],"pagination":{"limit":100,"hasMore":false,"nextCursor":"c1_1043"}}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects":{"get":{"tags":["Projects"],"operationId":"listProjects","summary":"List published projects","parameters":[{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). Missing Arabic fields fall back to English. `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). Missing Arabic fields fall back to English. `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}},{"name":"developerId","in":"query","required":false,"description":"Developer (organization) ID","schema":{"type":"string","format":"uuid"}},{"name":"city","in":"query","required":false,"schema":{"type":"string","maxLength":80}},{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":500}}],"responses":{"200":{"description":"A page of projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{id}":{"get":{"tags":["Projects"],"operationId":"getProject","summary":"Get a project","parameters":[{"name":"id","in":"path","required":true,"description":"Project ID","schema":{"type":"string","format":"uuid"}},{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}}],"responses":{"200":{"description":"The project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found or not accessible with this key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{id}/buildings":{"get":{"tags":["Projects"],"operationId":"listProjectBuildings","summary":"List a project's buildings","description":"Active buildings of a published project with published-unit counts. Projects without buildings return an empty list.","parameters":[{"name":"id","in":"path","required":true,"description":"Project ID","schema":{"type":"string","format":"uuid"}},{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}}],"responses":{"200":{"description":"Buildings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildingList"}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found or not accessible with this key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/metadata":{"get":{"tags":["Reference"],"operationId":"getMetadata","summary":"Filter metadata","description":"Property types, currencies, cities/districts, developers and price/bedroom ranges across your visible inventory. Labels follow `lang`.","parameters":[{"name":"lang","in":"query","required":false,"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","schema":{"description":"Content language (`en` default, `ar`). `Accept-Language` is honoured when omitted.","$ref":"#/$defs/Language"}}],"responses":{"200":{"description":"Metadata","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Metadata"}}}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See `Retry-After` and `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media/{id}":{"get":{"tags":["Reference"],"operationId":"getMedia","summary":"Download published media","description":"Binary download of a published photo, floor plan or shared document. URLs are returned by other endpoints; no API key is required so they can be used directly in `<img>` tags. Media is only served while its owner is published.","security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"Media ID","schema":{"type":"string","format":"uuid"}},{"name":"size","in":"query","required":false,"schema":{"type":"string","enum":["sm","md","lg","xl"]}}],"responses":{"200":{"description":"The file","content":{"image/webp":{},"application/pdf":{}}},"404":{"description":"Not found or not published"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"pik_…","description":"Per-bank API key"}},"schemas":{"Language":{"type":"string","enum":["en","ar"]},"Money":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$","example":"1250000.00"},"currency":{"type":"string","minLength":3,"maxLength":3,"example":"SAR"}},"required":["amount","currency"],"additionalProperties":false,"description":"Exact monetary amount. `amount` is a decimal string with two fraction digits."},"MediaAsset":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["IMAGE","DOCUMENT"]},"category":{"type":"string","enum":["LOGO","COVER_IMAGE","GALLERY_IMAGE","FLOOR_PLAN","BROCHURE","SPECIFICATION","OTHER_DOCUMENT"]},"title":{"type":["string","null"]},"altText":{"type":["string","null"]},"mimeType":{"type":"string"},"width":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"height":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"url":{"type":"string","format":"uri"},"renditions":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"width":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"height":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["url","width","height"],"additionalProperties":false}}},"required":["id","kind","category","title","altText","mimeType","width","height","url","renditions"],"additionalProperties":false,"description":"A published photo, floor plan or shared document."},"Location":{"type":"object","properties":{"country":{"type":"string","minLength":2,"maxLength":2},"region":{"type":["string","null"]},"city":{"type":"string"},"district":{"type":["string","null"]},"address":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]}},"required":["country","region","city","district","address","latitude","longitude"],"additionalProperties":false},"DeveloperSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["id","name","slug","logoUrl"],"additionalProperties":false},"ProjectSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"city":{"type":"string"},"district":{"type":["string","null"]}},"required":["id","name","city","district"],"additionalProperties":false},"BuildingSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"Unit":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"unit"},"developerReference":{"type":["string","null"]},"unitNumber":{"type":"string"},"propertyType":{"type":"string","enum":["APARTMENT","VILLA","TOWNHOUSE","DUPLEX","PENTHOUSE","LAND","OTHER"]},"title":{"type":"string"},"description":{"type":["string","null"]},"availability":{"type":"string","enum":["AVAILABLE","RESERVED","SOLD","UNAVAILABLE"]},"availableFrom":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"price":{"$ref":"#/components/schemas/Money"},"appraisal":{"anyOf":[{"type":"object","properties":{"value":{"$ref":"#/components/schemas/Money"},"validUntil":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]}},"required":["value","validUntil"],"additionalProperties":false},{"type":"null"}],"description":"Latest independent appraisal, when provided by the developer."},"specifications":{"type":"object","properties":{"bedrooms":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"bathrooms":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"livingRooms":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"kitchens":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"parkingSpaces":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"floorNumber":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"levels":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"hasMaidRoom":{"type":"boolean"},"hasDriverRoom":{"type":"boolean"},"internalArea":{"type":["number","null"]},"externalArea":{"type":["number","null"]},"totalArea":{"type":["number","null"]},"landArea":{"type":["number","null"]},"areaUnit":{"type":"string","const":"sqm"},"furnishing":{"anyOf":[{"type":"string","enum":["UNFURNISHED","SEMI_FURNISHED","FURNISHED"]},{"type":"null"}]},"finishing":{"anyOf":[{"type":"string","enum":["SHELL_AND_CORE","SEMI_FINISHED","FULLY_FINISHED"]},{"type":"null"}]},"orientation":{"type":["string","null"]},"view":{"type":["string","null"]}},"required":["bedrooms","bathrooms","livingRooms","kitchens","parkingSpaces","floorNumber","levels","hasMaidRoom","hasDriverRoom","internalArea","externalArea","totalArea","landArea","areaUnit","furnishing","finishing","orientation","view"],"additionalProperties":false},"features":{"type":"array","items":{"type":"string"}},"amenities":{"type":"array","items":{"type":"string"}},"developer":{"$ref":"#/components/schemas/DeveloperSummary"},"project":{"$ref":"#/components/schemas/ProjectSummary"},"building":{"anyOf":[{"$ref":"#/components/schemas/BuildingSummary"},{"type":"null"}],"description":"Null for units placed directly under a project."},"location":{"$ref":"#/components/schemas/Location"},"media":{"type":"array","items":{"$ref":"#/components/schemas/MediaAsset"}},"availableLanguages":{"type":"array","items":{"$ref":"#/components/schemas/Language"},"description":"Languages with developer-provided content for this resource (English is always present)."},"publishedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","object","developerReference","unitNumber","propertyType","title","description","availability","availableFrom","price","appraisal","specifications","features","amenities","developer","project","building","location","media","availableLanguages","publishedAt","updatedAt"],"additionalProperties":false},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"project"},"name":{"type":"string"},"referenceCode":{"type":["string","null"]},"headline":{"type":["string","null"]},"description":{"type":["string","null"]},"developmentType":{"type":"string","enum":["APARTMENT_COMPOUND","RESIDENTIAL_TOWER","VILLA_COMPOUND","STANDALONE","MIXED_USE","OTHER"]},"constructionStatus":{"type":"string","enum":["PLANNED","UNDER_CONSTRUCTION","COMPLETED"]},"expectedCompletionDate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"location":{"$ref":"#/components/schemas/Location"},"totalLandArea":{"type":["number","null"]},"features":{"type":"array","items":{"type":"string"}},"amenities":{"type":"array","items":{"type":"string"}},"nearbyPlaces":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string"},"distanceKm":{"type":["number","null"]}},"required":["name","category","distanceKm"],"additionalProperties":false}},"developer":{"$ref":"#/components/schemas/DeveloperSummary"},"contact":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]}},"required":["name","email","phone"],"additionalProperties":false},"unitCounts":{"type":"object","properties":{"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"available":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"reserved":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"unavailable":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["total","available","reserved","sold","unavailable"],"additionalProperties":false,"description":"Counts of published units by availability."},"priceFrom":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}],"description":"Lowest asking price among AVAILABLE published units."},"buildingCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"media":{"type":"array","items":{"$ref":"#/components/schemas/MediaAsset"}},"availableLanguages":{"type":"array","items":{"$ref":"#/components/schemas/Language"},"description":"Languages with developer-provided content for this resource (English is always present)."},"publishedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","object","name","referenceCode","headline","description","developmentType","constructionStatus","expectedCompletionDate","location","totalLandArea","features","amenities","nearbyPlaces","developer","contact","unitCounts","priceFrom","buildingCount","media","availableLanguages","publishedAt","updatedAt"],"additionalProperties":false},"Building":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"building"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"referenceCode":{"type":["string","null"]},"buildingType":{"type":"string"},"floors":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"description":{"type":["string","null"]},"constructionStatus":{"type":"string","enum":["PLANNED","UNDER_CONSTRUCTION","COMPLETED"]},"completionDate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"features":{"type":"array","items":{"type":"string"}},"unitCounts":{"type":"object","properties":{"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"available":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"reserved":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"unavailable":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["total","available","reserved","sold","unavailable"],"additionalProperties":false},"media":{"type":"array","items":{"$ref":"#/components/schemas/MediaAsset"}},"availableLanguages":{"type":"array","items":{"$ref":"#/components/schemas/Language"},"description":"Languages with developer-provided content for this resource (English is always present)."},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","object","projectId","name","referenceCode","buildingType","floors","description","constructionStatus","completionDate","features","unitCounts","media","availableLanguages","updatedAt"],"additionalProperties":false},"CursorPagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hasMore":{"type":"boolean"},"nextCursor":{"description":"Pass as `cursor` to fetch the next page. Null on the last page.","type":["string","null"]}},"required":["limit","hasMore","nextCursor"],"additionalProperties":false},"UnitList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Unit"}},"pagination":{"$ref":"#/components/schemas/CursorPagination"}},"required":["data","pagination"],"additionalProperties":false},"ProjectList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"pagination":{"$ref":"#/components/schemas/CursorPagination"}},"required":["data","pagination"],"additionalProperties":false},"BuildingList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Building"}}},"required":["data"],"additionalProperties":false},"UnitResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Unit"}},"required":["data"],"additionalProperties":false},"ProjectResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}},"required":["data"],"additionalProperties":false},"UnitUpsertedEvent":{"type":"object","properties":{"type":{"type":"string","const":"unit.upserted"},"id":{"type":"string","format":"uuid"},"sequence":{"type":"string","description":"Monotonic change sequence (decimal string)."},"occurredAt":{"type":"string","format":"date-time"},"unit":{"$ref":"#/components/schemas/Unit"}},"required":["type","id","sequence","occurredAt","unit"],"additionalProperties":false,"description":"The unit is (still) in your feed; replace your copy with `unit`."},"UnitRemovedEvent":{"type":"object","properties":{"type":{"type":"string","const":"unit.removed"},"id":{"type":"string","format":"uuid"},"sequence":{"type":"string"},"occurredAt":{"type":"string","format":"date-time"},"reason":{"type":"string","enum":["unpublished","archived","project_unpublished","building_archived","developer_suspended","access_revoked"]}},"required":["type","id","sequence","occurredAt","reason"],"additionalProperties":false,"description":"Tombstone: the unit left your feed. Delete or hide your copy. It may return later as `unit.upserted`."},"ChangeEvent":{"oneOf":[{"$ref":"#/components/schemas/UnitUpsertedEvent"},{"$ref":"#/components/schemas/UnitRemovedEvent"}]},"ChangeFeed":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChangeEvent"}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","description":"Always present. Store it and pass it as `cursor` on your next poll."}},"required":["limit","hasMore","nextCursor"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false},"Metadata":{"type":"object","properties":{"apiVersion":{"type":"string"},"language":{"description":"Language of the labels in this response.","$ref":"#/components/schemas/Language"},"currencies":{"type":"array","items":{"type":"string"}},"propertyTypes":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","enum":["APARTMENT","VILLA","TOWNHOUSE","DUPLEX","PENTHOUSE","LAND","OTHER"]},"label":{"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["value","label","count"],"additionalProperties":false}},"availabilityStatuses":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","enum":["AVAILABLE","RESERVED","SOLD","UNAVAILABLE"]},"label":{"type":"string"}},"required":["value","label"],"additionalProperties":false}},"cities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Canonical (English) city name — use it as the `city` filter value."},"label":{"type":"string","description":"City name in the requested language."},"unitCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"districts":{"type":"array","items":{"type":"string"}},"districtLabels":{"type":"array","items":{"type":"string"},"description":"`districts` in the requested language (same order)."}},"required":["name","label","unitCount","districts","districtLabels"],"additionalProperties":false}},"developers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"projectCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","name","slug","logoUrl","projectCount"],"additionalProperties":false}},"priceRange":{"type":"object","properties":{"min":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]},"max":{"anyOf":[{"$ref":"#/components/schemas/Money"},{"type":"null"}]}},"required":["min","max"],"additionalProperties":false},"bedroomRange":{"type":"object","properties":{"min":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"max":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["min","max"],"additionalProperties":false},"limits":{"type":"object","properties":{"maxPageSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxChangesPageSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["maxPageSize","maxChangesPageSize"],"additionalProperties":false}},"required":["apiVersion","language","currencies","propertyTypes","availabilityStatuses","cities","developers","priceRange","bedroomRange","limits"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["unauthorized","forbidden","not_found","invalid_request","rate_limited","internal_error"]},"message":{"type":"string"},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}}},"requestId":{"type":"string"}},"required":["code","message","requestId"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}