# info.summary
CLI-first API for governed computation on encrypted data

# info.description
The API behind the `blind` CLI. Raw data, encoded data, private keys, and
secret encryption contexts must stay on the caller's machine. The API
accepts public encryption context and encrypted ciphertext only.

Project mutations are owner-scoped. Freezing commits a cohort and prevents
governance changes. Creating a job can consume credits and dispatch
computation. Read the operation description before allowing an autonomous
agent to call a mutation.

# info.license.name
Proprietary API; public CLI is MIT licensed

# tags[].description
Obtain and exchange credentials for the supported CLI.

# tags[].description
Inspect the authenticated account and its credit balance.

# tags[].description
Discover and verify public signed computation applications.

# tags[].description
Retrieve public results and offline-verifiable certificates.

# tags[].description
Submit and inspect encrypted cohort contributions.

# tags[].description
Estimate, dispatch, and inspect governed computations.

# paths./auth/device.post.description
Starts the CLI's RFC 8628 device authorization flow.

# paths./auth/token.post.summary
Exchange a supported credential for an opaque bearer token

# paths./auth/token.post.description
Supports the RFC 8628 device grant, a The Blind Machine API key, or an
email and password. API-key and password exchange are product-specific,
not additional OAuth grant types.

# paths./auth/token.post.responses.400.description
OAuth device polling or unsupported grant error

# paths./auth/registration.post.description
Product account registration, not OAuth Dynamic Client Registration.

# paths./auth/registration.post.responses.200.description
New account and immediately usable bearer token

# paths./credits.get.summary
Read the authenticated account's credit balance

# paths./applications.get.summary
List signed public applications and versions

# paths./applications/{name}.get.summary
Get one public application and every published version

# paths./applications/{application_name}/versions/{digest}.get.summary
Get a content-addressed application version

# paths./applications/{application_name}/versions/{digest}/bundle.get.summary
Download the exact signed application bundle

# paths./applications/{application_name}/versions/{digest}/bundle.get.description
Hash and verify the bundle and detached signature before execution.

# paths./applications/{application_name}/versions/{digest}/signature.get.responses.200.description
Hex-encoded signature over the bundle digest

# paths./results/{result_digest}.get.summary
Resolve public metadata for a completed result digest

# paths./results/{result_digest}.get.responses.200.description
Public result metadata; no result plaintext is exposed

# paths./projects.get.summary
List projects owned by the authenticated account

# paths./projects.post.summary
Create a governed project pinned to an application digest

# paths./projects.post.description
Creates hash-chained ProjectCreated and ApplicationPinned events.
The application value is `slug@` plus the bare 64-hex registry digest.

# paths./projects/{id}.patch.description
Refused after the cohort is frozen or archived.

# paths./projects/{id}.put.summary
Update active-project governance using PUT

# paths./projects/{id}.put.description
Partial-update semantics identical to PATCH; refused after freeze.

# paths./projects/{id}.delete.summary
Archive a project without erasing its audit trail

# paths./projects/{id}.delete.description
A tombstone mutation. The project and its evidence remain retained.

# paths./projects/{id}/freeze.post.description
Irreversible governance transition. Computes and stores the cohort
commitment; further governance and contribution changes are refused.

# paths./projects/{project_id}/invitations.post.description
Returns secret-bearing capability URLs. Do not log, index, prompt-share,
or expose returned tokens. Signed invitations are preferred.

# paths./projects/{project_id}/invitations.post.responses.201.description
One invitation or a collection when count is greater than one

# paths./projects/{project_id}/events.get.summary
Read the hash-chained governance event log

# paths./projects/{project_id}/events.get.responses.200.description
Events and optional server-side chain check

# paths./projects/{project_id}/public_context.get.description
Accepts the owner's account bearer or an invitation bearer bound to this project.

# paths./projects/{project_id}/public_context.get.responses.200.description
Public context bytes; verify X-Public-Context-Digest before use

# paths./projects/{project_id}/public_context.patch.summary
Publish public encryption context using PATCH

# paths./projects/{project_id}/public_context.patch.description
Owner-only. Never upload the secret context. Refused after contributions
exist or the cohort is frozen.

# paths./projects/{project_id}/public_context.put.description
Canonical CLI operation. Owner-only. Never upload the secret context.
Refused after contributions exist or the cohort is frozen.

# paths./projects/{project_id}/owner_key.patch.summary
Register the owner's public Ed25519 key using PATCH

# paths./projects/{project_id}/owner_key.patch.description
Only the public key may be sent. It becomes immutable after signed invitations exist.

# paths./projects/{project_id}/owner_key.put.description
Canonical CLI operation. Only the public key may be sent.

# paths./projects/{project_id}/contributions.get.summary
List an owned project's encrypted contributions

# paths./projects/{project_id}/contributions.post.description
Accepts the owner's account bearer or an invitation bearer bound to this
project. Upload ciphertext only—never plaintext, encoded data, or keys.

# paths./projects/{project_id}/contributions.post.parameters[].x-conditionally-required
Required for application/octet-stream; multipart may include the field.

# paths./projects/{project_id}/contributions/mine.get.summary
List contributions made under the current account or invitation

# paths./projects/{project_id}/jobs.get.summary
List an owned project's computation jobs

# paths./projects/{project_id}/jobs.post.description
Billable mutation. Requires a frozen cohort, satisfied minimum-N, an
available run slot, and sufficient credits. A successful request can
consume credits and start compute work.

# paths./projects/{project_id}/jobs/estimate.post.summary
Estimate compute time and cost without dispatching a job

# paths./projects/{project_id}/jobs/estimate.post.description
Read-like planning operation. It does not consume credits or create a job.

# paths./projects/{project_id}/certificates.get.summary
List computation certificates for an owned project

# paths./invitations/{token}.get.description
The path token is the authorization. Treat the complete URL as a secret
and never log, index, or prompt-share it. Unknown and expired tokens both
return 404.

# paths./jobs/{id}/events.get.summary
Stream the computation stage history as NDJSON

# paths./jobs/{id}/logs.get.description
Logs can contain operational detail; do not republish them automatically.

# paths./jobs/{id}/result.get.summary
Download the encrypted computation result

# paths./jobs/{id}/result.get.description
Verify X-Result-Digest before writing or decrypting the bytes.

# components.securitySchemes.bearerAuth.description
Opaque session token for account operations. Selected contribution
operations also accept an unexpired invitation token bound to the
addressed project.

# components.parameters.PublicContextDigest.description
Bare 64-hex SHA-256 of the exact public-context bytes.

# components.responses.NotFound.description
Resource is absent or intentionally hidden from this caller

# components.responses.Conflict.description
Governance or computation precondition was not satisfied

# components.responses.PublicContextPublished.description
Published digest and incremented context epoch

# components.schemas.Digest.description
Bare lowercase SHA-256 digest used by the Rails API