Scout SelectDeveloper Documentation
Certifications

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

  • status progresses through PENDING -> ACTIVE -> COMPLETED -> EXPIRED.
  • proctoringStatus is separate from status: PENDING (not yet reviewed), PENDING_REVIEW (flagged, awaiting manual review), CLEARED, or CONFIRMED (cheating confirmed).
  • resultReleaseStatus tells you whether the candidate-facing result can be shown yet: PENDING, PENDING_REVIEW, or RELEASED.
  • isFollowUp is true when the candidate claimed a one-time retake or level-up offer.
  • originalInviteId identifies the initial invite that led to this follow-up attempt. It is null for 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, with concepts giving per-topic accuracy computed directly from the exam's own graded questions (each question is tagged with one or more topics; score is 10 * (questions correct on that topic / questions asked on that topic)). null until the attempt is graded.
  • communicationScores - derived from answer/transcript quality (clarity, confidence, etc.), independent of skillWiseScores; null for quiz-only attempts that never generated a narrative report.
  • badgeImageUrl - the URL of the badge image for the achieved level (see Badges), only set when resultBand is EXCELLENT or GOOD (i.e. a certificate was actually issued).
  • badgeEarned - true once a badge has been issued for this attempt. Stays true even if the badge later expires or is revoked - check verificationStatus for its current validity.
  • badgeExpiresAt - ISO 8601 expiry date of the issued badge, null until a badge is issued. Remains populated after expiry or revocation for record-keeping; check verificationStatus to 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, options is ["LEVEL_UP"] - one attempt at the next level up, if it exists and is available. On a fail, options can include RETAKE_SAME (same level again) and/or LEVEL_DOWN (one level down), whichever exist and are available; the candidate picks one via a link emailed to them. status is PENDING until claimed or the 14-day window passes (EXPIRED), or CONSUMED once claimed - claimedOption and claimedInviteId (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. null if 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"
    }
  }
}

On this page