API REST v1

API JSON para leer el inventario del Multilistado, administrar tus propiedades y recibir leads desde tu sitio o CRM. Gratis para agentes verificados.

Read in English · Markdown · Actualizado

Resumen

URL basehttps://multilistado.mx/api/v1
FormatoJSON (UTF-8). En POST/PUT envía Content-Type: application/json
AutenticaciónAuthorization: Bearer pbm_<prefijo>_<secreto>
Permisosread (todas las consultas) · write (crear, editar, publicar, crear leads)
Límite600 solicitudes cada 10 minutos por key
Descripción OpenAPI 3.0/api/v1/openapi.json · referencia interactiva

Autenticación

  1. Entra a Portal → Más → API (requiere licencia verificada).
  2. En Crear key escribe una Etiqueta (p. ej. «Mi CRM»), elige Permisos: «Lectura y escritura» o «Solo lectura», y pulsa Generar.
  3. Copia la key: se muestra una sola vez. Tiene la forma pbm_ + 8 caracteres + _ + 48 caracteres. Puedes revocarla en cualquier momento.

Envíala en la cabecera Authorization. Por seguridad no se aceptan keys en la URL (?api_key= responde 401) y la API no habilita CORS: llámala desde tu servidor, nunca desde el navegador de tus visitantes (la key quedaría expuesta). Para mostrar propiedades en un sitio sin programar usa el widget.

Gratis para agentes e inmobiliarias con licencia. Crea tu cuenta, verifica tu licencia y genera tu API key o tu widget en minutos.

Crear cuenta gratis Ya tengo cuenta

Las keys de socios RESO (permiso partner) solo sirven en la RESO Web API; en /api/v1 responden 403.

Cliente mínimo

Guarda tu key en una variable de entorno (MULTILISTADO_API_KEY) y usa este pequeño cliente en los ejemplos siguientes. Cada ejemplo continúa el anterior.

export MULTILISTADO_API_KEY="pbm_..."   # tu key
API=https://multilistado.mx/api/v1
curl -s "$API/me" -H "Authorization: Bearer $MULTILISTADO_API_KEY"

1. Buscar propiedades en el MLS

GET /properties devuelve propiedades publicadas de todo el Multilistado (y las tuyas), una página a la vez.

curl -s -G "$API/properties" -H "Authorization: Bearer $MULTILISTADO_API_KEY" \
  --data-urlencode "city=Tijuana" --data-urlencode "operation=sale" --data-urlencode "type=house" \
  --data-urlencode "min_price=2000000" --data-urlencode "sort=price_asc" --data-urlencode "limit=10"

Respuesta (recortada, ilustrativa):

{
  "pagination": { "page": 1, "pages": 3, "total": 27, "limit": 10 },
  "content": [{
    "id": "07e25392-…", "slug": "casa-en-venta-playas-de-tijuana", "url": "https://multilistado.mx/p/casa-en-venta-playas-de-tijuana",
    "title": "Casa en venta en Playas de Tijuana", "property_type": "house", "status": "published",
    "operations": [{ "type": "sale", "amount": 4350000, "currency": "MXN", "formatted_amount": "$4,350,000 MXN" }],
    "bedrooms": 3, "bathrooms": 2.5, "parking": 2, "construction_m2": 180, "lot_m2": 200,
    "location": { "address": null, "neighborhood": "Playas de Tijuana", "city": "Tijuana", "state": "Baja California", "lat": 32.519, "lng": -117.119, "exact": false },
    "images": [{ "url": "https://…/fachada.jpg", "thumb": "https://…/fachada.jpg" }],
    "agent": { "name": "…", "slug": "…", "phone": "…", "url": "https://multilistado.mx/agente/…" },
    "agency": null, "updated_at": "2026-09-30T14:07:28.671Z", "published_at": "2026-09-30T14:04:19.703Z"
  }]
}

Filtros

