Quickstart

Issue your first certificate in five minutes.

API access requires the Business plan or an active partner contract. A valid key on any other plan returns 403 forbidden — see Authentication.

1. Create an API key

  1. Sign in to Certify+.
  2. Go to Settings → API Keys.
  3. Click New API key, name it (e.g. My integration), and leave the default scopes.
  4. Copy the key shown in the dialog. It will not be shown again.

2. Find a template ID

List your templates:

curl https://YOUR_DOMAIN/api/v1/templates \
  -H "Authorization: Bearer YOUR_API_KEY"

Pick the id of the template you want to use. Only active templates are returned.

3. Issue a certificate

The body is templateId plus exactly one of recipient (single) or recipients (batch). Sending neither, or both, fails with 422.

curl -X POST https://YOUR_DOMAIN/api/v1/certificates \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "TEMPLATE_UUID",
    "recipient": {
      "name": "Jane Doe",
      "email": "jane@example.com",
      "data": { "course": "Intro to TypeScript" }
    }
  }'

Response (201, abridged):

{
  "data": {
    "id": "8f4d…",
    "uniqueCode": "ABC12345",
    "recipientName": "Jane Doe",
    "status": "Issued",
    "verificationUrl": "https://YOUR_DOMAIN/verify/ABC12345",
    "issuedAt": "2026-04-19T09:10:11.123Z",
    "downloadCount": 0,
    "emailCount": 0,
    "verificationCount": 0
  }
}

4. Verify it

Anyone can verify a certificate publicly — no API key required:

curl https://YOUR_DOMAIN/api/v1/verify/ABC12345

5. Download the PDF

Returns application/pdf bytes, not JSON. The PDF is rendered once at issue time and frozen, so repeat calls serve the same artifact.

curl https://YOUR_DOMAIN/api/v1/certificates/CERT_UUID/pdf \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -o certificate.pdf

6. Email it to the recipient

Sends the delivery email with the PDF attached, to the certificate's stored address (pass recipientEmail to override for this one send). Returns 202 — delivery is asynchronous.

curl -X POST https://YOUR_DOMAIN/api/v1/certificates/CERT_UUID/send \
  -H "Authorization: Bearer YOUR_API_KEY"

Poll the send history for delivery status:

curl https://YOUR_DOMAIN/api/v1/certificates/CERT_UUID/emails \
  -H "Authorization: Bearer YOUR_API_KEY"

Only Issued certificates can be emailed — a revoked or draft one returns 409 conflict.

7. Issue in batch

Swap recipient for recipients (up to 500 per request):

{
  "templateId": "TEMPLATE_UUID",
  "recipients": [
    { "name": "Jane Doe", "email": "jane@example.com" },
    { "name": "John Smith", "email": "john@example.com" }
  ]
}

The response includes per-recipient results, so partial failures don't abort the batch. Batch issuance is also partial with respect to quota: if you have fewer certificates left than recipients, you still get 201 with the overflow marked failed in results. Always check created and failed.

8. Watch your quota

curl https://YOUR_DOMAIN/api/v1/usage \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "data": {
    "tier": "Business",
    "certificates": { "limit": 2000, "used": 142, "remaining": 1858, "resetAt": "2026-05-01T00:00:00.000Z" }
  }
}

limit and remaining are null on partner accounts, where quota is contractual.

Next steps