Jiji API

Africa's largest classifieds network as JSON, in five countries

The Jiji API returns Africa's largest classifieds network as clean JSON in ten actions, across five country storefronts: Nigeria, Ghana, Kenya, Tanzania and Uganda.

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

10 active endpoints, on 0, 1 and 2 credit tiers.

  • POST/jiji/v1/search
  • POST/jiji/v1/listing
  • POST/jiji/v1/seller_listings
  • POST/jiji/v1/seller_reviews
  • POST/jiji/v1/similar
  • POST/jiji/v1/price_history
  • POST/jiji/v1/suggest
  • +3 more

What Jiji endpoints does ReefAPI ship?

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

10 endpoints

search

2 cr

Search a Jiji storefront across every vertical.

required
—
optional
country, query, category, region, price_min, price_max, filters, sort, posted_within, page, limit

listing

2 cr

One ad in full.

required
listing_id
optional
country, include_phone

seller_listings

2 cr

Every live ad of one seller.

required
user_id
optional
country, query, category, region, sort, page, limit

seller_reviews

1 cr

What buyers wrote about a seller.

required
seller_id
optional
country, page, rating

similar

2 cr

Jiji's own comparable live ads for one listing.

required
advert_id
optional
country, page

price_history

1 cr

Every price the seller has asked for this ad since it was posted, with the date of each change.

required
advert_id
optional
country

suggest

1 cr

Jiji's keyword autocomplete.

required
query
optional
country, category

categories

0 cr

Jiji's whole category tree for a country.

required
—
optional
country

regions

0 cr

Every state, city and district Jiji lists for a country, with ids and slugs and which ones it…

required
—
optional
country

filters

0 cr

Every filter one category publishes, with the allowed values, the range bounds and the unit.

required
—
optional
country, category, region, filters

Every parameter, every allowed value →

Jiji API

5 of 10 endpoints, ready to run

View docs ↗

Jiji rows for any vertical in any of the five countries: price and currency, the category's own attributes, state and town, cover photo, description, trust labels and the seller's account. 24 a page, up to 96 in one call.

2 credits0 required · 11 optional
POST/jiji/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 Jiji API works

Jiji 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 294 engines.

02
Call
POST /jiji/v1/…

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

03
Pay
0 or 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.

Let Jiji name the category and the filters, because both are free

Jiji accepts a category slug it does not know and answers with the whole site, and it accepts a filter name it does not know and hands back the unfiltered list. Both look like a working query. Asking Jiji what it actually publishes costs nothing, so there is no reason to guess.

01categories
POST/jiji/v1/categories
{"country": "ng"}

Zero credits. The whole tree for that storefront with every id, slug, name and live advert count, plus a flat list with parents. This is where you learn that the slug you were about to send exists in Nigeria but not in Kenya.

02filters
POST/jiji/v1/filters
{"country": "ng", "category": "cars"}

Zero credits. Every filter that category publishes with its allowed values, its range bounds and its unit. Pass a parent back in, such as make=Toyota, to see the children it unlocks, because the model list only exists once a make is chosen.

03search
POST/jiji/v1/search
{"country": "ng", "category": "cars", "filters": "make=Toyota;year_of_manufacture=2018-2021", "limit": 48}

2 credits. Filters are validated against that schema before the search is issued, so a wrong name or value is an error naming the ones that exist rather than a silent full-category answer. Read total_results for the real market size, and total_pages for how far the window goes.

04listing
POST/jiji/v1/listing
{"listing_id": "<a row's listing_id>"}

2 credits. The complete description, every photo at full resolution, the full attribute table, Jiji's market-price band, view and favourite counts, and the seller with the phone number the ad publishes. Set include_phone to false if you do not want it.

05price_history
POST/jiji/v1/price_history
{"advert_id": "<the row's advert_id>"}

1 credit. Every price that seller has asked for the ad with the date of each change, plus first_price, latest_price and change_pct. Pair it with seller_listings on seller.user_id, 2 credits, for the same treatment across a dealer's whole book.

A category and a filter set Jiji itself published, a row count you can budget against, and an ad enriched with the description, photos, attributes and published contact the results list does not carry.

request
curl -X POST https://api.reefapi.com/jiji/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"country":"ng","category":"cars","limit":24}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "jiji",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

The five Jiji storefronts, and what each one answered in the same run

Country is a parameter on search and on every other action, and the default is ng. Each storefront is its own catalogue, its own region tree and its own currency, so the same call returns different markets and different money. These counts are one measured run on 2026-09-24: the cars category, and the size of each country's region tree.

countryStorefrontCurrencyCars in that runPlaces in the region tree
ngjiji.ngNigerian naira59,5041,369
ghjiji.com.ghGhanaian cedi17,157599
kejiji.co.keKenyan shilling23,5021,674
tzjiji.co.tzTanzanian shilling16,7923,045
ugjiji.ugUgandan shilling2,300171

