Tes API endpoint
Returns detail for one teaching resource by its numeric id (the id field returned by tes-resource-search). Descriptive facts (title, subject, age range, resource type, author, price, rating, licence label), a per-file attachment list (file type, size, and a preview thumbnail -- metadata only), and the most recent page of reviews are returned -- not the downloadable resource file itself.
/tes/resources/detailQuery parameters:
id (required): a numeric Tes resource id, e.g. 13463100.country (optional, default GB): storefront market for pricing/currency. One of GB, US, AU, IE, CA, NZ, UN.Notable response behavior:
404.id resolves purely from the numeric id -- the real listing's slug does not need to be known.price is 0 and free is true for free resources.reviews is the most recent page of reviews (as many as the resource's own page shows, typically up to 5); rating_count is the true total review count across every review, not just len(reviews). A resource with no reviews yet returns an empty reviews array.license is the resource's own licence label as Tes's detail page displays it, e.g. Tes paid licence or Creative Commons "Sharealike".attachments lists each downloadable file's own type, size, and a preview thumbnail image -- metadata only; the file itself is never fetched.| Field | Filled in, of 13 checked | Values in the sample |
|---|---|---|
| file_type | 13 | png in all 13 |
| size | 13 | “256.71 KB” and 12 other values |
| preview_image_url | 13 | d1uvxqwmcz8fl1.cloudfront.net |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Tes resource id | 13463100 | |
| country | string | No | Storefront market for pricing/currency Allowed values: GB, US, AU, IE, CA, NZ, UN. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/tes/resources/detail?id=13463100&country=us" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"id": "13463100",
"title": "Phonics Bunting",
"url": "https://www.tes.com/teaching-resource/x-13463100",
"description": "These are A-Z alphabet bunting designed using the Little Wandle phonics scheme.",
"author": "joannecrozierharbottle",
"author_url": "https://www.tes.com/teaching-resources/shop/joannecrozierharbottle",
"subject": "English",
"age_range": "3-5",
"resource_type": "Visual aid/Display",
"price": 1,
"currency": "GBP",
"free": false,
"rating": 4.2,
"rating_count": 5,
"thumbnail_url": "https://d1e4pidl3fu268.cloudfront.net/example/preview.png",
"license": "Tes paid licence",
"attachments": [
{
"file_type": "png",
"size": "256.71 KB",
"preview_image_url": "https://d1uvxqwmcz8fl1.cloudfront.net/tes/resources/13463100/one/image?width=500"
}
],
"reviews": [
{
"id": "1313111",
"rating": 5,
"comment": "Thank you, great resource",
"author": "jafgthomas",
"author_url": "https://www.tes.com/teaching-resources/shop/jafgthomas",
"posted": "8 years ago"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/tes.resourceDetailResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | tes.ResourceDetail | No | ||||
| data.age_range | string | No | ||||
| data.attachments | array | No | Attachments lists each downloadable file's own type/size and a preview thumbnail -- metadata only (the file itself is never fetched; robots.txt disallows /teaching-resource/download/ regardless). | |||
| data.attachments[].file_type | string | No | ||||
| data.attachments[].preview_image_url | string | No | ||||
| data.attachments[].size | string | No | ||||
| data.author | string | No | ||||
| data.author_url | string | No | ||||
| data.currency | string | No | ||||
| data.description | string | No | ||||
| data.free | boolean | No | ||||
| data.id | string | No | ||||
| data.license | string | No | License is the resource's own licence label as Tes's detail page itself displays it (e.g. "Tes paid licence", `Creative Commons "Sharealike"`) -- a longer display string than ResourceSummary.License's short facet code, since the detail page has no equivalent short-code field to read. | |||
| data.price | number | No | ||||
| data.rating | number | No | ||||
| data.rating_count | integer | No | ||||
| data.resource_type | string | No | ||||
| data.reviews | array | No | Reviews is the most recent page of reviews (the same page the pricing/reviews JSON endpoint returns by default -- see rawResourcePricing's doc comment). RatingCount is the true total across every review, not just len(Reviews). | |||
| data.reviews[].author | string | No | ||||
| data.reviews[].author_url | string | No | ||||
| data.reviews[].comment | string | No | ||||
| data.reviews[].id | string | No | ||||
| data.reviews[].posted | string | No | ||||
| data.reviews[].rating | number | No | ||||
| data.subject | string | No | ||||
| data.thumbnail_url | string | No | ||||
| data.title | string | No | ||||
| data.url | string | 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/tes/resources/detail?id=13463100&country=us" \
-H "x-api-key: $CRAWLORA_API_KEY"