Guardian API endpoint
Returns the stories on a public Guardian tag archive (20 per page, newest first, with total pages and results) or section front (a single curated page, is_front true). topic is a Guardian tag or section slug and page defaults to 1. resolved_topic reports the path actually served, which differs for edition-scoped fronts.
/guardian/topicQuery parameters: required topic, a Guardian tag or section slug such as world/ukraine, technology/artificialintelligenceai, or world; optional 1-based page from 1 to 100, which defaults to 1.
Returns the stories listed on a public Guardian tag archive or section front, with titles, URLs, summaries, publication times, sections, and series kickers.
Notable response behavior:
is_front: false) return 20 stories per page, newest first. pagination.total_pages and pagination.total_results report the archive size; has_next/next_page are set while another page exists within the page limit of 100.is_front: true, for example world) are a single curated page: total_pages is 1, has_next is false, and page values above 1 return an empty items list.resolved_topic is the path the Guardian actually served. It differs from topic for edition-scoped fronts (for example technology resolves to uk/technology).page beyond the end of a tag archive returns an empty items list with has_next: false.published_at is an RFC 3339 UTC timestamp. section is the story's own Guardian section (the first URL segment), which can differ from the requested topic.| Field | Filled in, of 45 checked | Values in the sample |
|---|---|---|
| title | 45 | “Controversial vaccine trial touted by RFK Jr gets go-ahead…” and 44 other values |
| url | 45 | theguardian.com |
| summary | 45 | median 117 characters |
| published_at | 45 | 2026-10-08 to 2026-10-13 |
| section | 45 | “society” and 9 other values |
| kicker | 7 | “Weather tracker” and 6 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| topic | string | Yes | Guardian tag or section slug | world | |
| page | integer | No | 1 | 1-based archive page, 1 to 100, defaults to 1 Minimum: 1. Maximum: 100. | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/guardian/topic?topic=world&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"topic": "world/ukraine",
"resolved_topic": "world/ukraine",
"is_front": false,
"items": [
{
"title": "Ukraine war briefing: Poland’s Tusk heads to Kyiv after warning of Russian strikes on Ukrainian allies",
"url": "https://www.theguardian.com/world/2026/sep/18/ukraine-war-briefing-poland-warns-russian-strikes-kyiv-allies",
"summary": "Donald Tusk says Moscow will not enter peace talks without Ukraine’s ‘total capitulation’.",
"published_at": "2026-09-18T01:47:56Z",
"section": "world",
"kicker": "Russia-Ukraine war at a glance"
}
],
"pagination": {
"page": 1,
"has_next": true,
"next_page": 2,
"total_pages": 931,
"total_results": 18604
}
}
}Request schema
No body schema
Response schema
#/definitions/guardian.topicResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | guardian.TopicResponse | No | ||||
| data.is_front | boolean | No | IsFront is true for a curated section front (no archive paging) and false for a paginated tag archive. | |||
| data.items | array | No | ||||
| data.items[].kicker | string | No | Kicker is the series or blog label Guardian shows above the headline. | |||
| data.items[].published_at | string | No | ||||
| data.items[].section | string | No | ||||
| data.items[].summary | string | No | ||||
| data.items[].title | string | No | ||||
| data.items[].url | string | No | ||||
| data.pagination | guardian.TopicPagination | No | ||||
| data.pagination.has_next | boolean | No | ||||
| data.pagination.next_page | integer | No | ||||
| data.pagination.page | integer | No | ||||
| data.pagination.total_pages | integer | No | TotalPages is the archive's last page (1 for a section front). | |||
| data.pagination.total_results | integer | No | TotalResults is Guardian's article count for a tag archive. | |||
| data.resolved_topic | string | No | ResolvedTopic is the path Guardian actually served, which differs from Topic for edition-scoped fronts (technology -> uk/technology). | |||
| data.topic | 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/guardian/topic?topic=world&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"