Flashscore API endpoint
Returns a Flashscore article with its headline, standfirst, author, source credit, tags, publication and edit times, cover image and the full body converted to plain-text paragraphs and headings with structured links to players, teams, matches and other articles. Embedded posts, images and info boxes are kept as placeholder blocks, not in the text. Live blogs work too. An unknown article id returns not found. For metadata and image variants only, use flashscore-news-article.
/flashscore/news-article-bodyReturns one Flashscore article with its full body. Flashscore stores article text as markup; this endpoint converts it to plain-text paragraphs and headings and keeps links, embedded posts, images and info boxes as structured blocks. Use /api/v1/flashscore/news-article instead when you only need metadata and image variants.
Query parameters:
id (required): eight-character article id, from /api/v1/flashscore/news listing paths (/news/<slug>/<id>/), /api/v1/flashscore/entity-news, /api/v1/flashscore/news-most-read or /api/v1/flashscore/match-news. An unknown article id returns 404.Response fields (article):
id, type (STANDARD for every article checked), title, slug, url, perex (the standfirst), author, credit (the source credit, such as Reuters, AFP, Flashscore or the writer's name).published_at and published_at_iso; edited_at and edited_at_iso only when the article was edited.image: the original-size cover image {url, alt_text, credit}.tags: {entity_id, entity_type, label, slug}. entity_type is SPORT, PARTICIPANT (a team or player id), TOURNAMENT_TEMPLATE or TAG (an editorial tag). The first three work as inputs of /api/v1/flashscore/entity-news.text: every paragraph and heading in order, separated by a blank line. Embeds, images and info boxes are not part of text.blocks and block_count: the same content as ordered blocks. type is one of paragraph, heading, embed, image or infobox.
paragraph: text and optional links. heading: text and level (1 to 6; articles use 2).{text, kind, id, sport_id, url}. kind is link (an external web link, with url only), participant (a team or player page, with the participant id), player, event (a match, with the match id), tournament (the tournament template id; the url is the page the author linked, usually a match) or article (another Flashscore article, with its id). Only http and https URLs are returned.embed: a social post placeholder with provider (twitter, instagram and youtube seen) and url. The post's text is not fetched.image: an inline image with id, url, alt, credit, width and height.infobox: a reference to a Flashscore info box with its id; the box content is not part of the article text.Article text is Flashscore's editorial content or a licensed agency story and is returned as published; respect the credit when you reuse it.
Example response (shortened):
{"code":200,"msg":"OK","data":{"source_url":"https://2.ds.lsapp.eu/pq_graphql?_hash=na&articleId=xlKVMkEO&projectId=2","article":{"id":"xlKVMkEO","type":"STANDARD","title":"Ronaldo releases statement detailing fall-out, confirms he remains available for Portugal","slug":"ronaldo-releases-statement-detailing-fall-out-confirms-he-remains-available-for-portugal","url":"https://www.flashscore.com/news/ronaldo-releases-statement-detailing-fall-out-confirms-he-remains-available-for-portugal/xlKVMkEO/","perex":"Cristiano Ronaldo has accused Portugal coach Jorge Jesus of twice breaking his word, saying a failed agreement to publicly explain his omission against Norway drove him out of the camp but insistin...","author":"Mário Rui Ventura","credit":"Reuters","published_at":1791314553,"published_at_iso":"2026-10-06T19:22:33Z","edited_at":1791316179,"edited_at_iso":"2026-10-06T19:49:39Z","image":{"url":"https://livesport-ott-images.ssl.cdn.cra.cz/c5e168b7-5104-4a63-a0b6-729fd1be15e2","alt_text":"Cristiano Ronaldo, captain of Portugal","credit":"REUTERS/Pedro Nunes"},"tags":[{"entity_id":"SW9D1eZo","entity_type":"SPORT","label":"Soccer","slug":"soccer"},{"entity_id":"WvJrjFVN","entity_type":"PARTICIPANT","label":"Portugal","slug":"portugal"},{"entity_id":"WGOY4FSt","entity_type":"PARTICIPANT","label":"Cristiano Ronaldo","slug":"ronaldo-cristiano"}],"block_count":17,"text":"In a lengthy statement, the 41-year-old gave his account of the dispute that prompted his departure from Copenhagen before Portugal's Nations League match versus Denmark last week.\n\nRonaldo said Je...","blocks":[{"type":"paragraph","text":"In a lengthy statement, the 41-year-old gave his account of the dispute that prompted his departure from Copenhagen before Portugal's Nations League match versus Denmark last week."},{"type":"paragraph","text":"Ronaldo said Jesus had agreed a plan under which the forward would miss the Norway and Denmark matches to manage his fitness. However, on the day of the Norway game, the coach told him he would pla..."},{"type":"paragraph","text":"\"Everyone knows the rest. I warmed up from half-time onwards, watched the minutes tick by and wasn't called on,\" Ronaldo said."}]}}}
| Field | Filled in, of 17 checked | Values in the sample |
|---|---|---|
| type | 17 | paragraph (14), embed (2), heading (1) |
| text | 15 | median 156 characters |
| provider | 2 | “twitter” and 1 other value |
| url | 2 | x.com and 1 other host |
| level | 1 | 2 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Eight-character Flashscore news article id from a news listing, flashscore-entity-news or flashscore-news-most-read | xlKVMkEO | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/flashscore/news-article-body?id=xlKVMkEO" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://2.ds.lsapp.eu/pq_graphql?_hash=na&articleId=xlKVMkEO&projectId=2",
"article": {
"id": "xlKVMkEO",
"type": "STANDARD",
"title": "Ronaldo releases statement detailing fall-out, confirms he remains available for Portugal",
"slug": "ronaldo-releases-statement-detailing-fall-out-confirms-he-remains-available-for-portugal",
"url": "https://www.flashscore.com/news/ronaldo-releases-statement-detailing-fall-out-confirms-he-remains-available-for-portugal/xlKVMkEO/",
"perex": "Cristiano Ronaldo has accused Portugal coach Jorge Jesus of twice breaking his word, saying a failed agreement to publicly explain his omission against Norway drove him out of the camp but insistin...",
"author": "Mário Rui Ventura",
"credit": "Reuters",
"published_at": 1791314553,
"published_at_iso": "2026-10-06T19:22:33Z",
"edited_at": 1791316179,
"edited_at_iso": "2026-10-06T19:49:39Z",
"image": {
"url": "https://livesport-ott-images.ssl.cdn.cra.cz/c5e168b7-5104-4a63-a0b6-729fd1be15e2",
"alt_text": "Cristiano Ronaldo, captain of Portugal",
"credit": "REUTERS/Pedro Nunes"
},
"tags": [
{
"entity_id": "SW9D1eZo",
"entity_type": "SPORT",
"label": "Soccer",
"slug": "soccer"
},
{
"entity_id": "WvJrjFVN",
"entity_type": "PARTICIPANT",
"label": "Portugal",
"slug": "portugal"
},
{
"entity_id": "WGOY4FSt",
"entity_type": "PARTICIPANT",
"label": "Cristiano Ronaldo",
"slug": "ronaldo-cristiano"
}
],
"block_count": 17,
"text": "In a lengthy statement, the 41-year-old gave his account of the dispute that prompted his departure from Copenhagen before Portugal's Nations League match versus Denmark last week.\n\nRonaldo said Je...",
"blocks": [
{
"type": "paragraph",
"text": "In a lengthy statement, the 41-year-old gave his account of the dispute that prompted his departure from Copenhagen before Portugal's Nations League match versus Denmark last week."
},
{
"type": "paragraph",
"text": "Ronaldo said Jesus had agreed a plan under which the forward would miss the Norway and Denmark matches to manage his fitness. However, on the day of the Norway game, the coach told him he would pla..."
},
{
"type": "paragraph",
"text": "\"Everyone knows the rest. I warmed up from half-time onwards, watched the minutes tick by and wasn't called on,\" Ronaldo said."
}
]
}
}
}Request schema
No body schema
Response schema
Inline response schema
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | flashscore.NewsArticleBodyResponse | No | ||||
| data.article | flashscore.NewsArticleBody | No | ||||
| data.article.author | string | No | ||||
| data.article.block_count | integer | No | ||||
| data.article.blocks | array | No | ||||
| data.article.blocks[].alt | string | No | ||||
| data.article.blocks[].credit | string | No | ||||
| data.article.blocks[].height | integer | No | ||||
| data.article.blocks[].id | string | No | ||||
| data.article.blocks[].level | integer | No | ||||
| data.article.blocks[].links | array | No | ||||
| data.article.blocks[].links[].id | string | No | ||||
| data.article.blocks[].links[].kind | string | No | link, participant, player, event, tournament, article | |||
| data.article.blocks[].links[].sport_id | integer | No | ||||
| data.article.blocks[].links[].text | string | No | ||||
| data.article.blocks[].links[].url | string | No | ||||
| data.article.blocks[].provider | string | No | ||||
| data.article.blocks[].text | string | No | ||||
| data.article.blocks[].type | string | No | paragraph, heading, embed, image, infobox | |||
| data.article.blocks[].url | string | No | ||||
| data.article.blocks[].width | integer | No | ||||
| data.article.credit | string | No | ||||
| data.article.edited_at | integer | No | ||||
| data.article.edited_at_iso | string | No | ||||
| data.article.id | string | No | ||||
| data.article.image | flashscore.NewsCoverImage | No | ||||
| data.article.image.alt_text | string | No | ||||
| data.article.image.credit | string | No | ||||
| data.article.image.url | string | No | ||||
| data.article.perex | string | No | ||||
| data.article.published_at | integer | No | ||||
| data.article.published_at_iso | string | No | ||||
| data.article.slug | string | No | ||||
| data.article.tags | array | No | ||||
| data.article.tags[].entity_id | string | No | ||||
| data.article.tags[].entity_type | string | No | SPORT, PARTICIPANT, TOURNAMENT_TEMPLATE, TAG | |||
| data.article.tags[].label | string | No | ||||
| data.article.tags[].slug | string | No | ||||
| data.article.text | string | No | ||||
| data.article.title | string | No | ||||
| data.article.type | string | No | ||||
| data.article.url | string | No | ||||
| data.source_url | string | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| 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/flashscore/news-article-body?id=xlKVMkEO" \
-H "x-api-key: $CRAWLORA_API_KEY"