Results
Fetch the current status and outcome of a certification invite.
Requires the CERTIFICATION_RESULT_READ scope.
query CertificationResult($inviteId: String!) {
developerCertificationResult(inviteId: $inviteId) {
inviteId
isFollowUp
originalInviteId
status
skillName
level
completedAt
resultBand
score
proctoringStatus
resultReleaseStatus
certificateUrl
verificationStatus
feedbackAreas
reportUrl
skillWiseScores {
label
score
concepts {
label
score
}
}
communicationScores {
label
score
}
badgeImageUrl
badgeEarned
badgeExpiresAt
followUpOffer {
status
expiresAt
options
claimedOption
claimedInviteId
}
}
}Status fields
statusprogresses throughPENDING->ACTIVE->COMPLETED->EXPIRED.proctoringStatusis separate fromstatus:PENDING(not yet reviewed),PENDING_REVIEW(flagged, awaiting manual review),CLEARED, orCONFIRMED(cheating confirmed).resultReleaseStatustells you whether the candidate-facing result can be shown yet:PENDING,PENDING_REVIEW, orRELEASED.isFollowUpistruewhen the candidate claimed a one-time retake or level-up offer.originalInviteIdidentifies the initial invite that led to this follow-up attempt. It isnullfor an initial invite, so it can be used to group related attempts in your system.
While resultReleaseStatus is anything other than RELEASED, the result-bearing fields
(resultBand, score, certificateUrl, verificationStatus, feedbackAreas, reportUrl,
skillWiseScores, communicationScores, badgeImageUrl, badgeExpiresAt) are null - don't treat their
absence as an error, it means review is still pending. badgeEarned is non-nullable and instead reads
false until release.
Result fields
skillWiseScores- a single entry for the certified skill itself, withconceptsgiving per-topic accuracy computed directly from the exam's own graded questions (each question is tagged with one or more topics;scoreis10 * (questions correct on that topic / questions asked on that topic)).nulluntil the attempt is graded.communicationScores- derived from answer/transcript quality (clarity, confidence, etc.), independent ofskillWiseScores;nullfor quiz-only attempts that never generated a narrative report.badgeImageUrl- the URL of the badge image for the achieved level (see Badges), only set whenresultBandisEXCELLENTorGOOD(i.e. a certificate was actually issued).badgeEarned-trueonce a badge has been issued for this attempt. Staystrueeven if the badge later expires or is revoked - checkverificationStatusfor its current validity.badgeExpiresAt- ISO 8601 expiry date of the issued badge,nulluntil a badge is issued. Remains populated after expiry or revocation for record-keeping; checkverificationStatusto know whether the badge is still currently valid.followUpOffer- present once, and only once, per completed attempt whose result was released (never for attempts still pending cheat review, and never for confirmed cheating): a one-time, free follow-up exam the candidate can take within 14 days of release. On a pass,optionsis["LEVEL_UP"]- one attempt at the next level up, if it exists and is available. On a fail,optionscan includeRETAKE_SAME(same level again) and/orLEVEL_DOWN(one level down), whichever exist and are available; the candidate picks one via a link emailed to them.statusisPENDINGuntil claimed or the 14-day window passes (EXPIRED), orCONSUMEDonce claimed -claimedOptionandclaimedInviteId(a new invite id, itself never eligible for another follow-up offer) are set only after claiming. Claiming happens entirely through the candidate's email link, not the developer API - this field is read-only.nullif no follow-up was offered (e.g. already at the top level with a pass, or the adjacent-level quiz isn't configured/available).
Retake and level-up flow
Follow-up attempts are created only when a candidate claims the one-time offer sent after an eligible result.
They are separate invites with their own inviteId, status, result, and report. When the original invite has a
webhook callback, the follow-up inherits it and emits a certification.follow_up_claimed webhook immediately.
Its later result webhook includes the same lineage. 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": "query CertificationResult($inviteId: String!) { developerCertificationResult(inviteId: $inviteId) { inviteId status skillName level completedAt resultBand score proctoringStatus resultReleaseStatus certificateUrl verificationStatus feedbackAreas reportUrl } }",
"variables": { "inviteId": "clv2x..." }
}'Example response (released)
{
"data": {
"developerCertificationResult": {
"inviteId": "clv2x...",
"isFollowUp": false,
"originalInviteId": null,
"status": "COMPLETED",
"skillName": "React",
"level": "Intermediate",
"completedAt": "2026-07-20T09:41:00.000Z",
"resultBand": "GOOD",
"score": 78,
"proctoringStatus": "CLEARED",
"resultReleaseStatus": "RELEASED",
"certificateUrl": "https://select.getscout.ai/certificates/abc123",
"verificationStatus": "ISSUED",
"feedbackAreas": ["Error handling", "Debugging"],
"reportUrl": "https://select.getscout.ai/reports/9f3a1c...",
"skillWiseScores": [
{ "label": "React", "score": 7.5, "concepts": [{ "label": "Hooks", "score": 8 }] }
],
"communicationScores": [
{ "label": "Communication", "score": 7 }
],
"badgeImageUrl": "https://scout-interview.sgp1.cdn.digitaloceanspaces.com/certifications/public/intermediate-badge.png",
"badgeEarned": true,
"badgeExpiresAt": "2027-07-20T09:41:00.000Z"
}
}
}