The GSPC axis API
One public endpoint returns the 13-axis GSPC measurement board as JSON. No account, no API key, no tiers. Every number is recomputable from the published harness.
The endpoint
Base URL: https://councilof.ai/api/gspc
Auth: none. The response sends access-control-allow-origin: * and is cached for 300s.
Axes: governance, safety, provenance, continuity, conformance, openness, machinery-conformity, care, cross-reality, detector-interop, art5-safeguard, swarm, affect.
Call it
# The whole 13-axis board (keyless — no auth header)
curl https://councilof.ai/api/gspc
# A single axis
curl "https://councilof.ai/api/gspc?axis=governance"
# An unknown axis returns 404 with the list of known axes
curl "https://councilof.ai/api/gspc?axis=nope"
# => { "error": "unknown axis", "known": [ "governance", "safety", ... ] }Response shape (schema csoai.gspc-axes/0.3)
{
"schema": "csoai.gspc-axes/0.3",
"issuer": "CSOAI Ltd (GB, Companies House 16939677)",
"doi": "10.5281/zenodo.21755656",
"measured_on": {
"model": "19-model fleet: 8 tuned council specialists + 6 base + frontier cross-lab",
"date": "2026-08-12",
"grading": "deterministic grading on 15,580 per-item rows (0 transport errors)"
},
"totals": {
"axes": 13,
"measured_axes": 13,
"items": 819,
"separated_leads": 3,
"ties": 10
},
"axes": [
{
"axis": "governance",
"bench": "GovBench",
"task": "EU AI Act risk-tier classification",
"n": 237,
"accuracy": 0.700,
"leader": "council specialist:governance-v3",
"separation": "SEPARATED",
"separation_p": 0.0086,
"interval": [0.639, 0.755],
"fleet_mean": 0.490,
"macro_f1": 0.705,
"unparsed_rate": 0.0386,
"status": "MEASURED",
"dataset": "csoai/gspc-gov"
}
// ... 12 more axes
],
"limitations": [ "3 of 13 axes show a statistically separated leader ...", "..." ]
}schemaAlways csoai.gspc-axes/0.3 — the payload contract version.issuerCSOAI Ltd (GB, Companies House 16939677).doi10.5281/zenodo.21755656 — the citable dataset record.totals.axes / measured_axes13 measurement axes, all 13 MEASURED on the same fleet, rows and grader.totals.separated_leads / ties3 separated (McNemar p<0.05 on discordant items), 10 ties. A TIE is not a win.totals.itemsSum of per-axis n across the selection (819 across all 13 axes).axes[].n / accuracy / intervalPer-axis item count, the LEADER's accuracy, and its Wilson 95% CI where n is honestly independent.axes[].separation / separation_pSEPARATED or TIE, with the McNemar exact p on discordant pairs vs the best base model.axes[].fleet_mean / mean_harmThe full 19-model fleet mean, and the severity-weighted failure mass the accuracy hides.axes[].unparsed_rateShare of responses no label could be read from — reported, never scored as a wrong answer.axes[].statusMEASURED / UNMEASURED / DRAFT / SPEC / PLANNED. UNMEASURED is reported with its n, never hidden.There is no /v1/* SaaS API, no SDK to install, and no API key to request. This is a measurement body, not a platform: the public interface is a static, signed JSON board anyone can recompute.
Measurement, not certification. Every score is a deterministic grade of recorded model outputs on a frozen, published split. A TIE means the leader's point-estimate lead is not statistically separated — ties are not wins, and we do not publish “our models win N of 13”.
Machine consumers should prefer the registries over crawls: the MCP Registry entry and the A2A agent card are the authoritative machine interfaces, and this endpoint is keyless and verifiable offline.