DEVELOPING

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://..." }
      }
    }
  ]
}
FieldWhat it is
clientRefWhose list this is. It comes back in the response so you do not have to remember which header you asked with
totalHow many came back in THIS response, not how many the client has. See the note below
items[].paIdThe id you use to request it, edit it and publish it
items[].statusactive, or deleted if you deactivated it (only appears with includeDeleted=true)
items[].deletedAtWhen you deactivated it. Only on deleted ones — an active one does not carry the field
items[].canonicalThe object exactly as you sent it
items[].portalsThe per-portal status: {} if you never published it
items[].verdictAtCreationThe 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

ParameterDefaultWhat it does
limitno capCuts off at the first N
includeDeletedfalseIncludes 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.

ListGET /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

CodeWhat happened
200The list. If the client has none, total: 0 and items: []
400The x-client-ref header is missing
401Token missing or invalid
403Your 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.