Every row in all five runs carried a price and a currency. Category slugs and region slugs are not shared between countries, which is why categories and regions are free actions: ask the storefront you are about to search.

Five countries, ten actions, and the lines that go against us

Measured 2026-09-24: 168 calls with every parameter distinct across all ten actions, a 135-case end-to-end run over 18 verticals and all five countries, and 23 filter cases each against a same-run unfiltered control. Three of these lines go against us.

Nigeria, Ghana, Kenya, Tanzania and Uganda, as one parameter

Each country is a separate storefront with its own catalogue, its own region tree and its own currency, and country switches between them. One run returned 59,504 car ads in Nigeria, 17,157 in Ghana, 23,502 in Kenya, 16,792 in Tanzania and 2,300 in Uganda, through the same fields, with region trees of 1,369, 599, 1,674, 3,045 and 171 places. Every row carried a price and its currency.

Every vertical Jiji runs, with the category's own fields

Vehicles, property for sale and to rent, land, phones, computers, electronics, home and furniture, appliances, fashion and shoes, jobs, services, babies and kids, pets, livestock, agriculture and building materials. A car row carries condition, transmission, year and mileage; a property row carries bedrooms and furnishing; a phone row carries brand and storage. 18 categories were measured row by row.

A filter name Jiji does not know is an error here, not a silent full list

Jiji accepts an unknown filter name and returns the unfiltered set, and it accepts an unknown category slug and answers with the whole site. Both are checked against Jiji's own published schema before a search goes out, and a name or value that is not in it comes back as INVALID_PARAM naming the ones that are. 23 filter cases were run against a same-run control and all 23 narrowed: make=Toyota 59,504 to 24,730, make plus model to 6,349, a 2018-2021 year range to 7,474, a mileage ceiling to 2,603, a price band to 850, a region to 41,601, a keyword to 6,381 and a dog breed from 3,713 to 4.

Against us: Jiji publishes no price on job ads and on most service ads

0 of 23 general job rows and 0 of 24 IT job rows carried a price, and 18 of 23 cleaning-service rows carried none either. Those come back as price null with price_not_published true and Jiji's own price_label kept verbatim, never as 0. In the other 15 categories measured every row in the sample was priced.

Against us: the search window ends at roughly 5,350 ads per query

Jiji's page is fixed at 24 rows and cannot be widened, and its window ends at total_pages, which was 223 on a 58,000-ad category. Asking past it is an error rather than an empty page. limit up to 96 is served as consecutive pages with duplicates dropped, and a wider sweep is done by partitioning on region, price band or filter, which is what the free regions and filters actions are for.

Against us: some categories publish no row-level attributes

Not one row carried an attribute in cleaning-services, 0 of 23, or in babies-and-kids-accessories, dogs-and-puppies and livestock-and-poultry, 0 of 24 each, and only 2 of 23 in building-materials, because those categories publish none. condition is null wherever the category defines none, including property, jobs and services. seller.name is attached to a search row only on some ads, 16 of 24 on furniture down to 0 of 24 on houses for sale, while seller.user_id is complete everywhere and listing always has the name.

The seller, and the contact the ad itself publishes

listing returns the public seller profile, which is the display name, account id, seller id, rating, profile or shop URL, avatar, advert and feedback counts, how long they have been on Jiji, when they were last seen, and their trust labels, together with the phone number or numbers the ad publishes. The phone arrived on 22 of 22 detail calls across 13 verticals, it is on by default, and include_phone false turns it off. Jiji publishes no seller e-mail to a logged-out reader, 0 hits in 30 ads and in 38 raw payloads, so no e-mail field is returned.

100 percent on every action, and a dead ad says so

168 calls with every parameter distinct returned 100 percent success on all ten actions, and 135 of 135 end-to-end cases passed, including 19 negative contracts. A sold, expired or removed ad is served nothing by Jiji, so it comes back as NOT_FOUND rather than as an empty success, and an empty search is re-checked before it is returned, with empty_confirmed set only when the re-check agreed.

Price

categories, regions and filters are free. search, listing, seller_listings and similar are 2 credits each. seller_reviews, price_history and suggest are 1. A 24-row page and a 96-row call cost the same 2 credits, so ask for the rows you want in one call.

What people build with Jiji

The jobs this data is most often used for.

10

endpoints

0/1/2

credits per call

01

Price a used car, phone or flat against what the Nigerian, Ghanaian, Kenyan, Tanzanian or Ugandan market is asking today.

02

Track one dealer, shop or agency: their whole live stock in pages, their buyer feedback, and what changes week over week.

03

Watch a segment for new supply with posted_within and a validated filter set, then diff on listing_id.

04

Measure rents, land prices and asking-price drift by state or town from real advertised prices and price_history.

What Jiji data costs

The cheapest call here is 0 credits, 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 294 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/jiji/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"country":"ng","category":"cars","limit":24}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/jiji/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "country": "ng",
  "category": "cars",
  "limit": 24
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Jiji.

