Packages
Browse certification packages grouped into progression tracks and invite a candidate to all skills in a package at once.
A package track is a platform-curated progression, such as Cybersecurity. Each track has up to four packages: Fundamentals (Beginner), Practitioner (Intermediate), Professional (Advanced), and Expert. Each package contains certifications at one shared proficiency level. Skills and certifications inside a package are still tracked individually - a package invite creates one regular certification invite per skill, each with its own challenge link, attempt, and result.
Requires the CERTIFICATION_PACKAGE_READ scope to list packages, and CERTIFICATION_INVITE_CREATE
to send a package invite - the same scope used for single-skill invites.
List packages
query CertificationPackageTracks($search: String, $trackSlug: String) {
developerCertificationPackageTracks(search: $search, trackSlug: $trackSlug) {
id
name
slug
packages {
id
name
level
description
skills {
quizId
skillName
level
durationMinutes
enabledLanguages
conceptsTested
}
}
}
}Only packages where every skill is currently enabled and ready to deliver are returned. search matches
track and package names. Pass trackSlug to retrieve one track. Retain each
skill's quizId for reference, but you don't need it to send a package invite - only the package id.
Example response
{
"data": {
"developerCertificationPackageTracks": [
{
"id": "cybersecurity-track-id",
"name": "Cybersecurity",
"slug": "cybersecurity",
"packages": [
{
"id": "cybersecurity-fundamentals-id",
"name": "Cybersecurity Fundamentals",
"level": "BEGINNER",
"skills": [
{ "quizId": "cybersecurity-beginner-id", "skillName": "Cybersecurity Fundamentals", "level": "BEGINNER", "durationMinutes": 30, "enabledLanguages": ["en"], "conceptsTested": ["Threats", "Access control"] }
]
}
]
}
]
}
}Send a package invite
mutation CreateCertificationPackageInvite($input: DeveloperCreateCertificationPackageInviteInput!) {
developerCreateCertificationPackageInvite(input: $input) {
packageId
packageName
invites {
quizId
skillName
level
inviteId
status
challengeUrl
expiresAt
emailSent
}
}
}{
"input": {
"packageId": "backend-package-id",
"candidate": { "name": "Jane Doe", "email": "[email protected]" },
"sendInviteEmail": true
}
}Field notes
- This is all-or-nothing: if the candidate already has an in-progress attempt or a currently-valid
certification for any skill in the package, or any skill in the package is no longer enabled, the
whole request fails with
BAD_USER_INPUTand no invites are created. Resolve the conflicting skill (or invite the other skills individually via Invites) and retry. - On success, one
CertificationInviteand one challenge link are created per skill, exactly as if you had calleddeveloperCreateCertificationInviteonce per skill - each has its ownexpiresAt(14 days), its own attempt, and its own result. There is no combined "package result" - read each skill back individually via Results using itsinviteId. sendInviteEmaildefaults totrueand applies to every skill in the package; each skill's challenge link is emailed separately.callbackUrl(optional, HTTPS only, API-key auth only) is applied to every invite created by this request - see Webhooks.
Example request
curl https://select.getscout.ai/api/developer/graphql \
-H "x-api-key: sk_scout_..." \
-H "content-type: application/json" \
-d '{
"query": "mutation CreateCertificationPackageInvite($input: DeveloperCreateCertificationPackageInviteInput!) { developerCreateCertificationPackageInvite(input: $input) { packageId packageName invites { quizId skillName level inviteId status challengeUrl expiresAt emailSent } } }",
"variables": { "input": { "packageId": "backend-package-id", "candidate": { "name": "Jane Doe", "email": "[email protected]" }, "sendInviteEmail": true } }
}'