Connect your platform to ElefyMove: list properties, sync availability in real time, and never double-book a date.
One integration surface for listings, availability, and real-time sync.
Push multilingual property listings onto ElefyMove. Submit content in any subset of our 9 supported locales — every listing is moderated before it goes live.
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.
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.
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.
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.
Rule zero: every operation is scoped to your own data. There is no cross-partner access, in either direction.
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 keysBy creating an account, you agree to the API Terms of Use.
listings:readlistings:writeavailability:readavailability:writeholds:writewebhooks:managecommunity:readcommunity:writemarketplace:readmarketplace:writeDefault rate limit: 120 requests per minute per key.
Every request is authenticated with an X-Api-Key header carrying your issued key.
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" }
]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" }# Same request, the dates were just taken by another channel
# Response — 409 Conflict
{
"code": "SLOT_TAKEN",
"conflictingState": "HELD",
"wonBy": "external"
}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 documentationThe 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
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
/api/public/v1/listings | listings:write | Submit a new listing for moderation, with content in any of our 9 supported languages. | |
| GET | /api/public/v1/listings | listings:read | List every listing your key owns, with its current moderation status. |
| GET | /api/public/v1/listings/{externalId} | listings:read | Read one of your listings by the external ID you assigned it. |
| PATCH | /api/public/v1/listings/{externalId} | listings:write | Update one of your listings; any field you omit is left unchanged. |
| DELETE | /api/public/v1/listings/{externalId} | listings:write | Unlist one of your listings. |
/api/public/v1/listings/{externalId}/photos | listings:write | Add 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:write | Remove a photo from a listing. Refused with a 400 if it would drop a currently-published listing below the minimum photo count. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| GET | /api/public/v1/locations | Any valid key | Read the canonical province → district → area location tree. |
| GET | /api/public/v1/locations/search | Any valid key | Typeahead search over the canonical location hierarchy. |
| GET | /api/public/v1/reference/property-types | Any valid key | The exact set of property type values a listing accepts. |
| GET | /api/public/v1/reference/amenities | Any valid key | The length and count limits amenities must respect — amenities are free text, not a fixed catalog. |
| GET | /api/public/v1/reference/locales | Any valid key | The exact set of locale codes a listing's translations accept. |
| GET | /api/public/v1/reference/currencies | Any valid key | The currency a listing's price is denominated in. ElefyMove is Thailand-only, so this is always THB. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| GET | /api/public/v1/listings/{id}/availability | availability:read | Read a listing's unified calendar over a date range — available, held, booked, or blocked. |
| GET | /api/public/v1/availability | availability:read | Read 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}/blocks | availability:read | Read your own active external-channel blocks for a listing, optionally narrowed to a date range. |
/api/public/v1/listings/{id}/blocks | availability:write | Create or update an external-channel block, identified by your own reference. | |
/api/public/v1/listings/{id}/blocks/batch | availability:write | Create 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/batch | availability:write | Remove 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:write | Remove an external-channel block you previously wrote. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| GET | /api/public/v1/holds | holds:write | List your own holds, newest first. Defaults to active holds only; widen the filter with ?status=all. |
| GET | /api/public/v1/holds/{id} | holds:write | Read one of your holds by id. |
/api/public/v1/listings/{id}/holds | holds:write | Hold a date range while a guest completes checkout on your side. The losing request gets a 409 carrying SLOT_TAKEN. | |
/api/public/v1/holds/{id}/extend | holds:write | Push 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:write | Release one of your holds before it expires. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| GET | /api/public/v1/listings/{id}/calendar.ics | Signed URL, no key | Download 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-sources | availability:write | Register or replace the inbound iCal feed ElefyMove polls for one of your listings. |
| GET | /api/public/v1/listings/{id}/ical-sources | availability:read | Read the registered feed for a listing, with its polling status and last error. |
| DELETE | /api/public/v1/listings/{id}/ical-sources | availability:write | Stop polling and delete the registered feed for a listing. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| PUT | /api/public/v1/webhooks | webhooks:manage | Set your webhook endpoint URL and, optionally, replace your event subscription list. |
| GET | /api/public/v1/webhooks | webhooks:manage | Read your current webhook configuration. Never returns the signing secret. |
| DELETE | /api/public/v1/webhooks | webhooks:manage | Clear your webhook URL and stop deliveries. |
/api/public/v1/webhooks/test | webhooks:manage | Send a signed test ping to your configured endpoint, regardless of your event subscription. | |
| GET | /api/public/v1/webhook-deliveries | webhooks:manage | List your own webhook delivery attempts, with status, timestamps, and retry history. |
/api/public/v1/webhook-deliveries/{id}/redeliver | webhooks:manage | Manually retry a failed or dead-lettered delivery. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
/api/public/v1/community/posts | community:write | Submit a community post. Every partner-created post enters moderation and does not publish instantly. | |
| GET | /api/public/v1/community/posts | community:read | List your own community posts and their moderation status. |
| GET | /api/public/v1/community/posts/{externalId} | community:read | Read one of your community posts by the external ID you assigned it. |
| PATCH | /api/public/v1/community/posts/{externalId} | community:write | Update one of your community posts; any field you omit is left unchanged. |
| DELETE | /api/public/v1/community/posts/{externalId} | community:write | Unpublish one of your community posts. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| GET | /api/public/v1/marketplace/bookings | marketplace:read | List your own marketplace bookings, paginated and filtered. Responses carry dates and references only. |
| GET | /api/public/v1/marketplace/bookings/{id} | marketplace:read | Read one of your marketplace bookings by id. |
/api/public/v1/marketplace/bookings/{id}/decline | marketplace:write | Decline a booking that is still awaiting payment. There is no confirm route — a booking is confirmed when payment is captured, not by provider approval. |
| Method | Endpoint | Scope | What it does |
|---|---|---|---|
| GET | /api/public/v1/ping | Any valid key | Check that your key works and read back the client name and scopes attached to it. |
| GET | /api/public/v1/me | Any valid key | Read your API client's own identity — name, environment, and the scopes attached to your key. |
Open API v1 — currently onboarding integration partners.