HOSTED SEARCHBETA

Listings

Send your listings to an index: one at a time, in batches or as a file.

Hosted search and WordPress are in private beta. Your account needs the beta enabled to use these APIs.

Write listings

AuthenticationUse a key with write listings permission: Authorization: Bearer <key>.
Manage API keys
RouteBodyDoes
PUT /api/v1/indexes/{index}/listings/{id}One listingCreates or replaces it
DELETE /api/v1/indexes/{index}/listings/{id}—Unpublishes it
POST /api/v1/indexes/{index}/listings{ "upsert": [...], "remove": [...] }A batch of up to 1,000
GET /api/v1/indexes/{index}/listings/{id}—The stored record and its issues
curl -X PUT https://nabdaq.dev/api/v1/indexes/main-listings/listings/MH-1042 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "purpose": "For Sale",
  "property_type": "Apartment",
  "bedrooms": 2,
  "price": "AED 1.95M",
  "location": [
    "Dubai",
    "Dubai Marina"
  ],
  "lat": 25.0791,
  "lng": 55.1402,
  "title": "Sea view 2 bed in Marina",
  "url": "https://www.agency.ae/listings/mh-1042",
  "image": "https://www.agency.ae/img/mh-1042.jpg",
  "balcony": "yes",
  "revision": 1727340000
}'

What a listing contains

Flat JSON: an id and the filter fields by key, loosely typed. Values can be labels or aliases in English or Arabic ("Flat", "شقة"), amounts as people write them ("AED 1.2M", "١٥٠ ألف"), yes/no as words. Alongside: location, lat/lng, title, title_ar, building, project, reference, url, image, featured, listed_at, updated_at, status and revision.

Nothing is guessed: unknown values and unresolved places come back as warnings, and the rest of the listing is kept. status: "sold", "rented" or "unpublished" removes a listing.

Order and retries

Send revision (a number or your last-modified time): older updates are refused, so a late delivery never overwrites newer data or brings back a removed listing. Idempotency-Key makes a retried request apply once.

Imports

POST /api/v1/indexes/{index}/imports with CSV (text/csv) or JSON. Add ?dry_run=true to preview what would change; the same body without it applies. mode=full (default) treats the file as your whole inventory and unpublishes what is missing, asking for confirm=<import_hash> above 20%; mode=merge only adds and updates. Columns are mapped from common CRM headers; mapping overrides them.

Plan limits

Updates and removals always apply. New listings beyond the plan's limit (plus 10% on paid plans) are held and reported in held, never dropped silently.