Reports
Every endpoint create, refresh, and upgrade emits exactly one held-out report: the trust artifact. A report is immutable, names its split (method, sizes, seed), its baseline, its data snapshot, and its weakest slice, so a number never travels without provenance. Stateless runs also mint a run record in this listing (kind: "run").
Report display names follow {endpoint}.{base}.{op}.{YYYY-MM-DD} (base abbreviated s1, s2), for example churn.s2.upgrade.2026-08-14. The stable reference is the r_... id. Reports are kept for the life of the organization; deleting an endpoint does not delete its reports.
score with its metric name, then metric fields by task type: classification carries auc and per_class; regression carries rmse, nrmse, r2, and quantile_calibration; anomaly carries precision, recall, pr_auc where labels exist, or score_separation flagged unsupervised. Every report states a baseline.
{
"id": "r_8f3a",
"name": "churn.s1.create.2026-03-10",
"endpoint": "churn",
"endpoint_id": "{endpoint_id}",
"kind": "create",
"base": "schema-1",
"created_at": "2026-03-10T14:09:31Z",
"pinned": true,
"target": {
"column": "crm_contacts.c3",
"task": "classification",
"classes": ["retained", "churned"]
},
"data": { "snapshot": "dsv_2b81", "version": "2026-03-10 14:02", "rows": 22094 },
"split": {
"method": "in_context_holdout",
"train_rows": 17675,
"test_rows": 4419,
"seed": 42,
"stratified": true,
"unit": "entity"
},
"metrics": {
"score": 0.942,
"metric": "accuracy",
"auc": 0.961,
"baseline_majority": 0.71,
"lift_pp": 23.2,
"per_class": { "retained": 0.96, "churned": 0.88 }
},
"confidence": { "calibrated": true, "spread": "most predictions high-confidence" },
"weakest_slice": "tenure<3mo: 0.79",
"cross_table": {
"column_alignment": [
{
"a": "crm_contacts.c1",
"b": "billing_db.c1",
"attribute": "phone",
"confidence": 0.96
}
]
},
"estimate_note": "held-out is a creation-time estimate on unseen rows from the same snapshot; the live endpoint uses the full pinned data."
}Attributes
idstringr_..., immutable.namestringDisplay name at mint time,{endpoint}.{base}.{op}.{date}. A later rename of the endpoint does not change past names.endpointstringEndpoint name at mint time.endpoint_idstringThe endpoint ID.kindstringThe operation that minted the report;runmarks a stateless run record.createrefreshupgraderunbasestringBase evaluated.pinnedbooleanStarred reports float to the top of history. Pinning affects prominence, not retention. Set by starring on the platform’s Reports page.targetobjectcolumn,task, andclassesfor classification.dataobjectsnapshot(dsv_...),versiontimestamp,rows. The grade is tied to this snapshot and can expire on drift.splitobjectmethod(in_context_holdout),train_rows,test_rows,seed,stratified, andunit(entitywhen the split is by matched entity).metricsobjectTask-appropriate metrics plusbaseline_majority(orbaseline_mean) andlift_pp.confidenceobjectcalibrated(confidences on Schema models are calibrated probabilities) and aspreadnote.weakest_slicestringThe slice with the lowest score, surfaced on purpose.previousobject | nullOn upgrade reports:{ report_id, base, score }anddelta.
List reports
/v2/reportsLists held-out reports, newest first, pinned first.
curl 'https://api.schemalabs.ai/v2/reports?limit=3' \
-H "Authorization: Bearer $SCHEMA_API_KEY"import os
import requests
SCHEMA_API_KEY = os.environ["SCHEMA_API_KEY"]
r = requests.get(
"https://api.schemalabs.ai/v2/reports?limit=3",
headers={"Authorization": f"Bearer {SCHEMA_API_KEY}"},
)
r.raise_for_status()
result = r.json()const res = await fetch('https://api.schemalabs.ai/v2/reports?limit=3', {
headers: {
Authorization: `Bearer ${process.env.SCHEMA_API_KEY}`,
},
});
if (!res.ok) throw new Error(`Schema API error ${res.status}`);
const result = await res.json();{
"reports": [
{
"id": "r_a7d0",
"name": "churn.s2.upgrade.2026-08-14",
"kind": "upgrade",
"base": "schema-2",
"metric": "accuracy",
"score": 0.961,
"delta": "+0.013",
"pinned": false,
"created_at": "2026-08-14T11:20:05Z"
},
{
"id": "r_b5e1",
"name": "churn.s1.refresh.2026-08-12",
"kind": "refresh",
"base": "schema-1",
"metric": "accuracy",
"score": 0.948,
"pinned": false,
"created_at": "2026-08-12T09:31:44Z"
},
{
"id": "r_8f3a",
"name": "churn.s1.create.2026-03-10",
"kind": "create",
"base": "schema-1",
"metric": "accuracy",
"score": 0.942,
"pinned": true,
"created_at": "2026-03-10T14:09:31Z"
}
],
"next_cursor": null,
"total": 3
}Query parameters
limitintegerdefault20Page size.cursorstringCursor from a previous page.
Returns
A page of report summaries.
Retrieve a report
/v2/reports/:idReturns the full held-out report.
curl 'https://api.schemalabs.ai/v2/reports/r_8f3a' \
-H "Authorization: Bearer $SCHEMA_API_KEY"import os
import requests
SCHEMA_API_KEY = os.environ["SCHEMA_API_KEY"]
r = requests.get(
"https://api.schemalabs.ai/v2/reports/r_8f3a",
headers={"Authorization": f"Bearer {SCHEMA_API_KEY}"},
)
r.raise_for_status()
result = r.json()const res = await fetch('https://api.schemalabs.ai/v2/reports/r_8f3a', {
headers: {
Authorization: `Bearer ${process.env.SCHEMA_API_KEY}`,
},
});
if (!res.ok) throw new Error(`Schema API error ${res.status}`);
const result = await res.json();{
"id": "r_8f3a",
"name": "churn.s1.create.2026-03-10",
"endpoint": "churn",
"endpoint_id": "{endpoint_id}",
"kind": "create",
"base": "schema-1",
"created_at": "2026-03-10T14:09:31Z",
"pinned": true,
"target": {
"column": "crm_contacts.c3",
"task": "classification",
"classes": ["retained", "churned"]
},
"data": { "snapshot": "dsv_2b81", "version": "2026-03-10 14:02", "rows": 22094 },
"split": {
"method": "in_context_holdout",
"train_rows": 17675,
"test_rows": 4419,
"seed": 42,
"stratified": true,
"unit": "entity"
},
"metrics": {
"score": 0.942,
"metric": "accuracy",
"auc": 0.961,
"baseline_majority": 0.71,
"lift_pp": 23.2,
"per_class": { "retained": 0.96, "churned": 0.88 }
},
"confidence": { "calibrated": true, "spread": "most predictions high-confidence" },
"weakest_slice": "tenure<3mo: 0.79",
"cross_table": {
"column_alignment": [
{
"a": "crm_contacts.c1",
"b": "billing_db.c1",
"attribute": "phone",
"confidence": 0.96
}
]
},
"estimate_note": "held-out is a creation-time estimate on unseen rows from the same snapshot; the live endpoint uses the full pinned data."
}Path parameters
idstringrequiredr_....
Returns
The report object.