Skip to main content

Developers

Certificates from your assistant or your own systems

Connect Claude, Cursor, VS Code or any MCP client to draft, preview and issue certificates in conversation, or call the REST API from your CRM and audit tools. Both use the same API keys, defaults and register as the studio.

API keys

An administrator creates keys in Settings → API keys. Send the key as Authorization: Bearer <key> (or X-API-Key). Each key carries permissions:

Read

certificates:read

Certificate types, organisations, certificates, previews and PDFs

Write drafts

certificates:write

Create organisations; create, edit and delete draft certificates

Issue

certificates:issue

Issue, suspend, reinstate and withdraw certificates

New keys can read and write drafts. Issuing is a separate permission, so an assistant can prepare certificates for a person to review and issue in the studio.

MCP server

Streamable HTTP at the address below. The assistant sees only the tools its key allows, plus instructions to ask before issuing and never to invent audit facts.

https://cert.solutions/api/mcp

Claude Code

claude mcp add --transport http cert-solutions https://cert.solutions/api/mcp \
  --header "Authorization: Bearer $CERT_SOLUTIONS_KEY"

Cursor

.cursor/mcp.json

{
  "mcpServers": {
    "cert-solutions": {
      "url": "https://cert.solutions/api/mcp",
      "headers": {
        "Authorization": "Bearer ${env:CERT_SOLUTIONS_KEY}"
      }
    }
  }
}

VS Code

.vscode/mcp.json; VS Code asks for the key once.

{
  "servers": {
    "cert-solutions": {
      "type": "http",
      "url": "https://cert.solutions/api/mcp",
      "headers": {
        "Authorization": "Bearer ${input:cert-solutions-key}"
      }
    }
  },
  "inputs": [
    {
      "id": "cert-solutions-key",
      "type": "promptString",
      "description": "cert.solutions API key",
      "password": true
    }
  ]
}

Claude Desktop

claude_desktop_config.json, through the mcp-remote bridge.

{
  "mcpServers": {
    "cert-solutions": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://cert.solutions/api/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer <your key>"
      }
    }
  }
}

Read

  • list_certificate_typesTypes, templates, fonts and colours
  • get_certificate_typeFields, options and default wording for one type
  • list_certifying_bodiesBodies to issue under and their marks
  • search_organizationsFind a client by name
  • list_certificatesFilter by status, type, client or text
  • get_certificateDetails and links for one certificate
  • preview_certificatePNG image of the certificate
  • get_certificate_pdfPrint-ready A4 PDF
  • verify_certificateWhat the public register shows

Write drafts

  • create_organizationAdd a client (reuses an exact match)
  • create_certificate_draftNew draft; defaults fill the rest
  • update_certificate_draftChange only what you send
  • delete_certificate_draftRemove a draft

Issue

  • issue_certificatePublish a draft to the register
  • set_certificate_statusSuspend, reinstate or withdraw

Try asking

“Draft an ISO 27001 certificate for Northwind Data Services covering their managed cloud hosting, IAF code 33, in the Registration template with a teal accent. Show me a preview.”

REST API

JSON over HTTPS. Successful responses wrap the result in { data }; lists add nextCursor for paging. Certificates can be addressed by id or certificate number.

MethodPathPurpose
GET/api/v1/catalogCertificate types and design options
GET/api/v1/catalog/{type}One type: fields, options, validity, wording
GET/api/v1/bodiesCertifying bodies, their marks and verification pages
GET/api/v1/organizations?search=Clients by name
POST/api/v1/organizationsCreate a client
GET/api/v1/organizations/{id}One client
GET/api/v1/certificates?status=&scheme=&search=&cursor=List, newest first
POST/api/v1/certificatesCreate a draft
GET/api/v1/certificates/{id|number}One certificate
PATCH/api/v1/certificates/{id|number}Change a draft
DELETE/api/v1/certificates/{id|number}Delete a draft
POST/api/v1/certificates/{id|number}/statusIssue, suspend, reinstate, withdraw
GET/api/v1/certificates/{id|number}/preview?width=PNG preview
GET/api/v1/certificates/{id|number}/pdfA4 PDF
GET/api/v1/verify/{number|code}Public register entry

Create a draft

Only scheme, scope and the client are required. The number, dates, wording and design come from the type and your saved studio defaults; fields takes the type's keys from /api/v1/catalog/{type}. An unknown field or option is rejected with the valid choices.

curl -X POST https://cert.solutions/api/v1/certificates \
  -H "Authorization: Bearer $CERT_SOLUTIONS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "scheme": "iso-9001",
    "organization": {
      "name": "Acme Precision Engineering Ltd.",
      "address": "Unit 14, Riverside Industrial Estate",
      "city": "Manchester",
      "country": "United Kingdom"
    },
    "scope": "Design and manufacture of precision-machined components.",
    "fields": { "iafCode": "17" },
    "design": { "template": "registration", "accent": "#1b3a6b" }
  }'

Issue it

curl -X POST https://cert.solutions/api/v1/certificates/CS-QMS-2026-7K4QX/status \
  -H "Authorization: Bearer $CERT_SOLUTIONS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "ACTIVE" }'

Rules and limits

  • Only drafts can be changed or deleted through the API. Issued certificates are edited in the studio and withdrawn rather than deleted.
  • Issuing publishes the certificate in the public register at once, with its QR verification link.
  • 120 requests per minute per key. Over the limit you get 429 with Retry-After.
  • Errors are { error, fieldErrors? } with 400, 401, 403, 404, 409 or 503 (rendering unavailable).