API 레퍼런스
Deliverables
Customer API: GET /deliverables, GET /deliverables/{deliverableId}, GET /deliverables/{deliverableId}/progress, …
Parameters
limitinteger · queryMaximum number of items to return, 1-100. Defaults to 20.
cursorstring · queryOpaque cursor from the previous page's nextCursor. Omit for the first page.
localestring · queryLocale code (any letter case) or URL prefix of a live locale. Omitted: the customer's own locale (Contact.locale, set by their last checkout, sign-in or form submission), falling back to the site's primary locale. Titles and descriptions without a translation fall back to the primary locale.
Response 200
dataobject[]requireddata[].resolvedLocalestringMultilingual sites only: the locale actually served (the requested locale when a translation exists, otherwise the primary locale).
data[].idstringrequireddata[].titlestringrequireddata[].descriptionstring | nullrequireddata[].structure"COURSE" | "DOWNLOAD"requireddata[].coverAssetIdstring | nullrequireddata[].coverobject | nullCover image of the deliverable (null when unset or the image is in the trash).
data[].cover.urlstringrequireddata[].cover.widthinteger | nullrequireddata[].cover.heightinteger | nullrequireddata[].cover.altstring | nullrequireddata[].cover.placeholderstring | nullrequired16px WebP data URL
data[].grantedAtstringrequireddata[].expiresAtstring | nullrequireddata[].expiredbooleanrequireddata[].availableFromstring | nullrequireddata[].sourcesstring[]requireddata[].unitCountintegerrequireddata[].progressobject | nullrequireddata[].progress.percentnumberrequireddata[].progress.completedbooleanrequiredCompletion snapshot: set the first time the completion rule is met and never reverts, even if units are added later.
data[].progress.completedAtstring | nulldata[].progress.watchedSecondsintegerWall-clock seconds of media playback across the deliverable (only on the deliverables list).
data[].progress.lastPlayedAtstring | nullLatest media playback (only on the deliverables list).
hasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
INVALID_CURSOR400INVALID_LIMIT400
curl -X GET "https://{site}/api/v1/customer/deliverables" \
-H "Authorization: Bearer $KANORIO_CUSTOMER_TOKEN"Parameters
deliverableIdstring · pathrequiredlocalestring · queryLocale code (any letter case) or URL prefix of a live locale. Omitted: the customer's own locale (Contact.locale, set by their last checkout, sign-in or form submission), falling back to the site's primary locale. Titles and descriptions without a translation fall back to the primary locale.
Response 200
deliverableobjectrequireddeliverable.resolvedLocalestringMultilingual sites only: the locale actually served (the requested locale when a translation exists, otherwise the primary locale).
deliverable.idstringrequireddeliverable.titlestringrequireddeliverable.descriptionstring | nullrequireddeliverable.structure"COURSE" | "DOWNLOAD"requireddeliverable.coverAssetIdstring | nullrequireddeliverable.coverobject | nullCover image of the deliverable (null when unset or the image is in the trash).
deliverable.cover.urlstringrequireddeliverable.cover.widthinteger | nullrequireddeliverable.cover.heightinteger | nullrequireddeliverable.cover.altstring | nullrequireddeliverable.cover.placeholderstring | nullrequired16px WebP data URL
deliverable.authorsobject[]Authors/instructors in the owner's order (shared site author list). Older servers omit it.
deliverable.authors[].idstringrequireddeliverable.authors[].namestringrequireddeliverable.authors[].titlestring | nullrequiredJob title or credential, e.g. Head Chef
deliverable.authors[].avatarstring | nullrequiredDisplayable image URL
deliverable.authors[].biostring | nullrequireddeliverable.authors[].urlstring | nullrequireddeliverable.settingsobjectrequireddeliverable.unitsobject[]requireddeliverable.units[].idstringrequireddeliverable.units[].parentIdstring | nullrequireddeliverable.units[].orderintegerrequireddeliverable.units[].kindstringrequireddeliverable.units[].titlestring | nullrequireddeliverable.units[].descriptionstring | nullrequireddeliverable.units[].isPreviewbooleanrequireddeliverable.units[].allowDownloadbooleanrequireddeliverable.units[].countsTowardCompletionbooleanfalse = bonus unit: not counted in percent/completion and never locked by the require-in-order rule.
deliverable.units[].isPrerequisitebooleanUnits after this one stay locked until it is completed.
deliverable.units[].hasFilebooleanrequireddeliverable.units[].embedobject | nullrequireddeliverable.units[].bodyanyrequireddeliverable.units[].durationnumber | nullrequireddeliverable.units[].pageCountinteger | nullrequireddeliverable.units[].mimeTypestring | nullrequireddeliverable.units[].accessobjectrequireddeliverable.units[].progress"not_started" | "in-progress" | "completed"requireddeliverable.units[].positionSecondsnumberrequiredFurthest position reached (seconds); drives progress
deliverable.units[].lastPositionnumberWhere the learner last stopped (seconds); resume from here. Absent on older servers.
deliverable.units[].coveredPercentinteger | nullShare of the media actually watched (union of played ranges), 0-100; null when there is no duration or nothing watched yet
deliverable.units[].quizobject | nulldeliverable.progressobject | nullrequireddeliverable.progress.percentnumberrequireddeliverable.progress.completedbooleanrequiredCompletion snapshot: set the first time the completion rule is met and never reverts, even if units are added later.
deliverable.progress.completedAtstring | nulldeliverable.progress.watchedSecondsintegerWall-clock seconds of media playback across the deliverable (only on the deliverables list).
deliverable.progress.lastPlayedAtstring | nullLatest media playback (only on the deliverables list).
deliverable.certificateobject | nulldeliverable.certificate.enabledbooleanrequireddeliverable.certificate.serialstring | nullrequireddeliverable.certificate.issuedAtstring | nullrequired
Errors
DELIVERABLE_NOT_FOUND404
curl -X GET "https://{site}/api/v1/customer/deliverables/{deliverableId}" \
-H "Authorization: Bearer $KANORIO_CUSTOMER_TOKEN"Parameters
deliverableIdstring · pathrequired
Response 200
unitsobjectrequiredpositionsobjectrequiredpercentnumberrequiredcompletedbooleanrequiredcompletedAtstring | null
Errors
DELIVERABLE_NOT_FOUND404
curl -X GET "https://{site}/api/v1/customer/deliverables/{deliverableId}/progress" \
-H "Authorization: Bearer $KANORIO_CUSTOMER_TOKEN"Short-lived download URL for the completion certificate (issued once the deliverable is completed and certificates are enabled)
/deliverables/{deliverableId}/certificateParameters
deliverableIdstring · pathrequired
Response 200
certificateobjectrequiredcertificate.serialstringrequiredcertificate.issuedAtstringrequiredcertificate.urlstringrequiredSigned PDF URL, valid for expiresIn seconds
certificate.expiresInintegerrequired
Errors
DELIVERABLE_NOT_FOUND404CERTIFICATE_DISABLED404SIGN_FAILED503FORBIDDEN403
curl -X GET "https://{site}/api/v1/customer/deliverables/{deliverableId}/certificate" \
-H "Authorization: Bearer $KANORIO_CUSTOMER_TOKEN"