ParámetroDescripción
qTexto libre (en español, sin acentos)
operationsale (tiene precio de venta) · rental (tiene precio de renta)
typehouse, apartment, land, office, commercial, warehouse, ranch, building, other. Repite el parámetro para varios: type=house&type=apartment
stateEstado, nombre exacto: Baja California
city, neighborhoodCiudad y colonia (coincidencia parcial, sin acentos)
min_price, max_pricePrecio (el de venta con operation=sale, el de renta con rental; si no, cualquiera). No convierte monedas
currencyMXN o USD: solo propiedades con precio en esa moneda
min_bedrooms, min_bathrooms, min_parkingMínimos
min_construction, min_lotm² mínimos de construcción y terreno
featuresDebe tener todas estas amenidades (etiquetas en español de /meta); repite el parámetro
sw_lat, sw_lng, ne_lat, ne_lngRectángulo del mapa (coordenadas públicas aproximadas)
lat, lng, radius_kmRadio alrededor de un punto
updated_sinceFecha ISO 8601: solo cambios desde entonces (sincronización incremental)
sortnewest (por omisión), price_asc, price_desc, updated, relevance (con q). Las destacadas van primero
page, limitPágina (desde 1) y tamaño (por omisión 24, máximo 100)

Qué incluye: propiedades publicadas de agentes verificados, y las tuyas en cualquier estado. No incluye importaciones con licencia de otros MLS, propiedades cuyo propietario no autorizó sitios de otros agentes (idx_opt_out) ni cuentas de prueba.

2. Ver una propiedad

GET /properties/{id} acepta el id (UUID) o el slug.

curl -s "$API/properties/casa-en-venta-playas-de-tijuana" -H "Authorization: Bearer $MULTILISTADO_API_KEY"

3. Crear una propiedad

POST /properties (permiso write) crea la propiedad en tu inventario como borrador (draft). Obligatorios: title (mín. 5 caracteres), city, state y sale_price y/o rent_price.

curl -s -X POST "$API/properties" -H "Authorization: Bearer $MULTILISTADO_API_KEY" -H "Content-Type: application/json" -d '{
  "title": "Casa en venta en Playas de Tijuana", "description": "Casa de 3 recámaras a dos cuadras de la playa.",
  "property_type": "house", "sale_price": 4500000, "sale_currency": "MXN",
  "bedrooms": 3, "bathrooms": 2.5, "parking": 2, "construction_m2": 180, "lot_m2": 200,
  "city": "Tijuana", "state": "Baja California", "neighborhood": "Playas de Tijuana",
  "lat": 32.5201, "lng": -117.1205, "features": ["Vista al mar", "Jardín"], "external_id": "crm-1042"
}'
# Guarda el "id" de la respuesta:
LISTING_ID="…"

Campos que puedes enviar: title, description, title_en, description_en, property_type, sale_price, sale_currency, rent_price, rent_currency, rent_period (monthly, weekly, daily, yearly), bedrooms, bathrooms, half_bathrooms, parking, construction_m2, lot_m2, year_built, floors, features, address, neighborhood, city, municipality, state, postal_code, lat, lng, show_exact_address, idx_opt_out, video_url, virtual_tour_url, exclusive, shared_commission, internal_id, images y external_id (tu ID interno; se devuelve como source_id y es único por agente: si ya existe, la API responde 409 conflict con el id de esa propiedad para que la actualices con PUT). Los precios aceptan números o texto como "4,500,000". Las coordenadas se guardan exactas, pero se publican aproximadas salvo que show_exact_address sea true. Detalle completo en la referencia.

4. Actualizar

PUT /properties/{id} es parcial: envía solo lo que cambia.

curl -s -X PUT "$API/properties/$LISTING_ID" -H "Authorization: Bearer $MULTILISTADO_API_KEY" -H "Content-Type: application/json" \
  -d '{"sale_price": 4350000, "title_en": "House for sale in Playas de Tijuana"}'

5. Imágenes

POST /properties/{id}/images agrega imágenes por URL pública (hasta 60 por llamada, en orden). La primera se usa como portada si no hay otra. Las imágenes se enlazan, no se copian: mantenlas en línea (tu servidor, CDN o almacenamiento público http/https). En API v1 no hay carga binaria de archivos; para subir fotos desde tu computadora usa el portal. Enviar images en un PUT reemplaza las imágenes por URL de la propiedad.