Get a free key →
Which Jiji countries does the API cover?▾

Five: Nigeria, Ghana, Kenya, Tanzania and Uganda, passed as country with the values ng, gh, ke, tz and ug. Nigeria is the default. Each one is a separate storefront with its own catalogue, its own region tree and its own currency, so a category slug or a region slug from one country is not guaranteed to exist in another. The free categories and regions actions list exactly what that storefront publishes.

Do the Jiji filters actually filter?▾

Here, yes, and it was measured rather than assumed. Jiji itself accepts a filter name it does not know and hands back the unfiltered list, so a query that looks like it worked can silently be the whole category. Every filter you send is checked against the schema Jiji publishes for that category before any search is issued, and a name or a value the schema does not carry comes back as an error naming the ones that do. 23 filter cases were run against a same-run unfiltered control and all 23 narrowed: make=Toyota took 59,504 car ads to 24,730, make plus model to 6,349, a 2018-2021 year range to 7,474, a mileage ceiling to 2,603, a price band to 850, a region to 41,601 and a dog breed from 3,713 to 4.

How do I know which filters a category supports?▾

Ask the free filters action with a category. It returns every filter that category publishes, with its key, its label, whether it is single-choice, multi-choice or a range, its unit, and the complete list of allowed values or the range bounds. Some filters only exist once a parent choice is made: the model list appears after a make is chosen, so pass the parent back into filters to see the children it unlocks. In search, filters are name=value pairs separated by a semicolon, ranges take from-to, from- or -to, and several values for one filter are comma-separated: make=Toyota;model=Camry or condition=Foreign Used;year_of_manufacture=2018-2021.

Why do some Jiji ads come back with no price?▾

Because Jiji publishes none for them. Job ads are the clearest case: 0 of 23 general job rows and 0 of 24 IT job rows carried a price, and 18 of 23 cleaning-service rows carried none either. Those ads come back with price null and price_not_published true, plus Jiji's own price_label kept verbatim, so a missing price is never reported as 0 and never reads as free. In the other 15 categories measured, every row in the sample carried a price.

Do I get the seller's phone number?▾

The listing action returns the phone number or numbers the ad itself publishes, in seller.phone and seller.phones, and it did so on 22 of 22 detail calls across 13 verticals. It is on by default and include_phone set to false turns it off, which also saves one upstream call. Jiji publishes no seller e-mail address to a logged-out reader, so no e-mail field is returned: 0 hits in 30 ads scanned end to end and 0 in 38 raw payloads. The rest of the seller block is the public profile Jiji shows anyway: display name, account id, rating, profile or shop URL, avatar, advert and feedback counts, how long they have been on Jiji, when they were last seen, and their trust labels.

How deep can I page a Jiji search?▾

Jiji's page is fixed at 24 rows and cannot be widened, so limit above 24 is served as consecutive pages, up to 96 rows in one call, with duplicates dropped. The search window itself is Jiji's: a 58,000-ad category reported 223 pages, which is roughly 5,350 ads reachable per query. Asking past total_pages is an error rather than an empty page. To go wider than the window, partition the query by region, price band or filter, which is what the free regions and filters actions exist to give you.

Which Jiji fields come back empty, and why?▾

Whatever Jiji does not publish, reported as absence rather than guessed. Four categories publish no row-level attributes at all, and not one row in the samples carried any: cleaning-services 0 of 23, babies-and-kids-accessories, dogs-and-puppies and livestock-and-poultry 0 of 24 each, and building-materials 2 of 23, while cars, phones, property, land, laptops, furniture, appliances and jobs carry a full attribute table on every row. condition is null wherever the category defines none, which includes property, jobs and services. seller.name is attached to a search row only on some ads, from 16 of 24 on furniture down to 0 of 24 on houses for sale, but seller.user_id is complete everywhere and listing always has the name. listing_id, advert_id, title, url, image, description, location.region and seller.user_id were complete in all 18 categories measured.

What does an empty Jiji search mean?▾

It means no ad matched, and the answer says so explicitly. An empty result is re-checked before it is returned, and empty_confirmed true is only present when the re-check agreed, so a real no-match is distinguishable from a blip. A sold, expired or removed ad is a different case: Jiji serves it nothing at all, so a dead listing_id is NOT_FOUND rather than an empty success.

What is the Jiji API?▾

Jiji API is a ReefAPI endpoint group for africa's largest classifieds across nigeria, ghana, kenya, tanzania and uganda: ads in local currency, the seller and their whole stock. It returns live JSON through POST requests under /jiji/v1.

Is the Jiji API free to try?▾

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

Do I need a Jiji login or account?▾

No login to Jiji 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 Jiji 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 Jiji API use?▾

Jiji 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 Jiji from an AI assistant or MCP client?▾

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

19 Classifieds & Second-hand APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Jiji, 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 293 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-09-24.