Getting Started with the C.O.S. API
C.O.S. API v1 — Compliance Operating System
Base URL: https://cosprotocol.io/v1
What is C.O.S.?
The Compliance Operating System (C.O.S.) is a governed REST API for compliance intelligence and organisation management. It provides structured endpoints for managing tenant organisations, their members, API keys, and industry classification.
Prerequisites
- A C.O.S. API key — format:
cos_live_<48 chars>(57 characters total) - Keys are currently issued by the C.O.S. administrator. Contact your C.O.S. operator to request one.
Step 1 — Verify the API is reachable
No key required:
Step 2 — Make an authenticated request
Pass your key in the Authorization header:
export COS_API_KEY="cos_live_your_key_here"
export ORG_ID="your-organisation-uuid"
curl -s \
-H "Authorization: Bearer $COS_API_KEY" \
https://cosprotocol.io/v1/organisations/$ORG_ID
import requests
API_KEY = "cos_live_your_key_here"
ORG_ID = "your-organisation-uuid"
BASE = "https://cosprotocol.io/v1"
resp = requests.get(
f"{BASE}/organisations/{ORG_ID}",
headers={"Authorization": f"Bearer {API_KEY}"},
)
resp.raise_for_status()
print(resp.json())
If your key is valid you will receive a 200 response with your organisation profile.
If the key is missing or wrong you will receive 401 Unauthorized.
Key concepts
Organisation scope. Every API key is tied to one organisation. A standard key
can only read and write data for its own organisation. Keys issued for a
platform organisation (is_system: true) grant cross-tenant admin access and
are used by C.O.S. operators only.
Key prefix. Production keys start with cos_live_. Test keys start with
cos_test_. Both prefixes are registered with GitHub secret scanning — accidental
commits are detected automatically. Both prefix types have identical behaviour; the
distinction is for key management and scanning rules only.
Raw key shown once. The full raw key is returned in the issuance response exactly once. It cannot be retrieved again. Store it immediately in a secrets manager.
Pagination. All list endpoints return { "data": [...], "meta": { "next_cursor": "..." } }.
Pass ?cursor=<value> to fetch the next page. next_cursor is null on the last page.
Rate limits. Authenticated requests are limited to 60 per minute per organisation
by default. Unauthenticated endpoints (/health, /version) share a global limit of
60 per minute. Exceeded limits return 429 with a Retry-After header.
Next steps
- Authentication — key format, header syntax, org scope, revocation
- Rate Limits — limits, headers, retry guidance
- Error Handling — error format, all status codes, retry semantics
- Code Examples — Python + curl per endpoint
- API Reference — interactive OpenAPI browser
- Changelog — what changed in v1-stable