/v1/generators
Generators are the entities that sign content. Each generator has an ML-DSA keypair. A generator belongs to one organization.
All endpoints require authentication — Authorization: Bearer ctv_key_…
List generators
Section titled “List generators”GET /v1/generatorsReturns all generators for the authenticated organization.
{ "generators": [ { "generator_id": "gen_abc123", "org_id": "org_xyz", "name": "prod-sdxl", "status": "active", "public_keys": [ { "kid": "key_1", "algorithm": "ml-dsa-65", "key": "<base64>" } ] } ]}Get a generator
Section titled “Get a generator”GET /v1/generators/:generator_idRegister a generator
Section titled “Register a generator”POST /v1/generatorsContent-Type: application/json{ "name": "prod-sdxl", "supported_formats": ["image"], "public_keys": [ { "kid": "key_1", "algorithm": "ml-dsa-65", "key": "<base64 public key>" } ]}| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Human-readable name for this generator |
supported_formats | string[] | Yes | Formats this generator may sign: "image", "audio", "text", "video". At least one required. |
public_keys | array | No | Omit to use a server-managed keypair (recommended). |
A generator may declare multiple formats — for example, a multimodal model that outputs images and video:
{ "name": "sora-v1", "supported_formats": ["image", "video"] }Signing attempts with a format not listed in supported_formats are rejected with 400 format_not_supported.
Generate a keypair using the SDK:
import { generateKeypair } from '@certivu/sdk'
const { publicKey, privateKey } = generateKeypair()// privateKey: store securely on your server, never share// publicKey: paste into the dashboard when registering this generatorReturns { generator_id, name, supported_formats, status }.
Revoke a generator
Section titled “Revoke a generator”PUT /v1/generators/:generator_id/revokeSets status: "revoked". All signatures from a revoked generator immediately become invalid. This action cannot be undone.
Returns { generator_id, status: "revoked" }.
Rotate signing key
Section titled “Rotate signing key”POST /v1/generators/:generator_id/rotate-keyIssues a fresh ML-DSA signing key for a server-managed generator and retires the previous one. New content is signed with the new key, while content signed earlier stays verifiable — each signature records which key produced it, so the retired key continues to verify history. Use this to refresh keys on a schedule or after a suspected exposure, without invalidating past provenance.
Returns { generator_id, active_kid, retired_kid }.
Only available for server-managed generators. For client-managed generators (where you hold the private key), register a new key yourself instead — rotation returns 400.
Get public keys
Section titled “Get public keys”GET /v1/keys/:generator_idPublic endpoint — no authentication required. Used by the verification flow to retrieve the generator’s public key for ML-DSA signature verification.