Create or replace a property
Creates the property if we have not seen this provider_id from you before, and
replaces it otherwise. Your provider_id is yours: it is unique within your
integration and never across the platform.
Replace, not merge. The payload you send is the whole property. An amenity you omit is removed; a photo you omit is dropped. This mirrors how listings are edited everywhere else on Maat, and it is the only version of “update” in which “remove this amenity” is expressible.
A property that cannot yet be sold — no price, no photos, no amenities — is
accepted and held in an incomplete state rather than published at a placeholder
price. publishable and missing tell you exactly what it is waiting for, and
listing_id stays null until it can actually be shown to a guest.
Photos are fetched asynchronously, so the FIRST push of a complete property
comes back publishable: false with photos_processing. That is not a failure
and there is nothing to do: we fetch each URL, process it and publish the
property on its own. Anything we could not turn into a photo is named in
photos_rejected. Sending the same URL again is free — an unchanged URL is never
re-fetched, so a nightly catalogue sync costs nothing for the photos that did not
change. Change the bytes behind a URL and publish it at a new URL.
Send only the address fields listed here. Delivery detail (building, floor, apartment number, directions) is not part of this contract in either direction.
Enabled in the SANDBOX. A sandbox token creates real properties in your
sandbox workspace; they are excluded from every public surface (search, the map,
the guest feed) by design. A PRODUCTION token still receives 501 — the payload
is authenticated and validated in full first, and nothing is written.
Authorizations
A short-lived partner token, obtained by exchanging your API key at
POST /token. Send it as Authorization: Bearer <access_token>.
Tokens live for fifteen minutes by default and never for more than an hour. Mint one per batch of work, not one per request.
The token carries the workspace and the environment its key was issued for. You cannot change either by asking: the exchange ignores everything in the request body for exactly that reason.
Never send it as a cookie or in a query string, and never store it — store the API key, mint tokens from it.
Path Parameters
Your own identifier for the property. Unique to you — it never collides with another partner's.
1 - 128Body
The whole property. Anything you omit is removed — this replaces rather than merges.
1 - 12060^[a-z0-9][a-z0-9_-]*$"apartment"
Where the property is. Delivery detail — building, floor, apartment number, directions — is deliberately not part of this contract, in either direction.
How many people the property sleeps, and in what.
An amount and its currency, always together.
value is a decimal string, not a number. 1250.10 has no exact IEEE-754
representation, and a JSON parser that rounds it costs a cent on every booking.
Parse it with a decimal type, not a float.
There is no bare amount anywhere in this API and no currency field sitting beside one. Two fields can be read separately; one object cannot.
40006060^[a-z0-9][a-z0-9_-]*$30Local time, 24-hour.
^([01]\d|2[0-3]):[0-5]\d$"15:00"
^([01]\d|2[0-3]):[0-5]\d$"11:00"
Whether you want the property sellable on Maat right now.
listed, unlisted Response
The property was created or replaced. Sandbox only — a production token
receives 501.
created, updated Maat's listing identifier, once the property is complete enough to have
one. null while it is not — never a placeholder.
listed, unlisted Whether the property can be shown to guests as it stands.
Machine-readable reasons publishable is false. Empty when it is true.
photos_processing is not a deficiency — your images are being fetched
and processed, and it clears on its own. It is separate from photos
precisely so you can tell "wait" from "send us more".
unlisted restates your own status, and it is reported alongside any
real deficiency rather than instead of it, so you know whether the
property is otherwise complete before you re-list it.
price, amenities, cover_photo, photos, photos_processing, unlisted Amenity slugs we do not recognise, echoed back rather than silently dropped. They are not linked to the property. One unmapped slug does not fail the push — an otherwise-good property should not be blocked while you map your vocabulary onto ours.
Photo URLs that did not become photos. Empty when every one did.
missing: ["photos"] on its own is not actionable across a
thirty-photo push, so each failure names your own URL and a reason.
The reason vocabulary is deliberately coarse: a refused URL never says
what the name resolved to.