Retrieve and render results¶
Once a learner completes their assessment, one call returns their cognitive profile, and you put it in front of the people who act on it: the tutor's caseload view, your ILP, your learner record. This is Phase 2 of an integration, put the data where it's needed, and it removes the swivel-seat of re-keying results by hand.
Every call needs a bearer token and uses the base URL https://api.uk.cognassist.com. See Getting started to get one. The codes in the payload decode into the labels a tutor reads; Core concepts is their canonical home, and the full schemas live in the API reference.
Get the assessment result¶
Pass the learnerId you stored when you created the learner, and you get back a small, flat object whose integers decode into tutor-facing labels.
curl https://api.uk.cognassist.com/v1/learners/{learnerId}/assessment \
-H "Authorization: Bearer <token>"
A completed result carries a status, a learnerStatus classification, a supportLikelihoodRating, and one entry per cognitive domain in assessmentResults. Read the GET /v1/learners/{learnerId}/assessment schema for the full field list; the decode tables below cover the enums you render from.
A completed result, decoded
{
"status": 30,
"learnerStatus": 20,
"supportLikelihoodRating": 4,
"dateAssessmentCompleted": "2026-04-07T09:15:00",
"assessmentResults": [
{ "domainId": 1, "domainResult": 1 },
{ "domainId": 2, "domainResult": 2 },
{ "domainId": 6, "domainResult": 3 }
]
}
This reads: Completed, Monitor and review, one index identified, with the three listed domains resolving to not identified, identified, and insufficient data. Map domainId to a domain name such as Literacy using the domain codes in Core concepts.
Branch on status before reading the rest, because the other fields are only populated once scoring completes.
| State | Integer | What it means | What to do |
|---|---|---|---|
| Not completed | 20 | The learner hasn't finished. | Invite or remind them (see Send the assessment). |
| Awaiting results | 10 | Finished, but scoring isn't complete yet. | Fetch again shortly, or wait for the webhook. |
| Completed | 30 | The classification, rating, and results are populated. | Render the profile. |
When learnerStatus flags a learner as Consider a needs assessment, GET /v1/learners/{learnerId}/supportplan/needsassessmentdecision returns whether that stage-gate decision has been made. See Read the support plan for the field shapes and the report-less behaviour.
All three wire integers (10, 20, 30) are from the LearnerAssessmentStatus enum in the API source. React to completion with the 100 Assessment Completed webhook rather than polling on a timer, so you fetch each result exactly once, the moment it's ready.
Decode the result codes¶
Three enums decode into the labels a tutor reads: learnerStatus (the headline classification), supportLikelihoodRating (how confident the signal is, where higher is stronger and an index match outranks a domain match), and domainResult (the outcome for each domain). The worked example above shows all three decoded in place. The integer-to-meaning tables live once in Core concepts, their canonical home, with the exhaustive enums in the API reference; keep that open as you build the render rather than copying the values here.
Persist these integers as you receive them, not just the labels you render from them, so you can re-derive display text and reconcile safely later.
Render it responsibly¶
A cognitive profile is a signal, not a diagnosis
It indicates where support may help; it is never a verdict or a deficit label. Show the whole profile and lead with strengths, present insufficient data as "not enough information" rather than a low score, and frame learnerStatus and supportLikelihoodRating as how likely a learner is to benefit from support the tutor can then offer on an informed basis.
Display the human-readable names, not the raw integers, so a tutor sees "Literacy", not 2. Decode using the result codes and domain codes in Core concepts.
Your credentials only return your own organisation's learners, so a 403 for a learner outside that scope is expected rather than a failure. The access model is described once in Core concepts.
Request the PDF report¶
The structured result above is the machine-readable profile. For a durable, human-readable companion, and a useful item for your organisation's own evidence pack, request the full PDF report. The call returns 202 Accepted straight away with a requestId, then the finished file is pushed to you by webhook.
curl -X POST https://api.uk.cognassist.com/v1/learners/{learnerId}/assessment/report \
-H "Authorization: Bearer <token>"
The requestId is your correlation handle: hold onto it, then match it against the RequestId in whichever webhook arrives.
200 Assessment Report Createdis amultipart/form-datadelivery carrying the PDF, plus adatapart that echoes yourRequestId. The multipart signature check is on the Webhooks page.300 Assessment Report Request Failedmeans generation did not complete for thatrequestId. Log it against the request, surface it rather than silently dropping it, and re-request if appropriate. See Troubleshooting for handling failed deliveries.
The report is generated asynchronously, so the file arrives by webhook rather than on the POST response, following the same 202-then-callback shape as the canonical webhook sequence. The success-or-failure fork it shares with the bulk export is drawn once in Troubleshooting, and both events, their payloads, and signature verification are documented in full on the Webhooks page.
A field-for-field JSON equivalent of the whole PDF, covering relative strengths, speed of working, and the CogType label, is on the roadmap, not available today; you would then be able to render the full report without parsing the PDF. Today the structured API exposes the domains, classification, and support-likelihood above, delivers the full narrative as the PDF, and exposes the agreed support plan through the endpoints below.
Read the support plan¶
The support plan is the agreed set of adjustments and goals a tutor puts in place with a learner after the assessment. Where the result above is the assessment output, the support plan is what the organisation decided to do about it. Reach for these when you want to surface the agreed plan in your own system rather than the narrative PDF. Each is a GET under /v1/learners/{learnerId}/supportplan/, and each returns one section of the plan:
/barriers: the barriers assigned to the learner, each with its name, category, and description, plus any free-text custom barriers./reasonableadjustments: the agreed adjustments, split into those derived from the learner's cognitive domains (domainAdjustments) and those derived from their barriers (barrierAdjustments). Each carries atitle, animplementationworked example, and the domains or barriers it addresses. Each entry in a domain adjustment'sdomainscarries anid, the same cognitive-domain code returned by the assessment result'sdomainId, so decode it with the domain codes in Core concepts. A barrier adjustment's ownidis stable across changes to the plan and is the same identifier you see for that adjustment on a support record, so you can correlate the two./goalsandimpact: the course demands the plan responds to, and the impact if the support is not met./reviewcadence: how often the plan is reviewed (weeks), and the learner's sharing consent per recipient. Each consent entry carries arecipientobject whoseidis an integer code (1= end-point assessment or awarding body,2= client,4= employer), so decode the code rather than depending on a label; see the API reference for the enum./needsassessmentdecision: after a learner is flaggedConsider a needs assessment, the Evaluate stage-gate decision on whether they proceed to a full needs assessment:proceedToNeedsAssessment(nullable,nulluntil a decision is recorded), theevidencerationale behind it, andcourseDetails(the learner's job role,nullwhen none is recorded)./signatures: who has signed off the agreed plan, and when. Reach for it when you need to evidence that a plan was agreed rather than merely recorded.agreementKind.idsays what was signed: the plan first agreed after the needs assessment (10), or the outcome of a progress review that continued (20) or ended (30) the support. A review agrees a fresh plan rather than editing the previous one, so this endpoint always describes the current agreement and the signatures given for it; the kind belongs to that agreement, so it is the same for every entry insignaturesrather than varying by signatory.signatureStatus.idis the overall state (10unsigned,20partially signed,30fully signed); a support-plan agreement requires both the tutor and the learner, so20means exactly one of the two has signed. Each entry insignaturescarries the signatory'srole.id(10tutor,20learner), theiruserId, theirname(nullwhen the person's account can no longer be resolved, while the rest of the entry stays accurate),signedAtUtc, and themethod.idthey signed by (10typed,20uploaded), oldest first. Invalidated signatures are left out, so the list matches the status, and the signature images themselves are never returned. The status and the list are read separately, so a signature captured or invalidated part-way through your request can land in one and not the other. Re-read rather than treating a momentary mismatch as a data error. See the API reference for the enums.
Three behaviours change how you call these:
- The plan is the agreed set, not the full catalogue.
reasonableadjustmentsreturns only the adjustments actually agreed for the learner, not every adjustment that could apply. This is the agreed plan itself, distinct from the per-session evidence you read on support records, and it sits on the same golden thread: every agreed adjustment traces back to an assessed barrier. - A learner may not have a plan yet.
goalsandimpactandreviewcadencereturn 404 when the learner has no support plan, so treat a 404 as "no plan agreed yet", not an error to retry.barriersandreasonableadjustmentsreturn empty arrays in the same state.needsassessmentdecisioninstead returns 200 withproceedToNeedsAssessmentandevidencebothnullandcourseDetailsstill populated, because the job role does not depend on a support plan. - On
signatures, "nothing to sign" and "not signed yet" are different answers. It returns 404 when the learner has no support-plan agreement to sign at all, and 200 withsignatureStatus.id10and an emptysignaturesarray when the agreement exists but nobody has signed it. Only the second is chaseable, so keep the two apart rather than collapsing both to "no signatures".
For the exact response shape of each section, see the API reference.
What to store¶
Persist the learnerId and the raw result codes you receive, not just their rendered labels, so you can re-derive display text and reconcile later. Keep dateAssessmentCompleted alongside your own records. Your stable cross-system join key stays clientReference, held on your side (see Core concepts).
Where to go next¶
- Send the assessment: invite by email or embed the assessment URL.
- Keep in sync: react to results with webhooks, with polling as the fallback.
- Export evidence and data: pull support records and bulk evidence out (Phase 3).
- API reference: try the endpoints live, or get the OpenAPI spec.