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

# All Testing Records

> ## View Submission History

Browse all submissions for your company. Like a trophy case, but for code reviews.

**Filtering options:**
- Search by candidate email or name
- Sort by various timestamps
- Paginate through the results

**Submission states:**
- `draft` - Started but not submitted (chickened out)
- `submitted` - Committed to their fate
- `processing` - Judges are deliberating
- `analyzed` - Complete with scores and commentary

**Submission types:**
- `test: 1` - Practice round (free)
- `test: 0` - Real evaluation ($39 charged)

**Note:** All submissions include scorecards in the response for your convenience.




## OpenAPI

````yaml GET /playback
openapi: 3.0.3
info:
  title: Error Golf API - Where Code Goes to Die
  description: >
    # 🏌️ Error Golf API


    **Error Golf** replaces algorithmic tests with creative coding challenges
    that actually measure problem-solving skills.

    Companies pay $39 per candidate to discover if applicants can think
    creatively or just copy-paste from Stack Overflow.


    ## Business Model

    - **Setup Fee:** $49 one-time fee (because quality costs money)

    - **Per Candidate:** $39 each attempt (cheaper than a decent lunch)

    - **No Subscriptions:** We're not Netflix


    ## Golf Terminology

    - **Round:** Complete test (3 questions, like actual golf but with more
    crying)

    - **Hole:** Individual question (candidates pick 3 from 100 nightmares)

    - **Shot:** Solution attempt (usually involves existential crisis)

    - **Scorecard:** A roast of your code from 3 different personalities


    ## Authentication

    Protected endpoints need JWT Bearer token: `Bearer <your-digital-passport>`


    ## Error Responses

    When things inevitably break:

    ```json

    {
      "error": "something_went_sideways",
      "message": "A helpful explanation of what you did wrong this time"
    }

    ```


    ## Rate Limiting

    - 100 requests/hour (generous, considering your coding skills)

    - Headers tell you when we'll start ignoring you
  version: 1.0.0
  contact:
    name: Error Golf Support (May the odds be ever in your favor)
    url: https://errorgolf.com/support
    email: support@errorgolf.com
  license:
    name: Proprietary (We own this beautiful mess)
    url: https://errorgolf.com/terms
servers:
  - url: https://api.errorgolf.com/v1
    description: Production (where dreams meet reality)
  - url: http://localhost:8080/v1
    description: Local dev (your personal playground)
security: []
tags:
  - name: Health
    description: Is this thing even working?
  - name: Course
    description: Browse the vault of coding nightmares
  - name: Round
    description: Take 3 swings at holes you pick
  - name: Members
    description: Prove you belong here
  - name: Clubhouse
    description: Configure your coding challenge empire
paths:
  /playback:
    get:
      tags:
        - Clubhouse
      summary: Browse your rounds hall of fame
      description: >
        ## View Submission History


        Browse all submissions for your company. Like a trophy case, but for
        code reviews.


        **Filtering options:**

        - Search by candidate email or name

        - Sort by various timestamps

        - Paginate through the results


        **Submission states:**

        - `draft` - Started but not submitted (chickened out)

        - `submitted` - Committed to their fate

        - `processing` - Judges are deliberating

        - `analyzed` - Complete with scores and commentary


        **Submission types:**

        - `test: 1` - Practice round (free)

        - `test: 0` - Real evaluation ($39 charged)


        **Note:** All submissions include scorecards in the response for your
        convenience.
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            minimum: 1
            default: 1
          description: Page number for pagination
        - name: per_page
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 15
          description: Results per page (max 100)
        - name: sort
          in: query
          schema:
            type: string
            enum:
              - created_at
              - submitted_at
              - processing_started_at
              - processing_finished_at
              - email
              - status
            default: created_at
          description: Field to sort by
        - name: dir
          in: query
          schema:
            type: string
            enum:
              - asc
              - desc
            default: desc
          description: Sort direction
        - name: q
          in: query
          schema:
            type: string
          description: Search term for candidate email or name
      responses:
        '200':
          description: Submission list retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      allOf:
                        - $ref: '#/components/schemas/Submission'
                        - type: object
                          properties:
                            scorecard:
                              $ref: '#/components/schemas/Scorecard'
                              description: Analysis results (always included)
                    description: Array of submission records with attached scorecards
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
                  links:
                    $ref: '#/components/schemas/PaginationLinks'
        '401':
          $ref: '#/components/responses/TokenDead'
        '500':
          $ref: '#/components/responses/ServerExistentialCrisis'
      security:
        - bearerAuth: []
