Skip to main content

Authentication

Every tenant-scoped request carries:

HeaderRequiredNotes
AuthorizationyesBearer <JWT> ? Ed25519, 15-min TTL
X-Tenant-IdyesMust match JWT tid; mismatch ? 403 authz.tenant_not_a_member
Idempotency-Keyyes (POST/PUT/PATCH)ULID; stored 24h
traceparentyesW3C; gateway generates if missing
Accept-LanguagerecommendedBCP-47
If-Matchrequired on optimistic-concurrency writesMissing ? 428, mismatch ? 412
curl -X GET https://api.ghasi.io/api/v1/courses?cursor=eyJ2IjoxfQ \
-H 'Authorization: Bearer <jwt>' \
-H 'X-Tenant-Id: ten_01J…' \
-H 'Accept-Language: en'