Demostración ficticia. Sin inmuebles, clientes ni agencias reales.

Interfaces abiertas

# Registros públicos para personas y sistemas.

Solo los inmuebles autorizados como públicos están disponibles de forma anónima. La información profesional requiere una cuenta verificada y un token limitado.

Última actualización: 30 de septiembre de 2026

## Leer un inmueble sin conectar nada.

Las páginas legibles por IA no garantizan la indexación en buscadores ni su inclusión en una respuesta de IA.

Cada inmueble abierto tiene una dirección estable. Las personas ven una página; los asistentes de IA y los buscadores reciben el mismo registro en Markdown, JSON o JSON-LD, sin iniciar sesión.

- HTML [https://speakingbricks.eu/properties/L-DEMO-01](<https://speakingbricks.eu/properties/L-DEMO-01>)

- Markdown [https://speakingbricks.eu/properties/L-DEMO-01.md](<https://speakingbricks.eu/properties/L-DEMO-01.md>)

- JSON [https://speakingbricks.eu/properties/L-DEMO-01.json](<https://speakingbricks.eu/properties/L-DEMO-01.json>)

- JSON-LD [https://speakingbricks.eu/properties/L-DEMO-01.jsonld](<https://speakingbricks.eu/properties/L-DEMO-01.jsonld>)

- Accept: text/markdown https://speakingbricks.eu/properties/L-DEMO-01

- llms.txt [https://speakingbricks.eu/llms.txt](<https://speakingbricks.eu/llms.txt>)

- Mapa del sitio [https://speakingbricks.eu/sitemap.xml](<https://speakingbricks.eu/sitemap.xml>)

- Feed [https://speakingbricks.eu/feeds/open-listings.json](<https://speakingbricks.eu/feeds/open-listings.json>)

## Conectar un asistente de IA.

Añade el servidor MCP público como conector personalizado en Claude, ChatGPT o cualquier cliente MCP. No hace falta iniciar sesión. Busca inmuebles abiertos y devuelve los motivos, lo que se desconoce y la agencia responsable.

- MCP https://speakingbricks.eu/mcp/public

- Descubrimiento [https://speakingbricks.eu/.well-known/mcp.json](<https://speakingbricks.eu/.well-known/mcp.json>)

listing.searchdatabase.queryproperty.getproperty.compareproperty.verify_availabilityproperty.get_evidenceproperty.contact_representative

Los profesionales verificados usan un token con permisos limitados para consultar solicitudes anónimas de compradores autorizadas y el estado de las conexiones. Las coincidencias semiabiertas exigen un profesional elegible y una solicitud actual de comprador representado. Los inmuebles off-market exclusivos y los borradores están excluidos de todas las herramientas de IA.

- MCP https://speakingbricks.eu/mcp

## Crear una integración.

La API REST pública devuelve las mismas respuestas, con los mismos derechos verificados, que el servidor MCP. Su descripción OpenAPI funciona con GPT Actions y generadores de código.

- OpenAPI [https://speakingbricks.eu/v1/openapi.json](<https://speakingbricks.eu/v1/openapi.json>)

- POST https://speakingbricks.eu/v1/property-searches

- POST https://speakingbricks.eu/v1/database-queries

- GET https://speakingbricks.eu/v1/properties/{id}

- GET https://speakingbricks.eu/v1/properties/{id}/availability

- GET https://speakingbricks.eu/v1/properties/{id}/evidence

- GET https://speakingbricks.eu/v1/properties/{id}/contact-route

Las páginas JSONL firmadas y el feed de cambios con cursor permiten sincronizar datos públicos. Los cambios son actualizaciones observadas, no un historial completo de cada edición. Quien recibe los datos debe volver a comprobar la autorización antes de reutilizarlos.

- JSONL [https://speakingbricks.eu/v1/public-sync/snapshot.jsonl](<https://speakingbricks.eu/v1/public-sync/snapshot.jsonl>)

- Cambios [https://speakingbricks.eu/v1/public-sync/changes](<https://speakingbricks.eu/v1/public-sync/changes>)

- Clave de verificación [https://speakingbricks.eu/v1/public-sync/key.json](<https://speakingbricks.eu/v1/public-sync/key.json>)

## Usarlo desde la página.

Cada página de inmueble abierto ofrece también tres herramientas de solo lectura a los agentes de navegador compatibles con WebMCP: leer el registro, comprobar la disponibilidad y obtener la vía de contacto. Usan la misma API, así que la respuesta es la misma.

## Lo que los clientes públicos nunca reciben.

Las herramientas públicas solo devuelven inmuebles abiertos cuya autorización sigue vigente. La identidad privada de los clientes nunca se expone mediante estas herramientas. Cada verificación indica el rol profesional de quien la comunicó y la fecha; las verificaciones pendientes siguen siendo desconocidas.

## Prueba una integración de lectura

Estos ejemplos usan la demostración ficticia online. No necesitas una cuenta ni una clave de API. Los resultados dependen de los permisos de publicación y de la disponibilidad actuales; el número de coincidencias puede cambiar.

### Buscar por municipio, presupuesto y dormitorios

```
curl --fail-with-body 'https://speakingbricks.eu/v1/property-searches' \
  -H 'Content-Type: application/json' \
  --data '{"municipalities":["Cascais"],"max_price_eur":900000,"min_bedrooms":3,"limit":5}'
```

### Leer el registro y sus verificaciones

```
curl --fail-with-body 'https://speakingbricks.eu/properties/L-DEMO-01.md'
curl --fail-with-body 'https://speakingbricks.eu/v1/properties/L-DEMO-01/evidence'
curl --fail-with-body 'https://speakingbricks.eu/v1/properties/L-DEMO-01/availability'
```

Sustituye L-DEMO-01 por un listing_id devuelto en la búsqueda. Comprueba el rol de quien informó, la fecha, las verificaciones desconocidas y la disponibilidad actual antes de mostrar una respuesta al usuario.

### Mantener actualizada la copia de un socio

```
curl --fail-with-body 'https://speakingbricks.eu/feeds/open-listings.json'
```

Sigue el enlace next del feed para obtener las páginas siguientes. Para la sincronización incremental, usa los endpoints de snapshot firmado y cambios indicados arriba. Aplica los avisos de eliminación, consulta los registros actuales y elimina las copias no disponibles o caducadas. El feed recoge cambios observados; no es un historial completo ni una garantía demostrada de entrega en cinco minutos.

### Python (biblioteca estándar)

```
import json
from urllib.request import Request, urlopen
from urllib.error import HTTPError

filters = json.loads("{\"municipalities\":[\"Cascais\"],\"max_price_eur\":900000,\"min_bedrooms\":3,\"limit\":5}")
request = Request("https://speakingbricks.eu/v1/property-searches",
    data=json.dumps(filters).encode(),
    headers={"Content-Type": "application/json"}, method="POST")
try:
    with urlopen(request, timeout=20) as response:
        result = json.load(response)
except HTTPError as error:
    raise SystemExit(f"Search failed: HTTP {error.code}")
for listing in result["results"]:
    print(listing["listing_id"], listing["price_eur"],
          listing["municipality"], listing["explanation"]["unknown"])
```

### JavaScript (Node.js 24 o módulo del navegador)

```
const response = await fetch("https://speakingbricks.eu/v1/property-searches", {
  method: "POST",
  headers: {"Content-Type": "application/json"},
  body: JSON.stringify({"municipalities":["Cascais"],"max_price_eur":900000,"min_bedrooms":3,"limit":5}),
  signal: AbortSignal.timeout(20000)
});
if (!response.ok) throw new Error(`Search failed: HTTP ${response.status}`);
const result = await response.json();
for (const listing of result.results) {
  console.log(listing.listing_id, listing.price_eur,
    listing.municipality, listing.explanation.unknown);
}
```

### Interpretar la respuesta

results contiene solo coincidencias actuales y permitidas. listing_id identifica el registro; price_eur y beds son datos tipados. explanation separa criterios satisfechos, desconocidos y conflictos; readiness registra el rol de quien informó y las fechas. Una lista results vacía no revela si existen registros restringidos. Consulte el esquema OpenAPI anterior para el contrato completo.

### Autenticación y permisos

La API REST pública y el MCP público no requieren credenciales. La lectura profesional exige un token destinado al MCP profesional, un rol elegible y el contexto de comprador guardado necesario. La demostración usa tokens sintéticos; la activación de Supabase Auth y OAuth en producción sigue pendiente. Nunca incluya claves de servicio en el navegador. Estos ejemplos no acceden a inmuebles restringidos.

### Conectar mediante un cliente MCP

Usa un SDK MCP o un cliente compatible con Streamable HTTP, que gestiona la inicialización y la negociación del protocolo. Usa la cabecera Accept: application/json, text/event-stream; usa Content-Type: application/json en las solicitudes JSON. Un HTTP 202 puede confirmar una notificación; no demuestra que una búsqueda haya terminado.

### Gestionar permisos y errores

Los registros privados o no disponibles no devuelven detalles públicos. Un 404 puede indicar un registro inexistente o que ha dejado de ser público; no deduzcas cuál es el caso. Los filtros inválidos devuelven un error del cliente. Respeta los límites 429 y Retry-After cuando esté presente. Comprueba la disponibilidad al usar los datos; un resultado en caché no es un permiso permanente.

### Conectar la agencia conservando los documentos de sus clientes

El área profesional permite entrada manual, importación CSV y exportaciones limitadas a la agencia. Los documentos y la relación con el cliente permanecen con el profesional. Un conector CRM real necesita un mapeo de campos acordado, reglas de autorización y un proceso de eliminación probado. La sincronización CRM bidireccional automática y las asociaciones colaboradoras no están activas en esta demostración.

### ¿Una IA lo encuentra sin recibir un enlace?

Las páginas y enlaces públicos ayudan al descubrimiento; estas APIs permiten integraciones explícitas. No garantizan la indexación por buscadores ni las citas de asistentes. Mide esos resultados por separado con la inspección de URL y pruebas guardadas sin proporcionar enlaces.

Para IA y desarrolladores
- [Directorio para IA (llms.txt)](<https://speakingbricks.eu/llms.txt>)
- [Inmuebles abiertos (JSON)](<https://speakingbricks.eu/feeds/open-listings.json>)
- [Desarrolladores](<https://speakingbricks.eu/developers>)

[HTML](<https://speakingbricks.eu/developers?lang=es>)
