4Sale API

Search Kuwait's biggest classifieds site, then read any advert in full

4Sale (q84sale.com) is where Kuwait buys and sells almost everything, and this API reads it as JSON.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a 4Sale endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
4
/q84sale/v1

8 active endpoints, on 1 and 2 credit tiers.

  • POST/q84sale/v1/search
  • POST/q84sale/v1/category_listings
  • POST/q84sale/v1/listing
  • POST/q84sale/v1/category_attributes
  • POST/q84sale/v1/category_path
  • POST/q84sale/v1/suggest
  • POST/q84sale/v1/districts
  • +1 more

What 4Sale endpoints does ReefAPI ship?

8 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

8 endpoints

search

2 cr

Keyword search across every 4Sale vertical.

required
query
optional
category_id, sort, page, limit, lang, include_pii

category_listings

2 cr

Browse one 4Sale category end to end, newest-first or by price.

required
category_id
optional
sort, page, limit, lang, include_pii

listing

2 cr

One listing in full.

required
—
optional
id, url, include_attributes, lang, include_pii

category_attributes

1 cr

The filter attributes 4Sale defines for one category, with every drop-down option.

required
category_id
optional
filterable_only, lang

category_path

1 cr

A category's ancestor chain in both languages.

required
category_id
optional
lang

suggest

1 cr

4Sale's own search autocomplete.

required
query
optional
lang

districts

1 cr

Kuwait's geography as 4Sale publishes it.

required
—
optional
district_id, lang

trending

1 cr

The search terms 4Sale is promoting as trending right now, in Arabic and English.

required
—
optional
lang

Every parameter, every allowed value →

4Sale API

6 of 8 endpoints, ready to run

View docs ↗

Search every 4Sale vertical at once

2 credits1 required · 3 optional
POST/q84sale/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the 4Sale API works

4Sale is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /q84sale/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From a keyword to a priced, decoded Kuwaiti market feed

Resolve the word to a category, page that category instead of the keyword, then decode the attributes once for the whole feed.

01suggest?query=camry
GET/q84sale/v1/suggest?query=camry

4Sale answers with the keyword it recognises and the category it maps it to - here Used Cars, category_id 2897.

02category_listings?category_id=2897&sort=newest&limit=30
GET/q84sale/v1/category_listings?category_id=2897&sort=newest&limit=30

The full used-car feed, newest first. Read total_pages for the real end and keep listings[].id, price and attributes_raw. Promoted adverts arrive separately in paid_placements.

03category_attributes?category_id=2897
GET/q84sale/v1/category_attributes?category_id=2897

Fetch the dictionary once: 42 attributes with every drop-down option, so attributes_raw option ids become Year 2019, Mileage 66 Km-thousands, Colour Blue across the whole feed.

04listing?id=21238153
GET/q84sale/v1/listing?id=21238153

Follow any id for the complete description, the full image set, the category breadcrumb, the view count and the attributes already decoded.

A dated, priced feed of Kuwaiti adverts in KWD with structured car and property attributes, the seller's original Arabic text and its English translation, and advertising separated from organic results.

request
curl -X POST https://api.reefapi.com/q84sale/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"camry","limit":20,"lang":"en"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "q84sale",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

What a 4Sale field actually contains

Six fields that read the opposite of how they look. Every row was measured against live 4Sale responses on 2026-10-06.

FieldWhat it holds
descriptionThe seller's own words, in the language they wrote them (usually Arabic). description_translated is 4Sale's translation. description_ar and description_en are the same two strings sorted by the script they are actually written in - never by a label.
priceA whole number of Kuwaiti dinars, or null. Null means the seller published no price at all, which is normal on services, jobs and pet adverts: 240 of 305 sampled rows carried a price. A price is never reported as 0.
published_at vs bumped_atpublished_at is when the advert first went up; bumped_at is the last time the seller refreshed it to the top. Sorting by newest uses the bump.
attributes_raw vs attributesattributes_raw is 4Sale's own [{attribute_id, value}] where a value can be an option id (year 2019 arrives as 997). The listing endpoint returns them already decoded as attributes[]; category_attributes gives you the dictionary to decode a whole feed yourself.
listings vs paid_placementslistings holds the organic results. Promoted, pinned and 'golden pin' adverts 4Sale puts above them are returned separately in paid_placements, so a market count is never inflated by advertising.
seller_name / seller_phone4Sale publishes a phone number on every advert. We withhold the seller's name and number by default and set pii_withheld: true; ask for them explicitly to receive them. seller_id and seller_is_business are always returned.

Deliberate gaps, measured: 4Sale publishes no coordinates and no seller rating, there is no public 'all adverts by this seller' endpoint, and a category feed ignores a free-text query - use search for keywords. total_pages is the real last page; asking past it returns zero rows rather than repeating the last one.

Kuwait coverage, measured

Every number below was read from live 4Sale responses on 2026-10-06; two consecutive runs of 36 calls agreed.

Market

Kuwait only, one region, prices in KWD as whole dinars. All 14 verticals: automotive, property, electronics, contracting, services, camping, sports, animals, family, gifts, furniture, jobs, education, others.

