Sri Lanka's biggest classifieds marketplace, as one JSON API
The ikman API returns Sri Lanka's largest classifieds marketplace as clean JSON, in four actions: search, listing, categories and locations.
4 active endpoints, on 1 and 2 credit tiers.
- POST/ikman/v1/search
- POST/ikman/v1/listing
- POST/ikman/v1/categories
- POST/ikman/v1/locations
What ikman.lk endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
ikman.lk API
4 of 4 endpoints, ready to run
Live ikman ads with the matching total: ad id and slug, URL, title, price in rupees beside the string the site itself prints, category, district and city, condition, posting and expiry time, the site's own summary chips, paid-placement flag, photos and the advertiser's contact card.
// 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 ikman.lk API works
ikman.lk is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Every car for sale in one Sri Lankan district, with the full ad and the dealer behind it
Four calls: categories, then locations, then search, then listing.
Call categories with parent 391 and take the leaf you want — Cars is 392, with 10,766 live ads on 2026-10-02; Vans, Three Wheelers, Motorbikes and Lorries are separate ids.
Call locations with districts_only to pick a district — Colombo is 1506, Gampaha 1577 — or drill into one city with parent 1506.
Call search with category 392 and your location id, sort price and order asc. Cars in Colombo district measured 6,732 ads. Read total_results for the size and reachable_results for how much of it you can page, and set exclude_promoted if you do not want the paid row that sits above the sort.
Walk the pages up to the 10,000-row ceiling, keeping each row's listing_id (or its slug — both resolve). Each row already carries the rupee price, mileage and body type, the condition, the district and city and the advertiser's contact card.
Call listing for the ads you want: the complete description, every photo, the attribute list with the model year, the view count, and the dealer's shop name and public shop URL where the ad belongs to one.
Seven credits for the 5 calls: categories 1, locations 1, search 2, search 2, listing 1. Failed calls are free: a timeout, a block or a capacity error costs nothing.
curl -X POST https://api.reefapi.com/ikman/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"car","max_results":20}'{
"ok": true,
"data": { … },
"meta": {
"api": "ikman",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What is actually on the site — live ad counts on 2026-10-02
These are counts read off the live index, one call each, not estimates. They move as ads are posted and expire; every search response carries the matching total in the response body, plus ikman's own live total for each section, district and offer direction.
| section | category id | live ads | price published? |
|---|---|---|---|
| Vehicles (cars, vans, bikes, three wheelers, parts) | 391 | 89,274 | yes, in LKR |
| Electronics (computers, TVs, cameras, audio) | 428 | 64,450 | yes, in LKR |
| Property (land, houses, apartments, rentals) | 409 | 63,452 | yes, in LKR |
| Mobiles (phones, tablets, accessories) | 2000 | 58,911 | yes, in LKR |
| Home & Garden (furniture, appliances) | 444 | 19,435 | yes, in LKR |
| Services | 537 | 15,408 | often not — a service ad may be quote-only |
| Business & Industry | 535 | 14,066 | yes, in LKR |
| Jobs | 700 | 9,798 | a salary RANGE, not a price |
| Animals (pets and livestock) | 489 | 5,701 | yes, in LKR |
| Hobby, Sport & Kids | 503 | 5,220 | yes, in LKR |
| Fashion & Beauty | 470 | 3,520 | yes, in LKR |
| Agriculture | 587 | 613 | yes, in LKR |
That is 12 of the 17 top-level sections; the categories action lists all 299 categories with their parents and ids. The leaves are narrow and usually what you want to query directly — measured the same day: Mobile Phones 53,462 · Auto Parts & Accessories 29,485 · Land For Sale 27,514 · Motorbikes & Scooters 26,096 · Houses For Sale 18,415 · Cars 10,766 · Vehicle Rentals 9,036 · House Rentals 4,396 · Three Wheelers 3,809 · Apartments For Sale 3,598 · Lorries & Trucks 1,110 · Vans 1,044. Add a district and it narrows again: Cars in Colombo district was 6,732. 🔴 Two things worth knowing before you build against the tree. ikman still ships legacy categories in its own table that have no live ads — "Houses" (411) and "Land" (417) both measured 0, and a second "Mobile Phones" under Electronics (429) measured 15 against the live one's 53,462 — so check the count, not just the name. And whatever total a query reports, only the first 10,000 rows are reachable: page 400 answers and page 401 does not, measured on three different result sets including one reporting 14,124 pages. The API publishes reachable_results beside total_results and flags total_truncated_by_ceiling. The whole catalogue splits 340,036 for sale, 12,224 for rent, 546 wanted to buy and 284 wanted to rent.
What is measured, and what is not there
Every figure on this page was read off the live source in the run recorded for it, not estimated.
353,089 ads on 2026-10-02; 299 categories under 17 sections; 27 districts and 304 cities
Vehicles 89,274 · Electronics 64,450 · Property 63,452 · Mobiles 58,911 · Home & Garden 19,435 · Services 15,408 · Business & Industry 14,066 · Jobs 9,798 · Animals 5,701
Mobile Phones 53,462 · Auto Parts 29,485 · Land For Sale 27,514 · Motorbikes 26,096 · Houses For Sale 18,415 · Cars 10,766 · Vehicle Rentals 9,036 · House Rentals 4,396 · Three Wheelers 3,809 · Apartments For Sale 3,598 · Cars inside Colombo district 6,732
ikman's own table still lists sections with no live ads — "Houses" (411) 0 and "Land" (417) 0, plus a second "Mobile Phones" (429) with 15 against the live one's 53,462. We return the table as the source publishes it; check the count
340,036 for sale · 12,224 for rent · 546 wanted to buy · 284 wanted to rent
25, set by the source; no override accepted. A full page returns 25 or 26 rows because one paid ad is inserted at the top
🔴 10,000 rows per query. Page 400 answers, page 401 does not — measured on three result sets, one of which reported 14,124 pages. reachable_results publishes the real number
12 of 12 exposed filters measured narrowing a same-run control, across two controls (207,308 and 10,465). The 1 the site accepts and ignores is not exposed
no price band, no condition, no year, no brand, no mileage — 7 parameter spellings and 13 shapes of the source's own filter array were probed and all rejected. Filter client-side on the condition and attributes every row carries
270 of 312 sampled rows carry one, in LKR, and the parsed amount matched the string ikman prints beside it 296 of 296
42 of 312 — wanted ads, quote-only services and job posts. Returned as null with the reason, never as 0. A job returns a salary band instead
180 of 312 rows — property, jobs and services have no condition field at all
220 of 312 rows carry the site's own one-line summary (e.g. "5,000 km", "Hatchback", "Reconditioned")
304 of 312 rows have at least one; URLs at 780x585 and 158x88, plus the raw image ids and the URL template for any other size
11 of 12 details, but only 18 of 312 search rows — ikman attaches most of them to the ad page, not the result card
contact card on 312 of 312 rows: name, private or business, published phone numbers with their verified flags, e-mail, chat flag, membership level and ikman's paying-member, authorised-dealer and featured-member flags, plus the advertiser's own contact-opt-out flag
123 of 312 rows, concentrated in vehicles: shop name, tagline, description, slug and public shop URL. null elsewhere
full ad text (243 to 842 characters on the property ads round-tripped), view count 12 of 12, salary band and application deadline on vacancies
no sold-price history, no advertiser rating or review history, no price/condition/brand filter, and ikman's similar-ads block came back empty on 12 of 12 ads
ikman's live totals per category, city and offer direction come with every search, but they follow the id filters and IGNORE the keyword — measured both ways
29 of 29 behaved as expected on two separate runs (18 successes, 11 error cases on the right code); 12 of 12 top-level categories returned rows and a full detail with the id unchanged; 8 of 8 round-trips by id, slug and URL resolved to the same record
What people build with ikman.lk
The jobs this data is most often used for.
endpoints
credits per call
Track Sri Lankan vehicle supply and asking prices: 89,274 vehicle ads on 2026-10-02, with Cars, Vans, Three Wheelers, Motorbikes and Lorries as separate categories, each row carrying the rupee price, mileage and body type, and the dealer's shop page where there is one.
Build a property feed for one district: 63,452 property ads, filterable to any of 27 districts or 304 cities, sorted by price or posting date, with the full ad text, every photo and the lister's contact card from the detail call.
Watch a used-electronics or mobile market: 58,911 mobile and 64,450 electronics ads, with the site's own condition token (new, used, reconditioned, import) on each row so you can compare like with like.
Monitor the Sri Lankan job market without a jobs board: 9,798 live vacancies with the salary band, employer, role, job type and application deadline, in English, Sinhala or Tamil as posted.
What ikman.lk 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 →- 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 -X POST https://api.reefapi.com/ikman/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"car","max_results":20}'import requests
r = requests.post(
"https://api.reefapi.com/ikman/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "car",
"max_results": 20
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up ikman.lk.
Get a free key →Which currency are the prices in, and how do I know the number is right?▾
Sri Lankan rupees, and the currency is read off the source rather than assumed from the country. ikman prints its amounts as strings with their own token — "Rs 7,490,000" — so every row returns price as a parsed number, price_currency as LKR, and price_display as the exact string ikman itself prints. ikman also prints the same amount a second time in a separate field on the same row, and the API compares the two for you on every row: price_display_matches_info. Across 296 priced rows in 12 sections it agreed 296 of 296, zero mismatches. If a token ever came back that we do not recognise, price_currency would be null and price_currency_raw would carry the token — we would rather show you an unknown currency than mislabel one.
Why is price null on some ads?▾
Because those ads genuinely have no price, and a zero would be a lie. Across 312 sampled rows in all 12 top-level sections, 270 carried a price and 42 did not: wanted ads where the poster is buying, service listings quoted on enquiry, and job posts. Each one comes back with price null and the reason in price_kind — not_priced_wanted, not_priced or range. A job is the interesting case: ikman gives a vacancy a salary band rather than a price, so listing returns price_min and price_max with price_label ("Salary per month") and price_kind range — we measured Rs 45,000 - 75,000 on one post — and price stays null, because a band is not a price.
Does a filter actually do anything, or does the site just ignore it?▾
Every filter we expose was measured against a same-run control, and we ran two controls because one was not enough. Against a 207,308-ad Colombo-district control: category 391 (Vehicles) 49,636, category 392 (Cars) 6,732, for_sale 196,718, to_buy 145, for_rent 10,249, to_rent 196. Against a 10,465-ad keyword control (toyota): Cars 3,265, Colombo 6,632, Gampaha 1,953. Twelve for twelve. One honest-looking non-result is worth explaining: toyota plus category 391 returned the full 10,465, because every toyota ad really is in Vehicles — that is why the second control exists, and both are in our published logs. One filter the site accepts and does nothing with (buy_now, which returns zero everywhere) is deliberately not exposed, because a handle that does nothing is worse than no handle. And an unknown value for listing_type or sort is rejected with INVALID_PARAM rather than passed through.
Can I filter by price range, mileage or condition?▾
No, and we would rather say so than offer a switch that quietly does nothing. ikman's own data surface takes no price, condition, year or brand parameter. We probed that properly before answering: 7 spellings of a price band, a condition filter, a brand filter, and then 13 different shapes of the structured filter array the source does define — every one was rejected by the source's own validator, and the two endpoints that would publish a filter vocabulary do not exist. So the four handles that do work are the four we offer: keywords, category, location and offer direction. In practice the category tree does most of the work, because ikman's leaves are narrow (Cars 10,766, Three Wheelers 3,809, Houses For Sale 18,415, House Rentals 4,396 and Land For Sale 27,514 are all separate categories), and every row carries the condition and the category's own attributes so you can filter client-side on exactly the values the site published.
How many rows per page, and is it fixed?▾
Twenty-five, set by the source, and it accepts no override — we tried three spellings and all three were rejected. What you actually get back is 25 or 26: ikman inserts one paid ad at the top of a full page, so a full page measured 26 rows, 25 on one query, 15 on a 15-row result set and 0 past the end. We publish the source's page_size and the real returned count separately rather than printing a page size we did not measure.
What is the paid row at the top of my results?▾
A placement ikman has sold, and it ignores the sort you asked for. With sort=price and order=asc on Cars, row 0 came back at Rs 15,200,000 while rows 1 to 3 were the genuinely cheapest — measured the same way on all five sort combinations: only the first row sits outside the order. We return ikman's order unchanged, flag the row promoted: true, publish leading_promoted_insert and promoted_rows, and let you drop them with exclude_promoted. Note that a seller re-dating their own ad (ikman's bump) is NOT counted as a paid placement: it changes nothing about position, so it is reported separately as bumped_at.
What do the counts next to my results mean?▾
They are ikman's live totals for each section, district and offer direction — and they follow the id filters while ignoring your keyword, which is why the field is called catalogue_counts rather than facets. We measured it both ways. Searching toyota matches 10,465 ads, and the block still reported 89,274 for Vehicles and 207,308 for Colombo district, exactly what an unfiltered search for those ids returns. But search Cars (category 392) and the block reports 6,732 for Colombo and 10,757 for-sale, which are the real Cars-in-Colombo and Cars-total figures. So use them to size a category or a district, not to split a keyword search. One search call gives you that for every section and all 311 cities.
What do I get about the advertiser?▾
What the public ad page itself shows, unmodified: the display name, whether the account is private or a business, the contact numbers ikman publishes with the ad and whether they are verified, the e-mail where there is one, whether chat is enabled, the account's membership level (free, plus, premium) and ikman's own paying-member, authorised-dealer and featured-member flags. The advertiser's own contact-opt-out flag is passed through so you can see what they asked for. The block was present on 312 of 312 search rows and 12 of 12 details. Where the ad belongs to a dealer, you also get that dealer's shop: name, tagline, description, slug and public shop URL — present on 123 of 312 rows, concentrated in vehicles, and null rather than an empty object everywhere else.
What does listing add over a search row?▾
The complete ad text as the advertiser wrote it — 243 to 842 characters on the property ads we round-tripped, and several thousand on dealer ads, with markup and HTML entities already cleaned out, in English, Sinhala or Tamil exactly as posted — plus every photo at full size and as a thumbnail, the ad's view count (present 12 of 12), the category's own attribute list, and for a vacancy the salary band, the employer, the job type and the application deadline. Category attributes are the big difference: they came back on 11 of 12 details but only 18 of 312 search rows, because ikman attaches most of them to the ad page rather than the result card. One field we will flag against ourselves: ikman has a similar-ads block and it came back empty on all 12 ads we measured, so we return it as an empty list rather than implying it is populated.
Can I resolve an ikman URL directly?▾
Yes, and that is unusually convenient here. ikman's ad URLs carry a slug and no id, and the source resolves the slug and the 24-character id to the same record — we verified it on the same ad and on 8 round-trips across id, slug and URL, 8 of 8 matching. So you can pass listing_id, the slug, or a full ikman.lk ad URL, and the API checks that the record it got back is the one you asked for before returning it. A removed or non-existent ad — by id or by slug — returns NOT_FOUND rather than a page-shaped success.
How do I find the right category or district id?▾
Two actions exist for exactly that, and they are the whole tree, not a sample. categories returns all 299 live categories with their parent, their children, the offer directions each one accepts and its public URL, grouped under 17 top-level sections. locations returns all 331 rows: Sri Lanka's 27 districts and the 304 cities inside them — Colombo alone has 51 — and will include the boundary polygon ikman publishes for each if you ask for it (which is most of the payload, so it is off by default). You can also just read category_id, district_id and city_id off any search row; they come back with their names.
Why is condition empty on some ads?▾
Because ikman only offers a condition where it means something. It came back on 180 of 312 sampled rows — vehicles, electronics and mobiles have it, property, jobs and services do not — and we return null rather than inventing "used". The values are the site's own tokens (new, used, reconditioned, import and so on) and they also appear in the row's highlights, which is ikman's own summary line: for a car that measured as mileage, body type and condition together, e.g. "5,000 km", "Hatchback", "Reconditioned". Highlights were filled on 220 of 312 rows.
What happens if a search genuinely matches nothing?▾
You get ok with zero rows and total_results 0, because an empty answer is still an answer. There is one trap in this source that we handle for you: on three measured queries ikman reported total 0 and still shipped one row — the paid insert. The site's own total is authoritative, so a paid row inside a zero-match answer is dropped and counted in dropped_non_matching_promoted rather than handed to you as a match. A nonsense keyword returns 0 rows with nothing attached, so the two cases stay distinguishable.
Are jobs and rentals covered properly, or just the for-sale ads?▾
All four directions, and they are measured separately. The catalogue splits 340,036 for sale, 12,224 for rent, 546 wanted to buy and 284 wanted to rent, and listing_type gets you any one of them: within Colombo district, for_rent narrowed a 207,308-ad control to 10,249 and to_rent to 196. Jobs are a top-level section with 9,798 live posts and their own fields — salary band, employer, role, job type and application deadline. Note that ikman's own vehicle-rental listings sit in a Rentals category and are typed for_sale, so for a rental car you want the category, not the offer direction.
99 Classifieds & Second-hand APIs on the same key
One key, one credit pool, one response envelope. If you are pulling ikman.lk, 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.
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-02.