Skip to content

Get a learner

GET/v1/organization/{orgId}/learning/workspace/learners/{personId}

US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com

One learner: their courses with progress, certifications with status and expiry, assignments with due dates, sessions attended, and their credit by credit type with every claim and certificate, plus the paths of their transcript downloads. Read from the existing course progress, awards and credit records; nothing is copied. A teammate limited to some credits portfolios gets 404 for anyone outside them. Reads only. Requires read:learning; refused for a key restricted to particular events. Also at GET /v1/learning/workspace/learners/{personId}.

Request example

Terminal window
curl --request GET \
--url 'https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/learners/{personId}' \
--header 'x-access-token: <api-token>'

Try it

Authorization

Your token stays in this page. It is sent only to the region above and is never saved; it is gone when you leave or reload the page.

Path parameters
GET

Authorizations

  • x-access-tokenstringheader

    Organization API token. Generate from Organization Settings → API Tokens.

  • AuthorizationBearer <token>headeror

    OAuth 2.1 access token. Obtained via the OAuth PKCE flow at /oauth/token.

Send one of these. See Authentication.

Path parameters

  • orgIdstringpathrequired

    Your organization ID. Any other organization returns 404.

  • personIdstring<uuid>pathrequired

    The People id (from Find a learner or Rank learners by engagement).

Responses

200application/json

OK

  • successboolean
  • payloadLearningLearnerDetail
    Show child attributes
    • learnerobject
      Show child attributes
      • idstring<uuid>
      • namestring
      • emailstring | null
      • has_loginboolean
    • coursesobject[]

      Up to 200 courses they touched, most recent activity first.

      Show child attributes
      • idstring<uuid>
      • titlestring
      • statusstring
        Allowed values
        "draft", "published", "archived"
      • duration_minutesinteger | null
      • stepsinteger
      • doneinteger
      • percentinteger | null
      • completedboolean
      • started_atstring<date-time>
      • completed_atstring<date-time> | null
      • last_activity_atstring<date-time>
    • certificationsobject[]

      Their certification awards, newest first.

      Show child attributes
      • idstring<uuid>

        The award.

      • certification_idstring<uuid>
      • namestring
      • statusstring
        Allowed values
        "active", "expired", "revoked"
      • awarded_atstring<date-time>
      • expires_atstring<date-time> | null
      • days_leftinteger | null

        null once expired or when it never expires.

      • verify_codestring | null
    • assignmentsobject[]
      Show child attributes
      • idstring<uuid>
      • kindstring

        series is a course.

        Allowed values
        "certification", "series", "lesson"
      • namestring | null
      • statestring
        Allowed values
        "assigned", "overdue", "completed"
      • due_atstring<date-time> | null
      • completed_atstring<date-time> | null
    • creditsobject
      Show child attributes
      • typesLearningLedgerType[]

        Credit by credit type, largest total first.

        Show child attributes
        • credit_type_idstring<uuid> | null
        • namestring
        • unitstring | null
        • totalnumber
        • claimsobject[]
          Show child attributes
          • idstring<uuid>
          • amountnumber
          • titlestring | null

            The course or session.

          • sourcestring
            Allowed values
            "lesson", "session"
          • event_namestring | null
          • activity_atstring<date-time>

            When the activity ran.

          • claimed_atstring<date-time>
          • verified_bystring | null
            Allowed values
            "admin", "lesson", "scan", "import", "check_in", "self_report", null
          • certificateobject | null
            Show child attributes
            • numberstring
            • issued_atstring<date-time> | null
      • claimsinteger

        Live claims in all.

    • attendedobject[]

      Up to 200 sessions attended, newest first.

      Show child attributes
      • session_idstring<uuid>
      • titlestring | null
      • event_idinteger | null
      • event_namestring | null
      • occurred_atstring<date-time>
    • downloadsobject

      Paths of the transcript downloads.

      Show child attributes
      • transcript_pdfstring
      • transcript_xlsxstring

400application/json

A path, query or body value failed validation, or an unknown body property was sent. message names the field. (A source object naming the assistant, with the person's prompt, is accepted on every write and removed before validation.) For an {eventId} path that is not a whole number: error: VALIDATION_ERROR, eventId must be a valid integer.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

401

Missing, invalid or expired token.

403application/json

  • SCOPE_REQUIRED — the token lacks read:learning (reads) or write:learning (writes). Legacy tokens with no scopes cannot write.
  • ORG_WIDE_TOKEN_REQUIRED — the token is restricted to particular events: "The Learning workspace covers every event and learner in the organization, so this API key (restricted to particular events) cannot use it. Use a key without an event restriction."
  • FEATURE_NOT_ENABLED (feature: lessons_credits) — Learning is not on for the organization.
  • FORBIDDEN — the token's user is not an active member of the organization, or lacks the Lessons permission the operation needs.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

404application/json

No such person in your organization or portfolios (Learner could not be found), or another organization.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

429application/json

  • The token's request limit (100 requests per 15 minutes per bucket by default — see Rate Limiting). Wait Retry-After seconds.
  • QUOTA_EXCEEDED (writes) — the token's daily write quota (10,000 a day). Resets at midnight UTC.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>
  • Retry-Afterintegerheader

    Seconds to wait before retrying.

Response examples

{
"success": true,
"payload": {
"learner": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"email": "<string>",
"has_login": true
},
"courses": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"status": "draft",
"duration_minutes": 123,
"steps": 123,
"done": 123,
"percent": 123,
"completed": true,
"started_at": "2026-01-15T09:30:00Z",
"completed_at": "2026-01-15T09:30:00Z",
"last_activity_at": "2026-01-15T09:30:00Z"
}
],
"certifications": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"certification_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "active",
"awarded_at": "2026-01-15T09:30:00Z",
"expires_at": "2026-01-15T09:30:00Z",
"days_left": 123,
"verify_code": "<string>"
}
],
"assignments": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "certification",
"name": "<string>",
"state": "assigned",
"due_at": "2026-01-15T09:30:00Z",
"completed_at": "2026-01-15T09:30:00Z"
}
],
"credits": {
"types": [
{
"credit_type_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"unit": "<string>",
"total": 123.45,
"claims": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123.45,
"title": "<string>",
"source": "lesson",
"event_name": "<string>",
"activity_at": "2026-01-15T09:30:00Z",
"claimed_at": "2026-01-15T09:30:00Z",
"verified_by": "admin",
"certificate": {
"number": null,
"issued_at": null
}
}
]
}
],
"claims": 123
},
"attended": [
{
"session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"event_id": 123,
"event_name": "<string>",
"occurred_at": "2026-01-15T09:30:00Z"
}
],
"downloads": {
"transcript_pdf": "<string>",
"transcript_xlsx": "<string>"
}
}
}