DEVELOPING

Portal connections

If your application publishes properties on portals through PropertyAPI, each of your clients needs to have their own account on the portal connected. These endpoints manage those connections.

MethodPathWhat it does
POST/connectionsRegisters a client's connection with a portal
GET/connectionsLists a client's connections
GET/connections/{portal}Returns one connection
DELETE/connections/{portal}Disconnects the connection

These endpoints are under development. Write to us at dev@mapaprop.com if your integration requires them.

Before you start

You are the one who obtains the portal account token. These endpoints do not log in against the portal: they store the credential your client already authorized you to use. Each portal has its own connection mechanism.

You need one scope per portal. Scopes are granted when you register your application; write to us stating which portals you are going to work with.

portal values

PortalValueRequired scope
ArgenpropArgenpropApiargenpropapi:connect
CabapropCabapropApicabapropapi:connect
MercadoLibreMercadolibreApimercadolibreapi:connect
ZonapropZonapropApizonapropapi:connect

It is case-insensitive: ArgenpropApi, argenpropapi and ARGENPROPAPI are the same portal and the same connection. Responses always return the value in lowercase (argenpropapi), so do not be surprised if it comes back different from the way you sent it.

On Zonaprop the Api suffix matters: the portal also has an XML feed, and these endpoints are only for the API integration.

Identifying your client: clientRef

clientRef is the identifier that you choose for each of your end clients. It is opaque to us: it can be your internal id, a UUID or whatever you use. You send it in the x-client-ref header (or in the query, or in the body of the POST).

Your connections live in a space of their own: no other application can read them or touch them, and you cannot reach another application's either. That is determined by your token, not by what you send in the request.

One portal account = one owner

The same portal account cannot be connected by two applications at the same time. If you try to register an account that is already connected by another one, you get a 409. This is what makes it possible to route the inquiries coming from the portal without ambiguity.

POST /connections

Registers the connection. If you call it again for the same client and portal, it updates the existing connection (this is how you rotate the token).

FieldTypeRequiredDescription
portalstringyesSee portal values
portalAccountIdstring or numberyesId of the account on the portal. Case-sensitive
accountTokenstringyesCredential of the account. Maximum 4096 bytes
clientRefstringyes*Your client id. *Can be sent in a header
tokenExpiresAtnumber or nullnoExpiration in epoch, if the portal reports it
scopesGrantedarray of stringnoPermissions your client granted you. Up to 32
providerMetaobjectnoData of your own. Maximum 8192 bytes serialized
curl -X POST https://property-api.mapaprop.com/connections \
  -H "Authorization: Bearer <TU_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "portal": "ArgenpropApi",
    "portalAccountId": "310578",
    "accountToken": "<credencial de la cuenta>",
    "clientRef": "inmobiliaria-42"
  }'

201 response:

{
  "connection": {
    "portal": "argenpropapi",
    "portalAccountId": "310578",
    "status": "active",
    "scopesGranted": [],
    "createdAt": "2026-09-04T13:40:00.000Z",
    "lastActivityAt": "2026-09-04T13:40:00.000Z",
    "tokenExpiresAt": null,
    "providerMeta": {}
  }
}

The accountToken never comes back out. It is stored encrypted and no endpoint returns it, not even encrypted. Store it yourself if you need it for anything else.

GET /connections

Lists the client's connections. It only returns the portals you have scope for: if you work with Argenprop and your client also has a connection to another portal, that one does not appear.

curl https://property-api.mapaprop.com/connections \
  -H "Authorization: Bearer <TU_TOKEN>" \
  -H "x-client-ref: inmobiliaria-42"

200 response: { "connections": [ ... ] }, with the same fields as the POST.

GET /connections/{portal}

Returns one connection. 404 if that client does not have it.

DELETE /connections/{portal}

Disconnects the connection: we delete the stored credential and the account stops receiving inquiries from the portal through us.

We do not touch the listings published on the portal. The listings belong to your client and stay online exactly as they were. Disconnecting cuts off our access, nothing more. If your client wants to take their listings down, they have to do it on the portal.

It is idempotent: disconnecting something already disconnected responds 200 all the same.

{ "status": "revoked", "alreadyRevoked": false, "externalListingsUntouched": true }

Errors

CodeerrorWhat happened
400portal is required / portal must be a non-empty stringThe portal is missing or is not text
400Invalid JSON bodyThe body is not valid JSON
400clientRef is required (header x-client-ref, query or body)The client is not identified
400(several, with field)A field does not meet the format or exceeds a maximum
401UnauthorizedThe token is missing or is not valid
403Missing required scope: argenpropapi:connectYour application does not have the scope for that portal
404Connection not foundThat client has no connection with that portal
409portal account already connectedThat portal account is already connected by another application
503Connection storage is temporarily unavailable (encryption backend)A temporary problem on our side. Retry

A 403 tells you exactly which scope is missing, and that text includes the portal just as you sent it. If you see Missing required scope: argenprop:connect instead of argenpropapi:connect, the problem is the portal value, not your permissions.