elefymove

Документация для разработчиков

Руководства и справочник по ElefyMove Open API.

Эти руководства пока доступны только на английском языке.

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.

МетодЭндпоинтОбласть доступаНазначение
GET/api/public/v1/listings/{id}/availabilityavailability:readПолучить сводный календарь объявления за период — свободно, придержано, забронировано или заблокировано.
GET/api/public/v1/availabilityavailability:readПолучить доступность сразу для 50 объявлений за один вызов. Идентификатор, который вам не принадлежит или не существует, попадает в notFound, а не приводит к отказу всего запроса.
GET/api/public/v1/listings/{id}/blocksavailability:readПолучить собственные активные блокировки внешнего канала для объявления, при необходимости с ограничением по датам.
POST/api/public/v1/listings/{id}/blocksavailability:writeСоздать или обновить блокировку внешнего канала с вашим собственным идентификатором.
POST/api/public/v1/listings/{id}/blocks/batchavailability:writeСоздать или обновить до 100 блокировок внешнего канала для одного объявления за один вызов, с отдельным результатом успех/ошибка по каждой записи.
DELETE/api/public/v1/listings/{id}/blocks/batchavailability:writeУдалить до 100 блокировок внешнего канала для одного объявления за один вызов, с отдельным результатом успех/ошибка по каждой записи.
DELETE/api/public/v1/listings/{id}/blocks/{externalRef}availability:writeУдалить ранее созданную блокировку внешнего канала.
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.

МетодЭндпоинтОбласть доступаНазначение
GET/api/public/v1/holdsholds:writeПолучить список собственных броней, сначала новые. По умолчанию показываются только активные; расширить можно с помощью ?status=all.
GET/api/public/v1/holds/{id}holds:writeПолучить одну из своих броней по идентификатору.
POST/api/public/v1/listings/{id}/holdsholds:writeПридержать даты, пока гость оформляет оплату на вашей стороне. Проигравший запрос получает 409 с кодом SLOT_TAKEN.
POST/api/public/v1/holds/{id}/extendholds:writeПродлить срок действия брони, отсчитывая от текущего момента. Общий срок жизни брони ограничен 30 минутами с момента создания — продление, которое превысило бы этот лимит, отклоняется с кодом 409.
DELETE/api/public/v1/holds/{id}holds:writeСнять свою временную бронь до истечения срока.
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"
}