List a client's properties
GET /property-v1/properties
Returns every property you loaded for the clientRef you ask for, with each portal's publication
status. It is the read you use to reconcile your database against ours: what got loaded, what got
published and where.
curl https://property-api.mapaprop.com/property-v1/properties \
-H "Authorization: Bearer $TOKEN" \
-H "x-client-ref: cliente-42"
200 response:
{
"clientRef": "cliente-42",
"total": 42,
"items": [
{
"paId": "01M4BS9DR88PCN2WNR5WSH82D4",
"status": "active",
"createdAt": "2026-10-07T13:21:04.118Z",
"updatedAt": "2026-10-07T20:41:55.902Z",
"canonical": { "code": "DEV-V3-909181", "type": 1, "title": "Depto en Palermo", "...": "..." },
"verdictAtCreation": { "...": "..." },
"portals": {
"zonaprop": { "remoteStatus": "published", "itemId": "...", "url": "https://..." }
}
}
]
}
| Field | What it is |
|---|---|
clientRef | Whose list this is. It comes back in the response so you do not have to remember which header you asked with |
total | How many came back in THIS response, not how many the client has. See the note below |
items[].paId | The id you use to request it, edit it and publish it |
items[].status | active, or deleted if you deactivated it (only appears with includeDeleted=true) |
items[].deletedAt | When you deactivated it. Only on deleted ones — an active one does not carry the field |
items[].canonical | The object exactly as you sent it |
items[].portals | The per-portal status: {} if you never published it |
items[].verdictAtCreation | The verdict from the day you loaded it. ⚠️ It is from that day: if we later fixed a mapping, this does not know. For today's, use the GET by paId |
The two parameters
| Parameter | Default | What it does |
|---|---|---|
limit | no cap | Cuts off at the first N |
includeDeleted | false | Includes the ones you deactivated |
# the first 2
curl "https://property-api.mapaprop.com/property-v1/properties?limit=2" …
# the deactivated ones as well
curl "https://property-api.mapaprop.com/property-v1/properties?includeDeleted=true" …
There is no cursor pagination. Without limit we return that client's whole inventory in one
response, and total is how many came back — not how many there are. So total without limit is
indeed the full inventory, but with limit it is the cap you asked for and you do not know how many
were left out.
If you handle large portfolios, ask without limit and process the whole response. If you really need
to paginate, write to dev@mapaprop.com: the cursor does not exist because nobody has needed it yet.
It is a read of our system: it does not cost a single call from your client's portal allowance. What the portal says about each listing comes from the status lookup, which does cost 1 per property.
What it returns beyond the GET by paId
Nothing: the list returns less. It is a projection meant for walking through, not for inspecting.
| List | GET /properties/{paId} | |
|---|---|---|
| The object and the per-portal status | ✅ | ✅ |
| TODAY's verdict, recalculated | ❌ — the one from creation | ✅ |
The images' status (images) | ❌ | ✅ |
The last publication's detail (lastPublish) | ❌ | ✅ |
For reconciling, the list is enough. To understand one property, ask for the property.
Response codes
| Code | What happened |
|---|---|
200 | The list. If the client has none, total: 0 and items: [] |
400 | The x-client-ref header is missing |
401 | Token missing or invalid |
403 | Your token does not have the property-api-read scope |
A client with no properties returns 200 with items: [], not a 404. A 404 would mean the
client does not exist, and that is answered by the client GET.
Related
- Look up a property — with today's verdict and the images
- Creating properties · Modify · Deactivate
- Publishing — where this list's
portalscomes from