Sertifier Recipients API
Add, update, delete, and search the recipients (learners) who receive credentials. Recipients can be added individually via the API or in bulk in the web application, and are the audience a campaign issues credentials to.
Add, update, delete, and search the recipients (learners) who receive credentials. Recipients can be added individually via the API or in bulk in the web application, and are the audience a campaign issues credentials to.
openapi: 3.0.3
info:
title: Sertifier Credential API
description: >-
The Sertifier Credential API lets backend systems and LMS/CRM integrations
programmatically design, issue, verify, and manage verifiable digital
credentials (certificates and badges) on the Sertifier platform. A credential
is issued inside a Campaign that binds three things: a visual Design, a
descriptive Detail, and an Email Template used to deliver the finished
credential to a Recipient. Custom Attributes are merged into the design and
email at issue time. All requests are sent to the base host with a private
API key in the `secretKey` header and an `api-version` header. Most responses
share a common envelope ({ message, hasError, validationErrors, data,
content }). All dates are UTC. Designs are authored in the Sertifier web
application; the API references and duplicates them.
Endpoint paths, methods, the base host (https://b2b.sertifier.com), the
`secretKey` / `api-version` headers, and the credential-issuance workflow are
grounded in Sertifier's public Apiary reference, help-center quickstart, and
integration guides. Request and response bodies are minimally modeled where
the public reference does not fully enumerate every field; those are marked
with `x-modeled: true`.
version: '3.3'
contact:
name: Sertifier
url: https://sertifier.com
email: support@sertifier.com
x-logo:
url: https://kinlane-images.s3.amazonaws.com/shared/apis-json/apis-json-logo.jpg
servers:
- url: https://b2b.sertifier.com
description: Sertifier Credential API (production)
security:
- secretKey: []
tags:
- name: Authentication
description: Verify API key validity.
- name: Campaigns
description: Containers that bind a Design, Detail, and Email Template and issue credentials.
- name: Credentials
description: Individual issued credentials - retrieve, update, publish, and generate PDF links.
- name: Designs
description: Visual designs applied to certificates and badges.
- name: Details
description: Descriptive metadata (title, skills, criteria) printed on a credential.
- name: Email Templates
description: Templates used to deliver finished credentials to recipients.
- name: Recipients
description: Learners who receive credentials.
- name: Attributes
description: Reusable custom key/value fields merged into credentials.
- name: Webhooks
description: MODELED - inbound/outbound event automation. Not confirmed in the public reference.
paths:
/Test:
get:
operationId: testAuthentication
tags:
- Authentication
summary: Verify API key
description: Verifies that the provided secretKey is valid.
parameters:
- $ref: '#/components/parameters/ApiVersion'
responses:
'200':
description: The API key is valid.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/campaign:
post:
operationId: createCampaign
tags:
- Campaigns
summary: Create a campaign
description: >-
Creates a credential campaign, referencing a Design ID, a Detail ID, and
an Email Template ID. Returns the created campaign including its
campaignId, which is used to issue credentials.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignCreate'
responses:
'200':
description: The created campaign.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/campaign/{campaignId}:
get:
operationId: getCampaign
tags:
- Campaigns
summary: Retrieve a campaign
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/CampaignId'
responses:
'200':
description: The requested campaign.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateCampaign
tags:
- Campaigns
summary: Update a campaign
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/CampaignId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignCreate'
responses:
'200':
description: The updated campaign.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteCampaign
tags:
- Campaigns
summary: Delete a campaign
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/CampaignId'
responses:
'200':
description: The campaign was deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/campaign/search:
post:
operationId: searchCampaigns
tags:
- Campaigns
summary: Search campaigns
description: Returns a paginated list of campaigns matching the search filters.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of campaigns.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/campaign/addCredentials:
post:
operationId: addCredentials
tags:
- Campaigns
summary: Add / issue credentials to a campaign
description: >-
Issues one or more credentials into a campaign. Each credential
references the campaignId and a recipient (name + email) plus optional
custom attributes, external ID, issue date, and publish flags. Set
quickPublish=true to publish immediately. Use an idempotency check on
(enrolment ID + campaignId) if your source event can fire more than once.
The response includes the permanent, verifiable credential URL.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AddCredentialsRequest'
responses:
'200':
description: The issued credentials, including permanent credential URLs.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/campaign/send:
post:
operationId: sendCampaign
tags:
- Campaigns
summary: Publish / send a campaign's credentials
description: Publishes the credentials in a campaign and sends delivery emails.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
campaignId:
type: string
required:
- campaignId
responses:
'200':
description: The campaign's credentials were published.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/campaign/schedule:
post:
operationId: scheduleCampaign
tags:
- Campaigns
summary: Schedule credential distribution
description: Schedules a campaign's credential distribution at a future UTC time.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
campaignId:
type: string
scheduleDate:
type: string
format: date-time
description: The UTC time at which to distribute credentials.
required:
- campaignId
- scheduleDate
responses:
'200':
description: The campaign distribution was scheduled.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/credential/{credentialId}:
get:
operationId: getCredential
tags:
- Credentials
summary: Retrieve a credential
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/CredentialId'
responses:
'200':
description: The requested credential.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateCredential
tags:
- Credentials
summary: Update a credential
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/CredentialId'
requestBody:
required: true
content:
application/json:
schema:
type: object
x-modeled: true
responses:
'200':
description: The updated credential.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteCredential
tags:
- Credentials
summary: Delete a credential
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/CredentialId'
responses:
'200':
description: The credential was deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/credential/search:
post:
operationId: searchCredentials
tags:
- Credentials
summary: Search credentials
description: Returns a paginated list of issued credentials matching the filters.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/credential/publish:
post:
operationId: publishCredentials
tags:
- Credentials
summary: Publish credentials
description: Publishes one or more credentials, making their verifiable URLs live.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
credentialIds:
type: array
items:
type: string
responses:
'200':
description: The credentials were published.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/credential/generatePDFLink/{credentialIdOrCertificateNo}:
get:
operationId: generatePdfLink
tags:
- Credentials
summary: Generate a credential PDF link
description: >-
Generates a downloadable PDF link for a credential, identified by its
credential ID or its certificate number.
parameters:
- $ref: '#/components/parameters/ApiVersion'
- name: credentialIdOrCertificateNo
in: path
required: true
description: The credential ID or the certificate number.
schema:
type: string
responses:
'200':
description: A downloadable PDF link for the credential.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/design/{designId}:
get:
operationId: getDesign
tags:
- Designs
summary: Retrieve a design
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/DesignId'
responses:
'200':
description: The requested design.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteDesign
tags:
- Designs
summary: Delete a design
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/DesignId'
responses:
'200':
description: The design was deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/design/search:
post:
operationId: searchDesigns
tags:
- Designs
summary: Search designs
description: Returns a paginated list of designs. Designs are authored in the web app.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of designs.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/design/copy:
post:
operationId: copyDesign
tags:
- Designs
summary: Copy a design
description: Duplicates an existing design.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
designId:
type: string
required:
- designId
responses:
'200':
description: The duplicated design.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/detail:
post:
operationId: createDetail
tags:
- Details
summary: Create a credential detail
description: >-
Creates a credential Detail - the title, description, skills, and
criteria printed on a credential.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Detail'
responses:
'200':
description: The created detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/detail/{detailId}:
get:
operationId: getDetail
tags:
- Details
summary: Retrieve a credential detail
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/DetailId'
responses:
'200':
description: The requested detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateDetail
tags:
- Details
summary: Update a credential detail
description: Updates a Detail. Details become immutable once their credentials are sent.
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/DetailId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Detail'
responses:
'200':
description: The updated detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/detail/search:
post:
operationId: searchDetails
tags:
- Details
summary: Search credential details
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of details.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/detail/searchSkills:
post:
operationId: searchSkills
tags:
- Details
summary: Search the skills library
description: Searches Sertifier's skills library to attach skills to a credential detail.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of matching skills.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/emailTemplate/{emailTemplateId}:
get:
operationId: getEmailTemplate
tags:
- Email Templates
summary: Retrieve an email template
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/EmailTemplateId'
responses:
'200':
description: The requested email template.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteEmailTemplate
tags:
- Email Templates
summary: Delete an email template
parameters:
- $ref: '#/components/parameters/ApiVersion'
- $ref: '#/components/parameters/EmailTemplateId'
responses:
'200':
description: The email template was deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/emailTemplate/search:
post:
operationId: searchEmailTemplates
tags:
- Email Templates
summary: Search email templates
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of email templates.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/emailTemplate/copy:
post:
operationId: copyEmailTemplate
tags:
- Email Templates
summary: Copy an email template
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
emailTemplateId:
type: string
required:
- emailTemplateId
responses:
'200':
description: The duplicated email template.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/recipient:
post:
operationId: addRecipient
tags:
- Recipients
summary: Add a recipient
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Recipient'
responses:
'200':
description: The created recipient.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
put:
operationId: updateRecipient
tags:
- Recipients
summary: Update recipient(s)
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Recipient'
responses:
'200':
description: The updated recipient(s).
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/recipient/{recipientId}:
delete:
operationId: deleteRecipient
tags:
- Recipients
summary: Delete a recipient
parameters:
- $ref: '#/components/parameters/ApiVersion'
- name: recipientId
in: path
required: true
schema:
type: string
responses:
'200':
description: The recipient was deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/recipient/search:
post:
operationId: searchRecipients
tags:
- Recipients
summary: Search recipients
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of recipients.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/attribute:
post:
operationId: createAttribute
tags:
- Attributes
summary: Create a custom attribute
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Attribute'
responses:
'200':
description: The created attribute.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/attribute/{attributeId}:
put:
operationId: updateAttribute
tags:
- Attributes
summary: Update a custom attribute
parameters:
- $ref: '#/components/parameters/ApiVersion'
- name: attributeId
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Attribute'
responses:
'200':
description: The updated attribute.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteAttribute
tags:
- Attributes
summary: Delete a custom attribute
parameters:
- $ref: '#/components/parameters/ApiVersion'
- name: attributeId
in: path
required: true
schema:
type: string
responses:
'200':
description: The attribute was deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/attribute/search:
post:
operationId: searchAttributes
tags:
- Attributes
summary: Search custom attributes
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A paginated list of attributes.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
/webhook:
post:
operationId: createWebhook
tags:
- Webhooks
summary: Create a webhook subscription (MODELED)
description: >-
MODELED, NOT CONFIRMED. A first-party outbound webhook subscription
resource is not published in Sertifier's Credential API reference as of
the review date. Sertifier documents receiving inbound completion events
and no-code automation (Zapier, n8n) rather than a documented REST
webhook-subscription endpoint. This operation is included as an honest
placeholder and should be verified before use.
parameters:
- $ref: '#/components/parameters/ApiVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Webhook'
responses:
'200':
description: The created webhook subscription (modeled).
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
secretKey:
type: apiKey
in: header
name: secretKey
description: >-
Private API key obtained from the Sertifier web application under
Settings > API & Integrations (also referenced as Advanced >
Integrations). Store it in a secrets vault; never embed it in
client-side JavaScript.
parameters:
ApiVersion:
name: api-version
in: header
required: true
description: API version header. Current documented value is 3.3.
schema:
type: string
default: '3.3'
CampaignId:
name: campaignId
in: path
required: true
schema:
type: string
CredentialId:
name: credentialId
in: path
required: true
schema:
type: string
DesignId:
name: designId
in: path
required: true
schema:
type: string
DetailId:
name: detailId
in: path
required: true
schema:
type: string
EmailTemplateId:
name: emailTemplateId
in: path
required: true
schema:
type: string
responses:
Unauthorized:
description: The secretKey is missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/Envelope'
schemas:
Envelope:
type: object
description: Standard Sertifier response envelope.
properties:
message:
type: string
nullable: true
hasError:
type: boolean
validationErrors:
type: array
items:
type: string
data:
nullable: true
description: The operation-specific payload (object or array).
content:
nullable: true
SearchRequest:
type: object
description: Paginated search request.
x-modeled: true
properties:
page:
type: integer
default: 1
pageSize:
type: integer
default: 20
query:
type: string
nullable: true
CampaignCreate:
type: object
properties:
name:
type: string
designId:
type: string
description: The Design applied to credentials issued in this campaign.
detailId:
type: string
description: The credential Detail printed on the credential.
emailTemplateId:
type: string
description: The Email Template used to deliver the credential.
required:
- designId
- emailTemplateId
AddCredentialsRequest:
type: object
properties:
campaignId:
type: string
description: The campaign container to issue credentials into.
credentials:
type: array
items:
$ref: '#/components/schemas/CredentialInput'
required:
- campaignId
- credentials
CredentialInput:
type: object
properties:
name:
type: string
description: The recipient's full name.
email:
type: string
format: email
description: The recipient's email address.
issueDate:
type: string
format: date
description: The credential issue date (UTC).
quickPublish:
type: boolean
description: Publish the credential immediately.
dontSendEmail:
type: boolean
description: Suppress Sertifier's delivery email.
externalId:
type: string
description: A reference ID from your own system, useful for idempotency.
updateExistingCredentials:
type: boolean
description: Update a matching existing credential instead of creating a duplicate.
attributes:
type: array
description: Custom attribute values merged into the design and email.
items:
type: object
properties:
id:
type: string
value:
type: string
required:
- name
- email
# --- truncated at 32 KB (32 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/sertifier/refs/heads/main/openapi/sertifier-openapi.yml