---
title: "Fetch a signed CyclesEvidence envelope by content id"
method: GET
path: "/v1/evidence/{evidence_id}"
tags: ["Evidence"]
---

# Fetch a signed CyclesEvidence envelope by content id

`GET /v1/evidence/{evidence_id}`

## Request

- Base URL: `https://api.cycles.local`
- URL: `https://api.cycles.local/v1/evidence/{evidence_id}`
- Auth: none required

Retrieve the signed CyclesEvidence envelope identified by `evidence_id` (the sha256 content hash carried on a receipt's `cycles_evidence` reference). Returns the envelope exactly as emitted — JCS-canonicalizable and Ed25519-signed per cycles-evidence-v0.2 — so any holder can verify it offline without trusting this server.
AUTH (NORMATIVE): this endpoint is PUBLIC (no ApiKeyAuth). The `evidence_id` is an unguessable sha256 content hash that acts as a capability — only a party already holding the receipt (which carries the id) can fetch the envelope. Because the envelope is content-addressed and signature-verifiable, public read cannot forge or alter it. Servers SHOULD rate-limit this endpoint and SHOULD serve it with `Cache-Control: public, immutable` (the content never changes).

## Path parameters

- `evidence_id` string, required

## Response `200`

The signed CyclesEvidence envelope.

- object: A signed CyclesEvidence envelope returned by `getEvidence`. The NORMATIVE definition — field semantics and the JCS content-hash + Ed25519 signature derivation — lives in `cycles-evidence-v0.2.yaml`; this schema mirrors its required shape for the serving endpoint. The envelope is content-addressed (`evidence_id` = sha256 of the JCS-canonical bytes with `evidence_id` and `signature` emptied) and self-verifying, so a consumer can check it offline without trusting this server.
  - `schema_version` 'cycles-evidence/v0.1', required
  - `artifact_type` 'decide' | 'reserve' | 'commit' | 'release' | 'error', required
  - `server_id` string, required: Stable URI of the issuing Cycles server.
  - `signer_did` string, required: Ed25519 public key (v0.1 hex) the signature verifies against.
  - `issued_at_ms` integer, required
  - `trace_id` string
  - `payload` object, required: One key matching artifact_type (decide/reserve/commit/release/error).
  - `evidence_id` string, required
  - `signature` string, required

## Other responses

- `400`: Error response
- `404`: Error response
- `429`: Rate limited. Public endpoints SHOULD be throttled; clients retry after the indicated delay.
- `500`: Error response

---

[API](https://skmtc.dev/runcycles/apis/cycles-budget-authority-api.md) · [All operations](https://skmtc.dev/runcycles/apis/cycles-budget-authority-api/llms.txt) · [OpenAPI document](https://skmtc.dev/runcycles/apis/cycles-budget-authority-api/revisions/7d42267c1ea0?raw)
