Device Details
Retrieve one published device, including its nested brand, specifications, variants and catalog revision.
/v1/devices/{slug}Request
Run this on your server with SPECSPOOL_API_KEY set.
curl --request GET 'https://api.specspool.com/v1/devices/apple-iphone-16-pro-max' \
--header "x-api-key: $SPECSPOOL_API_KEY"Parameters
Required header: x-api-key.
| Field | Type | Presence |
|---|---|---|
slug | slug | Required |
| Field | Type | Presence |
|---|---|---|
generation | string | Optional |
- Discover a real slug through Search devices. Slugs accept up to 200 lowercase letters, digits and hyphens, with no leading, trailing or consecutive hyphens.
- A successful response includes X-Device-Generation. To pin a later read to the same content, pass that opaque UUID as generation. Do not interpret it as a timestamp.
- If the supplied generation is no longer current, the API returns 409 device_changed. Read the device again without generation to receive its current details and X-Device-Generation value.
- specs is an open JSON object. Groups and fields depend on the device and category; check that a field exists before using it. releasedAt is optional.
- A full-spec device consumes one billable unit. On prepaid Standard that unit costs $0.03. Account-wide device limits use fixed UTC windows and apply across all API keys.
Response
200 OK, application/json. See Response schema for device, brand, variant and search-result fields.
All customer /v1 responses use Cache-Control: private, no-store. Free device-detail responses omit image URL fields. Image URLs are optional on paid plans too; check for their presence before rendering an image.
Show an example JSON response
Illustrative data; names, counts and specifications are examples.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"slug": "example-phone",
"name": "Example Phone",
"brand": {
"id": "00000000-0000-4000-8000-000000000010",
"slug": "example-brand",
"name": "Example Brand",
"deviceCount": 2
},
"brandSlug": "example-brand",
"category": "phone",
"summary": "An illustrative catalog entry.",
"updatedAt": "2026-10-01T00:00:00.000Z",
"revision": "example-revision",
"specs": {
"display": {
"size_inches": 6.1,
"panel_type": "OLED",
"refresh_rate_hz": 120
},
"memory": {
"variants": [
{
"storage_gb": 128,
"ram_gb": 8
}
]
}
},
"variants": [],
"releasedAt": "2026-01-01T00:00:00.000Z"
}
}| Field | Type | Presence |
|---|---|---|
data | object | Required |
data.id | string (uuid) | Required |
data.slug | slug | Required |
data.name | string | Required |
data.brand | Brand | Required |
data.brandSlug | slug | Required |
data.category | category | Required |
data.summary | string | Required |
data.specs | object | Required |
data.variants | Variant[] | Required |
data.releasedAt | string (datetime) | Optional |
data.updatedAt | string (datetime) | Required |
data.revision | string | Required |
Errors
Invalid supported parameters or malformed JSON can return 400 validation_error. Authentication and admission can return 401, 402, 403, 429 or 503; see authentication errors. Unexpected failures return 500 internal_error. Errors after admission remain counted.
404 DEVICE_NOT_FOUNDNo published device matches the slug.
409 device_changedThe supplied generation no longer matches the current device.
503 device_changedThe returned device identity changed or its generation changed repeatedly during an unpinned lookup. Retry with backoff.
{
"error": {
"code": "validation_error",
"message": "Invalid request parameters"
}
}