components:
  schemas:
    Submission:
      type: object
      description: Basic submission record
      properties:
        id:
          type: string
          description: Unique submission identifier
          example: 6865d67ede0cf7e8fd94e4dd
        sheet_id:
          type: integer
          description: Question sheet version used
          example: 1750822302
        email:
          type: string
          description: Candidate email address
          example: ac@test.com
        name:
          type: string
          description: Candidate name
          example: Alex
        holes:
          type: array
          items:
            type: integer
          description: Question IDs selected for this round
          example:
            - 1
            - 2
            - 3
        attempt:
          type: integer
          description: Attempt number for this candidate
          example: 1
        status:
          type: string
          enum:
            - draft
            - submitted
            - processing
            - analyzed
          description: Current submission state
        test:
          type: integer
          enum:
            - 0
            - 1
          description: Test flag (0=live/charged, 1=test/free)
        created_at:
          type: string
          format: date-time
          example: '2025-07-03T01:01:50.474Z'
        submitted_at:
          type: string
          format: date-time
          nullable: true
          example: '2025-07-03T01:18:49.446Z'
        processing_started_at:
          type: string
          format: date-time
          nullable: true
          example: '2025-07-04T01:46:09.137Z'
        processing_finished_at:
          type: string
          format: date-time
          nullable: true
          example: '2025-07-04T01:46:27.018Z'
        candidate_emailed_at:
          type: string
          format: date-time
          nullable: true
          description: When results were emailed to candidate
          example: '2025-07-04T01:46:28.087Z'
        company_emailed_at:
          type: string
          format: date-time
          nullable: true
          description: When results were emailed to company
          example: '2025-07-04T01:46:28.076Z'
        webhook_completed_at:
          type: string
          format: date-time
          nullable: true
          description: When webhook was successfully delivered
          example: '2025-07-04T01:46:30.123Z'
    Scorecard:
      type: object
      description: Analysis results for all questions
      properties:
        sheet_id:
          type: integer
          description: Question sheet identifier
          example: 1750822302
        holes:
          type: object
          description: Evaluation results keyed by question ID
          example:
            '1':
              first:
                personality: jaded_dev
                quality:
                  score: 70
                  commentary: >-
                    The recommendation is practical, but prioritizes short-term
                    status boosts over long-term financial security.
                length:
                  score: 75
                  commentary: 'Solution length: 222 characters'
                creativity:
                  score: 60
                  commentary: >-
                    The use of 'separation' and 'teenagers mock minivan' as
                    input variables is clever, but the output is surprisingly
                    straightforward.
                ingenuity:
                  score: 75
                  commentary: >-
                    The payment plan structured around alimony is a nice touch,
                    demonstrating an understanding of the customer's financial
                    constraints.
                humor:
                  score: 50
                  commentary: >-
                    The deadpan delivery is appreciated, but the solution lacks
                    real bite or irony.
                correctness:
                  score: 85
                  commentary: >-
                    The recommendation is logically coherent and financially
                    responsible.
                feedback: >-
                  This solution is a decent starting point, but lacks the clever
                  psychological manipulation required to truly succeed in this
                  space.
              second:
                personality: jaded_dev
                quality:
                  score: 80
                  commentary: >-
                    Practical wisdom shines through in the recommendation of a
                    reliable Camaro.
              third:
                personality: jaded_dev
                quality:
                  score: 70
                  commentary: We appreciate the concise, human-centered approach.
          additionalProperties:
            type: object
            description: Scores from multiple personalities (hah!)
            properties:
              first:
                $ref: '#/components/schemas/HoleScore'
              second:
                $ref: '#/components/schemas/HoleScore'
              third:
                $ref: '#/components/schemas/HoleScore'
        summary:
          type: string
          description: Overall evaluation summary
          example: >-
            Analyzed 3 questions with 3 jaded reviewers. Overall: 447/90.
            Strongest: Correctness (81). Weakest: Humor (66). The code has
            survived the gauntlet.
        created_at:
          type: string
          format: date-time
          example: '2025-07-04T01:46:09.137Z'
    PaginationMeta:
      type: object
      description: Pagination metadata
      properties:
        page:
          type: object
          properties:
            current-page:
              type: integer
              description: Current page number
              example: 2
            per-page:
              type: integer
              description: Items per page
              example: 15
            from:
              type: integer
              description: First item number on current page
              example: 16
            to:
              type: integer
              description: Last item number on current page
              example: 30
            total:
              type: integer
              description: Total number of items
              example: 50
            last-page:
              type: integer
              description: Total number of pages
              example: 4
    PaginationLinks:
      type: object
      description: Pagination navigation links
      properties:
        first:
          type: string
          description: URL for first page
          example: https://api.errorgolf.com/submissions?page=1&per_page=15
        prev:
          type: string
          nullable: true
          description: URL for previous page (null if on first page)
          example: https://api.errorgolf.com/submissions?page=1&per_page=15
        next:
          type: string
          nullable: true
          description: URL for next page (null if on last page)
          example: https://api.errorgolf.com/submissions?page=3&per_page=15
        last:
          type: string
          description: URL for last page
          example: https://api.errorgolf.com/submissions?page=4&per_page=15
    HoleScore:
      type: object
      description: Individual personality evaluation for one question
      properties:
        personality:
          type: string
          description: Personality that performed this evaluation
          example: jaded_dev
        quality:
          type: object
          description: Code quality evaluation
          properties:
            score:
              type: integer
              minimum: 15
              maximum: 90
              example: 70
            commentary:
              type: string
              example: The solution shows good understanding but lacks depth.
        length:
          type: object
          description: Solution length evaluation
          properties:
            score:
              type: integer
              minimum: 15
              maximum: 90
              example: 75
            commentary:
              type: string
              example: 'Solution length: 222 characters'
        creativity:
          type: object
          description: Creative approach evaluation
          properties:
            score:
              type: integer
              minimum: 15
              maximum: 90
              example: 60
            commentary:
              type: string
              example: Shows some creative thinking but could be more innovative.
        ingenuity:
          type: object
          description: Problem-solving ingenuity evaluation
          properties:
            score:
              type: integer
              minimum: 15
              maximum: 90
              example: 75
            commentary:
              type: string
              example: Demonstrates good problem-solving approach.
        humor:
          type: object
          description: Humor and wit evaluation
          properties:
            score:
              type: integer
              minimum: 15
              maximum: 90
              example: 50
            commentary:
              type: string
              example: Some dry humor present but could be more entertaining.
        correctness:
          type: object
          description: Technical correctness evaluation
          properties:
            score:
              type: integer
              minimum: 15
              maximum: 90
              example: 85
            commentary:
              type: string
              example: Solution is technically sound and logically coherent.
        feedback:
          type: string
          description: Overall detailed feedback for this question
          example: >-
            This solution shows promise but needs more creative flair and
            psychological insight.
    ErrorResponse:
      type: object
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: Machine-readable error identifier
        message:
          type: string
          description: Human-readable error explanation
  responses:
    TokenDead:
      description: JWT token is invalid or has expired
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: token_expired
            message: Your authentication token has expired. Please login again.
    ServerExistentialCrisis:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: internal_server_error
            message: Something went wrong on our end. We're looking into it.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT token from /token endpoint

````