elefymove

Developer documentation

Guides and reference for the ElefyMove Open API.

Endpoints

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.

How listings work

  • You identify each listing by your own externalId — ElefyMove never asks you to store its internal ids.
  • Content is multilingual: submit any subset of the 9 supported locales, and ElefyMove serves the right language to each visitor.
  • New and updated listings pass moderation before going live. Subscribe to listing.approved / listing.rejected webhooks instead of polling for status.
  • PATCH is a partial update — any field you omit is left unchanged. DELETE unlists (it does not erase history).
  • Add or remove a single photo without a full PATCH round-trip. A photo you submit as a URL is fetched and re-hosted by ElefyMove — your URL is never stored or linked directly.
  • Removing a photo is refused with a MIN_PHOTOS_REQUIRED 400 if it would drop a currently-published listing below the minimum photo count.
  • Listings sourced through the API link back to their canonical page on elefymove.com.

Reference data

These routes need no scope — any valid key can read them. They expose the exact enum, locale, and currency values POST /listings validates against, and the canonical location hierarchy, so you never have to hard-code or guess them:

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.

amenities has no fixed catalog — it is free text validated only by a count and a per-item length limit. GET /reference/amenities returns those limits with an empty values array and freeText: true; do not treat the empty array as "no amenities allowed".