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개 매물의 예약 가능 여부를 조회합니다. 소유하지 않았거나 존재하지 않는 ID는 요청 전체를 실패시키지 않고 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:writeID로 본인 홀드 하나를 조회합니다.
POST/api/public/v1/listings/{id}/holdsholds:write고객이 파트너 사이트에서 결제하는 동안 기간을 임시로 잡아 둡니다. 경합에서 밀린 요청에는 SLOT_TAKEN이 담긴 409가 반환됩니다.
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"
}