Skip to main content
PATCH
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.

It also carries the key's scopes (scope, a list). Every operation names a scope as x-maat-scope, and a token whose key lacks it is refused with 403 insufficient_scope, naming the scope. Scopes are fixed when a key is issued and are re-read from the key on every request, so a key narrowed today is narrowed on its next call — the token's scope is what the key held at exchange time, for your own reading, never what authorizes a request.

x-maat-scope is the floor, and on the quick-action operations it is not the whole requirement. PUT and DELETE /listings/{listing_id}/quick-actions/{template_key} carry rules:write, and additionally require pricing:write when template_key begins pricing. — the capability depends on the template in the path, because a cleaning fee changes what a guest pays and a minimum stay does not. The refusal is the same 403 insufficient_scope, naming pricing:write. The two READS apply the same requirement without erroring: GET /listings/{listing_id}/quick-actions still lists the pricing.* rows but withholds their applied state, and GET /listings/{listing_id}/rules omits the pricing rules entirely and reports pricing_withheld in warnings. These four are the only operations in this document whose requirement is not exactly their x-maat-scope, and each of them says so machine-readably: x-maat-scope-additional lists the second scope it can require and x-maat-scope-additional-when says what happens without it.

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

unit_id
string<uuid>
required

Maat's identifier for the physical unit.

Body

application/json

A partial edit of one physical unit. An absent member is untouched, and nothing here is nullable — every one of these is a required value on the platform.

Send at least one member. An empty body is a 400, not a silent no-op that reads as success.

max_guests
integer

The most people the unit sleeps.

Required range: 1 <= x <= 50
bedrooms
integer

Rooms intended for sleeping.

Required range: 0 <= x <= 30
beds
integer

Beds in total, across every room.

Required range: 0 <= x <= 60
bathrooms
integer

Whole bathrooms. A fractional value is refused rather than truncated into a different property than you described; half-bathrooms are not expressible here.

Required range: 0 <= x <= 30
unit_type
enum<string>

What the unit is: the whole property, or one room inside it. Setting whole_property on a property that has another unit is a 409 conflict.

See UnitType.

Available options:
whole_property,
private_room
check_in_time
string

Local time, 24-hour.

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

"15:00"

check_out_time
string

Local check-out time, 24-hour HH:MM. The platform default is 12:00.

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

"12:00"

Response

The unit, read back after the change.

One physical unit, and the listings sold on it.

unit_type
string
required

What kind of physical inventory this is, as a slug.

max_guests
integer
required

The most people the unit sleeps.

bedrooms
integer
required

Rooms intended for sleeping.

beds
integer
required

Beds in total, across every room.

bathrooms
integer
required

Whole bathrooms. Half-bathrooms are not expressible.

check_in_time
string
required

Local HH:MM, 24-hour.

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

"15:00"

check_out_time
string
required

Local check-out time, 24-hour HH:MM. The platform default is 12:00.

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

"12:00"

amenities
string[]
required

Amenity slugs. See GET /catalog/amenities.

house_rules
HouseRuleAnswer · object[]
required

Every house rule that has been answered for this unit. A rule that was never asked is absent.

listings
Listing · object[]
required

The sellable views of this unit. One today; the model allows more.

unit_id
string<uuid>

The unit's id — the one GET /units/{unit_id} takes.