Nivel 1 · Conectado
Publica tus centros
Los datos de cada centro, lo que comprobamos, la revisión y la lista de cada día.
Cada centro se manda entero, con su identificador en tu software. Si ya existe, se pone al día; si no, se da de alta. Puedes repetir un envío las veces que haga falta: con la misma Idempotency-Key, la respuesta es la misma.
1. Manda el centro
PUT /connect/v1/facilities/madrid-01
Authorization: Bearer <token>
Idempotency-Key: 5b1d0c3e-8f6a-4c2e-9d1b-7a0e2f4c6b11
Content-Type: application/json
{
"version": "2026-10-26T08:15:00Z",
"name": "Trasteros Serrano Salamanca",
"address": {
"street": "Calle de Serrano 120",
"postalCode": "28006",
"city": "Madrid",
"province": "Madrid",
"country": "ES"
},
"location": { "lat": 40.4365, "lng": -3.6862 },
"openingHours": { "kind": "daily", "opens": "07:00", "closes": "22:00" },
"leadsEmail": "avisos@trasteros-serrano.example.com",
"pricesIncludeVat": true,
"policies": { "depositMonths": 1 }
}| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
version | texto | Sí | Cambia cuando cambia algo de estos datos (vale su updatedAt) |
name | texto | Sí | El nombre comercial: ni una dirección ni solo la ciudad |
address | {street, postalCode, city, province, country} | Sí | La ciudad y la provincia, con su nombre entero. country: ES |
location | {lat, lng} | Sí | En WGS 84, a menos de 1 km de donde cae su dirección |
openingHours | horario | Sí | {"kind": "always"}, {"kind": "daily", "opens", "closes"} o {"kind": "weekly", "days": {"mon": [{"opens", "closes"}], …}} |
leadsEmail | correo | Sí | Para las solicitudes que la gestora quiera en su correo. Nunca sale en el portal |
pricesIncludeVat | sí o no | Sí | Si los precios de sus trasteros llevan el IVA |
policies | {depositMonths, minimumStayMonths} | Sí | La fianza, en mensualidades (0: sin fianza), y la permanencia, en meses |
accessMethods | lista | No | app, pin, qr, key, remote o card |
amenities | lista | No | cctv, alarm, trolleys, groundFloor, loadingAtDoor, lift, parking o climateControl |
description | {es, en, fr, de, it, pt} | No | Al menos en un idioma: lo que falte lo traduce el portal, y lo dice |
openedOn | fecha | No | Cuándo abrió: «Centro nuevo» durante 180 días |
opensOn | mes | No | Si aún no ha abierto: «Abre en marzo de 2027» y «Avísame cuando abra» |
2. Mira lo que responde
La respuesta es cómo queda el centro: su status, la dirección de su ficha cuando está publicado y sus warnings, lo que no impide publicarlo pero conviene arreglar.
{
"id": "madrid-01",
"status": "in_review",
"listing": null,
"reasons": [],
"message": null,
"warnings": [
{ "code": "few_photos", "message": "Tiene 0 fotos: con tres o más, la ficha se ve mucho mejor." }
],
"updatedAt": "2026-10-26T08:15:02Z"
}status | Qué quiere decir |
|---|---|
pending_link | Se parece a uno que la gestora ya tenía en Qbox. Espera a que ella diga si es el mismo |
in_review | Es nuevo: el equipo lo revisa antes de publicarlo, como los que se dan de alta en Qbox. Te avisa facility.reviewed |
published | Está en el portal. Desde ahora, cada cambio sale al momento |
returned | El equipo lo ha devuelto, con sus motivos. Corrígelo y vuelve a mandarlo |
withdrawn | No está en el portal: lo quitaste, no vino en la lista del día, la gestora retiró el permiso o lo retiró el equipo |
3. Si falta algo
No se publica nada a medias: la respuesta es un 422 con cada campo que falla y por qué. Si el centro ya estaba publicado, sigue con sus últimos datos buenos. Todo queda en el registro de tu área durante 30 días.
{
"error": {
"code": "invalid_facility",
"message": "El centro no se publica: revisa estos campos.",
"fields": [
{ "path": "address.postalCode", "code": "invalid_postal_code",
"message": "«03203» no es un código postal de Madrid." },
{ "path": "name", "code": "name_is_address",
"message": "El nombre es una dirección o solo la ciudad: pon el nombre comercial del centro." }
]
}
}Lo que comprobamos
code | Qué falla |
|---|---|
required | Falta un campo obligatorio |
invalid_format | Un campo no tiene su formato: un correo, una fecha, un color… |
invalid_postal_code | El código postal no es de su país o no es de su provincia |
unknown_city | La ciudad no es un municipio de su provincia |
location_far | El punto está a más de 1 km de donde cae su dirección |
name_is_address | El nombre es una dirección o solo la ciudad |
invalid_price | Un precio menor que cero o que no es razonable |
duplicate_id | Dos tamaños, trasteros, plantas o fotos con el mismo id |
unknown_unit_type | Un trastero con un unitTypeId que no es de sus tamaños |
unknown_floor | Un trastero con un floorId que no es de su plano |
invalid_svg | El plano no pasa la limpieza |
unknown_unit_in_plan | Una forma del plano con un data-unit-id que no es de ningún trastero |
invalid_photo | La foto no es JPEG, PNG o WebP, o es demasiado pequeña |
Y lo que no impide publicar (warnings): few_photos (menos de tres), no_description y unit_not_in_plan (un trastero sin su forma en el plano).
Si la gestora ya lo tenía en Qbox
Si el centro cae a menos de 150 metros de uno que la gestora ya tiene en Qbox, o en su misma calle y su mismo código postal, queda en pending_link. En «Conecta tu software», ella dice si es el mismo (sigue publicado, ahora con tus datos) o es otro (se revisa como uno nuevo). Te llega el aviso facility.linked.
La lista de cada día
Al menos una vez al día, PUT /facilities con todos los centros de la gestora: el id de cada uno y, si quieres, sus versiones (facility, unitTypes, units, floorPlan y photos).
- Un centro que no esté en la lista se retira del portal. Vuelve si reaparece.
- Si mandas las versiones, la respuesta dice qué tenemos atrasado (
outdated) para que lo vuelvas a mandar.
{
"facilities": [
{ "id": "madrid-01", "versions": { "facility": "2026-10-26T08:15:00Z", "units": "2026-10-26T09:02:11Z" } },
{ "id": "madrid-02" }
]
}Quitar un centro
DELETE /facilities/{facilityId} lo quita del portal. GET /facilities/{facilityId} dice cómo está en cada momento.