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:readCertificate types, organisations, certificates, previews and PDFs
Write drafts
certificates:writeCreate organisations; create, edit and delete draft certificates
Issue
certificates:issueIssue, 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/mcpClaude 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 coloursget_certificate_typeFields, options and default wording for one typelist_certifying_bodiesBodies to issue under and their markssearch_organizationsFind a client by namelist_certificatesFilter by status, type, client or textget_certificateDetails and links for one certificatepreview_certificatePNG image of the certificateget_certificate_pdfPrint-ready A4 PDFverify_certificateWhat the public register shows
Write drafts
create_organizationAdd a client (reuses an exact match)create_certificate_draftNew draft; defaults fill the restupdate_certificate_draftChange only what you senddelete_certificate_draftRemove a draft
Issue
issue_certificatePublish a draft to the registerset_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.
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/catalog | Certificate types and design options |
| GET | /api/v1/catalog/{type} | One type: fields, options, validity, wording |
| GET | /api/v1/bodies | Certifying bodies, their marks and verification pages |
| GET | /api/v1/organizations?search= | Clients by name |
| POST | /api/v1/organizations | Create a client |
| GET | /api/v1/organizations/{id} | One client |
| GET | /api/v1/certificates?status=&scheme=&search=&cursor= | List, newest first |
| POST | /api/v1/certificates | Create 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}/status | Issue, suspend, reinstate, withdraw |
| GET | /api/v1/certificates/{id|number}/preview?width= | PNG preview |
| GET | /api/v1/certificates/{id|number}/pdf | A4 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).