elefymove

Build with ElefyMove

Connect your platform to ElefyMove: list properties, sync availability in real time, and never double-book a date.

What the API does

One integration surface for listings, availability, and real-time sync.

Listings API

Push multilingual property listings onto ElefyMove. Submit content in any subset of our 9 supported locales — every listing is moderated before it goes live.

Availability sync

ElefyMove's master calendar is the single source of truth for anything bookable. Every date range carries a state — available, held, booked, or blocked — and turnover buffers are enforced centrally so no channel can double-book.

Temporary holds

Place a short-lived hold, up to 10 minutes, while a guest completes checkout on your side. Conflicts resolve first-come-first-served, with a machine-readable 409 response for the losing request.

Webhooks

Subscribe to HMAC-SHA256-signed events for listing approvals, availability changes, hold lifecycle, and booking status, delivered near real time. Payloads carry dates and references only — never guest personal data.

iCal sync

Every listing exports a signed iCal feed, and ElefyMove can poll your feed URL in return, so external blocks stay reflected on both sides without writing any integration code.

What partners can — and can't — do

Rule zero: every operation is scoped to your own data. There is no cross-partner access, in either direction.

You can

  • Create, update, and unlist your own property listings, in any of our 9 languages
  • Read your own listings and their moderation status
  • Read availability for your own listings, and write external-channel blocks with a reference
  • Place and release temporary holds, up to 10 minutes, during your checkout
  • Register webhooks and receive signed events — dates and references only
  • Export listing calendars (iCal) and register your own iCal feeds
  • Read the public location hierarchy
  • Publish community posts, subject to ElefyMove moderation before they go live
  • Read your own marketplace bookings, and decline the ones still awaiting payment

You can't

  • Move any payment, refund, or deposit through this API
  • Create ElefyMove bookings or contracts — external bookings enter only as a calendar block
  • Send or receive guest or tenant personal data
  • Access or modify any other partner's listings, holds, blocks, or configuration
  • Message, contact, or solicit ElefyMove users
  • Read or republish listings you don't own
  • Exceed rate limits, share keys, or automate account creation

Getting access

Create a developer account, verify your email, and issue your own test API keys right from the dashboard. Live keys are created by the landlord in the ElefyMove back office.

Create your API keys

By creating an account, you agree to the API Terms of Use.

Available scopes

listings:readlistings:writeavailability:readavailability:writeholds:writewebhooks:managecommunity:readcommunity:writemarketplace:readmarketplace:write

Default rate limit: 120 requests per minute per key.

Quick start

Every request is authenticated with an X-Api-Key header carrying your issued key.

Check availability for a listing

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" }
]

Place a temporary hold

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" }

A losing request gets a machine-readable 409

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

Full API reference

Every request and response schema, error shape, and example lives in the interactive OpenAPI reference — try any endpoint live with your own key.

Open API DocsBrowse the full documentation

Every endpoint at a glance

The complete Open API v1 surface. Every request carries your key in an X-Api-Key header, and every route reaches your own data only.

Base URL https://elefymove.com

Listings

MethodEndpointScopeWhat it does
POST/api/public/v1/listingslistings:writeSubmit a new listing for moderation, with content in any of our 9 supported languages.
GET/api/public/v1/listingslistings:readList every listing your key owns, with its current moderation status.
GET/api/public/v1/listings/{externalId}listings:readRead one of your listings by the external ID you assigned it.
PATCH/api/public/v1/listings/{externalId}listings:writeUpdate one of your listings; any field you omit is left unchanged.
DELETE/api/public/v1/listings/{externalId}listings:writeUnlist one of your listings.
POST/api/public/v1/listings/{externalId}/photoslistings:writeAdd one photo to a listing without a full update. The image is fetched and re-hosted by ElefyMove — your URL is never stored directly.
DELETE/api/public/v1/listings/{externalId}/photos/{photoId}listings:writeRemove a photo from a listing. Refused with a 400 if it would drop a currently-published listing below the minimum photo count.

Reference data

MethodEndpointScopeWhat it does
GET/api/public/v1/locationsAny valid keyRead the canonical province → district → area location tree.
GET/api/public/v1/locations/searchAny valid keyTypeahead search over the canonical location hierarchy.
GET/api/public/v1/reference/property-typesAny valid keyThe exact set of property type values a listing accepts.
GET/api/public/v1/reference/amenitiesAny valid keyThe length and count limits amenities must respect — amenities are free text, not a fixed catalog.
GET/api/public/v1/reference/localesAny valid keyThe exact set of locale codes a listing's translations accept.
GET/api/public/v1/reference/currenciesAny valid keyThe currency a listing's price is denominated in. ElefyMove is Thailand-only, so this is always THB.

Availability & blocks