curl -s -X POST "$API/properties/$LISTING_ID/images" -H "Authorization: Bearer $MULTILISTADO_API_KEY" -H "Content-Type: application/json" \
  -d '{"urls": ["https://cdn.tu-sitio.com/fotos/1042/fachada.jpg", "https://cdn.tu-sitio.com/fotos/1042/sala.jpg"]}'

6. Publicar y despublicar

LlamadaNuevo estadoWebhook
POST /properties/{id}/publishpublishedlisting.published
POST /properties/{id}/unpublishdraftlisting.unpublished
DELETE /properties/{id}withdrawn (se conserva, no se borra)listing.unpublished
curl -s -X POST "$API/properties/$LISTING_ID/publish" -H "Authorization: Bearer $MULTILISTADO_API_KEY"
# {"ok":true,"status":"published"}

Tu inventario completo (todos los estados, hasta 500, sin paginación): GET /my/properties (filtra con ?status=draft).

7. Crear un lead desde tu sitio

POST /leads (permiso write) registra una solicitud recibida en tu propio sitio o formulario. El lead se asigna a ti; property_id (UUID o slug) solo se vincula si administras esa propiedad. Recibes el aviso por correo como con cualquier lead. name es obligatorio.

curl -s -X POST "$API/leads" -H "Authorization: Bearer $MULTILISTADO_API_KEY" -H "Content-Type: application/json" \
  -d "{\"name\": \"Ana López\", \"email\": \"ana@example.com\", \"phone\": \"+52 664 123 4567\", \"message\": \"Me interesa la casa.\", \"property_id\": \"$LISTING_ID\", \"source\": \"mi-sitio\"}"

8. Tus leads

GET /leads devuelve tus últimos 500 leads (de tu sitio de Multilistado, el widget, portales y la API), del más nuevo al más antiguo.

curl -s "$API/leads" -H "Authorization: Bearer $MULTILISTADO_API_KEY"

Campos: id, listing_id, listing_title, listing_slug, name, email, phone, message, source (widget:<id>, api, tu etiqueta…), status, kind (info o tour = solicitud de visita), lang, interest, budget_min, budget_max, follow_up_at, tour_at, tour_status, showing_at, id_status (identificación del comprador: verified/pending), awaiting_id, created_at, updated_at. Para recibirlos al instante usa webhooks.

Otros endpoints

EndpointDevuelve
GET /meDueño de la key y permisos
GET /metaTipos, estados de publicación, estados de México, amenidades y monedas (sin key)
GET /agentsDirectorio de agentes verificados públicos (hasta 1000)
GET /agenciesInmobiliarias activas (hasta 1000)
GET /locationsCiudades y estados con inventario publicado (top 200)
GET /my/propertiesTu inventario en todos los estados

Paginación

/properties responde pagination: { page, pages, total, limit }. Pide la siguiente página con page=2, page=3… hasta pages. Para sincronizar un inventario grande, guarda la hora de tu última sincronización y pide solo los cambios con updated_since=2026-09-30T00:00:00Z&sort=updated. Las listas /my/properties, /leads, /agents y /agencies no se paginan (tienen un tope fijo).

Errores

Los errores responden JSON con error (código estable) y, casi siempre, message:

{ "error": "unauthorized", "message": "Invalid or revoked API key." }
HTTPerrorCausa
401unauthorizedFalta la key, es inválida o revocada, la cuenta no está verificada, o la mandaste en la URL
403forbiddenLa key no tiene permiso write, la propiedad no es tuya, o es una key de socio RESO
404not_foundNo existe o tu key no la puede ver
409conflictYa tienes una propiedad con ese external_id; la respuesta incluye su id
422validationDatos inválidos; detalle en errors: [...] (mensajes en inglés)
429rate_limitedLímite superado; espera los segundos de Retry-After
500server_errorError nuestro: reintenta más tarde y avísanos si persiste

Límites

Qué no expone la API