Discover/pnp API
live

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.

Endpoint health
verified 19h ago
search_products_with_nutrition
search_products
search_store_products
get_stores
get_product_detail
8/8 passing latest checkself-healing
Endpoints
8
Updated
3d ago

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.

This call costs1 credit / call— charged only on success
Try it
Page number (0-based)
Sort order
Search keyword (e.g. 'milk', 'bread')
Additional filter string appended to the search query (e.g. ':isOnPromotion:On+Promotion')
Number of results per page
→ api.parse.bot/scraper/b87810bc-903f-41b8-b38d-c5c911cab324/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
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'
All endpoints · 8 totalmissing one? ·

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, image URLs and a barcode: the GTIN-13 / EAN-13 string that Pick n Pay embeds as a hyphen-delimited 13-digit segment of its product image filename, read verbatim from the first image URL that carries one; barcode is null when the product has no image URL or no such segment is present, and is never inferred from any other source. Pack variants carry their own barcode (a 6 x 1L case differs from the single 1L unit). Facets in the response enumerate available refinement dimensions with hit counts.

Input
ParamTypeDescription
pageintegerPage number (0-based)
sortstringSort order
queryrequiredstringSearch keyword (e.g. 'milk', 'bread')
filtersstringAdditional filter string appended to the search query (e.g. ':isOnPromotion:On+Promotion')
page_sizeintegerNumber of results per page
Response
{
  "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, availability and barcode",
    "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",
    "products[].barcode": "string GTIN-13 / EAN-13 read from the product image filename, or null when no image URL carries one"
  },
  "sample": {
    "data": {
      "type": "productCategorySearchPageWsDTO",
      "sorts": [
        {
          "code": "relevance",
          "name": "Best Match",
          "selected": true
        }
      ],
      "facets": [
        {
          "name": "category",
          "values": [
            {
              "name": "Milk, Dairy & Eggs",
              "count": 979,
              "query": {
                "url": "/search?q=milk%3Arelevance%3Acategory%3Amilk-dairy-and-eggs-423144840&pageSize=3",
                "query": {
                  "value": "milk:relevance:category:milk-dairy-and-eggs-423144840"
                }
              },
              "selected": false
            }
          ],
          "visible": true,
          "category": true,
          "multiSelect": false
        }
      ],
      "products": [
        {
          "code": "000000000000349246_EA",
          "name": "PnP UHT Full Cream Milk 1L",
          "price": {
            "value": 17.99,
            "savings": 0,
            "oldPrice": 0,
            "currencyIso": "ZAR",
            "formattedValue": "R17.99"
          },
          "stock": {
            "stockLevelStatus": "inStock"
          },
          "images": [
            {
              "url": "https://cdn-prd-02.pnp.co.za/sys-master/images/hd4/hc4/10794952884254/silo-product-image-v2-05Apr2022-180138-6001007041052-Straight_on-19006-4446_96Wx96H",
              "format": "thumbnail",
              "imageType": "PRIMARY"
            }
          ],
          "barcode": "6001007041052",
          "available": true,
          "brandSellerId": "PICK N PAY",
          "categoryNames": [
            "All Products",
            "Food Cupboard",
            "Full Cream"
          ],
          "numberOfReviews": 0,
          "inStockIndicator": true
        }
      ],
      "pagination": {
        "sort": "relevance",
        "pageSize": 3,
        "totalPages": 426,
        "currentPage": 0,
        "totalResults": 1277
      },
      "breadcrumbs": [],
      "currentQuery": {
        "url": "/search?q=milk%3Arelevance&pageSize=3",
        "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.

Reliability & maintenanceVerified

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.

Last verified
19h ago
Latest check
8/8 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Track price changes and savings on promoted products using get_specials with oldPrice and savings fields.
  • Build a grocery price comparison tool using search_store_products scoped to different storeId values.
  • Aggregate nutritional information across a product category using search_products_with_nutrition and 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_categories and resolve products with get_category_products.
  • Monitor stock levels for specific SKUs by polling get_product_detail for the stockLevel and stockLevelStatus fields.
  • Filter in-promotion products by department by combining a category_id with get_specials.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does Pick n Pay have an official public developer API?+
Pick n Pay does not publish a public developer API or documentation for third-party access to its product catalog or store data. This Parse API provides structured access to that data.
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?+
It is an array of classification groups, each with a set of named features. These features carry nutritional values (energy, protein, fat, carbohydrates, etc.) and endorsement or certification labels where the product carries them. Not every product has classifications populated.
Does the API cover Pick n Pay online order history or customer account data?+
No. The API covers public-facing product catalog data, specials, store locations, and nutritional information. Account-specific data such as order history, Smart Shopper balances, or saved lists is not exposed. You can fork this API on Parse and revise it to add endpoints targeting any public data the current spec does not include.
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.
Page content last updated . Spec covers 8 endpoints from pnp.co.za.
Related APIs in Food DiningSee all →