Conexiones a portales
Si tu aplicación publica propiedades en portales a través de PropertyAPI, cada cliente tuyo necesita tener conectada su propia cuenta del portal. Estos endpoints administran esas conexiones.
| Método | Ruta | Qué hace |
|---|---|---|
POST | /connections | Registra la conexión de un cliente con un portal |
GET | /connections | Lista las conexiones de un cliente |
GET | /connections/{portal} | Devuelve una conexión |
DELETE | /connections/{portal} | Desvincula la conexión |
Estos endpoints están en desarrollo. Escribinos a dev@mapaprop.com si tu integración los necesita.
Antes de empezar
El token de la cuenta del portal lo obtenés vos. Estos endpoints no hacen el login contra el portal: guardan la credencial que tu cliente ya te autorizó a usar. Cada portal tiene su propio mecanismo de conexión.
Necesitás un scope por cada portal. Los scopes se otorgan al registrar tu aplicación; escribinos indicando con qué portales vas a trabajar.
Valores de portal
| Portal | Valor | Scope necesario |
|---|---|---|
| Argenprop | ArgenpropApi | argenpropapi:connect |
| Cabaprop | CabapropApi | cabapropapi:connect |
| MercadoLibre | MercadolibreApi | mercadolibreapi:connect |
| Zonaprop | ZonapropApi | zonapropapi:connect |
No distingue mayúsculas de minúsculas: ArgenpropApi, argenpropapi y ARGENPROPAPI son el mismo portal y la misma conexión. Las respuestas siempre devuelven el valor en minúsculas (argenpropapi), así que no te sorprenda que salga distinto de como lo mandaste.
En Zonaprop el sufijo Api importa: el portal tiene también un feed XML, y estos endpoints son sólo para la integración por API.
Identificar a tu cliente: clientRef
clientRef es el identificador que vos elegís para cada uno de tus clientes finales. Es opaco para nosotros: puede ser tu id interno, un UUID o lo que uses. Lo mandás en el header x-client-ref (o en la query, o en el body del POST).
Tus conexiones viven en un espacio propio: ninguna otra aplicación puede leerlas ni tocarlas, y vos tampoco alcanzás las de otra. Eso lo determina tu token, no lo que mandes en el request.
Una cuenta de portal = un dueño
Una misma cuenta de portal no puede estar conectada por dos aplicaciones a la vez. Si intentás registrar una cuenta que ya está conectada por otra, recibís 409. Esto es lo que permite dirigir sin ambigüedad las consultas que llegan del portal.
POST /connections
Registra la conexión. Si volvés a llamarlo para el mismo cliente y portal, actualiza la conexión existente (es la forma de rotar el token).
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
portal | string | sí | Ver Valores de portal |
portalAccountId | string o número | sí | Id de la cuenta en el portal. Distingue mayúsculas |
accountToken | string | sí | Credencial de la cuenta. Máximo 4096 bytes |
clientRef | string | sí* | Tu id de cliente. *Se puede mandar por header |
tokenExpiresAt | número o null | no | Vencimiento en epoch, si el portal lo informa |
scopesGranted | array de string | no | Permisos que te dio el cliente. Hasta 32 |
providerMeta | objeto | no | Datos tuyos. Máximo 8192 bytes serializado |
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"
}'
Respuesta 201:
{
"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": {}
}
}
El accountToken nunca vuelve a salir. Se guarda cifrado y ningún endpoint lo devuelve, ni siquiera cifrado. Guardalo vos si lo necesitás para otra cosa.
GET /connections
Lista las conexiones del cliente. Sólo devuelve los portales para los que tenés scope: si trabajás con Argenprop y tu cliente además tiene una conexión de otro portal, esa no aparece.
curl https://property-api.mapaprop.com/connections \
-H "Authorization: Bearer <TU_TOKEN>" \
-H "x-client-ref: inmobiliaria-42"
Respuesta 200: { "connections": [ ... ] }, con los mismos campos del POST.
GET /connections/{portal}
Devuelve una conexión. 404 si ese cliente no la tiene.
DELETE /connections/{portal}
Desvincula la conexión: borramos la credencial guardada y la cuenta deja de recibir consultas del portal a través nuestro.
No tocamos los avisos publicados en el portal. Los avisos son de tu cliente y siguen online exactamente como estaban. Desvincular corta nuestro acceso, nada más. Si tu cliente quiere dar de baja sus avisos, tiene que hacerlo en el portal.
Es idempotente: desvincular algo ya desvinculado responde 200 igual.
{ "status": "revoked", "alreadyRevoked": false, "externalListingsUntouched": true }
Errores
| Código | error | Qué pasó |
|---|---|---|
400 | portal is required / portal must be a non-empty string | Falta el portal o no es texto |
400 | Invalid JSON body | El cuerpo no es JSON válido |
400 | clientRef is required (header x-client-ref, query or body) | Falta identificar al cliente |
400 | (varios, con field) | Un campo no cumple el formato o supera un máximo |
401 | Unauthorized | Falta el token o no es válido |
403 | Missing required scope: argenpropapi:connect | Tu aplicación no tiene el scope de ese portal |
404 | Connection not found | Ese cliente no tiene conexión con ese portal |
409 | portal account already connected | Esa cuenta de portal ya está conectada por otra aplicación |
503 | Connection storage is temporarily unavailable (encryption backend) | Problema temporal nuestro. Reintentá |
Un 403 te dice exactamente qué scope falta, y ese texto incluye el portal tal como lo mandaste. Si ves Missing required scope: argenprop:connect en lugar de argenpropapi:connect, el problema es el valor de portal, no tus permisos.