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

# API reference

> Authentication, response shape, and error handling.

## Authentication

Every endpoint requires an API key sent as a Bearer token:

```http theme={null}
Authorization: Bearer qint_xxxxxxxxxxxxxxxxxxxxxxxxx
```

API keys are issued by your organization admin. Each key is bound to your account and the jobs you own — calls made with the key will only see and operate on those jobs.

Keys begin with the `qint_` prefix. Treat them like passwords: store securely, never embed in client-side code, and rotate immediately if you suspect compromise. If you need a key rotated or revoked, contact your organization admin.

## Response envelope

Successful responses return JSON of the form:

```json theme={null}
{
  "success": true,
  "data": { ... }
}
```

Errors return:

```json theme={null}
{
  "status": 401,
  "errors": "Invalid API key"
}
```

`errors` is either a string or, on validation failure, an array of issue objects describing which fields were wrong.

## HTTP status codes

| Status | Meaning                                                                                     |
| ------ | ------------------------------------------------------------------------------------------- |
| `200`  | Request succeeded.                                                                          |
| `401`  | API key missing, malformed, or revoked.                                                     |
| `403`  | Request body failed validation. Check the `errors` array.                                   |
| `404`  | The requested resource (e.g. a `qodeJobId`) does not exist or you do not have access to it. |
| `5xx`  | Temporary server-side issue. Safe to retry with exponential backoff.                        |

## CV handling

`POST /interviews` accepts a `cv_link` that points to the candidate's CV. Plain HTTPS links and Google Drive sharing links are both supported.

## Idempotency

`POST /interviews` is **not** idempotent. Calling it twice with the same payload creates two interviews. If you need at-most-once semantics, dedupe on your side before calling.
