Skip to main content
https://.thoughtindustries.com

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.

POSThttps://example.thoughtindustries.com/incoming/v2/content/certificate-templates/bulk

Example 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.

NameTypeRequiredLocationDescription
templatesCertificateTemplateInput[]YesbodyArray of certificate template objects to create (see below).

Each object in templates (CertificateTemplateInput):

FieldTypeRequiredDescription
resourceIduuidYesUUID of the course or learning path the template belongs to.
resourceTypeCertificateTemplateResourceTypeYescourse or learningPath.
titlestringYesTemplate title (non-empty, max 500 characters).
expirationDatedateNoISO 8601 fixed expiration date. Mutually exclusive with expirationDays.
expirationDaysintegerNoDays after issuance until expiration (must be > 0). Mutually exclusive with expirationDate.
recertificationActionCertificateTemplateRecertificationActionTypeNoOne of resetProgress, recertifyInSession, actionUrl. Requires an expiration to be set. recertifyInSession is course-only.
recertificationInstructionsstringNoInstructions shown to the learner. Requires recertificationAction.
recertificationActionTextstringNoButton text. Required when recertificationAction is actionUrl; not allowed otherwise.
recertificationActionUrlurlNoTarget URL. Required when recertificationAction is actionUrl; not allowed otherwise.
recertificationAfterDaysintegerNoDays before recertification. Required (> 0) when recertificationAction is recertifyInSession; not allowed otherwise.
recertificationAutoResetbooleanNoOnly valid when recertificationAction is resetProgress.
userCustomFieldSlugslugNoUser custom field slug. Must be provided together with userCustomFieldValue.
userCustomFieldValuestringNoUser custom field value. Must be provided together with userCustomFieldSlug.
customCssstringNoCustom CSS for the certificate (must be valid CSS).
labelsCertificateTemplateLabelInput[]NoPositioned certificate fields (see below).
assetLibraryIduuidNoCentral Asset Manager certificate template asset ID. Mutually exclusive with assetUploadUrl.
assetUploadUrlurlNoExternal image URL for the certificate background, processed in a background job. Mutually exclusive with assetLibraryId.

Each object in labels (CertificateTemplateLabelInput):

FieldTypeRequiredDescription
certificateFieldIduuidYesID of the certificate field to place.
xintegerYesHorizontal position of the field.
yintegerYesVertical position of the field.
textAlignTextAlignmentYesleft or center.
fontSizeintegerYesFont size for the field.
fontColorHexColorYesHex color (e.g., #1A1A1A).

Note: The asset field is not supported — use assetUploadUrl (external URL) or assetLibraryId (Central Asset Manager). Supplying asset returns 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

FieldTypeDescription
createdCountintegerNumber of certificate templates successfully created by this request.
updatedCountintegerNumber of certificate templates successfully updated by this request.
createdIdsuuid[]UUIDs of the newly created certificate templates.
errorsBulkCertificateTemplateError[]List of errors encountered for individual templates during the bulk operation.
errors.resourceIduuidUUID of the template that caused the error.
errors.titlestringHuman-readable title identifying the template that caused the error.
errors.errorstringDescription of the error that occurred for this template.
errors.recordstringRaw record data associated with the failed template.
warningsstring[]Non-fatal warning messages generated during the bulk operation.
backgroundJobBackgroundJobBackground job spawned to process the bulk operation, if applicable.
backgroundJob.iduuidUnique identifier of the background job.
backgroundJob.typestringClassification of the background job.
backgroundJob.descriptionstringHuman-readable description of what the background job is doing.
backgroundJob.statusBackgroundJobStatusCurrent status of the background job (e.g., complete).