Moveandstay API for agents
A keyed HTTP API that lets an AI agent search Moveandstay's listings, read one listing, and send an enquiry through the same pipeline a visitor's enquiry goes through.
Moveandstay is a directory of move-in-ready stays and workspaces: serviced apartments, extended-stay accommodation, serviced offices and coworking spaces. Coverage is worldwide — strongest in Asia-Pacific. We take no booking commission — an enquiry is an introduction to the operator, not a reservation.
What it does, and what it does not
- Search published properties by country, city, category, capacity and property name.
- Read one property: its description, amenities, the operator's own FAQ, photos and published unit types.
- Send an enquiry — either to a specific property, or to our matching team when no single property is named.
It is not a booking API and there is nothing to reserve. It is not an availability API: we do not hold a live calendar, so no endpoint will tell you whether a property is free on a date. It cannot create or edit listings.
As at 2026-10-05, the directory holds 1,809 published properties across 57 cities in 34 countries. These are point-in-time figures read from the database when this page was generated; they change with every import, so do not cache them.
Authentication
Every endpoint except the health check needs an API key, sent as a bearer token. There is no anonymous tier: a request without a key is a 401. Ask contact@moveandstay.com for one.
curl -H 'Authorization: Bearer YOUR_KEY' \
'https://moveandstay.com/api/agent/v1/properties?city=hong-kong&limit=5'Each key has its own hourly budget — generous for reads, deliberately tight for enquiries. A spent budget answers 429 with a Retry-After header saying when the next slot frees, rather than a flat hour.
GET /api/agent/v1/properties
| Parameter | Meaning |
|---|---|
| q | Free text. Matches the property name only — not the description, address or amenities. |
| country | Country slug, e.g. thailand. |
| city | City slug, e.g. hong-kong. |
| type | One or more of serviced-apartments, extended-stay, serviced-offices, coworking-spaces, comma-separated. The former slug hotels is still accepted and means extended-stay. |
| min_capacity | Minimum guests (apartments, extended stay). |
| min_workstations | Minimum desks (coworking). |
| has_photos | true to require at least one photo. |
| limit | 1–50, default 20. |
| offset | For paging through total. |
An unknown city, country or type is an error, not an empty list. city=hong-kongg answers unknown_city, because returning zero results would tell you we have nothing in Hong Kong.
A capacity filter excludes properties that state no capacity, rather than assuming they fit. Results come back in the same order the website ranks them.
GET /api/agent/v1/properties/{id}
id is the value search returned. The response adds the description, the amenity list, the operator's FAQ, the photos and any published unit types.
No endpoint returns a property's email address or phone number. The enquiry endpoint is how a property is contacted.
POST /api/agent/v1/enquiries
Send property_id and the enquiry goes to that property. Leave it out and it goes to our matching team, who contact suitable properties on the traveller's behalf. Both land in the same pipeline a website enquiry lands in.
{
"property_id": "3f1a2b4c-5d6e-7f80-9a1b-2c3d4e5f6071",
"contact": {
"name": "Alice Tan",
"email": "alice@example.com",
"phone": "+852 1234 5678"
},
"requirements": {
"move_in_date": "2026-11-01",
"duration_value": 3,
"duration_unit": "month",
"capacity": 2,
"budget_amount": 40000,
"budget_currency": "HKD",
"budget_period": "monthly",
"message": "Quiet flat, close to the MTR."
},
"consent": { "granted": true, "source": "asked in chat" },
"idempotency_key": "your-unique-id-for-this-enquiry"
}consent.grantedmust be literallytrue. You are submitting somebody else's contact details to a company that will email them; this is where you confirm they agreed.idempotency_keyis required. Send the same value if you retry, so a timeout cannot produce a second enquiry. Reusing a key with different content is a409.requirements.capacityis required whenproperty_idis given — the operator is told how many people or desks the enquiry is for, and there is no honest default.
Two success shapes, both 200
{ "status": "RECEIVED", "enquiry_id": "…", "route": "property" }
{ "status": "RECEIVED_UNDER_REVIEW", "enquiry_id": "…", "route": "concierge" }RECEIVED means the enquiry entered the pipeline. RECEIVED_UNDER_REVIEW means it has been saved and is being looked at. Tell the person what the status says and nothing more: we do not promise a reply, a response time, or a number of properties that will get in touch.
Errors
Every error is { "error": { "code": …, "message": … } }. Branch on code; show message.
| Code | Status | Means |
|---|---|---|
| unauthorized | 401 | No key, or not one of ours. |
| rate_limited | 429 | This key's budget for the hour is spent. Retry-After says when. |
| invalid_request | 400 | A field is missing, malformed or out of range. |
| consent_required | 400 | consent.granted was not true. |
| unknown_city / unknown_country / unknown_type | 400 | That slug is not one we cover. |
| property_not_found | 404 | No published property has that reference. |
| idempotency_conflict | 409 | That key was already used for a different enquiry. |
| server_error | 500 | Ours. Safe to retry with the same idempotency key. |
What we cannot tell you
Stated plainly, because an agent that knows the edges of a source is more useful than one that guesses at them:
- Availability. We hold no calendar. Nothing here says whether a property is free on a date.
- Minimum stay. We do not store one. Ask the operator through an enquiry.
- Full pricing. Only a "from" rate, exactly as the operator gave it.
rate_from: nullmeans *not stated* — not free, and not "ask us". - Long-stay suitability as a filter. Most properties on the site take stays of a month or more, but we have no stored field for it, so there is no filter to offer.
- Search beyond the name.
qmatches the property name. To narrow by place, usecountry,cityandtype.
Machine-readable
- OpenAPI description — the whole surface, for a connector platform or a code generator.
- MCP server — the same three capabilities as MCP tools. Setup at /docs/mcp.
- /llms.txt — what this site is for and when not to use it.
- Every public page also answers to
Accept: text/markdown, or a.mdsuffix.
Questions, or a key: contact@moveandstay.com.