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.

  1. Propiedades: cómo se ve una propiedad cuando la lees.
  2. Escribir propiedades: crear y actualizar propiedades por tu propia referencia.
  3. Claves publicables: leer tus propiedades publicadas desde un navegador.
  4. 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.