Bulk Create Certificate Templates
Creates multiple certificate templates in a single request, returning counts of created and updated records along with any errors or warnings
Creates multiple certificate templates in a single request, returning counts of created and updated records along with any errors or warnings.
POST
https://example.thoughtindustries.com/incoming/v2/content/certificate-templates/bulkExample request — minimal course certificate template
curl -X POST "https://example.thoughtindustries.com/incoming/v2/content/certificate-templates/bulk" \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"templates": [
{
"resourceId": "8f2a1c34-5b6d-4e7f-9a01-2b3c4d5e6f70",
"resourceType": "course",
"title": "Workplace Safety — Certificate of Completion"
}
]
}'Example request — expiration with in-session recertification (course only)
curl -X POST "https://example.thoughtindustries.com/incoming/v2/content/certificate-templates/bulk" \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"templates": [
{
"resourceId": "8f2a1c34-5b6d-4e7f-9a01-2b3c4d5e6f70",
"resourceType": "course",
"title": "Annual Compliance Certificate",
"expirationDays": 365,
"recertificationAction": "recertifyInSession",
"recertificationAfterDays": 30
}
]
}'Example request — learning path certificate with positioned labels
curl -X POST "https://example.thoughtindustries.com/incoming/v2/content/certificate-templates/bulk" \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"templates": [
{
"resourceId": "1d9e8f70-4a3b-4c2d-8e1f-0a9b8c7d6e5f",
"resourceType": "learningPath",
"title": "Manager Fundamentals Certificate",
"expirationDate": "2026-12-31",
"recertificationAction": "actionUrl",
"recertificationActionText": "Renew now",
"recertificationActionUrl": "https://example.com/renew",
"labels": [
{ "certificateFieldId": "fie1d000-aaaa-bbbb-cccc-ddddeeeeffff", "x": 120, "y": 240, "textAlign": "center", "fontSize": 24, "fontColor": "#1A1A1A" }
],
"assetLibraryId": "a55e7000-1111-2222-3333-444455556666"
}
]
}'Parameters
Requires the courses.edit.settings permission.
| Name | Type | Required | Location | Description |
|---|---|---|---|---|
templates | CertificateTemplateInput[] | Yes | body | Array of certificate template objects to create (see below). |
Each object in templates (CertificateTemplateInput):
| Field | Type | Required | Description |
|---|---|---|---|
resourceId | uuid | Yes | UUID of the course or learning path the template belongs to. |
resourceType | CertificateTemplateResourceType | Yes | course or learningPath. |
title | string | Yes | Template title (non-empty, max 500 characters). |
expirationDate | date | No | ISO 8601 fixed expiration date. Mutually exclusive with expirationDays. |
expirationDays | integer | No | Days after issuance until expiration (must be > 0). Mutually exclusive with expirationDate. |
recertificationAction | CertificateTemplateRecertificationActionType | No | One of resetProgress, recertifyInSession, actionUrl. Requires an expiration to be set. recertifyInSession is course-only. |
recertificationInstructions | string | No | Instructions shown to the learner. Requires recertificationAction. |
recertificationActionText | string | No | Button text. Required when recertificationAction is actionUrl; not allowed otherwise. |
recertificationActionUrl | url | No | Target URL. Required when recertificationAction is actionUrl; not allowed otherwise. |
recertificationAfterDays | integer | No | Days before recertification. Required (> 0) when recertificationAction is recertifyInSession; not allowed otherwise. |
recertificationAutoReset | boolean | No | Only valid when recertificationAction is resetProgress. |
userCustomFieldSlug | slug | No | User custom field slug. Must be provided together with userCustomFieldValue. |
userCustomFieldValue | string | No | User custom field value. Must be provided together with userCustomFieldSlug. |
customCss | string | No | Custom CSS for the certificate (must be valid CSS). |
labels | CertificateTemplateLabelInput[] | No | Positioned certificate fields (see below). |
assetLibraryId | uuid | No | Central Asset Manager certificate template asset ID. Mutually exclusive with assetUploadUrl. |
assetUploadUrl | url | No | External image URL for the certificate background, processed in a background job. Mutually exclusive with assetLibraryId. |
Each object in labels (CertificateTemplateLabelInput):
| Field | Type | Required | Description |
|---|---|---|---|
certificateFieldId | uuid | Yes | ID of the certificate field to place. |
x | integer | Yes | Horizontal position of the field. |
y | integer | Yes | Vertical position of the field. |
textAlign | TextAlignment | Yes | left or center. |
fontSize | integer | Yes | Font size for the field. |
fontColor | HexColor | Yes | Hex color (e.g., #1A1A1A). |
Note: The
assetfield is not supported — useassetUploadUrl(external URL) orassetLibraryId(Central Asset Manager). Supplyingassetreturns a 400.
Example response
{
"createdCount": 0,
"updatedCount": 0,
"createdIds": [
"00000000-0000-0000-0000-000000000000"
],
"errors": [
{
"resourceId": "00000000-0000-0000-0000-000000000000",
"title": "string",
"error": "string",
"record": "string"
}
],
"warnings": [
"string"
],
"backgroundJob": {
"id": "00000000-0000-0000-0000-000000000000",
"type": "string",
"description": "string",
"status": "complete"
}
}Response fields
| Field | Type | Description |
|---|---|---|
createdCount | integer | Number of certificate templates successfully created by this request. |
updatedCount | integer | Number of certificate templates successfully updated by this request. |
createdIds | uuid[] | UUIDs of the newly created certificate templates. |
errors | BulkCertificateTemplateError[] | List of errors encountered for individual templates during the bulk operation. |
errors.resourceId | uuid | UUID of the template that caused the error. |
errors.title | string | Human-readable title identifying the template that caused the error. |
errors.error | string | Description of the error that occurred for this template. |
errors.record | string | Raw record data associated with the failed template. |
warnings | string[] | Non-fatal warning messages generated during the bulk operation. |
backgroundJob | BackgroundJob | Background job spawned to process the bulk operation, if applicable. |
backgroundJob.id | uuid | Unique identifier of the background job. |
backgroundJob.type | string | Classification of the background job. |
backgroundJob.description | string | Human-readable description of what the background job is doing. |
backgroundJob.status | BackgroundJobStatus | Current status of the background job (e.g., complete). |