curl --request GET \
--url https://gdeltcloud.com/api/v2/monitors/{id}/runs/{runId}/matches \
--header 'Authorization: Bearer <token>'import requests
url = "https://gdeltcloud.com/api/v2/monitors/{id}/runs/{runId}/matches"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://gdeltcloud.com/api/v2/monitors/{id}/runs/{runId}/matches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"data": []
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}Page a run's matched items
Pages the COMPLETE list of items one triggered run matched, as it was at trigger time, with the current state of each hydrated live. GET /api/v2/monitors/{id}/runs/{runId} embeds a bounded SAMPLE of cards; this operation walks the whole matched set. Each entry carries as_triggered — exactly what the email or webhook asserted, frozen and never re-derived — alongside current, the live card, and a status of unchanged, updated, superseded or gone. superseded means a Story was merged away by same-day de-duplication; follow the id to GET /api/v2/stories/{story_id}, which answers 404 STORY_MERGED with the replacement id. Read result_count, retained_match_count and matched_items_truncated together: when the run matched more items than the writer retains, result_count remains the exact total and the retained list is a prefix that says so. Runs are retained for seven days.
curl --request GET \
--url https://gdeltcloud.com/api/v2/monitors/{id}/runs/{runId}/matches \
--header 'Authorization: Bearer <token>'import requests
url = "https://gdeltcloud.com/api/v2/monitors/{id}/runs/{runId}/matches"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://gdeltcloud.com/api/v2/monitors/{id}/runs/{runId}/matches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"data": []
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}Authorizations
GDELT Cloud API key. Send as Authorization: Bearer gdelt_sk_....
Query Parameters
Matched items per page. Default 25, max 100. A value outside the range is refused, not clamped. Note: validation is owned by the endpoint service because it depends on composed or cross-parameter state; the published error semantics above still apply.
1 <= x <= 100Opaque cursor over the run's frozen matched-item list. Copy next_cursor from the previous response verbatim; omit it for the first page, and stop when it is null. It is not an offset — a plain integer is refused rather than answered with page one. Note: validation is owned by the endpoint service because it depends on composed or cross-parameter state; the published error semantics above still apply.

