CertOps
Certificate lifecycle orchestration (workspace-scoped). Control plane never stores private key material.
List managed certificates
Returns the workspace's managed certificate inventory. Response objects contain public certificate material and public metadata only.
Create or register a managed certificate
Registers a managed certificate from public certificate material. Request bodies containing private key material are rejected before feature gating.
Get a managed certificate
Returns a single managed certificate. Response objects contain public certificate material and public metadata only.
List managed certificate instances
Returns public, workspace-scoped certificate observation history for one managed certificate. Private key material, evidence, raw output, and secret fields are never returned.
Retire a managed certificate
Soft-retires a managed certificate by moving public lifecycle status to revoked or decommissioned. The managed certificate, linked token, and instance history are preserved; request bodies containing private key material are rejected before feature gating.
Set up automatic renewal for a managed certificate
Creates a renew job for the certificate and, in the same transaction,
Detach a managed certificate from its renewal profile
Nulls the certificate's profile link, writes the audit record, and
Retry a failed automatic-renewal setup intent
Returns a parked profile-derivation intent to the pending queue with a
List workspace certificate instances
Returns public, workspace-scoped certificate instance history across all managed certificates (a flat inventory browse, unlike the per-certificate instances route). Private key material, evidence, raw output, and secret fields are never returned.
List renewal profiles
Returns the workspace's renewal profiles. A profile carries the execution
List upcoming automatic renewals
Returns every renewable certificate in the workspace, ordered by expiry,
Get a renewal profile
Returns one renewal profile with `editableFields`, the subset a caller may
Update a renewal profile
Changes renewal configuration for a profile. Requires the workspace
List certificate targets
Returns the workspace's certificate targets (deployment/observation locations such as hosts, endpoints, load balancers, or Kubernetes secrets). Targets never hold key material.
Import certificates from public material
Imports certificates from PEM/public material. Private key material is rejected before feature gating.
Get workspace CertOps pause state
Returns the workspace-local CertOps kill-switch state and the effective side-effect availability. All authorized workspace members may read it. This is a human cookie/session-authenticated workspace surface; internal worker bearer credentials are not accepted. The stored pause state remains distinct from the deployment-wide certops.enabled rollout flag, and this settings endpoint remains available when that rollout flag is disabled.
Pause or resume new CertOps work for a workspace
Changes only the workspace-local kill switch and remains available while the deployment-wide rollout flag is disabled. Requires a human cookie/session-authenticated workspace admin; internal worker bearer credentials are not accepted. A paused workspace rejects new manual jobs and future dispatch or provision side effects with 409 CERTOPS_WORKSPACE_PAUSED; inventory, status, audit, evidence, and existing-work reporting remain available.
List CertOps jobs
Returns paginated public CertOps job summaries for the workspace. Consumers must follow pagination.limit and pagination.offset; long job histories can require multiple requests. Private key material, raw executor output, token hashes, and credentials are never returned.
Create a manual CertOps job
Creates a workspace-scoped CertOps job through the manual creation surface. This is a session-authenticated exception path for the pre-certops-scheduler window (and a break-glass path afterward); jobs created this way are always recorded with source 'api' and cannot be attributed to the executor or automated-scheduler pipelines. Requires workspace_manager role or above. Private key or secret material in the request body is rejected.
Bulk-create CertOps renewal jobs
Queues a renew job for up to 100 managed certificates in one request. Each certificate goes through the same manual job-creation path as POST /jobs (manager role, workspace kill switch, approval gate, payload validation), and jobs are always recorded with source 'api'. The response is a partial-failure envelope: per-certificate successes and failures are reported item by item and never abort the batch, so the request returns 200 even when some or all items fail. Only whole-request shape problems (malformed body, more than 100 ids, non-UUID or duplicate ids) fail with 400. Private key or secret material in the request body is rejected.
Get a CertOps job
Returns one sanitized CertOps job detail for the authorized workspace.
Approve a pending CertOps job
Grants the human approval a gated job needs before an agent can claim it. Session-only manager surface (internal worker credentials are rejected) with a non-requester rule: the user who requested the job cannot approve it. The approval is bound to a canonical SHA256 hash of the job payload at decision time; if the payload changes afterwards the claim path voids the approval and returns the job to pending_approval. Available while the workspace kill switch is paused.
Reject a pending CertOps job
Rejects a pending_approval job so it never becomes claimable. Session-only manager surface like approve, but without the non-requester rule: any authorized member, including the requester, may withdraw or reject. The decision is recorded in the attributable approval ledger. Available while the workspace kill switch is paused.
List CertOps job log entries
Returns paginated sanitized timeline entries for one workspace-scoped CertOps job. Consumers must follow pagination.limit and pagination.offset; long job histories can require multiple requests.
List CertOps job evidence
Returns paginated sanitized public evidence metadata for one workspace-scoped CertOps job. Consumers must follow pagination.limit and pagination.offset; long job histories can require multiple requests. Raw secrets, private keys, token hashes, and key-bearing artifacts are never returned.
List CertOps API tokens
Returns workspace-scoped CertOps API-token metadata only. Plaintext tokens, token hashes, Authorization headers, and credential material are never returned.
Issue a scoped CertOps API token
Issues a scoped CertOps API token. The one-time plaintext token is returned only by this create response and is never stored in recoverable form. List and revoke responses never include plaintext tokens, token hashes, Authorization headers, or credential material.
Revoke a scoped CertOps API token
Revokes a scoped CertOps API token within the authorized workspace and returns metadata only. The response never includes plaintext tokens, token hashes, Authorization headers, or credential material.
List CertOps agent bootstrap tokens
Returns workspace-scoped agent bootstrap-token metadata only. Plaintext ttboot_ tokens, token hashes, Authorization headers, and credential material are never returned. Manager-only, same authorization posture as create/revoke.
Create a CertOps agent bootstrap token
Issues a single-use agent bootstrap token used once by POST /api/v1/certops/agent/register. Expiry is required, must be in the future, and is capped at 30 days. The raw ttboot_ token is returned exactly once by this create response; only its hash is persisted.
Revoke a CertOps agent bootstrap token
Revokes an agent bootstrap token within the authorized workspace and returns metadata only. Revoking an already-revoked token is idempotent and returns its current state without a duplicate audit event.
List CertOps agents
Returns workspace-scoped agent fleet metadata (hostnames, versions, liveness). Manager-only. Credential hashes and bearer credentials are never returned.
Retire a CertOps agent
Retires an agent so its credential stops authenticating (agent protocol routes return 410). Retiring an already-retired agent is idempotent. If the agent holds actively leased jobs the request is blocked with 409 unless force is true, in which case an attributable reason is required. A forced retire fences the agent's in-flight work immediately rather than leaving it to the lease reaper: jobs still at 'claimed' are cancelled with error_code CERTOPS_AGENT_FORCE_RETIRED, while jobs that had reached 'running' become orphaned_unknown_effect and are flagged needs_operator_reconciliation, because their real-world effect is unknown. Both id lists are returned in the response and recorded on the CERTOPS_AGENT_RETIRED audit event.
List CertOps trust anchors
Returns the workspace's approved trust-anchor CAs (ADR-0012 decision 6/20). Manager-only. The private key never enters this record; only the CA's public certificate, its SHA-256 fingerprint, and approval metadata are stored and returned.
Approve a CertOps trust anchor
Approves a CA certificate as a trust anchor that distribute-trust jobs may install into an agent's trust store (ADR-0012 decision 6). `pem` must contain exactly one CA certificate (Basic Constraints CA=true); bundles and leaf certificates are rejected. Re-submitting the same fingerprint updates the existing row in place and reactivates it if it was previously retired, rather than creating a duplicate record. Recorded as a CERTOPS_TRUST_ANCHOR_APPROVED audit event.
Retire a CertOps trust anchor
Marks a trust anchor as revoked so future distribute-trust jobs can no longer target it (ADR-0012 decision 20g). Retiring an already-retired anchor is idempotent and returns `retiredNow: false`. Retiring an anchor does not remove any trust material an agent has already installed; that requires a separate revoke-trust job. Recorded as a CERTOPS_TRUST_ANCHOR_RETIRED audit event.
List installations for a CertOps trust anchor
Returns every certops_trust_anchor_installations row for one trust anchor (agent, store, transition state, provenance, last error), so an operator can see where the anchor actually landed before revoking or distributing it further. Manager-only, same as the other trust-anchor routes. Read-only: unlike the mutating trust-anchor routes, this route does not require the workspace's CertOps state to be active, since an operator diagnosing a paused workspace still needs to see current installations.
Update a CertOps agent's downtime alert settings
Edits `downtimeAlertsEnabled` and/or `contactGroupId` for an already registered agent. Both fields are independently optional: omit a field to leave it unchanged, or send `contactGroupId: null` to explicitly clear it back to 'use the workspace default contact group'. At least one field is required. Recorded as a CERTOPS_AGENT_ALERT_SETTINGS_UPDATED audit event.
Bootstrap a CertOps diagnostic agent
Session-authenticated (requires certops.agents.diagnose, admin-only). Atomically consumes a single-use requestId, creates an agent with agent_kind 'diagnostic', and creates its protocol_smoke job, all in one transaction. The response's credential is returned exactly once and is not recoverable afterward. Retrying with the same requestId never replays the original agentId/credential/job; it fails with diagnostic_bootstrap_already_consumed. Requests are rate limited per workspace. Diagnostic agents that stay inactive for 24 hours are retired automatically; retirement revokes the credential in the same transaction that marks the agent retired, so a retired diagnostic agent's credential fails authentication immediately, not just authorization.
Read a CertOps job's approval state
Cloud-only; no core counterpart. Manager-or-above human surface, the same role floor as deciding an approval (POST .../approve, POST .../reject): a viewer must not see who requested a job or whether a self-approval attempt would be blocked, since that is deployment-topology-adjacent detail rather than plain certificate/job status.
Read CertOps Tier 1 capability flags for a workspace
Cloud-only; no core counterpart. Plan-derived agentsEnabled/controllersEnabled/renewalsEnabled status read for the Agents/Renewals dashboard tabs. Gated on auth and workspace membership only (no plan/role/frozen-workspace check), so a Free-plan or frozen workspace can still see why a capability is unavailable instead of receiving a blanket 402/403.