Result Checks
Read validation check outcomes for one structuring result with GET /v1/structuring/results/:id/checks: pass, fail, skip, or error, with message and details.
Check outcomes record how each configured validation check evaluated one structuring result. GET /v1/structuring/results/{id}/checks returns all outcomes for a result in evaluation order, each with a four-way status — pass, fail, skip, or error — plus a human-readable message, the failing field_path, and the expected_value/actual_value pair that makes failures self-explanatory. Use this to understand why a result was flagged, or to build audit trails for data quality.
The id here is a structuring result id (one row of a run), not the run id — you get result ids from Job results (GET /v1/jobs/{id}/results) or from the result_id on pending review items. Outcomes are computed automatically when the result is produced; there is no manual trigger and no re-run. Each outcome also embeds the full check object it was evaluated against, so you can render name, severity, and current config without a second fetch.
/v1/structuring/results/{id}/checkscurl
curl -s https://api.talonic.com/v1/structuring/results/9c2f6a1e-3b7d-4c58-9e21-8f4a5d6b7c80/checks \
-H "Authorization: Bearer tlnc_your_api_key"Response
Response fields
Response
{
"data": [
{
"id": "d4e5f6a7-b8c9-0123-defa-234567890123",
"dataspace_result_id": "9c2f6a1e-3b7d-4c58-9e21-8f4a5d6b7c80",
"check_id": "5fee4bba-8380-44b8-9780-5e4548424b3c",
"status": "fail",
"severity": "error",
"message": "Field \"total_amount\" value 1500000 is out of range [0, 1000000]",
"details": null,
"field_path": "total_amount",
"expected_value": "[0, 1000000]",
"actual_value": "1500000",
"created_at": "2026-08-29T11:41:12.020Z",
"check": {
"id": "5fee4bba-8380-44b8-9780-5e4548424b3c",
"user_schema_id": "36ef3a00-a4dc-4e49-af6a-66ae20f9b58a",
"name": "Total amount range",
"description": "Totals must be plausible",
"type": "field_range",
"severity": "error",
"config": { "field": "total_amount", "min": 0, "max": 1000000 },
"is_active": true,
"sort_order": 0
}
},
{
"id": "e5f6a7b8-c9d0-1234-efab-345678901234",
"dataspace_result_id": "9c2f6a1e-3b7d-4c58-9e21-8f4a5d6b7c80",
"check_id": "342e816c-0687-474e-9393-44ed76dca9d8",
"status": "skip",
"severity": "warning",
"message": "Field \"due_date\" is null/missing",
"details": null,
"field_path": "due_date",
"expected_value": null,
"actual_value": null,
"created_at": "2026-08-29T11:41:12.020Z",
"check": {
"id": "342e816c-0687-474e-9393-44ed76dca9d8",
"user_schema_id": "36ef3a00-a4dc-4e49-af6a-66ae20f9b58a",
"name": "Due date is a date",
"description": null,
"type": "field_format",
"severity": "warning",
"config": { "field": "due_date", "format": "date" },
"is_active": true,
"sort_order": 1
}
}
]
}Errors
Error responses
These outcomes are the raw material for gate decisions: a validation_pass gate rule counts the fail rows (optionally only from critical-severity checks), and the [pending review queue](pending-approvals) is a cross-result feed of exactly the fail and error rows. When triaging a flagged record, this endpoint is the drill-down — the queue tells you *that* a result has issues; this route tells you *which field, expected what, got what*.
One nuance for audit tooling: severity on the outcome row is a snapshot from evaluation time, while the embedded check object reflects the check's current configuration. After you edit a check, old outcomes keep their original verdicts and severity but embed the new config — compare expected_value on the outcome (frozen) rather than check.config (live) when reconstructing why something failed months ago.