Ocado APIocado.com ↗
Access Ocado UK's grocery catalog via 6 endpoints: search products, fetch nutrition tables, get autocomplete suggestions, and retrieve cart data.
What is the Ocado API?
The Ocado API gives developers structured access to Ocado UK's grocery catalog across 6 endpoints, covering product search, full product detail, nutrition tables, autocomplete suggestions, related products, and cart state. The search_products endpoint returns current prices, promotions, availability, images, and category facets for up to 300 items per call. The get_product_details endpoint adds allergen information, storage instructions, ingredient lists, customer ratings, and per-product nutrition data.
curl -X GET 'https://api.parse.bot/scraper/44d2a146-f43b-415b-8494-308caaef06cf/search_products?query=milk&max_results=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Full-text search over Ocado's grocery catalog, optionally narrowed to one category. Returns decorated product listings with current prices, promotions, availability, and images, grouped by type (featured, cluster). Items with group_type 'featured' are sponsored placements the site shows regardless of the category filter; callers who want strictly in-category results can drop them. Every response also carries `categories`: the site's category facet tree for the current result set, flattened to {category_id, name, path, product_count}. When no category filter is given this is the full tree for the query; when a category is applied it lists only that category's sub-categories (empty for a leaf category). The category filter accepts either a category_id from `categories` (one round trip) or a category name, which is matched case-insensitively against the facet names for this query (two round trips: one to resolve the name, one to search). A name not present in the facet tree for the query returns an empty product list together with the categories that are available; an id the site rejects returns a stale_input error. Pagination is not exposed — use max_results to control volume (up to 300).
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search term (e.g. 'milk', 'bread', 'chicken breast') |
| category | string | Optional category filter: a category_id from search_products.categories[*].category_id (UUID string) or a category name exactly as it appears in search_products.categories[*].name, e.g. 'Fresh & Chilled Food' (one shape; any level of the tree such as 'Vegetables' or 'Aubergines' is accepted). Omit for an unfiltered search. |
| max_results | integer | Maximum number of results to return (1-300) |
{
"type": "object",
"fields": {
"query": "string - the search term used",
"category": "string - the matched category name when the filter was given as a name; null when filtered by id or unfiltered",
"products": "array of product summary objects with product_id, retailer_product_id, name, brand, type, pack_size, price, unit_price, available, image_url, promotions, group_type, quantity_in_basket",
"categories": "array of category facet objects {category_id (UUID usable as the category input), name, path (array of ancestor names ending with this category), product_count} for the current result set",
"category_id": "string - the category UUID actually applied to the search, or null when unfiltered",
"total_products": "integer - number of products returned"
},
"sample": {
"data": {
"query": "aubergine",
"category": "Fresh & Chilled Food",
"products": [
{
"name": "M&S Aubergine ",
"type": "REGULAR",
"brand": "M&S",
"price": {
"amount": "0.95",
"currency": "GBP"
},
"available": true,
"image_url": "https://www.ocado.com/images-v3/eafa5127-d256-497b-9609-4869092accd6/d780163e-6317-4c4f-9724-2843888559e7/300x300.jpg",
"pack_size": null,
"group_type": "cluster",
"product_id": "9f05d197-1e62-4930-bb06-8b5e9774677d",
"promotions": null,
"unit_price": {
"unit": "fop.price.per.each",
"amount": "95.0"
},
"quantity_in_basket": 0,
"retailer_product_id": "518543011"
},
{
"name": "White Rabbit Gluten Free Aubergine Parmigiana Fresh Girasoli Pasta",
"type": "REGULAR",
"brand": "White Rabbit Pizza Co",
"price": {
"amount": "3.75",
"currency": "GBP"
},
"available": true,
"image_url": "https://www.ocado.com/images-v3/eafa5127-d256-497b-9609-4869092accd6/e210f549-77b8-42be-8367-659db8f9e98b/300x300.jpg",
"pack_size": "250g",
"group_type": "cluster",
"product_id": "780c620c-beae-4513-9c87-396191ffcc46",
"promotions": null,
"unit_price": {
"unit": "fop.price.per.kg",
"amount": "15.00"
},
"quantity_in_basket": 0,
"retailer_product_id": "670742011"
}
],
"categories": [
{
"name": "Vegetables",
"path": [
"Vegetables"
],
"category_id": "93ca7a3f-f9a5-44dc-8b8a-6ddded9ca57b",
"product_count": 7
},
{
"name": "Courgettes & Aubergines",
"path": [
"Vegetables",
"Courgettes & Aubergines"
],
"category_id": "5dd99735-705d-4039-a503-76cd54a92160",
"product_count": 7
},
{
"name": "Pasta, Sauces & Stock",
"path": [
"Pasta, Sauces & Stock"
],
"category_id": "9a3eb120-9104-4092-883c-d416c51c642b",
"product_count": 1
}
],
"category_id": "01f3d930-813f-4038-983b-51bfcc7cb44e",
"total_products": 15
},
"status": "success"
}
}About the Ocado API
Search and Browse the Catalog
The search_products endpoint accepts a free-text query and an optional category filter — either a UUID from categories[*].category_id in previous results or a plain category name. Responses include a products array of summary objects (name, brand, pack size, price, unit price, availability, images, promotions) and a categories array of facet objects you can pass back as filters. The group_type field distinguishes sponsored placements (featured) from organic results (cluster). Results are capped by the max_results parameter (1–300).
Product Detail and Nutrition
get_product_details takes a retailer_product_id (numeric string from search results) and returns the full product record: description, ingredients, allergens, storage instructions, an images array, a rating object (overall score and review count), and a nutrition array of {name, value} pairs. For applications that need nutrition data across many items at once, search_products_with_nutrition runs a catalog search and normalises each product's nutrition table to per 100 g or per 100 ml, reporting products_with_nutrition, products_without_nutrition_data, and products_lookup_failed counts so you know the coverage quality of the result set. Because this endpoint issues one detail lookup per product, the max_results parameter is capped at 50.
Suggestions, Related Products, and Cart
get_search_suggestions returns autocomplete strings for a given prefix; passing an empty query returns currently popular search terms. get_related_products accepts a retailer_product_id and returns two UUID arrays — related_product_ids for complementary items and similar_product_ids for alternatives — which you then resolve individually with get_product_details. get_cart exposes the current session's anonymous trolley: items, item_count, totals (retail price, post-promotion price, savings), and a checkout_info object that indicates whether the cart meets the minimum order threshold.
The Ocado API is a managed, monitored endpoint for ocado.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ocado.com 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 ocado.com 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?+
- Build a grocery price tracker that monitors
priceandunit_pricefields across product categories over time. - Create a nutrition comparison tool using
search_products_with_nutritionto rank products by per-100g calorie or macro values. - Power a type-ahead search widget with
get_search_suggestions, falling back to trending terms when the input is empty. - Generate 'customers also buy' recommendation widgets using
related_product_idsfromget_related_products. - Audit promotional coverage across a category by scanning the
promotionsfield insearch_productsresults. - Build an allergen filter for shoppers by extracting the
allergensfield fromget_product_detailsacross a search result set. - Validate cart eligibility before checkout by reading
checkout_info.above_thresholdandcheckout_info.minimum_thresholdfromget_cart.
| 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 Ocado offer an official developer API?+
How does `search_products` handle sponsored vs organic results?+
products array includes a group_type field. Items with group_type equal to featured are sponsored placements; items with group_type equal to cluster are organic results. You can filter client-side on this field to separate the two.Does the API cover Ocado's full product range, including items only visible when logged in?+
Does `search_products_with_nutrition` guarantee a nutrition table for every result?+
products_with_nutrition (normalised successfully), products_without_nutrition_data (the source lists no nutrition table for that item), and products_lookup_failed (detail fetch failed). Expect partial coverage, especially for fresh produce and some own-label items.Can I retrieve order history or saved lists through this API?+
get_cart, product search, and product detail. Order history, saved shopping lists, and account-level data are not included. You can fork this API on Parse and revise it to add those endpoints if your use case requires them.