> ## Documentation Index
> Fetch the complete documentation index at: https://docs.crazygoldfish.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Send a student their result

> Get the link to a student's result page for an answer sheet, and send it to the student.

Once an answer sheet has been marked, call this to get the link to that student's result page, then send the link to the student by message, email or in your app. The student opens it and sees their marks and feedback.

Use it for answer sheets you create yourself with [Create an exam answer sheet](https://docs.crazygoldfish.com/api-reference/endpoint/evaluation-platform/v1-student-answer-sheet.md). If you create sheets with [Create an embeddable UI link](https://docs.crazygoldfish.com/api-reference/endpoint/evaluation-platform/embeddable-ui-link.md), its reply already carries the same link.

**1. Upload the answer sheet**

Create the answer sheet and [upload it](https://docs.crazygoldfish.com/api-reference/endpoint/evaluation-platform/v1-student-answer-sheet-id.md) as usual.

**2. Get the link**

Call this endpoint with the exam ID and the answer sheet ID.

**3. Send it to the student**

Send `link` from the reply to the student it belongs to.

```bash theme={null}
curl "https://api.crazygoldfish.com/evaluation-platform/v1/exam/EXAM_ID/answer-sheet/ANSWER_SHEET_ID/student-link/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

## Good to know

* The link opens this one student's answer sheet and nothing else.
* The student does not sign in. Your access token stays on your server, and the student needs only the link.
* Links do not expire. Calling again gives you a link that works too, and links from earlier calls keep working.

> [!WARNING]
>
> The page shows the marks and feedback as soon as marking finishes, before anyone has reviewed or published them. If a teacher must check the marks first, send the link only after that. See [Embeddable UI](https://docs.crazygoldfish.com/products/evaluation-layer/embeddable-ui.md).

## Reading the response

| Response | Meaning | What to do |
| - | - | - |
| `200` | The link | Send `link` to the student, unchanged |
| `404` `Answer Sheet not found` | No answer sheet with this ID under this exam | Check both IDs |
| `403` | The access token is missing, invalid or expired | [Get a new access token](https://docs.crazygoldfish.com/api-reference/endpoint/authentication.md) |


## OpenAPI

````yaml GET /evaluation-platform/v1/exam/{examId}/answer-sheet/{ansSheetId}/student-link/
openapi: 3.0.3
info:
  title: Exam Evaluation API
  version: 1.0.0
  description: >-
    Extract questions and model answers from an exam paper, grade handwritten
    answer sheets, and publish results.
servers:
  - url: https://api.crazygoldfish.com
    description: Production
  - url: https://api-staging.crazygoldfish.com
    description: Sandbox, for testing
security:
  - bearerAuth: []
tags:
  - name: Exam Evaluation
paths:
  /evaluation-platform/v1/exam/{examId}/answer-sheet/{ansSheetId}/student-link/:
    get:
      tags:
        - Exam Evaluation
      summary: Send a student their result
      description: >-
        Returns the link to one answer sheet's page in the student app, to send
        to that student: they open it to see their marks and feedback, with no
        sign-in. Links do not expire, and a link from an earlier call keeps
        working too.
      operationId: getStudentLink
      parameters:
        - $ref: '#/components/parameters/ExamIdPlain'
        - $ref: '#/components/parameters/AnsSheetId'
      responses:
        '200':
          description: A link that opens this answer sheet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StudentLink'
              example:
                link: >-
                  https://k12.crazygoldfish.com/evaluate/d19e6868-98dd-4274-a2a5-4a616dd93ea7/answers/8a2f4c1e-5b3d-4e6f-9a7b-0c1d2e3f4a5b#t=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
                answerSheetId: 8a2f4c1e-5b3d-4e6f-9a7b-0c1d2e3f4a5b
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: No answer sheet with this ID exists under this exam.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: 404
                  message:
                    non_field_errors:
                      - Answer Sheet not found
components:
  parameters:
    ExamIdPlain:
      name: examId
      in: path
      required: true
      description: >-
        The exam `id` returned by [Create an
        exam](/api-reference/endpoint/evaluation-platform/v1-exam).
      schema:
        type: string
        format: uuid
        example: d19e6868-98dd-4274-a2a5-4a616dd93ea7
    AnsSheetId:
      name: ansSheetId
      in: path
      required: true
      description: >-
        The answer sheet `id` returned by [Create an exam answer
        sheet](/api-reference/endpoint/evaluation-platform/v1-student-answer-sheet).
      schema:
        type: string
        format: uuid
        example: 8a2f4c1e-5b3d-4e6f-9a7b-0c1d2e3f4a5b
  schemas:
    StudentLink:
      type: object
      properties:
        link:
          type: string
          description: >-
            The student's result page for this answer sheet, to send to the
            student unchanged.
        answerSheetId:
          type: string
          format: uuid
          description: The answer sheet the link opens.
      example:
        link: >-
          https://k12.crazygoldfish.com/evaluate/d19e6868-98dd-4274-a2a5-4a616dd93ea7/answers/8a2f4c1e-5b3d-4e6f-9a7b-0c1d2e3f4a5b#t=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
        answerSheetId: 8a2f4c1e-5b3d-4e6f-9a7b-0c1d2e3f4a5b
    Error:
      type: object
      description: Every error except an authentication failure uses this shape.
      properties:
        error:
          type: object
          properties:
            code:
              type: integer
              description: Repeats the HTTP status code.
            message:
              type: object
              description: >-
                Field name to list of messages. Errors that are not about one
                field use `non_field_errors`.
              additionalProperties: true
    AuthError:
      type: object
      description: >-
        Error shape that carries a single message string. Used for
        authentication failures and for an out-of-range page number.
      properties:
        detail:
          type: string
          description: What went wrong.
  responses:
    Forbidden:
      description: >-
        The `Authorization` header is missing, or the token is invalid or
        expired. This API answers `403`, not `401`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AuthError'
          examples:
            missing:
              summary: No header
              value:
                detail: Authentication credentials were not provided.
            expired:
              summary: Expired token
              value:
                detail: Token has expired
            undecodable:
              summary: Malformed token
              value:
                detail: Error decoding token
            scheme:
              summary: Header is not `Bearer <token>`
              value:
                detail: Invalid token header. No credentials provided.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token from [Get an access
        token](/api-reference/endpoint/authentication). A missing, invalid, or
        expired token returns `403`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.