Onestop APIonestop.ng ↗
Search and browse the onestop.ng Nigerian gadgets catalogue. Get product names, NGN prices, SKUs, variants, stock levels, images, and specs via 3 endpoints.
What is the Onestop API?
The onestop.ng API exposes 3 endpoints for querying the Nigerian gadgets and electronics store at onestop.ng. Use search_products to run keyword searches and get paginated result cards, list_category_products to pull every item in a named category at once, and get_product to retrieve the full detail record for a single item — including all purchasable variants, gallery images, and specification text — with prices denominated in Nigerian Naira.
curl -X GET 'https://api.parse.bot/scraper/29391ed9-e935-45ec-9bdf-1c742c25fc6b/search_products?query=iphone' \ -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 onestop-ng-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: onestop.ng SDK — search, browse by category, and drill into product details."""
from parse_apis.onestop_ng_api import OnestopNg, Category, ProductNotFound
client = OnestopNg()
# Search for iPhones and print the first few summary cards.
for summary in client.product_summaries.search(query="iphone", limit=5):
print(summary.name, summary.price_label)
# Drill into the first search hit for full details (variants, specs, etc.).
hit = client.product_summaries.search(query="macbook", limit=1).first()
if hit is not None:
product = hit.details()
print(product.name, product.price_ngn, product.currency)
for variant in product.variants or []:
print(f" {variant.sku} {variant.effective_price_ngn} {variant.availability}")
# Browse a specific category — list all products in the iPhones category.
for summary in client.product_summaries.list_by_category(category_id=Category.IPHONES, limit=10):
print(summary.name, summary.price_from_ngn)
# Point lookup by slug, with typed error handling for unknown products.
try:
detail = client.products.get(slug="apple-iphone-17-pro-max")
print(detail.name, detail.stock_quantity, "variants:", len(detail.variants or []))
for related in detail.related_products:
print(f" related: {related.name} ({related.price_label})")
except ProductNotFound:
print("product not found")
print("exercised: search / list_by_category / details / get")
Keyword search across the onestop.ng catalogue. Returns one page of product summary cards (name, SKU, lowest price in NGN, image, slug) plus the site's total match count and a has_more flag. One round trip per page; the site serves 30 products per page and `page` (default 1) selects the page. A query with no matches returns an empty products array with total_products 0. The `slug` of each product is the input to get_product.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page. A page beyond the last is clamped by the site to the last page; the returned `page` field reports the page actually served. |
| queryrequired | string | Free-text search term matched against product names (e.g. a model name or brand). |
{
"type": "object",
"fields": {
"page": "page number actually served (integer)",
"query": "the search term as sent",
"has_more": "true when the site offers a next page",
"products": "array of product summary cards: slug (input for get_product), name, sku, price_from_ngn (lowest price in NGN as a number, 0 when the site lists no price), price_label (site's price text, 'From ₦…' when the product has variants), image URL, url",
"total_products": "site-reported total number of matching products across all pages"
},
"sample": {
"data": {
"page": 1,
"query": "iphone",
"has_more": true,
"products": [
{
"sku": "SF-1718-0046",
"url": "https://onestop.ng/products/iphone-back-glass-protector-new",
"name": "iPhone Back Glass Protector (New)",
"slug": "iphone-back-glass-protector-new",
"image": "https://onestop.ng/storage/products/images/2026/04/28/69f08c4b8d1a4-Tempered-Glass-Back-Cover-Protector-for-iPhone-12-Pro-Max-9H-13112020-02-p.png",
"price_label": "From ₦1,500",
"price_from_ngn": 1500
},
{
"sku": "SF-3928-AYZ9",
"url": "https://onestop.ng/products/apple-iphone-14",
"name": "Apple iPhone 14",
"slug": "apple-iphone-14",
"image": "https://onestop.ng/storage/iphone-14/img-0150-1.jpeg",
"price_label": "From ₦444,000",
"price_from_ngn": 444000
}
],
"total_products": 84
},
"status": "success"
}
}About the Onestop API
Search and Category Browsing
The search_products endpoint accepts a query string and an optional page integer (1-based) to step through results. Each response includes total_products (the site's total match count across all pages), a has_more flag, and an array of product summary cards. Each card carries a slug, name, sku, price_from_ngn (lowest price as a number, 0 when unavailable), and an image URL. The site returns 30 products per page; requesting a page beyond the last returns the final page with has_more: false.
The list_category_products endpoint accepts a category_id string (numeric, e.g. 51 for iPhones) and returns the complete category in a single response — no pagination. The response includes category_name, total_products, and the same summary card shape as search. This makes it straightforward to build a full category inventory snapshot without managing paging logic.
Full Product Detail
Passing any slug from a summary card to get_product returns the complete product record. Key response fields include price_ngn (a representative price computed as the lowest in-stock variant price, falling back to the lowest variant price, then the page price), an images array of gallery URLs, description (short text, nullable), specifications (long specification text, nullable), and currency (always NGN). The variants array is the most granular layer: each variant carries its own variant_id, sku, price_ngn, sale_price_ngn (null when no sale is active), effective_price_ngn, quantity, and an availability label.
Coverage and Currency
All prices are in Nigerian Naira. The API covers the onestop.ng product catalogue, which focuses on consumer electronics, smartphones, accessories, and related gadgets sold in Nigeria. Stock quantities and availability labels reflect the state of the product page at retrieval time.
The Onestop API is a managed, monitored endpoint for onestop.ng — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when onestop.ng 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 onestop.ng 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 NGN price movements for specific smartphone models across onestop.ng variants over time
- Build a Nigerian electronics price comparison tool using
price_from_ngnfrom search results - Sync a full category inventory (e.g. iPhones, laptops) into a local database with
list_category_products - Alert users when
sale_price_ngnbecomes non-null for a watched product slug - Aggregate
specificationstext from multiple products to compare feature sets programmatically - Check real-time
quantityandavailabilityfields before routing a purchase or referral link - Populate a product feed with gallery
images,name, andskudata for an affiliate or resale storefront
| 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 onestop.ng offer an official developer API?+
What does `get_product` return for variants, and how do sale prices appear?+
variants array includes price_ngn, sale_price_ngn (null when no sale applies), and effective_price_ngn which already reflects whichever price is active. You can check sale_price_ngn directly to determine whether a discount is running on a specific variant.How does pagination work in `search_products`?+
page (integer, 1-based) to step through results. The response always includes total_products (site-reported total matches) and has_more (true when a next page exists). If you request a page number beyond the last, the site clamps it to the last page — the returned page field reflects what was actually served, not what was requested.Does the API return customer reviews or seller ratings for products?+
Are all product categories available, or only specific ones?+
list_category_products endpoint accepts any numeric category_id from the site's category menu. The API does not expose a built-in endpoint that lists all available category IDs and names. You can fork the API on Parse and revise it to add a category-listing endpoint that enumerates the full menu.