Developer documentation · JSON REST API v1
For real estate agencies and private clients: create a key in your account and connect your CRM or website. The API accepts and returns JSON. New listings are created as drafts; photos and publishing have separate endpoints.
Base URL: https://doomio.cz/api/v1. Send your key only from your server over HTTPS, in the Authorization: Bearer <key> header. Keys work independently of browser sessions. Select read-only or read/write access; revoke keys in your account. A key can access only your personal listings or your current agency’s listings. Leaving the agency, account deactivation, expiry or revocation disables it.
1. Create a draft
Every new listing needs a stable externalId from your CRM, unique within your personal account or agency. A duplicate returns 409; retrieve the existing listing and PATCH it. IDs remain reserved when a listing is withdrawn.
curl https://doomio.cz/api/v1/properties \
-H "Authorization: Bearer $DOOMIO_API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"externalId": "CRM-12345",
"title": "Apartment in Valencia",
"description": "A bright two-bedroom apartment near the park.",
"sourceLocale": "en",
"country": "es", "city": "Valencia",
"address": "Valencia, Spain",
"type": "apartment", "transactionType": "sale",
"price": "245000.00", "currency": "EUR",
"bedrooms": 2, "usableArea": 78.5
}'
The response is 201 Created, {"data": {...}}, with the listing ID, a Location header and an ETag. Text is supplied in sourceLocale; the existing translation workflow prepares the other website languages.
2. Upload photos and publish
curl https://doomio.cz/api/v1/properties/123/images \
-H "Authorization: Bearer $DOOMIO_API_KEY" -F '[email protected]'
curl -X POST https://doomio.cz/api/v1/properties/123/publish \
-H "Authorization: Bearer $DOOMIO_API_KEY"
Upload JPEG, PNG or WebP, maximum 8 MiB and 40 megapixels per image, maximum 30 images. Photos go through the same review as web uploads. Publishing requires title, address, country, property type, at least one approved photo and a publication entitlement. Agency listings follow existing agency visibility rules; personal listings need an active publication purchased in the Doomio account. Promotional offers retain their existing limits and rights confirmation. API keys do not purchase plans or social promotion.
Check publiclyVisible, status and photoReviewError in the response. An expired listing or a failed photo review is not publicly visible. DELETE withdraws a listing into a draft; it preserves its ID and history. Removing the last photo also withdraws the listing.
Endpoints
| Method and path | Behavior |
|---|---|
GET /properties | Your listings, including drafts. Optional limit (1–100, default 50), after (ID cursor), externalId, status (draft/published). |
POST /properties | Create a draft. Required: externalId, title, sourceLocale, country, type, transactionType, price, currency. |
GET /properties/{id} | One listing and its ETag. |
PATCH /properties/{id} | Update supplied fields; omitted fields remain unchanged. externalId is immutable. Ownership, billing, social promotion and validity cannot be changed through this endpoint. |
DELETE /properties/{id} | Withdraw the listing; repeat calls are safe. |
POST /properties/{id}/publish | Validate and publish; existing publication rules apply. |
POST /properties/{id}/images | Multipart upload, field file. Returns the listing with the image ID. |
DELETE /properties/{id}/images/{imageId} | Remove one of this listing’s images. |
Fields and responses
Writable fields: title, description, sourceLocale, type, transactionType, price, currency, country, address, city, postalCode, latitude, longitude, rooms, bedrooms, bathrooms, usableArea, landArea, contactEmail, contactPhone. externalId is assigned on creation. Unknown fields return 422. See OpenAPI for exact bounds and supported countries/languages. Prices are decimal strings, areas are square metres, coordinates are numeric WGS84. Currency values: CZK, EUR, USD, GBP, PLN. Types: apartment, house, land, commercial, other, development. Transactions: sale, rent.
Lists return {"data": [...], "pagination": {"limit": 50, "nextAfter": 123}}. Repeat with ?after=123; nextAfter: null means the end. You can retrieve a CRM listing with ?externalId=CRM-12345.
curl -X PATCH https://doomio.cz/api/v1/properties/123 \
-H "Authorization: Bearer $DOOMIO_API_KEY" \
-H 'Content-Type: application/json' \
-H 'If-Match: "ETAG-FROM-LAST-GET"' \
--data '{"price":"239000.00"}'
Optional If-Match on PATCH, publish, withdraw and image operations prevents replacing a listing changed since your last GET. A mismatch returns 412; retrieve the listing and resolve the conflict. Maximum JSON request: 128 KiB. Limit: 120 authenticated requests per minute per account/agency across all its keys; excess requests return 429 and Retry-After: 60. Inspect X-RateLimit-Remaining. No cross-origin browser access is required: integrations belong on your server.
Errors use {"error":{"code":"validation_failed","message":"..."}}. Statuses: 400 malformed request, 401 missing/invalid/expired key, 403 read-only key or publication entitlement missing, 404 listing/image outside your scope or absent, 405 method, 409 duplicate externalId, 412 stale ETag, 413 oversized upload/body, 415 Content-Type, 422 invalid fields/photo/publishing validation, 429 rate limit, 500 temporary server error. Every response includes an X-Request-ID; provide it when reporting an error, never your secret key.
Install the client
Requires Python 3.10 or newer, with no third-party packages. Download the client and the .env key file, keep both outside a public web directory, then run:
chmod 600 doomio-api-key.env
python3 doomio_client.py --env doomio-api-key.env list
python3 doomio_client.py --env doomio-api-key.env sync listings.json
python3 doomio_client.py --env doomio-api-key.env upload 123 living-room.jpg
python3 doomio_client.py --env doomio-api-key.env publish 123
python3 doomio_client.py --env doomio-api-key.env withdraw 123
listings.json is an array of listing objects in the create format. sync looks up external IDs, creates missing drafts and updates existing listings. It does not delete listings absent from the file, upload photos automatically, or publish them. Upload/publish/withdraw are explicit commands. This is a generic JSON integration client; existing CRM products still need their own field mapping or connector.