Skip to content

Registry API

The Phase 3 registry. All routes are relative to REGISTRY_BIND_ADDR. Write routes require Authorization: Bearer <REGISTRY_WRITE_TOKEN>.

A hosted instance runs at https://registry.bunsenbrenner.org — the same routes answer there, so curl https://registry.bunsenbrenner.org/manifests returns the live catalogue as JSON. It is a machine API: there is no HTML page (GET / is 404).

Method & path Auth Purpose
POST /manifests write Publish a manifest + bundle (multipart). Verifies signature, bundle hash, and guardrail scan before storing.
GET /manifests List catalogued manifests (name, version, publisher, verdict, published-at).
GET /manifests/:id The full signed manifest JSON, byte-identical to what was published.
GET /manifests/:id/bundle The stored bundle tarball. Its sha256 equals the manifest's signed bundle.sha256.
POST /manifests/:id/activations write Append one ledger record {activator_pubkey, status}.
GET /publishers/:pubkey/ledger Per-manifest activation_count for a publisher.

POST /manifests

multipart/form-data, two parts:

  • manifest — the signed manifest JSON (text field)
  • bundle — the bundle tarball (file field)

Sending the manifest as a JSON body instead of multipart returns 400 Invalid boundary for multipart/form-data — a common first mistake.

Responses

Status When
201 Stored. Body: {manifest_id, guardrail_verdict}.
400 Signature invalid or expired; or uploaded bundle bytes do not match the signed sha256.
401 Missing or wrong write token.

measured Every row above was exercised against a local registry on 2026-08-27: publish → list → get → bundle (hash matched) → activation → ledger, plus 401 for a missing token and 400 for a tampered bundle.

measured Against the hosted registry.bunsenbrenner.org on 2026-08-29: a 7-manifest portfolio was published (201 each, incl. a signed demo_prompt and an ~18 MB bundle), then refetched via GET /manifests/:id byte-identically.