Skip to main content
PUT
cURL

Authorizations

Authorization
string
header
required

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

provider_id
string
required

Your own identifier for the property. Unique to you — it never collides with another partner's.

Required string length: 1 - 128

Body

application/json

The whole property. Anything you omit is removed — this replaces rather than merges.

name
string
required
Required string length: 1 - 120
property_type
string
required
Maximum string length: 60
Pattern: ^[a-z0-9][a-z0-9_-]*$
Example:

"apartment"

address
Address · object
required

Where the property is. Delivery detail — building, floor, apartment number, directions — is deliberately not part of this contract, in either direction.

occupancy
Occupancy · object
required

How many people the property sleeps, and in what.

base_rate
Money · object
required

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.

description
string
Maximum string length: 4000
amenities
string[]
Maximum array length: 60
Maximum string length: 60
Pattern: ^[a-z0-9][a-z0-9_-]*$
photos
Photo · object[]
Maximum array length: 30
check_in_time
string

Local time, 24-hour.

Pattern: ^([01]\d|2[0-3]):[0-5]\d$
Example:

"15:00"

check_out_time
string
Pattern: ^([01]\d|2[0-3]):[0-5]\d$
Example:

"11:00"

status
enum<string>

Whether you want the property sellable on Maat right now.

Available options:
listed,
unlisted

Response

The property was created or replaced. Sandbox only — a production token receives 501.

provider_id
string
required
result
enum<string>
required
Available options:
created,
updated
listing_id
string<uuid> | null
required

Maat's listing identifier, once the property is complete enough to have one. null while it is not — never a placeholder.

status
enum<string>
required
Available options:
listed,
unlisted
publishable
boolean
required

Whether the property can be shown to guests as it stands.

missing
enum<string>[]
required

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.

Available options:
price,
amenities,
cover_photo,
photos,
photos_processing,
unlisted
Example:
unknown_amenities
string[]
required

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.

Example:
photos_rejected
PhotoRejection · object[]
required

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.