CoderPad Pads API

A pad is a live interview or take-home session.

Operations 5

GET /pads List pads #
POST /pads Create a pad #
GET /pads/{id} Retrieve a pad #
PUT /pads/{id} Update a pad #
GET /pads/{id}/events List pad events #

Specifications

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/coderpad:coderpad-pads-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

coderpad-pads-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: CoderPad Interview Pads API
  version: 1.0.0
  description: 'The CoderPad Interview API lets you create and manage interview pads and questions programmatically, for example to integrate CoderPad with your interview scheduling platform or to retrieve the content of an interview once it has ended.


    It is a REST API that returns JSON.


    # Authentication


    Every request is authenticated with your API key, which you can find on your settings page. Send it in the `Authorization` header, either as a bearer token or in the `Token` format:


    ```

    curl -H ''Authorization: Bearer YOUR_API_KEY'' https://app.coderpad.io/api/pads

    curl -H ''Authorization: Token token="YOUR_API_KEY"'' https://app.coderpad.io/api/pads

    ```


    # Responses and errors


    Every response is a JSON object. Successful responses have an HTTP 2xx status and include `"status": "OK"`. Unsuccessful responses have an appropriate HTTP status and include `"status": "ERROR"` and a human-readable `message`:


    ```json

    { "status": "ERROR", "message": "Invalid API key" }

    ```


    | HTTP status | Meaning |

    | --- | --- |

    | 200 | The request succeeded. |

    | 400 | The request is invalid, for example because it specifies a language that does not exist. |

    | 401 | The API key is not tied to a valid account, or you cannot access this resource. |

    | 403 | You do not have permission to perform this action. |

    | 404 | The resource does not exist or is not visible to you. |

    | 429 | Too many requests, or your pad quota is exhausted. |


    # Request bodies


    Requests can be sent as JSON or as form data. Write endpoints expect their fields wrapped in an object named after the resource (`{"pad": {"title": "..."}}`, `question[title]=...`), but also accept them at the top level (`{"title": "..."}`, `title=...`).


    # Pagination


    List endpoints return at most 50 items per request, along with a `total` count. Follow the `next_page` and `prev_page` URLs, when present, to fetch the other pages.


    # Languages


    Wherever a request or response has a `language` field, its value is a CoderPad language key such as `python3`, `javascript`, `typescript`, `java`, `ruby`, `go`, `csharp`, `cpp` or `postgresql`. Where noted, project template slugs (multi-file environments such as `react` or `multifile_python`) are also accepted.'
  contact:
    name: CoderPad Support
    url: https://coderpad.io/support/
servers:
- url: https://app.coderpad.io/api
security:
- apiKey: []
tags:
- name: Pads
  description: A pad is a live interview or take-home session.
