pnp APIpnp.co.za ↗
Access Pick n Pay grocery products, specials, categories, store locations, and nutritional data via 8 structured API endpoints covering pnp.co.za.
What is the pnp API?
The Pick n Pay API exposes 8 endpoints covering grocery product search, category browsing, promotional specials, branch-level pricing, and store locations from pnp.co.za. The search_products endpoint returns paginated product results with pricing, stock status, and facets for filtering by category, certification, or promotion. Product codes from search results chain directly into get_product_detail for full nutritional classifications and variant options.
curl -X GET 'https://api.parse.bot/scraper/b87810bc-903f-41b8-b38d-c5c911cab324/search_products?page=0&sort=relevance&query=milk&page_size=20' \ -H 'X-API-Key: $PARSE_API_KEY'
Full-text search over Pick n Pay's product catalog. Matches against product names and descriptions. Supports pagination, sorting by relevance or price, and filtering by category, certification, or promotion status. Each product in results carries pricing, stock status, and image URLs. Facets in the response enumerate available refinement dimensions with hit counts.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-based) |
| sort | string | Sort order |
| queryrequired | string | Search keyword (e.g. 'milk', 'bread') |
| filters | string | Additional filter string appended to the search query (e.g. ':isOnPromotion:On+Promotion') |
| page_size | integer | Number of results per page |
{
"type": "object",
"fields": {
"facets": "array of facet objects for filtering (category, certifications, promotion status)",
"products": "array of product summary objects with code, name, price, images, stock, and availability",
"pagination": "object with currentPage, pageSize, sort, totalPages, totalResults",
"breadcrumbs": "array of breadcrumb objects for navigation context",
"currentQuery": "object with query value and URL",
"freeTextSearch": "string echoing the original search term"
},
"sample": {
"data": {
"facets": [
{
"name": "category",
"values": [
{
"name": "Milk, Dairy & Eggs",
"count": 943
}
],
"category": true
}
],
"products": [
{
"code": "000000000000349246_EA",
"name": "PnP UHT Full Cream Milk 1L",
"price": {
"value": 17.99,
"currencyIso": "ZAR",
"formattedValue": "R17.99"
},
"stock": {
"stockLevelStatus": "inStock"
},
"images": [
{
"url": "https://cdn-prd-02.pnp.co.za/sys-master/images/h69/h11/10794954915870/silo-product-image-v2-05Apr2022-180138-6001007041052-Straight_on-19006-4446_400Wx400H",
"format": "product"
}
],
"available": true,
"categoryNames": [
"All Products",
"Beverages",
"Long Life Milk"
]
}
],
"pagination": {
"sort": "relevance",
"pageSize": 72,
"totalPages": 18,
"currentPage": 0,
"totalResults": 1240
},
"breadcrumbs": [],
"currentQuery": {
"query": {
"value": "milk:relevance"
}
},
"freeTextSearch": "milk"
},
"status": "success"
}
}About the pnp API
Product Search and Catalog
The search_products endpoint accepts a query string and supports pagination via page and page_size, sorting via sort, and filter expressions via the filters parameter (e.g. :isOnPromotion:On+Promotion). Responses include a products array with each item's code, name, price, stock, images, and available flag, plus a facets array listing filterable dimensions such as category, certifications, and promotion status. The pagination object gives totalResults and totalPages for traversal. Category browsing follows the same shape: get_all_categories returns top-level department codes and names, and get_category_products accepts a category_id (e.g. beverages-423144840) to return products scoped to that department with breadcrumb context.
Product Detail and Nutritional Data
get_product_detail takes a product_code from any search or category response and returns images at multiple resolutions, a description string, a classifications array containing nutritional features and endorsements, exact stockLevel quantities, and price with oldPrice and savings fields when a promotion is active. The search_products_with_nutrition endpoint performs a search and enriches each result with that product's classification data in a single call. Its coverage object reports detailFetched and detailFailed counts per page, and page_size is capped at 20 because each result requires an individual detail lookup.
Specials and Branch Pricing
get_specials lists all products currently on promotion with oldPrice, savings, and promotion descriptions, optionally filtered to a specific category_id. For branch-specific prices, search_store_products accepts a store_id (the storeId from get_stores) alongside the query and returns products with price, inStock, and badges (e.g. SAVE, SMART SHOPPER) reflecting that branch's current inventory and promotions.
Store Locations
get_stores accepts an optional query to filter by name, city, suburb, or street, and returns each matching store's storeId, storeName, storeAddress, storeType (SUPER, EXPRESS, CLOTHING, etc.), telephone, email, tradingHours, and geolocation coordinates. Omitting the query returns all branches.
The pnp API is a managed, monitored endpoint for pnp.co.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pnp.co.za 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 pnp.co.za 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 changes and savings on promoted products using
get_specialswith oldPrice and savings fields. - Build a grocery price comparison tool using
search_store_productsscoped to different storeId values. - Aggregate nutritional information across a product category using
search_products_with_nutritionand its classifications output. - Display nearby Pick n Pay branches with trading hours and geolocation using
get_stores. - Populate a category navigation tree from
get_all_categoriesand resolve products withget_category_products. - Monitor stock levels for specific SKUs by polling
get_product_detailfor the stockLevel and stockLevelStatus fields. - Filter in-promotion products by department by combining a
category_idwithget_specials.
| 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 Pick n Pay have an official public developer API?+
How does `search_store_products` differ from `search_products`?+
search_products returns catalog-level pricing and stock valid across all stores. search_store_products requires a store_id from get_stores and returns prices, promotions, and inStock status specific to that branch, so the same product can show different prices or badge labels depending on the store.What does the `classifications` field in `get_product_detail` contain?+
Does the API cover Pick n Pay online order history or customer account data?+
Are there any pagination constraints I should know about?+
search_products_with_nutrition caps page_size at 20 because each result on a page triggers an individual detail lookup. All other endpoints use 0-based page numbering via the page parameter, and the pagination object in every response provides totalPages and totalResults to guide traversal.