MethodEndpointScopeWhat it does
GET/api/public/v1/listings/{id}/availabilityavailability:readRead a listing's unified calendar over a date range — available, held, booked, or blocked.
GET/api/public/v1/availabilityavailability:readRead availability across up to 50 listings in one call. An id you don't own or that doesn't exist is listed under notFound instead of failing the request.
GET/api/public/v1/listings/{id}/blocksavailability:readRead your own active external-channel blocks for a listing, optionally narrowed to a date range.
POST/api/public/v1/listings/{id}/blocksavailability:writeCreate or update an external-channel block, identified by your own reference.
POST/api/public/v1/listings/{id}/blocks/batchavailability:writeCreate or update up to 100 external-channel blocks on one listing in a single call, with a pass/fail result per item.
DELETE/api/public/v1/listings/{id}/blocks/batchavailability:writeRemove up to 100 external-channel blocks on one listing in a single call, with a pass/fail result per item.
DELETE/api/public/v1/listings/{id}/blocks/{externalRef}availability:writeRemove an external-channel block you previously wrote.

Holds

MethodEndpointScopeWhat it does
GET/api/public/v1/holdsholds:writeList your own holds, newest first. Defaults to active holds only; widen the filter with ?status=all.
GET/api/public/v1/holds/{id}holds:writeRead one of your holds by id.
POST/api/public/v1/listings/{id}/holdsholds:writeHold a date range while a guest completes checkout on your side. The losing request gets a 409 carrying SLOT_TAKEN.
POST/api/public/v1/holds/{id}/extendholds:writePush a hold's expiry further out from now. A hold's total lifetime is capped at 30 minutes from creation — an extension that would cross that cap is refused with a 409.
DELETE/api/public/v1/holds/{id}holds:writeRelease one of your holds before it expires.

Calendar sync (iCal)

MethodEndpointScopeWhat it does
GET/api/public/v1/listings/{id}/calendar.icsSigned URL, no keyDownload a listing's calendar as an iCal feed. The signed token in the URL is the authentication, so calendar apps can subscribe directly.
PUT/api/public/v1/listings/{id}/ical-sourcesavailability:writeRegister or replace the inbound iCal feed ElefyMove polls for one of your listings.
GET/api/public/v1/listings/{id}/ical-sourcesavailability:readRead the registered feed for a listing, with its polling status and last error.
DELETE/api/public/v1/listings/{id}/ical-sourcesavailability:writeStop polling and delete the registered feed for a listing.

Webhooks

MethodEndpointScopeWhat it does
PUT/api/public/v1/webhookswebhooks:manageSet your webhook endpoint URL and, optionally, replace your event subscription list.
GET/api/public/v1/webhookswebhooks:manageRead your current webhook configuration. Never returns the signing secret.
DELETE/api/public/v1/webhookswebhooks:manageClear your webhook URL and stop deliveries.
POST/api/public/v1/webhooks/testwebhooks:manageSend a signed test ping to your configured endpoint, regardless of your event subscription.
GET/api/public/v1/webhook-deliverieswebhooks:manageList your own webhook delivery attempts, with status, timestamps, and retry history.
POST/api/public/v1/webhook-deliveries/{id}/redeliverwebhooks:manageManually retry a failed or dead-lettered delivery.

Community posts

MethodEndpointScopeWhat it does
POST/api/public/v1/community/postscommunity:writeSubmit a community post. Every partner-created post enters moderation and does not publish instantly.
GET/api/public/v1/community/postscommunity:readList your own community posts and their moderation status.
GET/api/public/v1/community/posts/{externalId}community:readRead one of your community posts by the external ID you assigned it.
PATCH/api/public/v1/community/posts/{externalId}community:writeUpdate one of your community posts; any field you omit is left unchanged.
DELETE/api/public/v1/community/posts/{externalId}community:writeUnpublish one of your community posts.

Marketplace bookings

MethodEndpointScopeWhat it does
GET/api/public/v1/marketplace/bookingsmarketplace:readList your own marketplace bookings, paginated and filtered. Responses carry dates and references only.
GET/api/public/v1/marketplace/bookings/{id}marketplace:readRead one of your marketplace bookings by id.
POST/api/public/v1/marketplace/bookings/{id}/declinemarketplace:writeDecline a booking that is still awaiting payment. There is no confirm route — a booking is confirmed when payment is captured, not by provider approval.

Meta

MethodEndpointScopeWhat it does
GET/api/public/v1/pingAny valid keyCheck that your key works and read back the client name and scopes attached to it.
GET/api/public/v1/meAny valid keyRead your API client's own identity — name, environment, and the scopes attached to your key.

Data & fair use

  • No guest personal data crosses the API — external blocks carry dates and a reference only, in line with Thailand's PDPA.
  • Listings sourced through the API link back to their canonical page on elefymove.com.
  • Keys are scoped, and the ElefyMove team can revoke one at any time.

Open API v1 — currently onboarding integration partners.