Authentication
Two credentials work on the API. A session token from /v1/auth/login acts as the account. An API key acts for a specific set of scopes and is what a service or a pipeline should use.
# Issue a scoped key (shown once)
reliastra keys create ci-bot --scopes read:checks,write:dependencies,read:incidents,read:evidence
# Use it
export RELIASTRA_TOKEN=rel_…
curl -sS https://api.reliastra.com/v1/dependencies -H "Authorization: Bearer $RELIASTRA_TOKEN"| Scope | Grants |
|---|---|
| read:checks | Read observations |
| write:dependencies | Create, update and delete dependencies |
| read:incidents | Read incidents and correlations |
| read:evidence | Read evidence records and download artifacts |
Endpoints
| Method and path | What it does |
|---|---|
| POST /v1/auth/login | Exchange email and password for an access and refresh token |
| POST /v1/auth/refresh | Rotate an expired access token |
| GET /v1/users/me | The authenticated account |
| GET /v1/dependencies | List dependencies (limit, cursor) |
| POST /v1/dependencies | Create one |
| GET /v1/dependencies/{id} | Read one |
| PATCH /v1/dependencies/{id} | Update one |
| DELETE /v1/dependencies/{id} | Delete one and its observations |
| GET /v1/dependencies/{id}/results | Observations for one dependency |
| GET /v1/dependencies/{id}/history | Aggregated history over a window |
| GET /v1/checks/recent | The most recent observations across dependencies |
| GET /v1/incidents | List incidents (limit, cursor, status, severity, dependency_id) |
| GET /v1/incidents/{id} | One incident with its correlations |
| PATCH /v1/incidents/{id} | Set status, severity, root cause or description |
| POST /v1/incidents/{id}/correlate | Record a correlated dependency |
| GET /v1/incidents/{id}/evidence | The evidence record for this incident |
| GET /v1/evidence | List evidence records |
| GET /v1/evidence/{id} | One record: checksum, verification id and URL, payload hash, and a one-hour signed download_url |
| GET /v1/evidence/{id}/artifact | The rendered artifact itself, streamed. Use this from a script |
| GET /v1/evidence/{report_token}/download | Public gate download by token, for a shared record |
| POST /v1/evidence/{id}/regenerate | Rebuild an artifact from its incident |
| GET /v1/verify/{verification_id} | Public verification record. No authentication. |
| GET /v1/verify/keys | Public signing keys, in JWK form |
| GET /v1/vendors | The public observatory index |
| GET /v1/vendors/{name} | One vendor’s public record |
| GET|POST /v1/webhooks | List or create webhook subscriptions (session only) |
| GET /v1/api-keys | List keys (prefixes only; needs read:api_keys) |
| POST /v1/api-keys | Issue a key. The full value is returned once. |
From an artifact to its verification
A resolved incident produces an evidence record. GET /v1/evidence/{id} returns everything needed to check the artifact it issued, including the public verification id and URL that are printed inside the document itself:
{
"id": "7c1d0a5f-…",
"incident_id": "9f1c8b0e-…",
"checksum": "0c72…", // SHA-256 of the rendered document
"data_hash": "3f9a…", // SHA-256 of the canonical facts payload
"verification_id": "8Kd2xQ7mB4pL",
"verification_url": "https://reliastra.com/reports/8Kd2xQ7mB4pL",
"methodology_version": "2.0",
"signed": false, // this deployment issues unsigned artifacts
"expires_at": "2027-09-04T09:12:00Z"
}verification_url opens a page that needs no account, and GET /v1/verify/{verification_id} is the same record as JSON. GET /v1/verify/keys publishes the Ed25519 public keys for deployments that sign, so a third party can check a signature without trusting either endpoint.
What an API key can and cannot reach
Keys are denied by default. A key can reach the dependency, observation, incident and evidence surfaces its scopes allow; it cannot reach identity, account, webhook or key-management surfaces at all, whatever scopes it carries. That boundary is deliberate: a leaked key must not be able to mint credentials or read the account.
| Surface | API key | Session |
|---|---|---|
| Dependencies, observations, incidents, evidence | With the matching scope | Yes |
| Webhook configuration | No | Yes |
| API key management | No (unless the key carries read:api_keys) | Yes |
| Account and identity | No | Yes |
Pagination
{ "items": [ … ], "next_cursor": "eyJpZCI6…", "has_more": true }Pass next_cursor back as cursor to continue. Cursors are stable for a query shape, not across filters - change the filter and start again.
Errors
| Status | Meaning | What to do |
|---|---|---|
| 400 | Validation failed. detail lists each bad field. | Fix the request. The field name is in the message. |
| 401 | No credential, or the token expired. | Refresh, or issue a new key. |
| 403 | The credential lacks the scope. | Check the scopes on the key. |
| 404 | No such resource, or not yours. | Confirm the id came from your own list call. |
| 429 | Rate limited. | Back off. Paginated list endpoints are the usual cause. |
| 503 | A dependency of the API itself is unreadable. | Retry. Do not treat this as an empty result. |
Schema
This page is the field reference. The generated OpenAPI document is not published: it enumerates every route the API registers, including the authenticated ones, so serving it unauthenticated would hand an attacker the full attack surface from a single unauthenticated request.
This is a deliberate choice, not an omission. Operators who need the machine-readable contract can generate it locally against their own deployment.
# generate the schema from your own deployment
curl -sS https://api.reliastra.com/health
# then, against a checkout of the API:
# EXPOSE_API_SCHEMA=true python -m scripts.export_openapiProblem with this page?
These guides live in the repository. An inaccuracy in the documentation is a bug, and the fastest fix is an issue with the sentence quoted. Open an issue.
Next
CLI →Install, authenticate, read dependencies and incidents, retrieve evidence, and gate a pipeline on verification.