Authorization header.
OMEGAS_OPERATOR_API_KEY from the environment; over raw HTTP you
send the header yourself.
GET /v1/whoami answers with the key’s identity and is the cheapest way to
check a credential without touching anything.
Scopes
A key carries scopes and, optionally, a list of Spaces. Missing either is403 insufficient_scope.
Two rows deserve emphasis:
operator:sessions:controlis separate on purpose. A key issued for monitoring cannot be turned into a key that types into a logged-in browser.GET /v1/auditreads withoperator:audit:read. Keys minted before that scope existed carriedoperator:webhooks:readfor the audit route, and the historical scope is still accepted there, so an existing key keeps working.
A credential must not reach a URL
A URL is a publishing surface: access logs, span fields, error reporters, proxies,Referer headers. This product has already had one credential leak
that way, which is why the client refuses to let it happen again rather than
asking integrators to be careful:
- The key is wrapped in a
CredentialwhosetoString,toJSONand inspection output all returnomg_operator_<env>_<key_id>_***. The only function that reveals the secret returns anAuthorizationheader. - Query strings are scanned for credential-shaped values and the request throws before it is sent.
- Live-view session tokens ride the
Sec-WebSocket-Protocolheader (omega.operator.v1, omega.token.<ops_…>), never a query parameter, and the server-suppliedws_urlmust match the API origin and must bewss:. - Redirects are refused outright; following one would replay the
Authorizationheader at a host nobody validated.