CoderPad Pads API
A pad is a live interview or take-home session.
A pad is a live interview or take-home session.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/coderpad:coderpad-pads-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: 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