paths:
  /pads:
    get:
      tags:
      - Pads
      operationId: listPads
      summary: List pads
      description: 'Lists the pads visible to you, with the same fields as `GET /pads/{id}`.


        Values in this list can be up to a minute out of date. If you need the latest values, retrieve the pad individually.


        To go through all your pads, follow the `next_page` URL of each response until it is no longer returned. This is the recommended way to paginate: `next_page` points to the next page with a `cursor`, which stays fast however many pads you have.


        Requesting a `page` number is also supported, but gets slower as the page number grows. `prev_page` is only returned when you use `page`.'
      parameters:
      - $ref: '#/components/parameters/Sort'
      - $ref: '#/components/parameters/Page'
      - name: cursor
        in: query
        description: 'Position of the next page, as returned in the `next_page` URL of the previous response. Follow `next_page` rather than building this value yourself. When set, `sort` and `page` are ignored.

          '
        schema:
          type: string
      responses:
        '200':
          description: A page of pads.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/PaginatedResponse'
                - type: object
                  required:
                  - pads
                  properties:
                    pads:
                      type: array
                      items:
                        $ref: '#/components/schemas/Pad'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      tags:
      - Pads
      operationId: createPad
      summary: Create a pad
      description: 'Creates a pad owned by you, or by another user of your organization with `user_email`. Creating a pad counts towards your pad quota.


        Fields you omit use your account defaults (privacy, code execution, language) and your organization''s AI Assist setting.


        A pad can start either with `contents` or with a question from your question bank (`question_id`), not both.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - pad
              properties:
                pad:
                  $ref: '#/components/schemas/PadCreateRequest'
            example:
              pad:
                title: Backend interview
                language: python3
                contents: "def solution():\n    pass\n"
                private: true
      responses:
        '200':
          description: The created pad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PadResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          description: Over quota. You have reached the number of pads your plan allows in this billing cycle.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                status: ERROR
                message: Over quota
  /pads/{id}:
    parameters:
    - $ref: '#/components/parameters/PadId'
    get:
      tags:
      - Pads
      operationId: getPad
      summary: Retrieve a pad
      description: 'Returns the current state of a pad.


        For ended pads, the pad owner also gets the interview transcript, highlights and outline when their plan includes Insights & Analytics, and the AI review reports of the pad.'
      responses:
        '200':
          description: The pad.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PadResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      tags:
      - Pads
      operationId: updatePad
      summary: Update a pad
      description: 'Updates, ends or deletes a pad. Only the fields you send are changed.


        You can update your own pads. Organization owners can update any pad of their organization.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - pad
              properties:
                pad:
                  $ref: '#/components/schemas/PadUpdateRequest'
            example:
              pad:
                ended: true
      responses:
        '200':
          description: The pad was updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Ok'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /pads/{id}/events:
    parameters:
    - $ref: '#/components/parameters/PadId'
    get:
      tags:
      - Pads
      operationId: listPadEvents
      summary: List pad events
      description: Lists the events of a pad, such as participants joining or leaving, code runs and questions being added.
      parameters:
      - $ref: '#/components/parameters/Sort'
      - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A page of events.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/PaginatedResponse'
                - type: object
                  required:
                  - events
                  properties:
                    events:
                      type: array
                      items:
                        $ref: '#/components/schemas/PadEvent'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    PadWriteFields:
      type: object
      properties:
        title:
          type: string
        language:
          type: string
          description: A single-file language key.
          example: python3
        contents:
          type: string
          description: The code to put in the pad.
        private:
          type: boolean
          description: Whether the waiting room is enabled, so that guests must be admitted before joining the pad.
        execution_enabled:
          type: string
          enum:
          - 'true'
          - 'false'
          description: Whether code execution is enabled. Must be sent as the string `"true"` or `"false"`.
        restrict_interviewer_access:
          type: boolean
          description: Only let the owner and `allowed_interviewer_emails` join the pad as interviewers.
        allowed_interviewer_emails:
          type: array
          description: Users of the pad's organization allowed on the pad when `restrict_interviewer_access` is enabled. Replaces the current list.
          items:
            type: string
            format: email
        user_email:
          type: string
          format: email
          description: 'Makes this user of your organization the pad owner. A new account is created if the email address belongs to one of your organization''s domains and has no account yet. Organization owners only.

            '
        disable_coaching_tips:
          type: boolean
          description: Turn off interviewer coaching tips in the pad.
    PadResponse:
      allOf:
      - $ref: '#/components/schemas/Ok'
      - $ref: '#/components/schemas/Pad'
      - type: object
        properties:
          interview_highlights:
            type: string
            description: AI-generated summary of the interview. Insights & Analytics only.
          interview_outline:
            description: AI-generated outline of the interview. Insights & Analytics only.
          transcript:
            type: array
            description: The interview transcript. Insights & Analytics only.
            items:
              $ref: '#/components/schemas/TranscriptEntry'
          transcript_source_unavailable:
            type: boolean
            description: Present and `true` when the transcript could not be retrieved.
          review_reports:
            type: array
            description: AI review reports of the pad. Only returned to the pad owner.
            items:
              $ref: '#/components/schemas/ReviewReport'
    PadEvent:
      type: object
      properties:
        message:
          type: string
          description: A human-readable description of the event.
          example: '2026-09-30T14:02:11Z: Jane Doe joined'
        kind:
          type: string
          enum:
          - joined
          - left
          - ran
          - enabled
          - disabled
          - ended
          - renamed
          - started
          - deleted
          - added_question
          - submitted_take_home
          - added_question_example
          - opened_take_home
          - auto_ended
          - agreed_to_transcription
          - declined_transcription
          - paused_transcription
          - unpaused_transcription
          - stopped_transcription
          - enabled_ai_assist
          - disabled_ai_assist
        metadata:
          type:
          - string
          - 'null'
          description: Details that depend on `kind`, such as the language that was run or the new title.
        user_name:
          type:
          - string
          - 'null'
        user_email:
          type:
          - string
          - 'null'
        created_at:
          $ref: '#/components/schemas/Timestamp'
    PadInterviewerNotification:
      type: object
      properties:
        id:
          type: integer
        title:
          type:
          - string
          - 'null'
        message:
          type:
          - string
          - 'null'
        priority:
          type:
          - string
          - 'null'
        request_id:
          type:
          - string
          - 'null'
        useful:
          type:
          - boolean
          - 'null'
          description: The interviewer's feedback on the notification, if any.
        auto_dismissed:
          type:
          - boolean
          - 'null'
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
        dismissed_at:
          type:
          - string
          - 'null'
          format: date-time
    ReviewReport:
      type: object
      properties:
        id:
          type: string
        status:
          type: string
        title:
          type:
          - string
          - 'null'
        prompt:
          type:
          - string
          - 'null'
        report:
          type:
          - string
          - 'null'
        summary:
          type:
          - string
          - 'null'
        icon:
          type:
          - string
          - 'null'
        error:
          type:
          - string
          - 'null'
        user_id:
          type:
          - integer
          - 'null'
        file_paths:
          type: array
          items:
            type: string
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
    Ok:
      type: object
      required:
      - status
      properties:
        status:
          type: string
          enum:
          - OK
    PadUpdateRequest:
      allOf:
      - $ref: '#/components/schemas/PadWriteFields'
      - type: object
        properties:
          ended:
            type: boolean
            description: Set to `true` to end the pad.
          deleted:
            type: boolean
            description: Set to `true` to delete the pad.
    TranscriptEntry:
      type: object
      properties:
        id:
          type: string
        kind:
          type: string
          enum:
          - transcript
          - system_message
        speaker_name:
          type:
          - string
          - 'null'
        speaker_role:
          type:
          - string
          - 'null'
          enum:
          - interviewer
          - candidate
          - null
        text:
          type: string
        timestamp:
          type: integer
          description: Unix timestamp in milliseconds.
    PaginatedResponse:
      allOf:
      - $ref: '#/components/schemas/Ok'
      - type: object
        required:
        - total
        properties:
          next_page:
            type: string
            format: uri
            description: URL of the next page. Absent on the last page.
          prev_page:
            type: string
            format: uri
            description: URL of the previous page. Absent on the first page.
          total:
            type: integer
            description: Total number of items across all pages.
    Team:
      type: object
      required:
      - id
      - name
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
    PadCreateRequest:
      allOf:
      - $ref: '#/components/schemas/PadWriteFields'
      - type: object
        properties:
          question_id:
            type: integer
            description: A question from your question bank to start the pad with. Cannot be combined with `contents`.
          notes:
            type: string
            description: Private interviewer notes.
          team_id:
            type: string
            format: uuid
            description: The team the pad belongs to.
          take_home:
            type: boolean
            description: Create a take-home pad, for questions usable in both live and take-home pads.
          take_home_time_limit:
            type: integer
            description: Take-home time limit, in minutes. Defaults to the question's time limit.
          ai_assist_enabled:
            type: boolean
            description: Enable AI Assist in the pad. Defaults to your organization's setting.
    Error:
      type: object
      required:
      - status
      - message
      properties:
        status:
          type: string
          enum:
          - ERROR
        message:
          type: string
          description: A human-readable description of the error.
    Pad:
      type: object
      properties:
        id:
          type: string
          description: The pad ID, as shown in the pad URL.
          example: AFQ2K9A3
        title:
          type: string
          example: Backend interview
        state:
          type: string
          description: '`pending`: not started yet. `started`: a participant has joined. `ended`: the interview has ended. `opened_take_home` and `submitted_take_home`: take-home progress. `deleted`: the pad was deleted.

            '
          enum:
          - pending
          - started
          - ended
          - deleted
          - opened_take_home
          - submitted_take_home
        owner_email:
          type:
          - string
          - 'null'
          format: email
        language:
          type:
          - string
          - 'null'
          description: The pad language. `null` for pads with multiple environments; see `pad_environment_ids`.
        private:
          type: boolean
          description: Whether the waiting room is enabled, so that guests must be admitted before joining the pad.
        execution_enabled:
          type: boolean
        restrict_interviewer_access:
          type: boolean
          description: Whether only the owner and `allowed_interviewer_emails` can access the pad as interviewers.
        contents:
          type:
          - string
          - 'null'
          description: The code of single-environment pads. `null` for pads with environments; use `GET /pad_environments/{id}`.
        participants:
          type: array
          description: Names of the people who joined the pad.
          items:
            type: string
        events:
          type: string
          format: uri
          description: URL of the pad's events (`GET /pads/{id}/events`).
        notes:
          type:
          - string
          - 'null'
          description: Private interviewer notes, in Markdown. Only returned to the pad owner.
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
        ended_at:
          type:
          - string
          - 'null'
          format: date-time
        url:
          type: string
          format: uri
          description: URL of the pad.
        playback:
          type: string
          format: uri
          description: URL of the pad playback.
        history:
          type: string
          format: uri
          description: URL of the raw edit history of single-environment pads.
        drawing:
          type:
          - string
          - 'null'
          format: uri
          description: Temporary URL (valid 5 minutes) of the drawing made in the pad, if any.
        type:
          type: string
          enum:
          - live
          - take_home
          - drawing
          - no_code
        question_ids:
          type: array
          description: IDs of the question bank questions added to the pad.
          items:
            type: integer
        pad_environment_ids:
          type: array
          items:
            type: integer
        active_environment_id:
          type:
          - integer
          - 'null'
        allowed_interviewer_emails:
          type: array
          description: Interviewers allowed on the pad when `restrict_interviewer_access` is enabled.
          items:
            type: string
            format: email
        team:
          type:
          - object
          - 'null'
          allOf:
          - $ref: '#/components/schemas/Team'
        pad_interviewer_notifications:
          type: array
          description: Notifications shown to interviewers during the interview.
          items:
            $ref: '#/components/schemas/PadInterviewerNotification'
    Timestamp:
      type: string
      format: date-time
      example: '2026-09-30T14:02:11Z'
  parameters:
    PadId:
      name: id
      in: path
      required: true
      description: The pad ID, as shown in the pad URL.
      schema:
        type: string
        example: AFQ2K9A3
    Page:
      name: page
      in: query
      description: One-based page number.
      schema:
        type: integer
        minimum: 1
        default: 1
    Sort:
      name: sort
      in: query
      description: '`created_at` or `updated_at`, optionally followed by `,asc` or `,desc` (descending by default). For example, `updated_at,asc` sorts from least to most recently updated.

        '
      schema:
        type: string
        default: created_at,desc
        enum:
        - created_at
        - created_at,asc
        - created_at,desc
        - updated_at
        - updated_at,asc
        - updated_at,desc
  responses:
    Forbidden:
      description: You do not have permission to perform this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: ERROR
            message: Unauthorized question access.
    NotFound:
      description: The resource does not exist or is not visible to you.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: ERROR
            message: Pad not found
    BadRequest:
      description: The request is malformed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: ERROR
            message: 'Bad request: invalid language'
    Unauthorized:
      description: The API key is invalid, or you cannot access this resource.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: ERROR
            message: Invalid API key
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'Your API key, from [your settings page](https://app.coderpad.io/settings). The `Authorization: Token token="YOUR_API_KEY"` format is also accepted.

        '
