elefymove

Entwicklerdokumentation

Leitfäden und Referenz für die ElefyMove Open API.

Diese Leitfäden sind derzeit nur auf Englisch verfügbar.

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.

MethodeEndpunktScopeFunktion
GET/api/public/v1/listings/{id}/availabilityavailability:readDen zusammengeführten Kalender eines Inserats für einen Zeitraum abrufen — frei, reserviert, gebucht oder gesperrt.
GET/api/public/v1/availabilityavailability:readVerfügbarkeit für bis zu 50 Inserate in einem einzigen Aufruf abrufen. Eine ID, die Ihnen nicht gehört oder nicht existiert, wird in notFound aufgeführt, statt die gesamte Anfrage fehlschlagen zu lassen.
GET/api/public/v1/listings/{id}/blocksavailability:readIhre eigenen aktiven externen Kanalsperren für ein Inserat abrufen, optional eingegrenzt auf einen Zeitraum.
POST/api/public/v1/listings/{id}/blocksavailability:writeEine Sperre aus einem externen Kanal anlegen oder aktualisieren, identifiziert über Ihre eigene Referenz.
POST/api/public/v1/listings/{id}/blocks/batchavailability:writeBis zu 100 externe Kanalsperren für ein Inserat in einem einzigen Aufruf anlegen oder aktualisieren, mit einem Erfolgs-/Fehlerergebnis pro Eintrag.
DELETE/api/public/v1/listings/{id}/blocks/batchavailability:writeBis zu 100 externe Kanalsperren für ein Inserat in einem einzigen Aufruf entfernen, mit einem Erfolgs-/Fehlerergebnis pro Eintrag.
DELETE/api/public/v1/listings/{id}/blocks/{externalRef}availability:writeEine zuvor geschriebene Sperre aus einem externen Kanal entfernen.
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.

MethodeEndpunktScopeFunktion
GET/api/public/v1/holdsholds:writeIhre eigenen Reservierungen auflisten, neueste zuerst. Standardmäßig werden nur aktive angezeigt; mit ?status=all erweitern.
GET/api/public/v1/holds/{id}holds:writeEine eigene Reservierung anhand der ID abrufen.
POST/api/public/v1/listings/{id}/holdsholds:writeEinen Zeitraum reservieren, während der Gast bei Ihnen bezahlt. Die unterlegene Anfrage erhält einen 409 mit SLOT_TAKEN.
POST/api/public/v1/holds/{id}/extendholds:writeDen Ablauf einer Reservierung ab jetzt hinausschieben. Die Gesamtlaufzeit einer Reservierung ist ab ihrer Erstellung auf 30 Minuten begrenzt — eine Verlängerung, die dieses Limit überschreiten würde, wird mit einem 409 abgelehnt.
DELETE/api/public/v1/holds/{id}holds:writeEine eigene Reservierung vor Ablauf freigeben.
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"
}