# CertSeal — how to use (mcp.ai)

Connect your CertSeal account and use 21 tools for e-signatures straight from your AI agent. Connect with your own API key. CertSeal provides APIs for issuing and managing verifiable digital certificates, recipients, batches, designs, and webhook subscriptions.

## Option A — via MCP (recommended)
Remote MCP endpoint (HTTP, streamable): `https://api.mcp.ai/p_cert_seal?ms=1787298840000`
Add it as a custom/remote MCP connector in your client (Claude, Cursor, VS Code…), then authenticate when prompted. Once connected, ask the agent to use the server's tools (e.g. `cert_seal_create_batch`).

## Option B — via direct REST API
Base URL: `https://api.mcp.ai/api/cert_seal`
Auth: `Authorization: Bearer sk_live_…` — create a workspace API key at https://mcp.ai/settings/api-keys
Discover endpoints: `GET https://api.mcp.ai/api/cert_seal/_endpoints`

### Endpoints
- `POST https://api.mcp.ai/api/cert_seal/create/batch` — Create a persistent certificate batch from an existing CertSeal design and optional email template. This consumes a batch slot and can fail when the plan batch limit is reached; designs and templates 
  - body: { title: string, design_id: string, course_name?: string, description?: string, issuer_name?: string, email_template_id?: string }
- `POST https://api.mcp.ai/api/cert_seal/create/webhook/subscription` — Create a persistent webhook subscription for selected certificate events. The response contains a wh_sec_ signing secret exactly once; capture it immediately and store it securely because later reads 
  - body: { url: string, events: string[] }
- `POST https://api.mcp.ai/api/cert_seal/delete/recipient` — Permanently delete an issued recipient from an active batch. This cannot be undone, does not refund certificate quota, and permanently burns the certificate ID. Use only when permanent removal is inte
  - body: { batch_id: string, recipient_id: string }
- `POST https://api.mcp.ai/api/cert_seal/delete/webhook/subscription` — Permanently delete a webhook subscription and stop future deliveries. This cannot be undone; create a new subscription to resume events.
  - body: { subscription_id: string }
- `POST https://api.mcp.ai/api/cert_seal/get/batch` — Get one active or archived certificate batch by ID.
  - body: { batch_id: string }
- `POST https://api.mcp.ai/api/cert_seal/get/certificate` — Look up an issued certificate using either its human-readable certificate ID or its public-viewer share token, and return its recipient, batch, design, and resolved variables. Provide exactly one look
  - body: { share_token?: string, certificate_id?: string }
- `POST https://api.mcp.ai/api/cert_seal/get/current/workspace` — Verify the connected CertSeal API key and return the workspace ID and username it belongs to. Use this to confirm account context before creating or changing resources.
- `POST https://api.mcp.ai/api/cert_seal/get/recipient` — Get one issued certificate recipient record by batch ID and recipient ID.
  - body: { batch_id: string, recipient_id: string }
- `POST https://api.mcp.ai/api/cert_seal/get/webhook/subscription` — Get one webhook subscription by ID. This does not reveal the signing secret; it returns only the stored secret tail.
  - body: { subscription_id: string }
- `POST https://api.mcp.ai/api/cert_seal/issue/and/send/certificates` — Atomically issue certificates for 1-100 recipients and queue email delivery for every created certificate. This irreversible external side effect requires every recipient to have an email address and 
  - body: { batch_id: string, recipients: object[] }
- `POST https://api.mcp.ai/api/cert_seal/issue/certificates` — Atomically issue certificates without sending email for 1-100 recipients in one active batch. Each recipient permanently consumes one certificate quota unit even if later deleted; any invalid row, dup
  - body: { batch_id: string, recipients: object[] }
- `POST https://api.mcp.ai/api/cert_seal/list/batches` — Return one newest-first page of certificate batches in the connected workspace, optionally filtered by archive state.
  - body: { limit?: integer, cursor?: string, status?: string }
- `POST https://api.mcp.ai/api/cert_seal/list/designs` — Return one newest-first page of reusable certificate designs. Designs are read-only through the API and must be authored in the CertSeal web app.
  - body: { limit?: integer, cursor?: string }
- `POST https://api.mcp.ai/api/cert_seal/list/recipients` — Return one page of issued certificate recipients in a batch, optionally filtered by email delivery status.
  - body: { limit?: integer, cursor?: string, batch_id: string, email_status?: string }
- `POST https://api.mcp.ai/api/cert_seal/list/webhook/subscriptions` — Return one newest-first page of webhook subscriptions. Stored signing secrets are never returned; secret_tail is only a non-sensitive identifier.
  - body: { limit?: integer, cursor?: string }
- `POST https://api.mcp.ai/api/cert_seal/rotate/webhook/signing/secret` — Immediately invalidate a webhook subscription's current signing secret and replace it. The new wh_sec_ secret is returned exactly once; capture and deploy it immediately or webhook verification will f
  - body: { subscription_id: string }
- `POST https://api.mcp.ai/api/cert_seal/send/certificate/emails` — Sequentially queue real certificate emails for 1-25 existing recipients in one active batch. Each queued email is irreversible. Processing stops after the first failed or unknown attempt, and remainin
  - body: { batch_id: string, recipient_ids: string[] }
- `POST https://api.mcp.ai/api/cert_seal/send/recipient/certificate/email` — Queue asynchronous certificate email delivery to one recipient. This causes an external email side effect and requires a recipient email, a batch email template, and configured mail delivery; already 
  - body: { batch_id: string, recipient_id: string }
- `POST https://api.mcp.ai/api/cert_seal/set/batch/archived` — Idempotently archive or unarchive a batch. Archiving freezes recipient create, update, delete, and send operations but preserves existing certificate URLs; unarchiving re-enables those writes. This pe
  - body: { archived: boolean, batch_id: string }
- `POST https://api.mcp.ai/api/cert_seal/test/webhook/subscription` — Enqueue one synthetic signed event through CertSeal's normal webhook dispatcher. This causes a real external delivery to the subscription URL; it does not only validate the subscription locally.
  - body: { event_type?: string, subscription_id: string }
- `POST https://api.mcp.ai/api/cert_seal/update/recipient` — Partially update an issued certificate recipient. Only supplied fields change, while an explicit null clears an optional field; changing certificate_id must remain globally unique. Archived batches re
  - body: { data?: object, name?: string, email?: string, batch_id: string, issue_date?: string, expiry_date?: string, recipient_id: string, certificate_id?: string }

## Example prompts
- "What can I do in CertSeal?"
- "Show me a summary of my CertSeal account"

## More
- Page: https://mcp.ai/cert_seal
- Agent spec (llms.txt): https://mcp.ai/cert_seal/llms.txt
- Postman collection: https://mcp.ai/cert_seal/postman.json
