caps APIcaps.nl ↗
Search the caps.nl computer hardware catalog and retrieve real-time prices, stock levels, EAN codes, and full specs for any product via 2 JSON endpoints.
What is the caps API?
The caps.nl API exposes 2 endpoints for querying the caps.nl Dutch computer hardware catalog. Use search_products to run a free-text search and receive paginated product summaries including EUR prices (with and without Dutch VAT), brand, delivery time, and a brand facet. Use search_price to fetch a single product's current price, previous price when discounted, stock quantity, EAN barcode, SKU, and full specification table by product ID.
curl -X GET 'https://api.parse.bot/scraper/1e25f3f5-58b4-4c8b-b72d-79f8cd2655d5/search_products?sort=recommended&query=rtx+5070' \ -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 caps-nl-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: caps.nl hardware catalog — search, browse, and price check."""
from parse_apis.caps_nl_api import CapsNl, SortOrder, ProductNotFound
client = CapsNl()
# Search for graphics cards, cheapest first, capped at 5 results.
for item in client.product_summaries.search(
query="rtx 5070", sort=SortOrder.PRICE_ASC, limit=5
):
print(item.title, item.price_incl_vat, item.currency)
# Drill into the first result for full specs and stock info.
hit = client.product_summaries.search(query="rtx 5070 ti", limit=1).first()
if hit is not None:
detail = hit.details()
print(detail.title, detail.price_incl_vat, detail.availability)
print("stock:", detail.stock_quantity)
for label, value in list(detail.specifications.items())[:5]:
print(f" {label}: {value}")
# Point lookup by a product_id discovered above.
if hit is not None:
try:
product = client.products.get(product_id=hit.product_id)
print(product.title, product.sku, product.ean)
except ProductNotFound:
print("product no longer listed")
print("exercised: product_summaries.search / details / products.get")
Full-text product search across the whole caps.nl catalog. Returns one page of product summaries (one row per product) with prices in EUR including and excluding Dutch VAT, delivery time, brand, image and product URL, plus the total result count, page count and the brand facet (brand names with result counts) for narrowing. Paging is caller-controlled: page defaults to 1 and page_size to 12; has_more is true while further pages exist. One upstream request per call. A query with no matches returns total_results 0 and an empty items list.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page. |
| sort | string | Result ordering. |
| brand | string | Restrict results to one brand, using a name exactly as returned in brands[*].name of a previous search (e.g. MSI). Omitted = all brands. |
| queryrequired | string | Free-text search term, e.g. a product line or model name. |
| page_size | integer | Results per page; the site accepts 12, 24, 36 or 48, other values are rejected. |
{
"type": "object",
"fields": {
"page": "integer current page",
"items": "array of product summaries: product_id (numeric string, input to search_price), title, brand, price_incl_vat and price_excl_vat (EUR numbers), old_price_incl_vat (number or null when not discounted), currency, delivery_time (Dutch text, e.g. '1-2 werkdagen'), free_shipping_nl (boolean), image, url",
"query": "search term as interpreted by the site",
"brands": "array of {name, count} brand facet values for the current result set",
"has_more": "boolean, true when a next page exists",
"page_size": "integer page size applied",
"total_pages": "integer number of pages",
"total_results": "integer total matching products across all pages",
"suggested_query": "alternative spelling suggested by the site, or null"
},
"sample": {
"data": {
"page": 1,
"items": [
{
"url": "https://caps.nl/msi-geforce-rtx-5070-ti-16g-ventus-3x-oc-id-998606.html",
"brand": "MSI",
"image": "https://cdn.caps.nl/media/catalog/product/9/9/9986064babd0a620a831a89441dc41dc73e5ce_1.jpg",
"title": "MSI GeForce RTX 5070 Ti 16G VENTUS 3X OC",
"currency": "EUR",
"product_id": "998606",
"delivery_time": "1-2 werkdagen",
"price_excl_vat": 1098.35,
"price_incl_vat": 1329,
"free_shipping_nl": true,
"old_price_incl_vat": null
}
],
"query": "rtx 5070",
"brands": [
{
"name": "MSI",
"count": 9
},
{
"name": "GIGABYTE",
"count": 16
}
],
"has_more": false,
"page_size": 12,
"total_pages": 1,
"total_results": 9,
"suggested_query": null
},
"status": "success"
}
}About the caps API
Searching the Catalog
The search_products endpoint accepts a free-text query and returns a paginated list of matching products from the caps.nl catalog. Each result row includes a numeric product_id (needed as input to search_price), title, brand, price_incl_vat, price_excl_vat in EUR, delivery_time, and the product page URL. The response also carries pagination metadata: total_results, total_pages, page, page_size, and has_more. A brands array gives the brand facet with name and hit count for the current result set, and suggested_query surfaces any alternative spelling the site proposes.
The page_size parameter only accepts the values 12, 24, 36, or 48 — any other value is rejected. Filtering by brand requires passing the brand parameter with a name exactly as it appears in brands[*].name from a previous search response. Results can be ordered via the sort parameter.
Product Detail and Pricing
The search_price endpoint takes a single product_id (the numeric string from search results) and returns the full detail for that product. Fields include price_incl_vat (current price), a previous price when the product is discounted, availability as a schema.org token (e.g. InStock), stock quantity, delivery_time in Dutch (e.g. 1-2 werkdagen), ean, sku, description, image, url, and a structured specification table as labeled key-value pairs. This makes it straightforward to compare hardware specs programmatically without parsing unstructured text.
Coverage and Language
All catalog data is sourced from caps.nl, a Dutch computer hardware retailer. Prices are in EUR. Delivery time strings are in Dutch. The EAN field returns null when the product page does not list one. The API does not cover user reviews, seller ratings, or historical price data.
The caps API is a managed, monitored endpoint for caps.nl — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when caps.nl 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 caps.nl 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 current EUR prices (incl. and excl. Dutch VAT) for specific CPU or GPU models across the caps.nl catalog.
- Monitor stock availability and delivery time for hardware components before placing bulk orders.
- Compare full specification tables for multiple products using the structured key-value spec fields from
search_price. - Build a price-alert tool that checks
price_incl_vatand the previous-price field to detect discounts. - Aggregate EAN and SKU codes from caps.nl to cross-reference products against other Dutch hardware retailers.
- Filter search results by brand using the
brandsfacet to narrow a product line to a single manufacturer. - Populate a product database with canonical URLs and images from the caps.nl catalog for a hardware comparison site.
| 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 caps.nl provide an official developer API?+
What does `search_price` return beyond the current price?+
search_price returns the current price_incl_vat, a previous price when the product is on discount, availability as a schema.org token, stock quantity, delivery_time (Dutch text), ean, sku, description, image, url, and a full specification table as structured label-value pairs. The currency field is always an ISO code from the product page.Can I retrieve customer reviews or seller ratings through this API?+
What happens if I pass a page_size value that isn't 12, 24, 36, or 48?+
page_size in search_products will result in a rejected request. Use one of the four supported values to avoid errors.