---
title: "Sign an operator attestation envelope"
method: POST
path: "/sign/operator-attestation"
tags: ["Verification"]
---

# Sign an operator attestation envelope

`POST /sign/operator-attestation`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/sign/operator-attestation`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `mnemom_session`

Returns an Ed25519-signed envelope binding the operator's identity + role to a free-form statement about an asserted subject. Used for compliance attestation chains where an operator's signature is required (e.g., closing a critical governance signal with a note that's later shown in audit).

## Request body

- OperatorAttestationRequest: Sign an operator-issued attestation about a checkpoint, signal, or audit-relevant event. Returns an Ed25519-signed envelope binding the operator's identity to the asserted statement at the asserted time.
  - `subject` object, required: What's being attested about (e.g., {type: 'governance_signal', id: 'gs-...'}).
  - `statement` string, required: Free-form operator statement.
  - `actor_role` 'platform_admin' | 'org_owner' | 'org_admin' | 'team_admin' | 'member' | 'system': Audit-actor role per ADR-046.

## Response `201`

Signed attestation.

- OperatorAttestationResponse
  - `attestation_id` string, required
  - `signed_at` string, date-time, required
  - `signed_by` string, uuid
  - `actor_role` 'platform_admin' | 'org_owner' | 'org_admin' | 'team_admin' | 'member' | 'system': Audit-actor role per ADR-046.
  - `subject` object
  - `statement` string
  - `signature` string, required: base64url Ed25519 signature.
  - `public_key` string: base64url Ed25519 public key.

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Forbidden
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.
- `503`: An upstream dependency is currently unavailable. The request was not processed; retry after the cooldown window.

---

[API](https://skmtc.dev/mnemom/apis/mnemom-api.md) · [All operations](https://skmtc.dev/mnemom/apis/mnemom-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemom/apis/mnemom-api/revisions/274b7a6ea182?raw)
