Com APIjiji.com.gh ↗
Search Jiji Ghana classified ads by keyword, category, region, price, and condition. Returns listings with attributes, seller info, and posting dates.
What is the Com API?
The Jiji Ghana API exposes one endpoint, search_listings, that queries jiji.com.gh classified ads and returns up to 60 enriched records per call. Each record includes 15+ fields: listing ID, title, price in GHS, condition, region, posting date, seller display name, ID-verification status, and ad-specific attributes such as brand, model, storage, RAM, colour, and size. Filters for region, price range, and condition let you narrow results without post-processing.
curl -X GET 'https://api.parse.bot/scraper/e1d7d5d9-a3b9-4e28-8c5a-b33681be5f71/search_listings?query=iphone+17' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace jiji-com-gh-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Jiji Ghana classified-ads search — bounded, re-runnable."""
from parse_apis.jiji_com_gh_api import Jiji, Sort, Condition, InputNotFound
client = Jiji()
# Search for iPhones sorted by newest, capped at 5 results.
for listing in client.listings.search(query="iphone 17", sort=Sort.NEWEST, limit=5):
print(listing.title, listing.price_display, listing.condition, listing.region)
# Drill into the first used-condition listing under a price ceiling.
cheap = client.listings.search(
query="samsung tablet",
condition=Condition.USED,
max_price=2000,
limit=1,
).first()
if cheap is not None:
print(cheap.title, cheap.price, cheap.currency)
print("seller:", cheap.seller_name, "verified:", cheap.seller_verified)
print("posted:", cheap.date_posted_relative)
if cheap.other_attributes:
print("attrs:", cheap.other_attributes)
# Narrow by category — handle unknown slug gracefully.
try:
for listing in client.listings.search(
query="laptop",
category_slug="computers-and-laptops",
limit=3,
):
print(listing.title, listing.price_display, listing.brand, listing.storage)
except InputNotFound:
print("category slug not recognised by the site")
print("exercised: listings.search (with sort / condition / max_price / category_slug filters)")
Searches Jiji Ghana classified ads by keyword and returns one record per listing. Results are gathered 20 per upstream page starting at `page` and following the site's own continuation, de-duplicated by listing id, until `limit` listings are collected or no more pages exist (at most 10 pages, i.e. 200 listings, are read per call). Two modes: with `include_details` true (the default) every listing is enriched with the ad's detail attributes (brand, model, storage, RAM, size, colour and any other attributes under other_attributes), the posting date and the seller's display name and ID-verification status; each listing then costs one extra detail request (detail requests are fetched a few at a time in parallel so a full call stays within the execution limit), so the per-call ceiling in this mode is 80 (a call at the default limit of 40 performs about 42 requests, at 80 about 84) and larger limits are clamped to 80. With `include_details` false only the search pages are read (one request per 20 listings), the per-call ceiling is 200 (values above 200 are clamped to 200), and the detail-only fields (brand, model, storage, ram, size, colour, other_attributes, date_posted, date_posted_relative) are null; seller_verified is always taken from the search result and seller_name is filled from the search result when the site includes it there (it is sparse in this mode and complete in enriched mode). `details_included` echoes the mode. A listing whose detail request fails keeps its summary fields and carries a `detail_error` message (counted in `detail_failures`). `category_slug`, `region`, `min_price`, `max_price` and `sort` are applied by the site; `condition` is applied locally against the ad's Condition attribute (Brand New -> new; Used/Refurbished/Foreign Used -> used), so a filtered call may read several pages to fill the limit. `total_matches` is the site's count for the keyword plus site-applied filters (not the condition filter). `next_page` is the upstream page to pass as `page` to continue: when a page was only partly consumed because `limit` was reached, `next_page` repeats that page, so use a limit that is a multiple of 20 for gap-free paging. An unknown keyword returns an empty `listings` array; an unknown category_slug or region slug returns a stale_input error. Prices are in Ghanaian cedi (GHS). `date_posted` is an RFC 1123 GMT timestamp from the ad.
| Param | Type | Description |
|---|---|---|
| page | integer | Upstream result page (20 listings per page) to start from; pass the previous response's next_page to continue. |
| sort | string | Result ordering applied by the site. |
| limit | integer | Maximum number of listings to return; clamped to 80 when include_details is true and to 200 when it is false. |
| queryrequired | string | Search keyword(s), e.g. a product name. |
| region | string | Ghana region or area slug as it appears in the site's location URLs (confirmed: greater-accra, accra-metropolitan). Omitted = all of Ghana. |
| condition | string | Keep only listings whose Condition attribute maps to this value. Omitted = both. |
| max_price | integer | Maximum price in GHS. Omitted = no upper bound. |
| min_price | integer | Minimum price in GHS. Omitted = no lower bound. |
| category_slug | string | Jiji category slug as it appears in the site's category URLs (confirmed: mobile-phones, cell-phones-tablets-accessories). Omitted = all categories. |
| include_details | boolean | Whether to enrich each listing with its detail attributes, posting date and seller name (one extra request per listing, ceiling 80). False reads search pages only, with a ceiling of 200 listings per call. |
{
"type": "object",
"fields": {
"page": "first upstream page read",
"query": "echo of the search keyword",
"has_more": "whether more listings exist beyond this response",
"listings": "array of listing records: id, title, price (number, GHS), currency, price_display, condition (new|used|null), condition_raw, region, parent_region, region_slug, category, category_slug, short_description, main_image_url, image_urls (up to 5), images_count, listing_url, is_promoted, seller_verified, seller_name, and the detail-only fields brand, model, storage, ram, size, colour, other_attributes (object of remaining attribute name -> value), date_posted, date_posted_relative, detail_error (all null when details_included is false)",
"next_page": "upstream page to pass as page to continue, null when exhausted",
"pages_fetched": "number of upstream pages read in this call",
"total_matches": "site-reported number of ads matching the keyword and site-applied filters",
"detail_failures": "number of listings whose detail request failed (they carry detail_error)",
"details_included": "whether detail enrichment was performed (echo of include_details)"
},
"sample": {
"data": {
"page": 1,
"query": "iphone 17",
"has_more": true,
"listings": [
{
"id": "uQjricy3B1JA43UEYP5Qm0pB",
"ram": "8 GB",
"size": "6.3 inches",
"brand": "Apple",
"model": "iPhone 17",
"price": 10500,
"title": "New Apple iPhone 17 256 GB White",
"colour": "White",
"region": "Dzorwulu",
"storage": "256 GB",
"category": "Mobile Phones",
"currency": "GHS",
"condition": "new",
"image_urls": [
"https://pictures-ghana.jijistatic.net/57592450_MzAwLTQwMC1jMGI4NWI1ZjI2.jpg"
],
"date_posted": "Tue, 17 Feb 2026 15:38:46 GMT",
"is_promoted": true,
"listing_url": "https://jiji.com.gh/dzorwulu/mobile-phones/new-apple-iphone-17-256-gb-white-uQjricy3B1JA43UEYP5Qm0pB.html",
"region_slug": "dzorwulu",
"seller_name": "Noble King",
"detail_error": null,
"images_count": 3,
"category_slug": "mobile-phones",
"condition_raw": "Brand New",
"parent_region": "Greater Accra",
"price_display": "GH₵ 10,500",
"main_image_url": "https://pictures-ghana.jijistatic.net/57592450_MzAwLTQwMC1jMGI4NWI1ZjI2.jpg",
"seller_verified": true,
"other_attributes": {
"Battery": "3692 mAh",
"Card Slot": "No",
"Display Type": "OLED",
"Operating System": "IOS",
"Physical Condition": "No faults"
},
"short_description": "Brand new latest :\nApple iPhone 17 \n256GB\neSIM Unlocked",
"date_posted_relative": "44 min ago"
}
],
"next_page": 2,
"pages_fetched": 1,
"total_matches": 1680,
"detail_failures": 0,
"details_included": true
},
"status": "success"
}
}About the Com API
What the API returns
The search_listings endpoint accepts a required query string and returns an array of listing objects from jiji.com.gh. Each listing carries a numeric price in GHS alongside a price_display string, a normalized condition field (new, used, or null), and a region field populated from the site's location data. Detail-level attributes — brand, model, storage, RAM, screen size, colour, and any other attributes the seller filled in — are merged into the same record, so you don't need a second call to get them.
Filtering and pagination
You can narrow results using min_price and max_price (both in GHS), a region slug (e.g. greater-accra, accra-metropolis), a condition value, and a sort ordering. The limit parameter caps the number of listings returned per call; values above 60 are clamped to 60. Pagination is handled through the page input and the next_page field in the response — pass the returned next_page value as page in your next request to walk through additional results. has_more tells you whether further pages exist, and total_matches reflects the site-reported count for your query.
Seller and data quality signals
Each listing record includes the seller's display name and their ID-verification status, which lets you filter for verified sellers without scraping individual profile pages. The detail_failures count in the response flags how many listings in that batch could not be fully enriched; those records carry a detail_error field instead of attributes.
Coverage scope
The API covers Ghana-specific inventory on jiji.com.gh. Listings span all major categories on the site — electronics, vehicles, property, fashion, and more — but the search results reflect the site's own index and ranking, not a full database export. Category-browsing, seller profile lookups, and saved-search or alert features are not part of the current endpoint set.
The Com API is a managed, monitored endpoint for jiji.com.gh — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when jiji.com.gh changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official jiji.com.gh API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track price trends for used smartphones in Greater Accra by querying a model name with
region=greater-accraand recordingpriceover time - Build a price-comparison tool for electronics that normalizes brand, model, and storage attributes across listings
- Monitor new listings for a specific product keyword daily using
sortandposting_datefields - Filter verified-seller listings by checking the ID-verification status field in each record
- Aggregate regional supply data for a product category by running the same query across multiple
regionslugs - Identify condition distribution (new vs. used) for a given search term using the normalized
conditionfield - Feed a deal-alert system with
min_price/max_pricebounds to surface listings below a target price
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Jiji Ghana have an official developer API?+
What does the `search_listings` endpoint return beyond the basic listing title and price?+
total_matches and has_more fields support pagination.How does pagination work, and is there a cap on results per call?+
next_page value from a response back as the page parameter in your next request to fetch the following page. Each upstream page contains 20 listings. The limit parameter controls how many listings are returned in a single API call, with a hard ceiling of 60. has_more indicates whether additional pages remain.