Live volume

Used cars 12,611 adverts; property 3,956; electronics 5,342; property to rent 2,721; services 2,167; furniture 1,747; animals 1,569; camping 803; jobs 704; spare parts 588; mobile phones 515.

Search depth

Arabic Land Cruiser 1,825 hits, camry 1,475, iphone 1,432, Arabic 'flat to rent' 3,823. total_pages is the true last page - page 288 of a 287-page result returns zero rows, never a repeat. Unknown terms return 0 rows honestly.

Field fill

Across 305 sampled rows: id, url, title, description, category, publish time and image 305/305; district name 280/305; price 240/305; structured attributes 141/305. Price and attributes are absent where 4Sale itself omits them - used cars, phones and spare parts were 10/10 priced, services 3/10.

Both languages

Every listing arrives as the seller's original text plus 4Sale's translation, each labelled with the script it is actually written in. Category, district and attribute labels come in Arabic and English.

Identity

Search to detail round-trips on the same integer id and the same title, 10/10. Prices matched 4Sale's own rendered advert page 8/8.

Exclusions

No map coordinates, no seller rating, no 'all adverts by one seller' endpoint, no district filter on search, and no free-text query on a category feed. Seller name and phone are withheld unless you ask for personal data.

What people build with 4Sale

The jobs this data is most often used for.

8

endpoints

1/2

credits per call

01

Track the Kuwaiti used-car market daily: walk category 2897 newest-first and keep id, price, year, mileage and colour from the decoded attributes.

02

Build a Kuwait rental-price index by paging property-for-rent (808) and grouping the KWD prices by district id.

03

Watch resale prices for one phone model: search the Arabic and Latin spellings, then follow each id to its listing for the full description and image set.

04

Feed a Gulf lead-generation pipeline with fresh adverts in one category, requesting seller contact only for the rows you actually act on.

What 4Sale data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 438 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/q84sale/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"camry","limit":20,"lang":"en"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/q84sale/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "camry",
  "limit": 20,
  "lang": "en"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up 4Sale.

Get a free key →
Do I need an account or a Kuwaiti IP to use the 4Sale API?▾

No. Every endpoint is read without an account, a login or a cookie, and the API handles access for you - you call reefapi.com from anywhere.

Should I search in Arabic or English?▾

Arabic finds more, because that is what Kuwaiti sellers type. Measured on 2026-10-06: the Arabic spelling of Land Cruiser returned 1,825 listings, `camry` 1,475 and `iphone` 1,432. Latin brand names still work because sellers mix them into Arabic titles. An unknown term honestly returns zero rows instead of a padded page.

Why is price null on some 4Sale listings?▾

Because the seller published none. 4Sale omits the price entirely on ask-for-price adverts, which is common in services, jobs and pets. Across 305 sampled rows 240 carried a price; in used cars, phones and spare parts it was 10 out of 10. We return null rather than 0 so you can tell 'no price' from 'free'.

What are the 14 verticals and how do I browse one?▾

Automotive, Property, Electronics, Contracting, Services, Camping, Sports, Animals, Family, Gifts, Furniture, Jobs, Education and Others. Pass the vertical slug or any category id to category_listings - for example category_id 2897 for used cars (12,611 live adverts on 2026-10-06), 808 for property to rent (2,721), 99 for mobile phones (515).

How do I get from a keyword to a category id?▾

Call suggest with the word. 4Sale answers with the keywords it recognises and the category it maps each one to, plus the filters it would pre-apply - `camry` resolves to the Used Cars category with the Toyota Camry filters attached. category_path then walks any id up to its vertical in both languages.

Can I get the seller's phone number?▾

4Sale publishes one on every advert, and the API returns it when you explicitly ask for personal data. By default the seller's name and number are withheld and the response says pii_withheld: true, so nothing personal reaches your logs by accident.

How deep can I page through 4Sale results?▾

As deep as 4Sale itself goes. total_pages is the real last page: a 1,433-hit query at 5 rows per page reported 287 pages, page 287 returned the last 3 rows and page 288 returned none. The last page is never silently repeated, so a crawl terminates.

What does 4Sale not publish?▾

No map coordinates, no seller rating, no view count outside the listing endpoint, and no public endpoint for every advert by one seller. Those come back as null or are simply absent rather than guessed.

What is the 4Sale API?▾

4Sale API is a ReefAPI endpoint group for kuwait's biggest classifieds: cars, property, phones, furniture, jobs and services in kwd, arabic and english. It returns live JSON through POST requests under /q84sale/v1.

Is the 4Sale API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. 4Sale calls use the same shared credit balance as every other ReefAPI engine.

Do I need a 4Sale login or account?▾

No login to 4Sale is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the 4Sale data?▾

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the 4Sale API use?▾

4Sale actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call 4Sale from an AI assistant or MCP client?▾

Yes. Connect ReefAPI once through MCP and your assistant can call q84sale actions with the same key, credit pool and JSON envelope used by normal REST requests.

99 Classifieds & Second-hand APIs on the same key

One key, one credit pool, one response envelope. If you are pulling 4Sale, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-06.