Create and update listings
Upload photos, then create, read, update and delete your agency's listings through the property API.
These endpoints manage your agency's own listings. Writes need the properties:write scope, reads properties:read, and photo uploads media:write. Every write is scoped to the key's organization. Send the key as Authorization: Bearer <key>, as in every example here. X-API-Key: <key> is still accepted on these routes, and so is Authorization: ApiKey <key>.
Upload photos
POST /properties/media/upload
Uploads one image (multipart field file, at most 20 MB). Every photo, thumbnail and floor plan on a listing must be an image your organization owns, so upload first and use the returned URLs.
Put fullSize in images[].url and thumbnail in thumbnails[].url. Photos uploaded in the dashboard, a URL the listing already has in the same field, and a thumbnail that repeats an images URL in the same request are accepted too; any other URL is a 400 naming the field.
Fondaro records each upload's pixel size and returns it as images[].width and height; you never need to send them. An upload that no listing uses within 7 days may be removed, so upload right before you create or update.
Create a listing
POST /properties
Creates a listing as pending with a generated reference (FDR- and eight letters and digits). See Own-listing lifecycle for statuses.
Listing fields
Required on create:
| Field | Values |
|---|---|
listingType | sale, rent, sale_or_rent, fraction |
propertyCategory | residential, commercial, industrial, land |
propertyType | A type that belongs to the category (below) |
city | Up to 100 characters |
countryCode | ISO 3166-1 alpha-2, for example ES |
currency | ISO 4217, for example EUR |
Optional:
| Field | Type | Notes |
|---|---|---|
title, translatedTitles | string, object | Headline up to 140 characters; translations as { "es": "..." } |
description, translatedDescriptions | string, object | |
addressLine1, addressLine2, postalCode | string | |
community, region, provinceState | string | |
latitude, longitude | number | Must lie inside countryCode. Without a point, Fondaro looks up addressLine1 and fills it in on an exact match |
price | number | |
rentalPrice, rentalPriceLowSeason, rentalPriceHighSeason, rentalPeriod | number, string | Rent for rent and sale_or_rent; period day, week, month, year |
availableFrom, completionDate | date | YYYY-MM-DD |
bedrooms, parkingSpaces | integer | |
bathrooms | number | Halves allowed, up to 99.9 |
livingArea, plotArea, areaUnit | number, string | Unit sqm or sqft |
yearBuilt | integer | 1801 to five years ahead |
isNewConstruction, isExterior | boolean | |
condition | string | new, excellent, good, needs_renovation, under_construction |
floor, totalFloors | integer | Basements are negative |
orientation | string | N, NE, E, SE, S, SW, W, NW |
parkingType | string | garage, underground, covered, open, street, communal |
energyRating | string | A+, A to G, exempt, in_progress |
energyConsumptionKwh, co2Emissions, energyRatingDetails | number, string | |
communityFeesPerYear, ibiPerYear, basuraPerYear | number | Yearly costs in currency |
features, furnished | string[], string | See Amenities and furnishing |
images | array | [{ url, alt?, order, isFeatured? }] |
thumbnails | array | [{ url, alt?, order, originalImageIndex }] |
floorPlans | array | [{ url, alt?, order }] |
videoUrls, virtualTourUrls | string[] | Up to 20 http(s) links each |
sharedCommission, sharedCommissionNotes | number, string | What you offer a collaborating agency (0 to 100 %) and its terms; every agency on the network sees them |
commission | number | Your own commission %, private to your agency |
viewingInstructions | string | Keys and access notes, private to your agency |
agentId | string | The assigned agent from your roster |
additionalFeatures | object | Your own key-value facts |
autoRenewEnabled | boolean | Renew automatically at expiresAt (default false) |
propertyType must belong to propertyCategory; other fits every category.
| Category | Types |
|---|---|
residential | apartment, condominium, house_detached, house_semi_detached, house_terraced, townhouse, multi_family_home, penthouse, studio |
commercial | office, retail, commercial_other, hospitality |
industrial | industrial_warehouse, industrial_other |
land | land_residential, land_commercial, land_agricultural, land_other |
Amenities and furnishing
features lists amenities as slugs: pool, sea_view, garage, terrace, garden, air_conditioning, lift, beachfront, frontline_golf, panoramic_views, gated_complex, storage_room, built_in_wardrobes, luxury. Furnishing is its own field, furnished (no, partly, fully).
The older booleans (hasPool, hasSeaView, hasGarage, hasTerrace, hasGarden, hasAirConditioning, hasLift, isFurnished) still work:
- With
features, the list is stored and the booleans follow it; booleans sent beside it are ignored. - With booleans only, each adds or removes its own amenity and leaves every other slug as it was.
furnishedwins overisFurnished. Sent alone,isFurnished: truestoresfullyandfalseclearsfurnished.
Responses always carry both features and the booleans.
Read a listing
GET /properties/:id
Returns your own listing in any status, or another agency's active listing. Anything else is a 404.
| Query parameter | Meaning |
|---|---|
includeBranding | Add the agency's branding and the agent card |
includeAdCount, includeAdCreatives | Add the ad creative count or the creatives |
Another agency's listing omits only what is private to it: commission, viewingInstructions and import-only additionalFeatures keys. It keeps the street address, postcode, exact coordinates and the shared-commission offer. The agent's email and phone numbers appear only when that agent shares their contact with the network (the default).
Update a listing
PUT /properties/:id
Send only the fields to change; any field you leave out keeps its value. Every create field is accepted, plus status (sold, rented or deleted; see Own-listing lifecycle).
Returns the updated listing. The required create fields and the lists features, floorPlans, videoUrls and virtualTourUrls cannot be cleared with null; send [] to empty a list. A changed type is checked against the category and a changed point against the country. referenceNumber never changes.
Delete a listing
DELETE /properties/:id
Sets the listing's status to deleted. It leaves search and portal feeds but its history is kept.
Errors
| Status | When |
|---|---|
400 | A field fails validation. message is an array of strings, each led by the field path, for example "areaUnit must be one of the following values: sqm, sqft" or "images.2.url is not an image this organization owns" |
403 | The key lacks the scope (API_KEY_SCOPE_MISSING) |
404 | The listing does not exist, is not yours (writes), or is another agency's non-active listing (reads) |
Nothing is saved when a request is refused.