Cardmarket API endpoint
Returns a paginated snapshot of Cardmarket's public daily price-guide export. The response discovers category IDs but the source file has no category labels. Cardmarket's posted English terms include a prior-written-agreement clause for external price display in a future-dated revision whose effective status is unconfirmed here; the response marks permission as unconfirmed.
/cardmarket/price-guideQuery parameters:
kind: game or accessories; defaults to game. For accessories, omit game_id and the endpoint uses the global accessories guide.game_id: required when kind=game. Accepted values are 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, and 33.category_id: optional current numeric category ID discovered through /api/v1/cardmarket/price-guide/categories. The source price-guide rows do not contain category labels; the response also includes the current category IDs.product_id: optional exact product ID filter.limit: 1–500 rows; defaults to 100.offset: zero-based; defaults to 0.The endpoint downloads the daily public export, discovers category IDs from its full row set, and applies filters locally. Data is cached for six hours and stale data is returned if refresh fails. Depending on the export, finish-specific metrics may be named holo or foil; the response retains them separately as *_holo and *_foil. This is not a current seller offer or historical-price endpoint. Cardmarket's posted English terms page shows an external-display agreement clause in a future-dated revision, so its effective status is not independently confirmed here. The user confirms written approval for this feature's external display scope; the agreement was not attached for review. The response keeps price_redistribution_policy_status at external_price_display_permission_not_confirmed because the permission has not been independently reviewed in this repository.
Example response (one category and one row shown; the live response includes every discovered category ID and its exact count):
{
"code": 200,
"msg": "OK",
"data": {
"kind": "game",
"game_id": 6,
"source_url": "https://downloads.s3.cardmarket.com/productCatalog/priceGuide/price_guide_6.json",
"version": 1,
"created_at": "2026-10-28T02:45:21+0100",
"fetched_at": "2026-10-28T00:00:00Z",
"stale": false,
"price_redistribution_policy_status": "external_price_display_permission_not_confirmed",
"category_ids": [{"id": 52, "item_count": 80000}],
"items": [{"product_id": 271439, "category_id": 52, "average": 174.5, "low": 150, "trend": 270.03, "average_1d": 170, "average_7d": 160, "average_30d": 140}],
"total": 80170,
"limit": 100,
"offset": 0
}
}
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| product_id | 40 | |
| category_id | 40 | |
| average | 40 | 39.95 to 19,950, median 465 |
| low | 40 | 37 to 100,000, median 300 |
| trend | 40 | 95.27 to 19,020.98, median 430.65 |
| trend_holo | 40 | 3.93 to 1,782.45, median 10.95 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| kind | string | No | game | Price-guide dataset; defaults to game Allowed values: game, accessories. | game |
| game_id | integer | No | Required when kind=game; omit for global accessories Allowed values: 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33. | 6 | |
| category_id | integer | No | Optional category ID; discover the full set with /cardmarket/price-guide/categories | 52 | |
| product_id | integer | No | Optional exact product ID filter | 271439 | |
| limit | integer | No | 100 | Rows per page, 1-500; defaults to 100 | 100 |
| offset | integer | No | 0 | Zero-based offset; defaults to 0 | 0 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/cardmarket/price-guide?kind=game&game_id=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"kind": "game",
"game_id": 6,
"source_url": "https://downloads.s3.cardmarket.com/productCatalog/priceGuide/price_guide_6.json",
"version": 1,
"created_at": "2026-10-28T02:45:21+0100",
"fetched_at": "2026-10-28T00:00:00Z",
"stale": false,
"price_redistribution_policy_status": "external_price_display_permission_not_confirmed",
"category_ids": [
{
"id": 52,
"item_count": 80000
}
],
"items": [
{
"product_id": 271439,
"category_id": 52,
"average": 174.5,
"low": 150,
"trend": 270.03,
"average_1d": 170,
"average_7d": 160,
"average_30d": 140
}
],
"total": 80170,
"limit": 100,
"offset": 0
}
}Request schema
No body schema
Response schema
#/definitions/cardmarket.priceGuideResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | cardmarket.PriceGuideResponse | No | ||||
| data.category_id | integer | No | ||||
| data.category_ids | array | No | ||||
| data.category_ids[].id | integer | No | ||||
| data.category_ids[].item_count | integer | No | ||||
| data.created_at | string | No | ||||
| data.empty_state | string | No | ||||
| data.fetched_at | string | No | ||||
| data.game_id | integer | No | ||||
| data.items | array | No | ||||
| data.items[].average | number | No | ||||
| data.items[].average_1d | number | No | ||||
| data.items[].average_1d_foil | number | No | ||||
| data.items[].average_1d_holo | number | No | ||||
| data.items[].average_30d | number | No | ||||
| data.items[].average_30d_foil | number | No | ||||
| data.items[].average_30d_holo | number | No | ||||
| data.items[].average_7d | number | No | ||||
| data.items[].average_7d_foil | number | No | ||||
| data.items[].average_7d_holo | number | No | ||||
| data.items[].average_foil | number | No | ||||
| data.items[].average_holo | number | No | ||||
| data.items[].category_id | integer | No | ||||
| data.items[].low | number | No | ||||
| data.items[].low_foil | number | No | ||||
| data.items[].low_holo | number | No | ||||
| data.items[].product_id | integer | No | ||||
| data.items[].trend | number | No | ||||
| data.items[].trend_foil | number | No | ||||
| data.items[].trend_holo | number | No | ||||
| data.kind | string | No | ||||
| data.limit | integer | No | ||||
| data.offset | integer | No | ||||
| data.price_redistribution_policy_status | string | No | ||||
| data.product_id | integer | No | ||||
| data.source_url | string | No | ||||
| data.stale | boolean | No | ||||
| data.total | integer | No | ||||
| data.version | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/cardmarket/price-guide?kind=game&game_id=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"