elefymove

Documentación para desarrolladores

Guías y referencia de la Open API de ElefyMove.

Estas guías están disponibles actualmente solo en inglés.

The master calendar

ElefyMove’s calendar is the single source of truth for anything bookable. Every date range carries a state — AVAILABLE, HELD, BOOKED, or BLOCKED — and conflicts resolve first-come-first-served across every channel.

MétodoEndpointÁmbitoQué hace
GET/api/public/v1/listings/{id}/availabilityavailability:readConsulta el calendario unificado de un anuncio en un rango de fechas: disponible, retenido, reservado o bloqueado.
GET/api/public/v1/availabilityavailability:readConsulta la disponibilidad de hasta 50 anuncios en una sola llamada. Un ID que no te pertenece o que no existe se incluye en notFound en lugar de hacer fallar toda la solicitud.
GET/api/public/v1/listings/{id}/blocksavailability:readConsulta tus propios bloqueos de canal externo activos para un anuncio, opcionalmente acotados a un rango de fechas.
POST/api/public/v1/listings/{id}/blocksavailability:writeCrea o actualiza un bloqueo de canal externo identificado con tu propia referencia.
POST/api/public/v1/listings/{id}/blocks/batchavailability:writeCrea o actualiza hasta 100 bloqueos de canal externo en un mismo anuncio en una sola llamada, con un resultado de éxito/fallo por elemento.
DELETE/api/public/v1/listings/{id}/blocks/batchavailability:writeElimina hasta 100 bloqueos de canal externo en un mismo anuncio en una sola llamada, con un resultado de éxito/fallo por elemento.
DELETE/api/public/v1/listings/{id}/blocks/{externalRef}availability:writeElimina un bloqueo de canal externo que hayas creado.
curl "https://elefymove.com/api/public/v1/listings/{listingId}/availability?from=2026-09-01&to=2026-09-30" \
  -H "X-Api-Key: efy_live_xxxxxxxxxxxxxxxxxxxxxxxx"

# Response — 200 OK
[
  { "from": "2026-09-01", "to": "2026-09-14", "state": "AVAILABLE" },
  { "from": "2026-09-15", "to": "2026-09-20", "state": "BLOCKED", "source": "partner-site", "externalRef": "HMXYZ123" },
  { "from": "2026-09-21", "to": "2026-09-30", "state": "AVAILABLE" }
]

Syncing a whole portfolio? GET /availability reads up to 50 listings in one call — pass their ids as a comma-separated listingIds. An id you don't own or that doesn't exist is folded into the response's notFound array rather than failing the whole request.

External blocks

When a stay is booked on your own platform, write a block carrying your reference. Blocks are dates + a reference only — no guest personal data crosses the API. GET /listings/:id/blocks reads your own active blocks back, optionally narrowed by from/to.

The batch endpoints write or delete up to 100 blocks on one listing in a single call. Each block gets its own result — check every item in the response rather than assuming the whole batch landed; one bad date range never rolls back the others.

Temporary holds

Place a short-lived hold (up to 10 minutes per call) while a guest completes checkout on your side, then either confirm it into a block or release it early. Not ready in time? POST /holds/:id/extend re-arms the expiry — but a hold's total lifetime, measured from when it was created (not from the extension), is capped at 30 minutes. An extension that would cross that cap is refused with a 409, so extending repeatedly cannot hold inventory indefinitely.

MétodoEndpointÁmbitoQué hace
GET/api/public/v1/holdsholds:writeLista tus propias retenciones, de más reciente a más antigua. Por defecto muestra solo las activas; amplía con ?status=all.
GET/api/public/v1/holds/{id}holds:writeConsulta una de tus retenciones por ID.
POST/api/public/v1/listings/{id}/holdsholds:writeRetén un rango de fechas mientras el huésped completa el pago en tu plataforma. La petición perdedora recibe un 409 con SLOT_TAKEN.
POST/api/public/v1/holds/{id}/extendholds:writeAmplía la caducidad de una retención a partir de ahora. La duración total de una retención está limitada a 30 minutos desde su creación — una ampliación que supere ese límite se rechaza con un 409.
DELETE/api/public/v1/holds/{id}holds:writeLibera una de tus retenciones antes de que caduque.
curl -X POST "https://elefymove.com/api/public/v1/listings/{listingId}/holds" \
  -H "X-Api-Key: efy_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"from": "2026-09-15", "to": "2026-09-20", "ttlSeconds": 300}'

# Response — 201 Created
{ "holdId": "hld_9f3a2c1b", "expiresAt": "2026-08-13T10:15:00Z" }

Losing a conflict

If another channel takes the dates first, the losing request gets a machine-readable 409 — surface it to your guest and refresh availability:

# Same request, the dates were just taken by another channel
# Response — 409 Conflict
{
  "code": "SLOT_TAKEN",
  "conflictingState": "HELD",
  "wonBy": "external"
}