CTV News API endpoint
Returns public CTV News article metadata and body paragraphs from a canonical story URL (https://www.ctvnews.ca/<section>/article/<slug>/). Video, photo-gallery and live-stream pages are not article pages.
/ctvnews/articleQuery parameter: url is a canonical HTTPS ctvnews.ca story URL of the form https://www.ctvnews.ca/<section>/article/<slug>/ (sub-sections such as /world/mideast-conflict/article/<slug>/ are accepted). Video, photo-gallery and live-stream pages are not article pages and are rejected with a 400 error. A story that does not exist returns 404.
Returns public metadata (title, description, publication and update time, section, authors, lead image) and the body paragraphs. Headings and list items are returned as paragraphs; images and embeds are skipped. CTV News serves full story text to anonymous readers; paywalled is only present (and true) if a story is ever gated, in which case paragraphs is a partial body.
| Field | In the sample | Value in the sample |
|---|---|---|
| url | Has a value | ctvnews.ca |
| title | Has a value | 78 characters |
| description | Has a value | 199 characters |
| published_at | Has a value | 2026-09-24 |
| updated_at | Has a value | 2026-09-24 |
| section | Has a value | “Vancouver” |
| authors | Has a value | 1 entry |
| image_url | Has a value | ctvnews.ca |
| paragraphs | Has a value | 21 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| url | string | Yes | Canonical CTV News article URL | https://www.ctvnews.ca/toronto/article/example-article-slug/ | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/ctvnews/article?url=https%3A%2F%2Fwww.ctvnews.ca%2Ftoronto%2Farticle%2Fexample-article-slug%2F" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"url": "https://www.ctvnews.ca/toronto/article/example-article-slug",
"title": "Example article",
"description": "Example description.",
"published_at": "2026-09-24T18:55:50Z",
"updated_at": "2026-09-24T18:55:50Z",
"section": "Toronto",
"authors": [
"Jane Reporter"
],
"image_url": "https://www.ctvnews.ca/resizer/v2/EXAMPLE.jpg?auth=example",
"paragraphs": [
"Example public paragraph."
]
}
}Request schema
No body schema
Response schema
#/definitions/publicnews.articleResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| data | newsplatform.ArticleResponse | No | ||||
| data.authors | array | No | ||||
| data.description | string | No | ||||
| data.image_url | string | No | ||||
| data.paragraphs | array | No | ||||
| data.paywalled | boolean | No | Paywalled is true when the publisher serves only a teaser of this article to anonymous readers, so Paragraphs is a partial body rather than the full text. It is omitted when the full public body was returned. | |||
| data.published_at | string | No | ||||
| data.section | string | No | ||||
| data.title | string | No | ||||
| data.updated_at | string | No | ||||
| data.url | string | No |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/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/ctvnews/article?url=https%3A%2F%2Fwww.ctvnews.ca%2Ftoronto%2Farticle%2Fexample-article-slug%2F" \
-H "x-api-key: $CRAWLORA_API_KEY"