{"openapi":"3.1.0","info":{"title":"IMO360 Integration API","description":"API for publishing estate listings. Authenticate using your API key in the X-API-Key header.","version":"1.0.0"},"paths":{"\/api\/integration\/estates":{"post":{"operationId":"publishEstateUpsert","tags":["Publishing"],"responses":{"200":{"description":"Estate created or updated","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PublishEstateResponse"}}}},"400":{"description":"Validation error","content":{"application\/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing required field"}}}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient permissions","content":{"application\/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Insufficient permissions"}}}}}}},"summary":"Upsert an estate listing","description":"Create or update a property listing. Matching is done by providerIdentifier + externalId (upsert). Agency and agent are created\/updated inline (matched by providerIdentifier + name). Requires `publish.estates` permission. See the Estate Types section for type-specific field recommendations.","requestBody":{"description":"Estate payload","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PublishEstateInput"}}},"required":true},"security":[{"ApiKeyAuth":[]}]}},"\/api\/integration\/estates\/bulk":{"post":{"operationId":"publishEstatesBulk","tags":["Publishing"],"responses":{"200":{"description":"Bulk upsert results (per-item success\/failure)","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PublishEstateBulkResponse"}}}},"400":{"description":"Validation error","content":{"application\/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing required field"}}}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient permissions","content":{"application\/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Insufficient permissions"}}}}}}},"summary":"Bulk upsert estate listings","description":"Create or update multiple property listings in a single request. Each item follows the same schema as the single estate upsert. Individual items that fail do not affect other items. Requires `publish.estates` permission.","requestBody":{"description":"Bulk estate payload","content":{"application\/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/PublishEstateInput"},"description":"Array of estate payloads (same schema as single upsert)."}}}}},"required":true},"security":[{"ApiKeyAuth":[]}]}},"\/api\/integration\/reference":{"get":{"operationId":"getReferenceData","tags":["Reference Data"],"responses":{"200":{"description":"Reference data with enums and estate type specifications","content":{"application\/json":{"schema":{"type":"object","properties":{"enums":{"type":"object","description":"All enum fields and their accepted values.","properties":{"type":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"transaction":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"currency":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"partitioning":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"comfort":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"energyClass":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"agentType":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"status":{"type":"object","properties":{"description":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}}}},"estateTypes":{"type":"array","description":"Estate type specifications with recommended fields and examples.","items":{"type":"object","properties":{"type":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"fields":{"type":"array","items":{"type":"string"},"description":"Recommended fields for this type."},"example":{"type":"object","description":"Example payload."}}}}},"example":{"enums":{"type":{"description":"Property type classification","values":["APARTMENT","HOUSE","OFFICE","COMMERCIAL_SPACE","INDUSTRIAL_SPACE","HOTEL","FARM","LAND"]},"transaction":{"description":"Transaction type","values":["SALE","RENT","AUCTION"]},"currency":{"description":"Price currency","values":["EUR","USD","RON"]},"partitioning":{"description":"Interior layout type (primarily for APARTMENT, OFFICE)","values":["DETACHED","SEMI_DETACHED","NOT_DETACHED","CIRCULAR","INLINE","OPEN_SPACE"]},"comfort":{"description":"Comfort level (primarily for APARTMENT)","values":["1","2","3"]},"energyClass":{"description":"Energy performance certificate class (A=best, G=worst)","values":["A","B","C","D","E","F","G"]},"agentType":{"description":"Type of agent\/seller","values":["DEVELOPER","AGENCY","AGENT","OWNER","BANK"]},"status":{"description":"Listing status","values":["active","sold","rented"]}},"estateTypes":[{"type":"APARTMENT","label":"Apartment","description":"Residential apartment or flat in a multi-unit building.","fields":["rooms","floor","floorMax","partitioning","comfort","bathrooms","balconies","isFurnished","totalArea","usableArea","constructionYear","constructionStatus","condition","energyClass","renovationYear"],"example":{"type":"APARTMENT","title":"Apartament 3 camere Herastrau","transaction":"SALE","price":185000,"currency":"EUR","rooms":3,"totalArea":85.5,"usableArea":72,"floor":4,"floorMax":10,"partitioning":"DETACHED","comfort":"1","bathrooms":2,"balconies":1,"constructionYear":2020,"energyClass":"B"}},{"type":"HOUSE","label":"House","description":"Residential house, villa, or townhouse.","fields":["rooms","landArea","totalArea","usableArea","bathrooms","balconies","floorMax","isFurnished","constructionYear","constructionStatus","condition","energyClass","renovationYear"],"example":{"type":"HOUSE","title":"Vila P+1 Pipera","transaction":"SALE","price":350000,"currency":"EUR","rooms":5,"totalArea":220,"landArea":500,"floorMax":2,"bathrooms":3,"constructionYear":2019}},{"type":"OFFICE","label":"Office","description":"Office space in a commercial building.","fields":["rooms","floor","floorMax","totalArea","usableArea","partitioning","isFurnished","constructionYear","condition","energyClass"],"example":{"type":"OFFICE","title":"Spatiu birou Floreasca","transaction":"RENT","price":2500,"currency":"EUR","totalArea":120,"floor":3,"floorMax":8,"partitioning":"OPEN_SPACE"}},{"type":"COMMERCIAL_SPACE","label":"Commercial Space","description":"Retail store, showroom, or commercial property.","fields":["totalArea","usableArea","landArea","floor","floorMax","constructionYear","condition"],"example":{"type":"COMMERCIAL_SPACE","title":"Spatiu comercial Calea Victoriei","transaction":"RENT","price":5000,"currency":"EUR","totalArea":200,"floor":0}},{"type":"INDUSTRIAL_SPACE","label":"Industrial Space","description":"Warehouse, factory, or industrial property.","fields":["totalArea","usableArea","landArea","constructionYear","condition"],"example":{"type":"INDUSTRIAL_SPACE","title":"Hala industriala Chitila","transaction":"SALE","price":500000,"currency":"EUR","totalArea":2000,"landArea":5000}},{"type":"HOTEL","label":"Hotel","description":"Hotel, pension, or hospitality property.","fields":["rooms","totalArea","usableArea","landArea","floorMax","constructionYear","condition","energyClass"],"example":{"type":"HOTEL","title":"Pensiune 12 camere Bran","transaction":"SALE","price":800000,"currency":"EUR","rooms":12,"totalArea":600,"landArea":1200,"floorMax":3}},{"type":"FARM","label":"Farm","description":"Agricultural property with or without buildings.","fields":["landArea","totalArea","constructionYear"],"example":{"type":"FARM","title":"Ferma agricola Giurgiu","transaction":"SALE","price":200000,"currency":"EUR","landArea":50000,"totalArea":500}},{"type":"LAND","label":"Land","description":"Vacant land or building plot.","fields":["landArea","totalArea"],"example":{"type":"LAND","title":"Teren intravilan Snagov","transaction":"SALE","price":45000,"currency":"EUR","landArea":1000,"totalArea":1000}}]}}}}}},"summary":"Get all accepted values and estate type specifications","description":"Returns all enum values accepted by the API and estate type specifications with recommended fields per type.\n\nUse this endpoint to populate dropdowns, validate input, and understand which fields apply to each estate type.\n\n## Enums\n\nAll enum fields in the publish endpoint accept only the values listed here. Sending an unrecognized value will return a 400 error.\n\n## Estate Types\n\nEach estate type lists its **recommended fields** \u2014 fields that are most meaningful for that type. All fields are technically accepted for all types, but the `fields` array shows what\u0027s relevant.\n\nCommon fields accepted by all types: `title`, `description`, `price`, `currency`, `transaction`, `latitude`, `longitude`, `features`, `imageUrls`, `agency`, `agent`, `status`.","security":[{"ApiKeyAuth":[]}]}}},"components":{"schemas":{"PublishEstateResponse":{"type":"object","properties":{"id":{"type":"integer","example":12345},"externalId":{"type":"string","example":"listing-456"},"provider":{"type":"string","example":"crm-x"}}},"PublishEstateInput":{"type":"object","required":["providerIdentifier","externalId","title","transaction","price","currency"],"properties":{"providerIdentifier":{"type":"string","example":"crm-x","description":"Your provider\/CRM identifier. A provider record is auto-created if it does not exist."},"providerName":{"type":"string","example":"CRM X","description":"Human-readable provider name. Only used when auto-creating the provider."},"externalId":{"type":"string","example":"listing-456","description":"Your unique listing ID. Same providerIdentifier + externalId = update (upsert)."},"title":{"type":"string","example":"Apartament 3 camere, zona Herastrau"},"description":{"type":"string","example":"Apartament spatios cu vedere la parc..."},"externalUrl":{"type":"string","example":"https:\/\/crm-x.ro\/listings\/456","description":"Original listing URL on your platform."},"transaction":{"type":"string","enum":["SALE","RENT","AUCTION","UNKNOWN"],"example":"SALE"},"type":{"type":"string","enum":["APARTMENT","HOUSE","OFFICE","COMMERCIAL_SPACE","INDUSTRIAL_SPACE","HOTEL","FARM","LAND"],"example":"APARTMENT","description":"Estate type. See the Estate Types section for type-specific field recommendations."},"price":{"type":"number","example":120000},"currency":{"type":"string","enum":["EUR","USD","RON"],"example":"EUR"},"latitude":{"type":"number","format":"double","example":44.4812},"longitude":{"type":"number","format":"double","example":26.0766},"constructionYear":{"type":"integer","example":2020,"description":"Year the building was constructed (1800-2100)."},"totalArea":{"type":"number","example":85.5,"description":"Total area in sqm."},"usableArea":{"type":"number","example":72,"description":"Usable\/net area in sqm."},"landArea":{"type":"number","example":250,"description":"Land area in sqm. Relevant for HOUSE, LAND, FARM, COMMERCIAL_SPACE, INDUSTRIAL_SPACE, HOTEL."},"rooms":{"type":"integer","example":3,"description":"Number of rooms. Relevant for APARTMENT, HOUSE, OFFICE, HOTEL."},"floor":{"type":"integer","example":4,"description":"Floor number (0 = ground). Relevant for APARTMENT, OFFICE, COMMERCIAL_SPACE."},"floorMax":{"type":"integer","example":10,"description":"Total floors in building."},"bathrooms":{"type":"integer","example":2},"balconies":{"type":"integer","example":1},"isFurnished":{"type":"boolean","example":true},"partitioning":{"type":"string","enum":["DETACHED","SEMI_DETACHED","NOT_DETACHED","CIRCULAR","INLINE","OPEN_SPACE"],"example":"DETACHED","description":"Room partitioning style. Primarily relevant for APARTMENT."},"comfort":{"type":"string","example":"1","description":"Comfort level (1, 2, 3 or custom). Primarily relevant for APARTMENT."},"constructionStatus":{"type":"string","example":"ready_to_use","description":"Construction status (e.g. ready_to_use, to_completion, in_construction)."},"condition":{"type":"string","example":"Finisat modern","description":"Property condition (e.g. Finisat modern, Semifinisat, Bun\u0103, Rezonabil\u0103)."},"energyClass":{"type":"string","example":"B","description":"Energy efficiency class (A through G)."},"renovationYear":{"type":"integer","example":2023,"description":"Year of last renovation\/finishing."},"features":{"type":"object","description":"Arbitrary key-value features\/attributes.","example":{"heating":"centrala proprie","parking":"underground"}},"imageUrls":{"type":"array","items":{"type":"string"},"description":"Array of image URLs. First URL is used as primary image.","example":["https:\/\/example.com\/img1.jpg","https:\/\/example.com\/img2.jpg"]},"imageUrl":{"type":"string","description":"Single primary image URL (used only if imageUrls is empty)."},"downloadImages":{"type":"boolean","default":true,"description":"Whether to download and store images on our CDN. Set false to just save URLs."},"maxImages":{"type":"integer","default":5,"description":"Maximum number of images to download (equidistant selection from the array)."},"status":{"type":"string","enum":["active","sold","rented"],"description":"Listing status. \u0022sold\u0022 or \u0022rented\u0022 marks the listing as closed. \u0022active\u0022 reopens it."},"agency":{"type":"object","description":"Agency data. Creates or updates the agency (matched by providerIdentifier + name) and links it to this estate.","properties":{"name":{"type":"string","example":"VIB Imobiliare","description":"Agency name (required). Used together with providerIdentifier as unique identifier."},"address":{"type":"string","example":"Str. Victoriei 10, Bucure\u0219ti"},"phone":{"type":"string","example":"+40721000000"},"website":{"type":"string","example":"https:\/\/www.vibimobiliare.ro"}},"required":["name"]},"agent":{"type":"object","description":"Agent\/seller data. Creates or updates the agent (matched by providerIdentifier + name) and links it to this estate.","properties":{"name":{"type":"string","example":"Ana Popescu","description":"Agent name (required). Used together with providerIdentifier as unique identifier."},"company":{"type":"string","example":"VIB Imobiliare"},"phone":{"type":"string","example":"+40721000000"},"website":{"type":"string","example":"https:\/\/www.vibimobiliare.ro"},"type":{"type":"string","enum":["DEVELOPER","AGENCY","AGENT","OWNER","BANK","UNKNOWN"],"default":"AGENT","description":"Seller type."}},"required":["name"]}}},"PublishEstateBulkResponse":{"type":"object","properties":{"count":{"type":"integer","example":3},"results":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","example":0},"success":{"type":"boolean","example":true},"data":{"$ref":"#\/components\/schemas\/PublishEstateResponse"},"error":{"type":"object","description":"Error details (present when success=false)."}}}}}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Integration API key provided by IMO360"}}},"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Publishing","description":"Create and update estate listings with inline agency and agent data"},{"name":"Reference Data","description":"Enum values, estate type specifications, and field definitions"}]}