x-provenance:
  method: searched
  source: https://developers.coderpad.io/reference
  harvested: '2026-10-27'
  tool: harvest-readme-openapi.py
  note: Assembled verbatim from the OpenAPI definition ReadMe embeds in each operation page of the provider's developer portal; paths and components merged by API title, nothing authored.
  assembled_from:
  - https://developers.coderpad.io/reference/createpad.md
  - https://developers.coderpad.io/reference/createquestion-1.md
  - https://developers.coderpad.io/reference/createquestionvariant.md
  - https://developers.coderpad.io/reference/deletequestion.md
  - https://developers.coderpad.io/reference/deletequestionvariant.md
  - https://developers.coderpad.io/reference/getorganization.md
  - https://developers.coderpad.io/reference/getorganizationstats.md
  - https://developers.coderpad.io/reference/getpad.md
  - https://developers.coderpad.io/reference/getpadenvironment.md
  - https://developers.coderpad.io/reference/getquestion.md
  - https://developers.coderpad.io/reference/getquestionvariant.md
  - https://developers.coderpad.io/reference/getquota.md
  - https://developers.coderpad.io/reference/getuser.md
  - https://developers.coderpad.io/reference/listorganizationpads.md
  - https://developers.coderpad.io/reference/listorganizationquestions.md
  - https://developers.coderpad.io/reference/listorganizationusers.md
  - https://developers.coderpad.io/reference/listpadevents.md
  - https://developers.coderpad.io/reference/listpads.md
  - https://developers.coderpad.io/reference/listquestions.md
  - https://developers.coderpad.io/reference/listquestionvariants.md
  - https://developers.coderpad.io/reference/updatepad.md
  - https://developers.coderpad.io/reference/updatequestion-1.md
  - https://developers.coderpad.io/reference/updatequestionvariant.md
  merge:
    pages: 23
    deduped: 211
    conflicts_kept_first: 0