Guía rápida headless
Mantén tus propiedades en el sistema que ya usas (un CRM inmobiliario, un back office, una exportación de hoja de cálculo) y deja que letsrealty las publique: en tu sitio web de letsrealty, por la API y, con widgets, en cualquier otro sitio web que tengas. Esta guía recorre el camino completo una vez; cada paso enlaza a la guía con los detalles.
- Propiedades: cómo se ve una propiedad cuando la lees.
- Escribir propiedades: crear y actualizar propiedades por tu propia referencia.
- Claves publicables: leer tus propiedades publicadas desde un navegador.
- Widgets: mostrarlas en tu propio sitio web con un fragmento de código.
1. Crea una API Key
En la consola de administración, un Tenant Admin abre Integraciones → Claves de API, crea una clave para la sincronización y le da los permisos properties:write (que incluye properties:read) y webhooks:manage. Agrega leads:read para enterarte de los Leads que envían tus widgets. La clave se muestra una sola vez; guárdala en tu servidor como LETSREALTY_API_KEY. Consulta Autenticación y permisos.
2. Sincroniza tus propiedades
PUT /v1/properties/by-ref/{internal_ref} crea la propiedad con tu referencia la primera vez (201) y la actualiza después (200), así que un proceso de sincronización envía cada propiedad siempre de la misma forma:
curl -X PUT "https://api.letsrealty.io/v1/properties/by-ref/CASA-TAM-07" \
-H "Authorization: Bearer $LETSREALTY_API_KEY" \
-H "Idempotency-Key: nightly-2026-10-04-CASA-TAM-07" \
-H "Content-Type: application/json" \
-d '{
"title": "Tamarindo beach house",
"description": "Three bedrooms, a pool and a view of the bay.",
"listing_type": "sale",
"price": "385000",
"currency": "USD",
"bedrooms": 3,
"place_code": "CR-50309",
"ai_enrichment": false
}'
Una propiedad con place_code se publica en tu sitio web. Con "ai_enrichment": false nada se traduce ni se reescribe por ti, así que envía tú el texto de cada idioma: la misma llamada con ?lang=es escribe el texto en español, que la IA luego no toca.
curl -X PUT "https://api.letsrealty.io/v1/properties/by-ref/CASA-TAM-07?lang=es" \
-H "Authorization: Bearer $LETSREALTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Casa de playa en Tamarindo", "description": "Tres habitaciones, piscina y vista a la bahía.", "ai_enrichment": false }'
El mismo proceso en Node, importando las fotos de cada propiedad desde las URL donde tu sistema ya las tiene (la misma URL otra vez no agrega nada):
const API = "https://api.letsrealty.io";
const headers = {
Authorization: `Bearer ${process.env.LETSREALTY_API_KEY}`,
"Content-Type": "application/json",
};
async function call(method, path, body) {
const res = await fetch(`${API}${path}`, { method, headers, body: JSON.stringify(body) });
if (!res.ok) throw new Error(`${method} ${path} → ${res.status}: ${await res.text()}`);
return res.status === 204 ? null : res.json();
}
export async function sync(listings) {
for (const listing of listings) {
const ref = encodeURIComponent(listing.ref);
const written = await call("PUT", `/v1/properties/by-ref/${ref}`, {
title: listing.title.en,
description: listing.description.en,
listing_type: "sale",
price: String(listing.price),
currency: "USD",
bedrooms: listing.bedrooms,
place_code: listing.placeCode,
ai_enrichment: false,
});
await call("PUT", `/v1/properties/by-ref/${ref}?lang=es`, {
title: listing.title.es,
description: listing.description.es,
ai_enrichment: false,
});
for (const [index, url] of listing.photos.entries()) {
await call("POST", `/v1/properties/${written.id}/images:import`, { url, is_primary: index === 0 });
}
if (listing.sold) await call("DELETE", `/v1/properties/${written.id}`);
}
}
Archivar con DELETE /v1/properties/{property_id} saca la propiedad de tu sitio web y de tus widgets; su slug y su historial de precios se conservan.
3. Entérate de los cambios
Suscribe un endpoint tuyo a los eventos de propiedades con POST /v1/webhooks/subscriptions. Guarda el secret de la respuesta para verificar cada entrega:
curl https://api.letsrealty.io/v1/webhooks/subscriptions \
-H "Authorization: Bearer $LETSREALTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://crm.youragency.com/hooks/letsrealty",
"events": ["property.created", "property.went_live", "property.price_changed", "property.archived", "lead.created"]
}'
La primera sincronización envía property.created y, para una propiedad con Place, property.went_live; un precio nuevo envía property.price_changed con el previous_price; archivarla envía property.archived. Una consulta desde un widget envía lead.created. Consulta Webhooks.
4. Léelas de vuelta
GET /v1/properties con updated_since devuelve lo que cambió, en el idioma que pide lang, para que otro sistema mantenga su propia copia:
curl "https://api.letsrealty.io/v1/properties?updated_since=2026-10-04T00:00:00Z&lang=es" \
-H "Authorization: Bearer $LETSREALTY_API_KEY"
Pagina con next_cursor hasta que sea null. Consulta Propiedades y Paginación y sincronización.
5. Muéstralas en tu sitio web
En Integraciones → Widgets para sitios web, agrega el origen de tu sitio web (https://www.youragency.com), elige un widget y copia el fragmento. Pégalo en cualquier página:
<script type="module" src="https://www.letsrealty.io/widgets/v1/lr.js" data-key="lr_pk_1a2b3c4d_xxxx"></script>
<lr-listings layout="grid" listing="sale" limit="6"></lr-listings>
<lr-lead-form></lr-lead-form>
La página muestra tus propiedades publicadas con tu marca y en tu idioma; un visitante abre una en una ventana y te escribe, y la consulta llega como un Lead "vía widget" con la página de donde vino. La clave del fragmento es una clave publicable: solo funciona en los orígenes que agregas, así que el mismo fragmento en cualquier otro sitio web no lee nada. Un cambio que sincronizas llega a tus widgets en más o menos un minuto.
Para construir tu propio front end, lee las mismas propiedades con la clave publicable desde el navegador: consulta Claves publicables.