Who this is for
A host, or a property company, with its own system — a website, a booking engine, an app, an internal tool — that wants to manage its Maat listings from that system rather than one screen at a time. From one place you keep your properties, photos, calendars and rates in step, answer booking requests, reply to reviews, read what you have earned, and hear about every booking the moment it happens. Everything is scoped to your own workspace. You issue your keys yourself, from your own Maat account, and a key reaches that workspace’s inventory and nothing else. There is one contract and everybody uses the same one — Get access.Environments
One vocabulary, settled here and used everywhere else.- One host.
https://maatstays.wtf/v1. There is no second URL, no environment subdomain and no header that switches anything. - A key is bound to one workspace, chosen when the key is issued and never changeable.
- A workspace is either a sandbox or a production workspace. A sandbox is a real Maat tenancy with real endpoints and real writes, kept off every public surface — Sandbox.
- The token exchange tells you which one you hold.
POST /v1/tokenreturns asandboxfield. It is the only place that answer is published, and it is decided by your key rather than by anything you send.
501 not_enabled
with nothing written, nothing read and nothing delivered. The credential exchange
(POST /v1/token) is the one operation that also answers a production workspace, because it
is how you find out which kind you hold. That status is on each operation’s
reference page and machine-readable as x-maat-availability; the
changelog records every change.
Your first four calls
You need a key for a sandbox workspace — Get access.1
Exchange your key for a token
POST /v1/token with your API key returns a short-lived, workspace-scoped bearer token. One
paragraph covers the whole model — Authentication.2
Push a property
PUT /v1/properties/{provider_id} — keyed by your own system’s identifier, so retrying is
always safe. Properties.3
Block some nights
PUT /v1/blocks/{external_uid} holds a range on that property’s calendar, and GET /v1/blocks reads it back. Calendar blocks.4
Register a webhook endpoint
PUT /v1/webhooks/endpoint, echo the signed challenge, and booking notifications arrive at
your server. Webhooks.What crosses the wire about a guest
Worth knowing before you design around it, though nothing above depends on it. Nothing about a guest travels inbound — ever. When a stay is sold through your own system, a calendar block says “these nights are gone” and nothing else: there is no field for a name, a reservation amount, or a free-text note, and sending one is a validation error rather than a silent drop. Nothing identifies a guest outbound either. When a guest books one of your listings on Maat, your endpoint receives the stay dates and door times, the party size and the booking’s status — no name, no contact details, no guest identifier. Each booking event carries aconsole_url that opens the booking in your Maat host console, where the people on your team
who may see the guest can. The whole boundary, in one page:
The data boundary.