{
  "openapi": "3.0.3",
  "info": {
    "title": "Praxicraft Assess Public API",
    "version": "1.1.0",
    "description": "Programmatic API for organisation integrations with Praxicraft Assess.\n\nAll endpoints live under `/api/v1/public/` and require a bearer-token API key.\n\n## Authentication\n\nCreate keys in **Assess \u2192 API Keys** (Live or Test mode) and include them on every request:\n```\nAuthorization: Bearer ct_live_<your-key>\n```\nTest-mode keys use `ct_test_` and only see test assessments, invites, and webhooks.\n\n## API Key Scopes\n\nScopes limit what a key can access. A key with **no scopes selected has full access** (legacy keys). Create narrow-scoped keys for each integration.\n\n| Scope | Access granted |\n|---|---|\n| `organisation:read` | Org info, team members, aggregate stats |\n| `assessments:read` | List and retrieve assessments |\n| `assessments:write` | Create, update, duplicate assessments; attach/replace/remove cases |\n| `invitations:read` | List candidate invitations |\n| `invitations:write` | Create, remind, and cancel invitations |\n| `candidates:read` | Candidate results and session breakdowns |\n| `cases:read` | List and retrieve custom (org-owned) cases |\n| `cases:write` | Create, update, and delete custom cases |\n| `pipelines:read` | List and retrieve hiring pipelines and enrollments |\n| `pipelines:write` | Enroll candidates into pipelines |\n| `webhooks:read` | List registered webhook endpoints |\n| `webhooks:write` | Register and test webhook endpoints |\n| `interviews:read` | List interviews, analysis, replay, templates |\n| `interviews:write` | Create, cancel, reschedule, and share interviews |\n\n**Insufficient scope error:**\n```json\nHTTP 403\n{ \"error\": { \"message\": \"This API key does not have the 'assessments:read' scope.\", \"code\": \"INSUFFICIENT_SCOPE\" } }\n```\n\nEach operation lists its **Required scope** in the description.\n\n## IP allowlists\n\nEach key can have an optional CIDR allowlist, set per key in **Assess \u2192 Developer \u2192 API Keys**. Empty list = any IP. When set, requests from outside those networks return HTTP 403:\n\n```json\nHTTP 403\n{ \"error\": { \"message\": \"This API key is not allowed from this IP address.\", \"code\": \"IP_NOT_ALLOWED\" } }\n```\n\n## Rate limits\n\nLimits are **per organisation per hour** (shared across all API keys) and scale with plan:\n\n| Plan | Read (GET) | Write (POST / PATCH / DELETE) |\n|---|---|---|\n| Starter | 500 / hour | 100 / hour |\n| Growth | 2,000 / hour | 400 / hour |\n| Enterprise | 10,000 / hour | 2,000 / hour |\n\nBulk invite (`POST /assessments/{slug}/invites/bulk/`) is additionally capped at **20 requests / hour** per organisation.\n\nSuccessful responses include `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`. Rate-limit errors return HTTP 429 with code `RATE_LIMITED` and a `Retry-After` header.\n\nEvery successful **GET** includes top-level `meta` with `plan`, `invite_limit`, `invites_used`, and `invites_remaining`.\n\n## Response format\n\nSuccessful responses return the resource directly (not wrapped in a status envelope). Errors return `{ \"error\": { \"code\": \"...\", \"message\": \"...\" } }`."
  },
  "paths": {
    "/api/v1/public/assessments/": {
      "get": {
        "operationId": "public_assessments_list",
        "description": "Returns assessments for your organisation (all statuses by default). Pass `status=active|draft|archived` to narrow the list, or `status=all` to be explicit. Use `search` for a case-insensitive title match. The top-level `meta` object includes your plan invite quota (`plan`, `invite_limit`, `invites_used`, `invites_remaining`).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated list of assessments plus `meta` quota object |\n| `404` | Not used \u2014 empty list returns `200` with `results: []` |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List assessments",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "query",
            "name": "search",
            "schema": {
              "type": "string"
            },
            "description": "Case-insensitive substring match on assessment title"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string"
            },
            "description": "Optional filter: `active`, `draft`, `archived`, or `all`. Omit or use `all` to return every assessment (default)."
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentListPage"
                },
                "examples": {
                  "ActiveAssessments": {
                    "value": {
                      "next": "https://assess.praxicraft.com/api/v1/public/assessments/?cursor=cD0yMDI1",
                      "previous": null,
                      "results": [
                        {
                          "id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
                          "title": "Senior Backend Engineer Screen",
                          "slug": "senior-backend-screen",
                          "description": "A 3-task technical screen.",
                          "status": "active",
                          "case_count": 3,
                          "time_limit_minutes": 90,
                          "passing_score": 70,
                          "invitation_count": 12,
                          "enforce_fullscreen": true,
                          "copy_paste_disabled": false,
                          "created_at": "2025-03-01T10:00:00Z",
                          "updated_at": "2025-03-20T14:30:00Z"
                        }
                      ],
                      "meta": {
                        "plan": "starter",
                        "invite_limit": 100,
                        "invites_used": 42,
                        "invites_remaining": 58
                      }
                    },
                    "summary": "Active assessments"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "InvalidAPIKey": {
                    "value": {
                      "error": {
                        "message": "Invalid or revoked API Key.",
                        "code": "INVALID_API_KEY"
                      }
                    },
                    "summary": "Invalid API key"
                  },
                  "ExpiredAPIKey": {
                    "value": {
                      "error": {
                        "message": "This API key has expired.",
                        "code": "EXPIRED_API_KEY"
                      }
                    },
                    "summary": "Expired API key"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "IPNotAllowed": {
                    "value": {
                      "error": {
                        "message": "This API key is not allowed from this IP address.",
                        "code": "IP_NOT_ALLOWED"
                      }
                    },
                    "summary": "IP not allowed"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "RateLimited": {
                    "value": {
                      "error": {
                        "code": "RATE_LIMITED",
                        "message": "Rate limit exceeded. Retry later.",
                        "details": {
                          "retry_after_seconds": 14
                        }
                      }
                    },
                    "summary": "Rate limited"
                  }
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/create/": {
      "post": {
        "operationId": "public_assessments_create_create",
        "description": "Creates a new assessment in **draft** status. Attach tasks with `POST /assessments/{slug}/cases/attach/`, then set `status: active` via `PATCH /assessments/{slug}/update/` before inviting candidates.\n\n> **Required scope:** `assessments:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `201` | \u2014 | Draft assessment created |\n| `400` | `VALIDATION_ERROR` | Missing title or invalid fields |\n| `403` | `ASSESSMENT_LIMIT_REACHED` | Plan assessment quota exhausted |\n| `403` | `PLAN_REQUIRED` | Recording feature needs a higher plan |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Create assessment",
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCreateRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCreateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCreateRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/update/": {
      "patch": {
        "operationId": "public_assessments_update_partial_update",
        "description": "Partially updates assessment configuration. Send **only** the fields you want to change (e.g. `{ \"status\": \"archived\" }`). Do not paste OpenAPI placeholder values like `\"<string>\"` or leave unused fields set \u2014 they will overwrite real data.\n\nPath `{slug}` must be the URL-safe **slug** (or UUID `id`) from create/list \u2014 **not** the assessment title.\n\nCommon fields: `title`, `description`, `status` (`draft` | `active` | `archived`), `time_limit_minutes`, `passing_score`, proctoring flags.\n\n> **Required scope:** `assessments:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Updated assessment returned |\n| `400` | `VALIDATION_ERROR` | Invalid field value |\n| `404` | \u2014 | Assessment not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Update assessment",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicAssessmentUpdateRequestRequest"
              },
              "examples": {
                "ArchiveAssessment(statusOnly)": {
                  "value": {
                    "status": "archived"
                  },
                  "summary": "Archive assessment (status only)"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicAssessmentUpdateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicAssessmentUpdateRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/duplicate/": {
      "post": {
        "operationId": "public_assessments_duplicate_create",
        "description": "Clone an assessment (settings + tasks) into a new draft. Candidates and results are not copied.",
        "summary": "Duplicate assessment",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentDuplicateRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentDuplicateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentDuplicateRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/": {
      "get": {
        "operationId": "public_assessments_retrieve",
        "description": "Returns full configuration for a single assessment: time limit, passing score, proctoring flags, and counts. Path `{slug}` is the assessment **URL slug** from create/list (e.g. `core-data-engineers-cohort-admission-assessment`), **not** the human title. UUID `id` is also accepted. Use `GET /assessments/{slug}/cases/` for the attached task list.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Assessment detail |\n| `404` | Assessment not found or not owned by your organisation |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Retrieve assessment detail",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/cases/attach/": {
      "post": {
        "operationId": "public_assessments_cases_attach_create",
        "description": "Appends one or more tasks to an assessment. Pass `{ cases: [...] }` or a single `{ case_id, source }` object. `source` is `platform` (default) or `org`. Duplicates are skipped. Blocked after candidates have started.\n\n> **Required scope:** `assessments:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `201` | \u2014 | Cases attached (may be empty if all were duplicates) |\n| `403` | `LIMIT_REACHED` | Plan case-per-assessment limit |\n| `404` | `CASE_NOT_FOUND` | Platform or org case id invalid |\n| `409` | `TASKS_LOCKED` | Candidates have already started |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Attach assessment cases",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCasesWriteRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCasesWriteRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCasesWriteRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentCaseItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/cases/replace/": {
      "put": {
        "operationId": "public_assessments_cases_replace_update",
        "description": "Atomically replaces the full task lineup with `{ cases: [...] }`.\n\n> **Required scope:** `assessments:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | New lineup returned |\n| `403` | `LIMIT_REACHED` | Plan case-per-assessment limit |\n| `404` | `CASE_NOT_FOUND` | Unknown case id |\n| `409` | `TASKS_LOCKED` | Candidates have already started |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Replace assessment cases",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCasesWriteRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCasesWriteRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicAssessmentCasesWriteRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentCaseItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/cases/remove/": {
      "delete": {
        "operationId": "public_assessments_cases_remove_destroy",
        "description": "Removes one attached task by `assessment_case_id` (the join-row id from the cases list).\n\n> **Required scope:** `assessments:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `204` | \u2014 | Link removed |\n| `404` | `NOT_FOUND` | Link id not on this assessment |\n| `409` | `TASKS_LOCKED` | Candidates have already started |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Remove assessment case",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/cases/": {
      "get": {
        "operationId": "public_assessments_cases_retrieve",
        "description": "Returns platform and custom tasks attached to an assessment, in display order.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated case summaries (`assessment_case_id`, `id`, `title`, `type`, \u2026) |\n| `404` | Assessment slug not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List assessment cases",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Assessments"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentCasePage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/results/": {
      "get": {
        "operationId": "public_assessments_results_retrieve",
        "description": "Returns candidate sessions for an assessment with scores, pass/fail, violation counts, and `invite_token` for fetching the detailed result. Ordered by most recent session start.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated session summaries (includes in-progress and completed invitations) |\n| `404` | Assessment slug not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List assessment results",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Results"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAssessmentResultsPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/invites/": {
      "post": {
        "operationId": "public_assessments_invites_create",
        "description": "Creates a unique assessment link for one candidate. **Idempotent:** if the email was already invited, or if `external_id` matches an existing invite on this assessment, returns the existing invitation with HTTP `200` (not `201`). Set `send_email: true` to dispatch the email immediately. Counts against your monthly invite quota unless you are on the enterprise plan.\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `201` | \u2014 | New invitation created |\n| `200` | \u2014 | Invitation already exists for this email (idempotent) |\n| `400` | `ASSESSMENT_NOT_ACTIVE` | Assessment is draft or archived |\n| `400` | `MISSING_EMAIL` | `email` field is empty |\n| `403` | `INVITE_QUOTA_EXCEEDED` | Monthly invite quota exhausted |\n| `404` | \u2014 | Assessment slug not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Create invitation",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Invitations"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicInviteRequestRequest"
              },
              "examples": {
                "InviteCandidate": {
                  "value": {
                    "email": "ada@example.com",
                    "name": "Ada Lovelace",
                    "send_email": true,
                    "external_id": "gh_cand_123"
                  },
                  "summary": "Invite candidate"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicInviteRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicInviteRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInviteResponse"
                },
                "examples": {
                  "InvitationCreated": {
                    "value": {
                      "message": "Invitation created successfully.",
                      "invite_token": "8e909a4f-aa4c-40cb-9623-485d2879cb3b",
                      "invite_url": "https://assess.praxicraft.com/take/8e909a4f-aa4c-40cb-9623-485d2879cb3b",
                      "expires_at": "2025-03-22T10:00:00Z",
                      "status": "pending",
                      "external_id": "gh_cand_123"
                    },
                    "summary": "Invitation created"
                  }
                }
              }
            },
            "description": ""
          },
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInviteResponse"
                },
                "examples": {
                  "InvitationAlreadyExists(idempotent)": {
                    "value": {
                      "message": "Invitation already exists.",
                      "invite_token": "8e909a4f-aa4c-40cb-9623-485d2879cb3b",
                      "invite_url": "https://assess.praxicraft.com/take/8e909a4f-aa4c-40cb-9623-485d2879cb3b",
                      "expires_at": "2025-03-22T10:00:00Z",
                      "status": "pending"
                    },
                    "summary": "Invitation already exists (idempotent)"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "AssessmentNotActive": {
                    "value": {
                      "error": {
                        "message": "This assessment is not active and cannot accept new invitations.",
                        "code": "ASSESSMENT_NOT_ACTIVE"
                      }
                    },
                    "summary": "Assessment not active"
                  },
                  "MissingEmail": {
                    "value": {
                      "error": {
                        "message": "email is required",
                        "code": "MISSING_EMAIL"
                      }
                    },
                    "summary": "Missing email"
                  }
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "InviteQuotaExceeded": {
                    "value": {
                      "error": {
                        "message": "Monthly invite quota exceeded. Upgrade your plan to invite more candidates.",
                        "code": "INVITE_QUOTA_EXCEEDED"
                      }
                    },
                    "summary": "Invite quota exceeded"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/assessments/{slug}/invites/bulk/": {
      "post": {
        "operationId": "public_assessments_invites_bulk_create",
        "description": "Creates invitations for multiple candidates in one request. Duplicate emails are returned in `skipped` (reason: `already invited`). Rows with empty email are skipped (`missing email`). Processing stops when the monthly invite quota is reached mid-batch (`invite quota reached for this billing cycle`). Also subject to a dedicated **20 requests/hour** bulk-invite rate limit (in addition to the plan write bucket).\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `201` | \u2014 | Batch processed \u2014 see `invited` and `skipped` arrays |\n| `400` | `ASSESSMENT_NOT_ACTIVE` | Assessment is draft or archived |\n| `400` | `INVALID_INPUT` | `candidates` missing or empty |\n| `403` | `INVITE_QUOTA_EXCEEDED` | No quota remaining before any invites are created |\n| `404` | \u2014 | Assessment slug not found |\n| `429` | `RATE_LIMITED` | Plan write bucket or bulk-invite 20/hour cap exceeded |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Bulk create invitations",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Invitations"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicBulkInviteRequestRequest"
              },
              "examples": {
                "BulkInvite": {
                  "value": {
                    "send_email": true,
                    "candidates": [
                      {
                        "email": "ada@example.com",
                        "name": "Ada Lovelace",
                        "external_id": "gh_cand_123"
                      },
                      {
                        "email": "al@example.com",
                        "name": "Al Turing",
                        "external_id": "gh_cand_124"
                      }
                    ]
                  },
                  "summary": "Bulk invite"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicBulkInviteRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicBulkInviteRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicBulkInviteResponse"
                },
                "examples": {
                  "BulkInvitationsCreated": {
                    "value": {
                      "invited": [
                        {
                          "email": "alice@example.com",
                          "invite_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                          "invite_url": "https://assess.praxicraft.com/take/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
                        }
                      ],
                      "skipped": [
                        {
                          "email": "jane@example.com",
                          "reason": "already invited"
                        },
                        {
                          "email": "",
                          "reason": "missing email"
                        }
                      ]
                    },
                    "summary": "Bulk invitations created"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "AssessmentNotActive": {
                    "value": {
                      "error": {
                        "message": "This assessment is not active and cannot accept new invitations.",
                        "code": "ASSESSMENT_NOT_ACTIVE"
                      }
                    },
                    "summary": "Assessment not active"
                  },
                  "InvalidBulkPayload": {
                    "value": {
                      "error": {
                        "message": "candidates must be a non-empty list.",
                        "code": "INVALID_INPUT"
                      }
                    },
                    "summary": "Invalid bulk payload"
                  }
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "InviteQuotaExceeded": {
                    "value": {
                      "error": {
                        "message": "Monthly invite quota exceeded. Upgrade your plan to invite more candidates.",
                        "code": "INVITE_QUOTA_EXCEEDED"
                      }
                    },
                    "summary": "Invite quota exceeded"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/invites/": {
      "get": {
        "operationId": "public_invites_list",
        "description": "Global list of all candidate invitations across every assessment in your organisation.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated invitation rows |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List all invitations",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          }
        ],
        "tags": [
          "Public API \u2014 Invitations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicGlobalInvitePage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/invites/{token}/result/": {
      "get": {
        "operationId": "public_invites_result_retrieve",
        "description": "Returns the scored result for a candidate invitation. If the candidate has **not started**, returns HTTP `200` with `{ status, message }` only. When completed, includes `violation_events`, per-case `cases[]`, and `detailed_report_url`.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Full result **or** not-started message (`status` + `message` only) |\n| `404` | Invitation token not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Get result for an invitation",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Results"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicResultResponse"
                },
                "examples": {
                  "CompletedResult": {
                    "value": {
                      "candidate_email": "jane@example.com",
                      "candidate_name": "Jane Doe",
                      "assessment": "Senior Backend Engineer Screen",
                      "status": "completed",
                      "started_at": "2025-03-15T14:00:00Z",
                      "completed_at": "2025-03-15T15:21:00Z",
                      "score": 255,
                      "max_score": 300,
                      "score_percentage": 85.0,
                      "passed": true,
                      "passing_score": 70,
                      "violation_counts": {
                        "fullscreen_violations": 0,
                        "copy_paste_violations": 1,
                        "screen_share_violations": 0,
                        "webcam_violations": 0,
                        "focus_loss_violations": 2,
                        "total_violations": 3
                      },
                      "integrity_review_status": null,
                      "violation_events": [
                        {
                          "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                          "violation_type": "copy_paste",
                          "case_order": 2,
                          "created_at": "2025-03-15T14:45:00Z"
                        }
                      ],
                      "detailed_report_url": "https://assess.praxicraft.com/api/v1/assess/assessments/senior-backend-screen/results/e1f2a3b4/",
                      "cases": [
                        {
                          "case_order": 1,
                          "case_title": "SQL Fundamentals",
                          "score": 90,
                          "max_score": 100,
                          "status": "correct",
                          "time_spent_seconds": 1200
                        }
                      ]
                    },
                    "summary": "Completed result"
                  },
                  "NotStarted": {
                    "value": {
                      "status": "pending",
                      "message": "Candidate has not started or completed the assessment yet."
                    },
                    "summary": "Not started"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/invites/{token}/remind/": {
      "post": {
        "operationId": "public_invites_remind_create",
        "description": "Re-sends the invitation email. Valid only for `pending` or `started` invitations. Limited to one reminder per invitation per 24 hours. Updates `reminded_at` on success.\n\n> **Required scope:** `invitations:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Reminder email dispatched |\n| `400` | `REMINDER_COOLDOWN` | Reminder already sent within the last 24 hours |\n| `400` | `ALREADY_COMPLETED` | Candidate already finished the assessment |\n| `400` | `INVITATION_EXPIRED` | Invitation past `expires_at` |\n| `404` | \u2014 | Invitation token not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Send reminder",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Invitations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicMessageResponse"
                },
                "examples": {
                  "ReminderSent": {
                    "value": {
                      "message": "Reminder sent."
                    },
                    "summary": "Reminder sent"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "ReminderCooldown": {
                    "value": {
                      "error": {
                        "message": "A reminder was already sent for this invitation in the last 24 hours.",
                        "code": "REMINDER_COOLDOWN"
                      }
                    },
                    "summary": "Reminder cooldown"
                  },
                  "AlreadyCompleted": {
                    "value": {
                      "error": {
                        "message": "Cannot send reminder \u2014 assessment already completed.",
                        "code": "ALREADY_COMPLETED"
                      }
                    },
                    "summary": "Already completed"
                  },
                  "InvitationExpired": {
                    "value": {
                      "error": {
                        "message": "Cannot send reminder \u2014 invitation has expired.",
                        "code": "INVITATION_EXPIRED"
                      }
                    },
                    "summary": "Invitation expired"
                  }
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/invites/{token}/": {
      "get": {
        "operationId": "public_invites_retrieve",
        "description": "Returns invitation metadata and lifecycle timestamps without the full scored result. Use `GET /invites/{token}/result/` once the candidate has completed the assessment.\n\n> **Required scope:** `invitations:read`\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Invitation detail including nested `assessment` `{ slug, title }` |\n| `404` | Invitation token not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Get invitation status",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Invitations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInviteDetailResponse"
                },
                "examples": {
                  "InvitationInProgress": {
                    "value": {
                      "invite_token": "8e909a4f-aa4c-40cb-9623-485d2879cb3b",
                      "email": "jane@example.com",
                      "name": "Jane Doe",
                      "role": "Senior Backend Engineer",
                      "status": "started",
                      "external_id": "gh_cand_123",
                      "assessment": {
                        "slug": "senior-backend-screen",
                        "title": "Senior Backend Engineer Screen"
                      },
                      "created_at": "2025-03-15T09:00:00Z",
                      "expires_at": "2025-03-22T09:00:00Z",
                      "started_at": "2025-03-15T14:00:00Z",
                      "completed_at": null,
                      "reminded_at": null
                    },
                    "summary": "Invitation in progress"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      },
      "delete": {
        "operationId": "public_invites_destroy",
        "description": "Permanently deletes a **pending** invitation. Requires `invitations:write` scope (checked on DELETE only).\n\n> **Required scope:** `invitations:read` (GET) \u00b7 `invitations:write` (DELETE)\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `204` | \u2014 | Invitation deleted |\n| `400` | `ALREADY_STARTED` | Candidate is currently in the session |\n| `400` | `ALREADY_COMPLETED` | Assessment already submitted |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks `invitations:write` |\n| `404` | \u2014 | Invitation token not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Cancel invitation",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Invitations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "AlreadyStarted": {
                    "value": {
                      "error": {
                        "message": "Cannot cancel \u2014 assessment is currently in progress.",
                        "code": "ALREADY_STARTED"
                      }
                    },
                    "summary": "Already started"
                  },
                  "CancelAfterCompletion": {
                    "value": {
                      "error": {
                        "message": "Cannot cancel \u2014 assessment has already been completed.",
                        "code": "ALREADY_COMPLETED"
                      }
                    },
                    "summary": "Cancel after completion"
                  }
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "MissingWriteScope": {
                    "value": {
                      "error": {
                        "message": "This API key does not have the 'invitations:write' scope.",
                        "code": "INSUFFICIENT_SCOPE"
                      }
                    },
                    "summary": "Missing write scope"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/": {
      "get": {
        "operationId": "public_org_retrieve",
        "description": "Returns organisation profile and current billing-cycle invite quota usage.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Organisation profile |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Get organisation info",
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgResponse"
                },
                "examples": {
                  "OrganisationProfile": {
                    "value": {
                      "name": "Acme Corp",
                      "slug": "acme-corp",
                      "plan": "starter",
                      "squads_enabled": true,
                      "invite_limit": 100,
                      "invites_used": 42,
                      "invites_remaining": 58,
                      "meta": {
                        "plan": "starter",
                        "invite_limit": 100,
                        "invites_used": 42,
                        "invites_remaining": 58
                      }
                    },
                    "summary": "Organisation profile"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/audit-log/": {
      "get": {
        "operationId": "public_org_audit_log_retrieve",
        "description": "Returns compliance audit events for your organisation (who did what, and when). Includes dashboard and Public API / MCP actions that stamp `org_slug`. Requires the **Starter** plan or above.\n\n> **Required scope:** `organisation:read`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Paginated audit events |\n| `403` | `PLAN_REQUIRED` | Free plan |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List organisation audit log",
        "parameters": [
          {
            "in": "query",
            "name": "action",
            "schema": {
              "type": "string"
            },
            "description": "Exact action name filter (e.g. assessment_created)"
          },
          {
            "in": "query",
            "name": "channel",
            "schema": {
              "type": "string"
            },
            "description": "Filter by channel: public_api, assess_dashboard, etc."
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "exclude_dashboard",
            "schema": {
              "type": "boolean"
            },
            "description": "Exclude noisy org_dashboard_viewed rows (default true)"
          },
          {
            "in": "query",
            "name": "outcome",
            "schema": {
              "type": "string"
            },
            "description": "success | error"
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "query",
            "name": "search",
            "schema": {
              "type": "string"
            },
            "description": "Match action, path, actor email, or IP"
          },
          {
            "in": "query",
            "name": "since",
            "schema": {
              "type": "string"
            },
            "description": "ISO-8601 lower bound on created_at"
          },
          {
            "in": "query",
            "name": "until",
            "schema": {
              "type": "string"
            },
            "description": "ISO-8601 upper bound on created_at"
          }
        ],
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAuditLogPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/team/": {
      "get": {
        "operationId": "public_org_team_retrieve",
        "description": "Lists active organisation members with role (`owner`, `admin`, `developer`, `recruiter`, `reviewer`, `member`).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated team members |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List team members",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          }
        ],
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgTeamPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/squads/": {
      "get": {
        "operationId": "public_org_squads_list",
        "description": "Lists hiring squads (sub-teams) within the organisation. Requires Growth plan or above.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated squads |\n| `403` | `PLAN_REQUIRED` below Growth |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List hiring squads",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          }
        ],
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgTeamPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/squads/{team_id}/": {
      "get": {
        "operationId": "public_org_squad_retrieve",
        "description": "Returns one hiring squad by id. Requires Growth plan or above (`403 PLAN_REQUIRED` below Growth).",
        "summary": "Get hiring squad detail",
        "parameters": [
          {
            "in": "path",
            "name": "team_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgSquadDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/squads/{team_id}/members/": {
      "get": {
        "operationId": "public_org_squads_members_retrieve",
        "description": "Lists members of a hiring squad. Requires Growth plan or above (`403 PLAN_REQUIRED` below Growth).",
        "summary": "List hiring squad members",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "path",
            "name": "team_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgTeamPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/org/stats/": {
      "get": {
        "operationId": "public_org_stats_retrieve",
        "description": "Aggregate assessment metrics: invites sent, completions, pass rate, and average score percentage.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Analytics snapshot |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Get organisation analytics",
        "tags": [
          "Public API \u2014 Organisation"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgStatsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/platform-cases/": {
      "get": {
        "operationId": "public_platform_cases_retrieve",
        "description": "Browse the curated Praxicraft platform task library available for assessments. Returns safe metadata only (no hidden tests or solutions).\n\n> **Required scope:** `assessments:read`\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated platform case summaries |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List platform cases",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "difficulty",
            "schema": {
              "type": "string"
            },
            "description": "Filter by difficulty"
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "query",
            "name": "search",
            "schema": {
              "type": "string"
            },
            "description": "Match title or case_number"
          },
          {
            "in": "query",
            "name": "track",
            "schema": {
              "type": "string"
            },
            "description": "Filter by track slug"
          },
          {
            "in": "query",
            "name": "type",
            "schema": {
              "type": "string"
            },
            "description": "Filter by submission_type"
          }
        ],
        "tags": [
          "Public API \u2014 Cases"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPlatformCasePage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/cases/": {
      "get": {
        "operationId": "public_cases_list",
        "description": "Returns your organisation's custom task library. Soft-deleted tasks are excluded.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated custom case objects |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List custom cases",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          }
        ],
        "tags": [
          "Public API \u2014 Cases"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgCasePage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/cases/create/": {
      "post": {
        "operationId": "public_cases_create_create",
        "description": "Adds a new custom task to your organisation library. Field requirements depend on `case_type` (`coding`, `mcq`, `text`).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `201` | Case created |\n| `400` | Serializer validation failed |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Create custom case",
        "tags": [
          "Public API \u2014 Cases"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicOrgCaseRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicOrgCaseRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicOrgCaseRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgCase"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/cases/{id}/": {
      "get": {
        "operationId": "public_cases_retrieve",
        "description": "Returns a single custom case by UUID.\n\n> **Required scope:** `cases:read`\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Case detail |\n| `404` | Case not found or not owned by your organisation |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Retrieve custom case",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Cases"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgCase"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      },
      "put": {
        "operationId": "public_cases_update",
        "description": "Partially or fully updates a custom case.\n\n> **Required scope:** `cases:read` (route) \u00b7 `cases:write` (required to update)\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Updated case returned |\n| `400` | \u2014 | Validation error on request body |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks `cases:write` |\n| `404` | \u2014 | Case not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Replace custom case",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Cases"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicOrgCaseRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicOrgCaseRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicOrgCaseRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgCase"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "MissingCasesWriteScope": {
                    "value": {
                      "error": {
                        "message": "This API key does not have the 'cases:write' scope.",
                        "code": "INSUFFICIENT_SCOPE"
                      }
                    },
                    "summary": "Missing cases write scope"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      },
      "patch": {
        "operationId": "public_cases_partial_update",
        "description": "Partially or fully updates a custom case.\n\n> **Required scope:** `cases:read` (route) \u00b7 `cases:write` (required to update)\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Updated case returned |\n| `400` | \u2014 | Validation error on request body |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks `cases:write` |\n| `404` | \u2014 | Case not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Update custom case",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Cases"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicOrgCaseRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicOrgCaseRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicOrgCaseRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicOrgCase"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "MissingCasesWriteScope": {
                    "value": {
                      "error": {
                        "message": "This API key does not have the 'cases:write' scope.",
                        "code": "INSUFFICIENT_SCOPE"
                      }
                    },
                    "summary": "Missing cases write scope"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      },
      "delete": {
        "operationId": "public_cases_destroy",
        "description": "Soft-deletes a custom case (`is_active=false`).\n\n> **Required scope:** `cases:read` (route) \u00b7 `cases:write` (required to delete)\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `204` | \u2014 | Case deleted |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks `cases:write` |\n| `404` | \u2014 | Case not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Delete custom case",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Cases"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "MissingCasesWriteScope": {
                    "value": {
                      "error": {
                        "message": "This API key does not have the 'cases:write' scope.",
                        "code": "INSUFFICIENT_SCOPE"
                      }
                    },
                    "summary": "Missing cases write scope"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/": {
      "get": {
        "operationId": "public_pipelines_list",
        "description": "Returns active hiring pipelines for your organisation with stage counts. Each pipeline reports its owning hiring squad as `team_id` / `team_slug` (`null` for org-wide pipelines). Filter to a single squad with the `team_id` or `team_slug` query params, or pass `team_id=null` to list org-wide pipelines only (Growth+ orgs with squads enabled).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated pipeline summaries |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List pipelines",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "query",
            "name": "team_id",
            "schema": {
              "type": "string"
            },
            "description": "Filter by hiring squad UUID. Pass `null` for org-wide pipelines only."
          },
          {
            "in": "query",
            "name": "team_slug",
            "schema": {
              "type": "string"
            },
            "description": "Filter by hiring squad slug (Growth+)."
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineListPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/enrollments/{id}/": {
      "get": {
        "operationId": "public_pipelines_enrollments_retrieve",
        "description": "Tracks a candidate's progress through a pipeline including per-stage assessment history. Terminal success status is `passed` (not `completed`).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Enrollment status with `history[]` |\n| `404` | Enrollment ID not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Get enrollment status",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollmentStatusResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/enrollments/{id}/reject/": {
      "post": {
        "operationId": "public_pipelines_enrollments_reject_create",
        "description": "Manual ATS actions: reject (optional reason) or hold/unhold. Held enrollments do not auto-advance.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Updated enrollment |\n| `400` | Invalid status transition |\n| `404` | Enrollment not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Reject enrollment",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineRejectRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineRejectRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineRejectRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollmentStatusResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/enrollments/{id}/hold/": {
      "post": {
        "operationId": "public_pipelines_enrollments_hold_create",
        "description": "Manual ATS actions: reject (optional reason) or hold/unhold. Held enrollments do not auto-advance.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Updated enrollment |\n| `400` | Invalid status transition |\n| `404` | Enrollment not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Hold enrollment",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollmentStatusResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/enrollments/{id}/unhold/": {
      "post": {
        "operationId": "public_pipelines_enrollments_unhold_create",
        "description": "Manual ATS actions: reject (optional reason) or hold/unhold. Held enrollments do not auto-advance.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Updated enrollment |\n| `400` | Invalid status transition |\n| `404` | Enrollment not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Unhold enrollment",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollmentStatusResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/{slug}/": {
      "get": {
        "operationId": "public_pipelines_retrieve",
        "description": "Returns pipeline configuration and ordered `stages[]` with linked assessment slugs, plus the owning hiring squad as `team_id` / `team_slug` (`null` for org-wide pipelines).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Pipeline detail |\n| `404` | Pipeline slug not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Retrieve pipeline detail",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineDetailResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/{slug}/enroll/": {
      "post": {
        "operationId": "public_pipelines_enroll_create",
        "description": "Atomically enrolls a candidate and creates the stage-one invitation when the first stage is an assessment. **Idempotent:** returns HTTP `200` if the email is already enrolled. If invite quota is exhausted, returns `INVITE_QUOTA_EXCEEDED` and creates neither enrollment nor invite.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `201` | New enrollment |\n| `200` | Candidate already enrolled |\n| `400` | `MISSING_EMAIL` / validation |\n| `403` | `INVITE_QUOTA_EXCEEDED` |\n| `404` | Pipeline slug not found |\n| `409` | `ALREADY_INVITED` for stage-one assessment |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Enroll candidate in pipeline",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineEnrollRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineEnrollRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineEnrollRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollResponse"
                },
                "examples": {
                  "CandidateEnrolled": {
                    "value": {
                      "message": "Candidate enrolled successfully.",
                      "enrollment_id": "e1f2a3b4-c5d6-7890-abcd-ef1234567890",
                      "status": "in_progress",
                      "current_stage": 0
                    },
                    "summary": "Candidate enrolled"
                  }
                }
              }
            },
            "description": ""
          },
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollResponse"
                },
                "examples": {
                  "AlreadyEnrolled(idempotent)": {
                    "value": {
                      "message": "Candidate already enrolled in this pipeline.",
                      "enrollment_id": "e1f2a3b4-c5d6-7890-abcd-ef1234567890",
                      "status": "in_progress",
                      "current_stage": 1
                    },
                    "summary": "Already enrolled (idempotent)"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "MissingEmail": {
                    "value": {
                      "error": {
                        "message": "email is required",
                        "code": "MISSING_EMAIL"
                      }
                    },
                    "summary": "Missing email"
                  }
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "InviteQuotaExceeded": {
                    "value": {
                      "error": {
                        "code": "INVITE_QUOTA_EXCEEDED",
                        "message": "Monthly invite quota exceeded."
                      }
                    },
                    "summary": "Invite quota exceeded"
                  }
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/{slug}/enroll/bulk/": {
      "post": {
        "operationId": "public_pipelines_enroll_bulk_create",
        "description": "Bulk-enroll candidates. Same atomicity rules as single enroll. Capped like bulk invite (20/hour).\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Batch result with enrolled/skipped/errors |\n| `404` | Pipeline slug not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Bulk enroll candidates",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineBulkEnrollRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineBulkEnrollRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicPipelineBulkEnrollRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineBulkEnrollResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/pipelines/{slug}/enrollments/": {
      "get": {
        "operationId": "public_pipelines_enrollments_list",
        "description": "Lists enrollments for a pipeline with optional `status` filter. Paginated.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated enrollments |\n| `404` | Pipeline slug not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List pipeline enrollments",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          },
          {
            "in": "path",
            "name": "slug",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string"
            },
            "description": "Filter by enrollment status_code (in_progress, on_hold, passed, rejected)."
          }
        ],
        "tags": [
          "Public API \u2014 Pipelines"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPipelineEnrollmentListPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/webhooks/": {
      "get": {
        "operationId": "public_webhooks_list",
        "description": "Lists registered webhook endpoints including verification state, subscribed `events`, and delivery health fields.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `200` | Paginated webhook endpoints |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "List webhooks",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhookListPage"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/webhooks/create/": {
      "post": {
        "operationId": "public_webhooks_create_create",
        "description": "Registers a destination. **HTTPS** endpoints receive signed JSON (`whsec_\u2026` shown once). Set `kind` to `slack` or `teams` (or paste a `hooks.slack.com` / `webhook.office.com` URL) to post a formatted chat message instead \u2014 no HMAC. After connecting Slack in the dashboard, you can omit `url` and pass `slack_channel_id` to post via `chat.postMessage`. New destinations start as `is_active: false` until a successful test ping.\n\n### Responses\n\n| Status | When |\n|--------|------|\n| `201` | Webhook created |\n| `400` | Invalid URL or payload |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Create webhook",
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicWebhookRequest"
              },
              "examples": {
                "HTTPSDestination": {
                  "value": {
                    "url": "https://api.example.com/webhooks/praxicraft",
                    "kind": "https",
                    "events": [
                      "assessment.completed",
                      "candidate.passed"
                    ]
                  },
                  "summary": "HTTPS destination"
                },
                "SlackIncomingWebhook": {
                  "value": {
                    "url": "https://hooks.slack.com/services/T000/B000/xxx",
                    "kind": "slack",
                    "events": [
                      "candidate.passed",
                      "candidate.failed"
                    ]
                  },
                  "summary": "Slack Incoming Webhook"
                },
                "SlackOAuthChannel": {
                  "value": {
                    "kind": "slack",
                    "slack_channel_id": "C0123456789",
                    "slack_channel_name": "hiring",
                    "events": [
                      "candidate.passed",
                      "candidate.failed"
                    ]
                  },
                  "summary": "Slack OAuth channel"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicWebhookRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicWebhookRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhook"
                },
                "examples": {
                  "WebhookCreated": {
                    "value": {
                      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                      "name": "bright-harbor",
                      "kind": "https",
                      "url": "https://api.example.com/webhooks/praxicraft",
                      "secret_key": "whsec_abc123xyz",
                      "is_active": false,
                      "is_verified": false,
                      "events": [
                        "assessment.completed",
                        "candidate.passed",
                        "webhook.test"
                      ],
                      "created_at": "2025-03-01T10:00:00Z",
                      "last_triggered_at": null,
                      "failure_count": 0,
                      "probe_consecutive_failures": 0,
                      "auto_paused_by_health": false,
                      "pending_delivery_count": 0
                    },
                    "summary": "Webhook created"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/webhooks/{id}/": {
      "get": {
        "operationId": "public_webhooks_retrieve",
        "description": "Retrieve, update, or delete a webhook endpoint.",
        "summary": "Retrieve webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhookItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      },
      "patch": {
        "operationId": "public_webhooks_partial_update",
        "description": "Retrieve, update, or delete a webhook endpoint.",
        "summary": "Update webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicWebhookRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicWebhookRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicWebhookRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhookItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      },
      "delete": {
        "operationId": "public_webhooks_destroy",
        "description": "Retrieve, update, or delete a webhook endpoint.",
        "summary": "Delete webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/webhooks/{id}/deliveries/": {
      "get": {
        "operationId": "public_webhooks_deliveries_retrieve",
        "description": "Recent delivery log rows for a webhook endpoint (newest first, max 100).",
        "summary": "List webhook deliveries",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhookDeliveriesResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/webhooks/{id}/deliveries/{delivery_id}/retry/": {
      "post": {
        "operationId": "public_webhooks_retry_delivery",
        "description": "Resend one failed or pending delivery to this destination. Does not create a new `event_id`. The destination must be active and verified.\n\n> **Required scope:** `webhooks:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Retry attempted \u2014 see `resent` and `status` |\n| `400` | `ENDPOINT_PAUSED` | Destination is paused or unverified |\n| `400` | `ALREADY_DELIVERED` | Delivery already succeeded |\n| `400` | `NOT_RETRYABLE` | Status is not failed or pending |\n| `404` | \u2014 | Webhook or delivery not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Retry webhook delivery",
        "parameters": [
          {
            "in": "path",
            "name": "delivery_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhookRetryResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/webhooks/{id}/test/": {
      "post": {
        "operationId": "public_webhooks_test_create",
        "description": "Sends a signed `webhook.test` ping to your endpoint. On HTTP 2xx response, sets `is_verified=true` and `is_active=true` on the endpoint.\n\n> **Required scope:** `webhooks:write`\n\n### Responses\n\n| Status | Code | When |\n|--------|------|------|\n| `200` | \u2014 | Endpoint responded with 2xx |\n| `400` | `WEBHOOK_REQUEST_FAILED` | Connection or timeout error |\n| `400` | `WEBHOOK_ENDPOINT_ERROR` | Endpoint returned non-2xx status |\n| `404` | \u2014 | Webhook ID not found |\n\n**Authentication & rate limits (all endpoints)**\n\n| Status | Code | When |\n|--------|------|------|\n| `401` | `INVALID_API_KEY` | Missing or invalid bearer token |\n| `401` | `EXPIRED_API_KEY` | API key past its optional `expires_at` |\n| `403` | `INSUFFICIENT_SCOPE` | API key lacks the required scope for this operation |\n| `403` | `IP_NOT_ALLOWED` | Client IP is outside this key's CIDR allowlist |\n| `429` | `RATE_LIMITED` | Rate limit exceeded \u2014 plan-tiered reads/writes per organisation per hour |",
        "summary": "Test webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Webhooks"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicWebhookTestResponse"
                },
                "examples": {
                  "TestPingSucceeded": {
                    "value": {
                      "message": "Test succeeded \u2014 endpoint responded with 200.",
                      "status_code": 200,
                      "is_verified": true
                    },
                    "summary": "Test ping succeeded"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                },
                "examples": {
                  "WebhookConnectionFailed": {
                    "value": {
                      "error": {
                        "message": "Webhook request failed: Connection timed out",
                        "code": "WEBHOOK_REQUEST_FAILED"
                      }
                    },
                    "summary": "Webhook connection failed"
                  },
                  "WebhookEndpointError": {
                    "value": {
                      "error": {
                        "message": "Endpoint returned HTTP 500.",
                        "code": "WEBHOOK_ENDPOINT_ERROR"
                      }
                    },
                    "summary": "Webhook endpoint error"
                  }
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/integrations/": {
      "get": {
        "operationId": "public_integrations_retrieve",
        "description": "Read-only view of connected ATS providers and inbound webhook URLs. Credential management stays in the Assess dashboard.",
        "summary": "List ATS integration status",
        "tags": [
          "Public API \u2014 Integrations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicIntegrationsListResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/integrations/{provider}/connect/": {
      "get": {
        "operationId": "public_integrations_connect_retrieve",
        "description": "Returns a dashboard URL to connect an ATS provider in the browser. OAuth and API key setup remain session-only \u2014 this does not expose secrets.",
        "summary": "Get ATS connect URL",
        "parameters": [
          {
            "in": "path",
            "name": "provider",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Integrations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicIntegrationsConnectResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/integrations/{provider}/test/": {
      "post": {
        "operationId": "public_integrations_test_create",
        "description": "Verify stored credentials for a connected provider. Does not accept or return secrets.",
        "summary": "Test ATS credentials",
        "parameters": [
          {
            "in": "path",
            "name": "provider",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Integrations"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicIntegrationsTestResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/": {
      "get": {
        "operationId": "public_interviews_list",
        "description": "List interviews",
        "summary": "List interviews",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor \u2014 pass the value from `next` to fetch the next page."
          },
          {
            "in": "query",
            "name": "page_size",
            "schema": {
              "type": "integer"
            },
            "description": "Results per page, max 100 (default 20)."
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewListResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/create/": {
      "post": {
        "operationId": "public_interviews_create_create",
        "description": "Create interview",
        "summary": "Create interview",
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterviewRoomCreateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/InterviewRoomCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/InterviewRoomCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterviewRoomDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/bulk/": {
      "post": {
        "operationId": "public_interviews_bulk_create",
        "description": "Bulk create interviews",
        "summary": "Bulk create interviews",
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewBulkCreateRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewBulkCreateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewBulkCreateRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewBulkCreateResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/analytics/": {
      "get": {
        "operationId": "public_interviews_analytics_retrieve",
        "description": "Interview analytics",
        "summary": "Interview analytics",
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewAnalyticsResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/org-cases/": {
      "get": {
        "operationId": "public_interviews_org_cases_retrieve",
        "description": "List org coding cases for interviews",
        "summary": "List org coding cases for interviews",
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewOrgCaseItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/templates/": {
      "get": {
        "operationId": "public_interviews_templates_retrieve",
        "description": "List interview templates",
        "summary": "List interview templates",
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewTemplateItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/templates/create/": {
      "post": {
        "operationId": "public_interviews_templates_create_create",
        "description": "Create interview template",
        "summary": "Create interview template",
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewTemplateCreateRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewTemplateCreateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewTemplateCreateRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewTemplateItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/templates/{template_id}/": {
      "get": {
        "operationId": "public_interviews_templates_retrieve_2",
        "description": "Retrieve interview template",
        "summary": "Retrieve interview template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewTemplateItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/templates/{template_id}/update/": {
      "patch": {
        "operationId": "public_interviews_templates_update_partial_update",
        "description": "Update interview template",
        "summary": "Update interview template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicInterviewTemplateUpdateRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicInterviewTemplateUpdateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPublicInterviewTemplateUpdateRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewTemplateItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/templates/{template_id}/delete/": {
      "delete": {
        "operationId": "public_interviews_templates_delete_destroy",
        "description": "Delete interview template",
        "summary": "Delete interview template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/{room_id}/": {
      "get": {
        "operationId": "public_interviews_retrieve",
        "description": "Retrieve interview",
        "summary": "Retrieve interview",
        "parameters": [
          {
            "in": "path",
            "name": "room_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterviewRoomDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/{room_id}/cancel/": {
      "post": {
        "operationId": "public_interviews_cancel_create",
        "description": "Cancel interview",
        "summary": "Cancel interview",
        "parameters": [
          {
            "in": "path",
            "name": "room_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewCancelResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/{room_id}/reschedule/": {
      "post": {
        "operationId": "public_interviews_reschedule_create",
        "description": "Reschedule interview",
        "summary": "Reschedule interview",
        "parameters": [
          {
            "in": "path",
            "name": "room_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterviewRoomRescheduleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/InterviewRoomRescheduleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/InterviewRoomRescheduleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterviewRoomDetail"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/{room_id}/analysis/": {
      "get": {
        "operationId": "public_interviews_analysis_retrieve",
        "description": "Get interview analysis",
        "summary": "Get interview analysis",
        "parameters": [
          {
            "in": "path",
            "name": "room_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewAnalysisResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/{room_id}/replay/": {
      "get": {
        "operationId": "public_interviews_replay_retrieve",
        "description": "Get interview replay",
        "summary": "Get interview replay",
        "parameters": [
          {
            "in": "path",
            "name": "room_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewReplayResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    },
    "/api/v1/public/interviews/{room_id}/share/": {
      "post": {
        "operationId": "public_interviews_share_create",
        "description": "Create interview share link",
        "summary": "Create interview share link",
        "parameters": [
          {
            "in": "path",
            "name": "room_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Public API \u2014 Interviews"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewShareRequestRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewShareRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PublicInterviewShareRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicInterviewShareResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicAPIErrorBody"
                }
              }
            },
            "description": ""
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "InterviewChatMessage": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "sender_role": {
            "enum": [
              "interviewer",
              "candidate",
              "ai",
              "system"
            ],
            "type": "string",
            "x-spec-enum-id": "34c422768b1d5f65"
          },
          "sender_name": {
            "type": "string",
            "maxLength": 200
          },
          "content": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "source": {
            "type": "string",
            "maxLength": 16
          },
          "cancelled": {
            "type": "boolean"
          }
        },
        "required": [
          "content",
          "created_at",
          "id",
          "sender_role"
        ]
      },
      "InterviewQuestionInterviewer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "source": {
            "enum": [
              "manual",
              "ai",
              "platform",
              "org"
            ],
            "type": "string",
            "x-spec-enum-id": "fbf48454a206c246"
          },
          "question_type": {
            "enum": [
              "coding",
              "technical",
              "system_design",
              "behavioral",
              "intro"
            ],
            "type": "string",
            "x-spec-enum-id": "e1c851097caa96f8"
          },
          "title": {
            "type": "string",
            "maxLength": 500
          },
          "body": {
            "type": "string"
          },
          "starter_code": {
            "type": "string"
          },
          "solution": {
            "type": "string"
          },
          "expected_answer": {
            "type": "string"
          },
          "hints": {},
          "difficulty": {
            "enum": [
              "easy",
              "medium",
              "hard"
            ],
            "type": "string",
            "x-spec-enum-id": "3d022f885ef2d73d"
          },
          "order": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "is_active": {
            "type": "boolean"
          },
          "current_code": {
            "type": "string"
          },
          "current_language": {
            "enum": [
              "python",
              "javascript",
              "typescript",
              "sql",
              "java",
              "go",
              "bash"
            ],
            "type": "string",
            "x-spec-enum-id": "3e799593e1bbd9c9"
          },
          "platform_case_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "readOnly": true
          }
        },
        "required": [
          "id",
          "platform_case_id",
          "title"
        ]
      },
      "InterviewRoomCreateRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "interview_type": {
            "enum": [
              "coding",
              "technical",
              "system_design",
              "behavioral",
              "mixed"
            ],
            "type": "string",
            "x-spec-enum-id": "9bac42e316080eda"
          },
          "interviewer_mode": {
            "enum": [
              "ai_only",
              "human_only",
              "hybrid"
            ],
            "type": "string",
            "x-spec-enum-id": "c96a49d7c755ab6b"
          },
          "candidate_email": {
            "oneOf": [
              {
                "type": "string",
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          },
          "candidate_name": {
            "type": "string",
            "maxLength": 200
          },
          "time_limit_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "active_language": {
            "enum": [
              "python",
              "javascript",
              "typescript",
              "sql",
              "java",
              "go",
              "bash"
            ],
            "type": "string",
            "x-spec-enum-id": "3e799593e1bbd9c9"
          },
          "integrity_config": {},
          "job_description": {
            "type": "string",
            "default": ""
          },
          "resume_text": {
            "type": "string",
            "default": ""
          },
          "voice_mode": {
            "type": "boolean",
            "default": false
          },
          "human_can_join": {
            "type": "boolean",
            "default": false
          },
          "target_role": {
            "type": "string",
            "default": "",
            "maxLength": 200
          },
          "target_company": {
            "type": "string",
            "default": "",
            "maxLength": 200
          },
          "difficulty": {
            "enum": [
              "entry",
              "mid",
              "senior",
              "staff",
              ""
            ],
            "type": "string",
            "x-spec-enum-id": "70219e23b4816a13",
            "default": "mid"
          },
          "coding_case_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "org_case_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "persona": {
            "type": "object",
            "additionalProperties": {}
          },
          "send_invite": {
            "type": "boolean",
            "default": true
          },
          "pipeline_enrollment_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "required": [
          "title"
        ]
      },
      "InterviewRoomDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 300
          },
          "mode": {
            "enum": [
              "org",
              "engineer"
            ],
            "type": "string",
            "x-spec-enum-id": "9327c6248608501d"
          },
          "interview_type": {
            "enum": [
              "coding",
              "technical",
              "system_design",
              "behavioral",
              "mixed"
            ],
            "type": "string",
            "x-spec-enum-id": "9bac42e316080eda"
          },
          "status": {
            "enum": [
              "prepared",
              "scheduled",
              "waiting",
              "active",
              "ended",
              "expired",
              "no_show"
            ],
            "type": "string",
            "x-spec-enum-id": "026d504fffd266f0"
          },
          "interviewer_mode": {
            "enum": [
              "ai_only",
              "human_only",
              "hybrid"
            ],
            "type": "string",
            "x-spec-enum-id": "c96a49d7c755ab6b"
          },
          "human_can_join": {
            "type": "boolean"
          },
          "active_language": {
            "enum": [
              "python",
              "javascript",
              "typescript",
              "sql",
              "java",
              "go",
              "bash"
            ],
            "type": "string",
            "x-spec-enum-id": "3e799593e1bbd9c9"
          },
          "time_limit_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "ended_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "candidate_name": {
            "type": "string",
            "maxLength": 200
          },
          "candidate_email": {
            "oneOf": [
              {
                "type": "string",
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          },
          "candidate_token": {
            "type": "string",
            "maxLength": 64
          },
          "org_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "readOnly": true
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InterviewQuestionInterviewer"
            },
            "readOnly": true
          },
          "messages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InterviewChatMessage"
            },
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "integrity_config": {},
          "whiteboard_snapshot": {
            "nullable": true
          },
          "voice_mode": {
            "type": "boolean"
          },
          "job_description": {
            "type": "string"
          },
          "resume_text": {
            "type": "string"
          },
          "target_role": {
            "type": "string",
            "maxLength": 200
          },
          "target_company": {
            "type": "string",
            "maxLength": 200
          },
          "difficulty": {
            "enum": [
              "entry",
              "mid",
              "senior",
              "staff",
              ""
            ],
            "type": "string",
            "x-spec-enum-id": "bb8f88cb3321de1f"
          },
          "session_metadata": {}
        },
        "required": [
          "candidate_token",
          "created_at",
          "id",
          "messages",
          "org_id",
          "questions",
          "title"
        ]
      },
      "InterviewRoomRescheduleRequest": {
        "type": "object",
        "properties": {
          "scheduled_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "scheduled_at"
        ]
      },
      "PatchedPublicAssessmentUpdateRequestRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string"
          },
          "status": {
            "enum": [
              "draft",
              "active",
              "archived"
            ],
            "type": "string",
            "x-spec-enum-id": "b97665e701cd7b38"
          },
          "time_limit_minutes": {
            "type": "integer"
          },
          "passing_score": {
            "type": "integer"
          },
          "team_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "pool_mode": {
            "type": "boolean"
          },
          "assignment_size": {
            "type": "integer",
            "nullable": true
          },
          "shuffle_strategy": {
            "type": "string",
            "minLength": 1
          },
          "tag_quotas": {
            "type": "object",
            "additionalProperties": {}
          },
          "pool_settings": {
            "type": "object",
            "additionalProperties": {}
          },
          "enforce_fullscreen": {
            "type": "boolean"
          },
          "copy_paste_disabled": {
            "type": "boolean"
          },
          "session_recording_enabled": {
            "type": "boolean"
          },
          "screen_recording_enabled": {
            "type": "boolean"
          },
          "webcam_recording_enabled": {
            "type": "boolean"
          },
          "notify_on_completion": {
            "type": "boolean"
          },
          "violation_review_threshold": {
            "type": "integer"
          }
        }
      },
      "PatchedPublicInterviewTemplateUpdateRequestRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1
          },
          "config": {
            "type": "object",
            "additionalProperties": {}
          }
        }
      },
      "PatchedPublicOrgCaseRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "description": {
            "type": "string"
          },
          "case_type": {
            "enum": [
              "mcq",
              "coding",
              "text"
            ],
            "type": "string",
            "x-spec-enum-id": "c0a9d49340efbc59"
          },
          "difficulty": {
            "enum": [
              "easy",
              "medium",
              "hard"
            ],
            "type": "string",
            "x-spec-enum-id": "3d022f885ef2d73d"
          },
          "points": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "time_limit_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "question": {
            "type": "string"
          },
          "options": {
            "description": "List of {id, text, is_correct} dicts for MCQ"
          },
          "allow_multiple": {
            "type": "boolean",
            "description": "MCQ: allow selecting multiple answers"
          },
          "language": {
            "enum": [
              "python",
              "sql",
              "javascript",
              ""
            ],
            "type": "string",
            "x-spec-enum-id": "683820eec8dbf225"
          },
          "starter_code": {
            "type": "string"
          },
          "expected_output": {
            "type": "string"
          },
          "rubric": {
            "type": "string",
            "description": "Keywords/criteria for scoring"
          },
          "tags": {}
        }
      },
      "PatchedPublicWebhookRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Display name for this destination. Auto-generated if left blank.",
            "maxLength": 80
          },
          "kind": {
            "enum": [
              "https",
              "slack",
              "teams"
            ],
            "type": "string",
            "x-spec-enum-id": "75595ebd33d4d365",
            "description": "https = signed JSON. slack/teams = chat message (OAuth or Incoming Webhook)."
          },
          "url": {
            "type": "string"
          },
          "slack_channel_id": {
            "type": "string",
            "maxLength": 32
          },
          "slack_channel_name": {
            "type": "string",
            "maxLength": 80
          },
          "is_active": {
            "type": "boolean"
          },
          "events": {
            "description": "List of event types this webhook subscribes to."
          }
        }
      },
      "PublicAPIError": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "details": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "code",
          "message"
        ]
      },
      "PublicAPIErrorBody": {
        "type": "object",
        "properties": {
          "error": {
            "$ref": "#/components/schemas/PublicAPIError"
          }
        },
        "required": [
          "error"
        ]
      },
      "PublicAssessmentCaseAttachItemNestedRequest": {
        "type": "object",
        "properties": {
          "case_id": {
            "type": "string",
            "format": "uuid"
          },
          "source": {
            "enum": [
              "platform",
              "org"
            ],
            "type": "string",
            "x-spec-enum-id": "27db2c2fac826e7d"
          },
          "order": {
            "type": "integer"
          },
          "weight": {
            "type": "integer"
          },
          "time_limit_minutes": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "case_id"
        ]
      },
      "PublicAssessmentCaseItem": {
        "type": "object",
        "properties": {
          "assessment_case_id": {
            "type": "string"
          },
          "id": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "platform | org"
          },
          "case_type": {
            "type": "string"
          },
          "difficulty": {
            "type": "string"
          },
          "order": {
            "type": "integer"
          },
          "points": {
            "type": "integer"
          }
        },
        "required": [
          "case_type",
          "description",
          "difficulty",
          "id",
          "order",
          "points",
          "title",
          "type"
        ]
      },
      "PublicAssessmentCasePage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicAssessmentCasePageItem"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicAssessmentCasePageItem": {
        "type": "object",
        "properties": {
          "assessment_case_id": {
            "type": "string"
          },
          "id": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "platform | org"
          },
          "case_type": {
            "type": "string"
          },
          "difficulty": {
            "type": "string"
          },
          "order": {
            "type": "integer"
          },
          "points": {
            "type": "integer"
          }
        },
        "required": [
          "case_type",
          "description",
          "difficulty",
          "id",
          "order",
          "points",
          "title",
          "type"
        ]
      },
      "PublicAssessmentCasesWriteRequestRequest": {
        "type": "object",
        "properties": {
          "cases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicAssessmentCaseAttachItemNestedRequest"
            }
          },
          "case_id": {
            "type": "string",
            "format": "uuid"
          },
          "source": {
            "enum": [
              "platform",
              "org"
            ],
            "type": "string",
            "x-spec-enum-id": "27db2c2fac826e7d"
          },
          "order": {
            "type": "integer"
          },
          "weight": {
            "type": "integer"
          },
          "time_limit_minutes": {
            "type": "integer",
            "nullable": true
          },
          "assessment_case_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "cases"
        ]
      },
      "PublicAssessmentCreateRequestRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string"
          },
          "time_limit_minutes": {
            "type": "integer"
          },
          "passing_score": {
            "type": "integer"
          },
          "team_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "pool_mode": {
            "type": "boolean"
          },
          "assignment_size": {
            "type": "integer",
            "nullable": true
          },
          "shuffle_strategy": {
            "type": "string",
            "minLength": 1
          },
          "tag_quotas": {
            "type": "object",
            "additionalProperties": {}
          },
          "pool_settings": {
            "type": "object",
            "additionalProperties": {}
          },
          "enforce_fullscreen": {
            "type": "boolean"
          },
          "copy_paste_disabled": {
            "type": "boolean"
          },
          "session_recording_enabled": {
            "type": "boolean"
          },
          "screen_recording_enabled": {
            "type": "boolean"
          },
          "webcam_recording_enabled": {
            "type": "boolean"
          },
          "notify_on_completion": {
            "type": "boolean"
          },
          "violation_review_threshold": {
            "type": "integer"
          }
        },
        "required": [
          "title"
        ]
      },
      "PublicAssessmentDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "slug": {
            "type": "string",
            "maxLength": 100,
            "pattern": "^[-a-zA-Z0-9_]+$"
          },
          "description": {
            "type": "string"
          },
          "status": {
            "enum": [
              "draft",
              "active",
              "archived"
            ],
            "type": "string",
            "x-spec-enum-id": "118920364e74f4e0"
          },
          "time_limit_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "passing_score": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "case_count": {
            "type": "integer",
            "readOnly": true
          },
          "invitation_count": {
            "type": "integer",
            "readOnly": true
          },
          "enforce_fullscreen": {
            "type": "boolean",
            "readOnly": true
          },
          "copy_paste_disabled": {
            "type": "boolean",
            "readOnly": true
          },
          "session_recording_enabled": {
            "type": "boolean",
            "readOnly": true
          },
          "screen_recording_enabled": {
            "type": "boolean",
            "readOnly": true
          },
          "webcam_recording_enabled": {
            "type": "boolean",
            "readOnly": true
          },
          "pool_mode": {
            "type": "boolean",
            "description": "Each candidate is assigned a random subset of cases from the pool"
          },
          "assignment_size": {
            "type": "integer",
            "maximum": 32767,
            "minimum": 0,
            "nullable": true,
            "description": "How many cases each candidate gets (must be <= total cases in assessment)"
          },
          "shuffle_strategy": {
            "enum": [
              "random",
              "balanced",
              "tag_balanced",
              "tag_difficulty_balanced",
              "track_balanced"
            ],
            "type": "string",
            "x-spec-enum-id": "0117da479c83cbb0",
            "description": "How cases are selected from the pool"
          },
          "tag_quotas": {
            "description": "Per-tag or tag:difficulty counts for tag-balanced strategies, e.g. {\"python\": 10, \"sql\": 10} or {\"python:easy\": 5, \"sql:hard\": 3}"
          },
          "pool_settings": {
            "description": "Advanced pool options: tag_quota_mode, assignment_seed_mode, display_order_mode, mandatory_case_ids, shuffle_display_order"
          },
          "violation_review_threshold": {
            "type": "integer",
            "maximum": 32767,
            "minimum": 0,
            "description": "Total proctoring violations at or above this count require org integrity review."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "team": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PublicAssessmentTeamBrief"
              }
            ],
            "nullable": true,
            "readOnly": true
          },
          "livemode": {
            "type": "boolean",
            "description": "True for live hiring. False for isolated test-mode assessments."
          }
        },
        "required": [
          "case_count",
          "copy_paste_disabled",
          "created_at",
          "enforce_fullscreen",
          "id",
          "invitation_count",
          "screen_recording_enabled",
          "session_recording_enabled",
          "slug",
          "team",
          "title",
          "updated_at",
          "webcam_recording_enabled"
        ]
      },
      "PublicAssessmentDuplicateRequestRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          }
        }
      },
      "PublicAssessmentItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "case_count": {
            "type": "integer"
          },
          "time_limit_minutes": {
            "type": "integer",
            "nullable": true
          },
          "passing_score": {
            "type": "integer"
          },
          "invitation_count": {
            "type": "integer"
          },
          "enforce_fullscreen": {
            "type": "boolean"
          },
          "copy_paste_disabled": {
            "type": "boolean"
          },
          "session_recording_enabled": {
            "type": "boolean"
          },
          "screen_recording_enabled": {
            "type": "boolean"
          },
          "webcam_recording_enabled": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "case_count",
          "copy_paste_disabled",
          "created_at",
          "description",
          "enforce_fullscreen",
          "id",
          "invitation_count",
          "passing_score",
          "screen_recording_enabled",
          "session_recording_enabled",
          "slug",
          "status",
          "time_limit_minutes",
          "title",
          "updated_at",
          "webcam_recording_enabled"
        ]
      },
      "PublicAssessmentListPage": {
        "type": "object",
        "properties": {
          "meta": {
            "$ref": "#/components/schemas/PublicInviteQuotaMeta"
          },
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicAssessmentItem"
            }
          }
        },
        "required": [
          "meta",
          "next",
          "previous",
          "results"
        ]
      },
      "PublicAssessmentResultRow": {
        "type": "object",
        "properties": {
          "violation_counts": {
            "$ref": "#/components/schemas/PublicViolationCounts"
          },
          "candidate_email": {
            "type": "string",
            "format": "email"
          },
          "candidate_name": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string"
          },
          "score_percentage": {
            "type": "number",
            "format": "double"
          },
          "passed": {
            "type": "boolean",
            "nullable": true
          },
          "time_spent_seconds": {
            "type": "integer",
            "nullable": true
          },
          "started_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "invite_token": {
            "type": "string"
          }
        },
        "required": [
          "candidate_email",
          "candidate_name",
          "completed_at",
          "invite_token",
          "passed",
          "role",
          "score_percentage",
          "started_at",
          "status",
          "time_spent_seconds",
          "violation_counts"
        ]
      },
      "PublicAssessmentResultsPage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicAssessmentResultRow"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicAssessmentTeamBrief": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "slug": {
            "type": "string",
            "pattern": "^[-a-zA-Z0-9_]+$"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "slug"
        ]
      },
      "PublicAuditLogPage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "meta": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "meta",
          "next",
          "previous",
          "results"
        ]
      },
      "PublicBulkCandidateRequest": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "role": {
            "type": "string",
            "minLength": 1
          },
          "external_id": {
            "type": "string",
            "maxLength": 255
          }
        },
        "required": [
          "email"
        ]
      },
      "PublicBulkInviteRequestRequest": {
        "type": "object",
        "properties": {
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicBulkCandidateRequest"
            }
          },
          "expires_days": {
            "type": "integer",
            "default": 7
          },
          "send_email": {
            "type": "boolean",
            "default": false
          }
        },
        "required": [
          "candidates"
        ]
      },
      "PublicBulkInviteResponse": {
        "type": "object",
        "properties": {
          "invited": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicBulkInviteRow"
            }
          },
          "skipped": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicBulkInviteSkipped"
            }
          }
        },
        "required": [
          "invited",
          "skipped"
        ]
      },
      "PublicBulkInviteRow": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "invite_token": {
            "type": "string"
          },
          "invite_url": {
            "type": "string"
          },
          "external_id": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "email",
          "invite_token",
          "invite_url"
        ]
      },
      "PublicBulkInviteSkipped": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "reason"
        ]
      },
      "PublicGlobalInvitePage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicGlobalInviteRow"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicGlobalInviteRow": {
        "type": "object",
        "properties": {
          "invite_token": {
            "type": "string"
          },
          "assessment_title": {
            "type": "string"
          },
          "assessment_slug": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "candidate_name": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string"
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "sent_at": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "assessment_slug",
          "assessment_title",
          "candidate_name",
          "created_at",
          "email",
          "expires_at",
          "invite_token",
          "role",
          "sent_at",
          "status"
        ]
      },
      "PublicIntegrationListItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "provider": {
            "type": "string"
          },
          "auth_mode": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "has_api_key": {
            "type": "boolean"
          },
          "oauth_available": {
            "type": "boolean"
          },
          "last_synced_at": {
            "type": "string",
            "nullable": true
          },
          "webhook_url": {
            "type": "string"
          },
          "connect_url": {
            "type": "string"
          }
        },
        "required": [
          "auth_mode",
          "connect_url",
          "has_api_key",
          "id",
          "is_active",
          "last_synced_at",
          "oauth_available",
          "provider",
          "webhook_url"
        ]
      },
      "PublicIntegrationsConnectResponse": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "connect_url": {
            "type": "string"
          },
          "oauth_available": {
            "type": "boolean"
          },
          "instructions": {
            "type": "string"
          }
        },
        "required": [
          "connect_url",
          "instructions",
          "oauth_available",
          "provider"
        ]
      },
      "PublicIntegrationsListResponse": {
        "type": "object",
        "properties": {
          "integrations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicIntegrationListItem"
            }
          },
          "ats_allowed": {
            "type": "boolean"
          }
        },
        "required": [
          "ats_allowed",
          "integrations"
        ]
      },
      "PublicIntegrationsTestResponse": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "ok": {
            "type": "boolean"
          },
          "connect_url": {
            "type": "string"
          }
        },
        "required": [
          "connect_url",
          "ok",
          "provider"
        ]
      },
      "PublicInterviewAnalysisResponse": {
        "type": "object",
        "properties": {
          "room_id": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "scores": {
            "type": "object",
            "additionalProperties": {}
          },
          "status": {
            "type": "string"
          }
        }
      },
      "PublicInterviewAnalyticsResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer"
          },
          "completed": {
            "type": "integer"
          },
          "by_status": {
            "type": "object",
            "additionalProperties": {}
          }
        }
      },
      "PublicInterviewBulkCreateRequestRequest": {
        "type": "object",
        "properties": {
          "candidates": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "title": {
            "type": "string",
            "minLength": 1
          },
          "interview_type": {
            "type": "string",
            "minLength": 1
          },
          "interviewer_mode": {
            "type": "string",
            "minLength": 1
          },
          "job_description": {
            "type": "string",
            "minLength": 1
          },
          "time_limit_minutes": {
            "type": "integer"
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time"
          },
          "coding_case_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "org_case_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "persona": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "candidates"
        ]
      },
      "PublicInterviewBulkCreateResponse": {
        "type": "object",
        "properties": {
          "created": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "created",
          "errors"
        ]
      },
      "PublicInterviewCancelResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          }
        },
        "required": [
          "status"
        ]
      },
      "PublicInterviewListMeta": {
        "type": "object",
        "properties": {
          "quota": {
            "$ref": "#/components/schemas/PublicInterviewQuotaMeta"
          },
          "plan": {
            "type": "string"
          },
          "invite_limit": {
            "type": "integer",
            "nullable": true
          },
          "invites_used": {
            "type": "integer"
          },
          "invites_remaining": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "invite_limit",
          "invites_remaining",
          "invites_used",
          "plan",
          "quota"
        ]
      },
      "PublicInterviewListResponse": {
        "type": "object",
        "properties": {
          "meta": {
            "$ref": "#/components/schemas/PublicInterviewListMeta"
          },
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "meta",
          "next",
          "previous",
          "results"
        ]
      },
      "PublicInterviewOrgCaseItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "case_type": {
            "type": "string"
          },
          "difficulty": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title"
        ]
      },
      "PublicInterviewQuotaMeta": {
        "type": "object",
        "properties": {
          "used": {
            "type": "integer"
          },
          "limit": {
            "type": "integer"
          },
          "remaining": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "limit",
          "remaining",
          "used"
        ]
      },
      "PublicInterviewReplayResponse": {
        "type": "object",
        "properties": {
          "room_id": {
            "type": "string"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "recording_url": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "PublicInterviewShareRequestRequest": {
        "type": "object",
        "properties": {
          "expires_days": {
            "type": "integer",
            "default": 14
          }
        }
      },
      "PublicInterviewShareResponse": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "expires_at": {
            "type": "string"
          }
        },
        "required": [
          "expires_at",
          "token",
          "url"
        ]
      },
      "PublicInterviewTemplateCreateRequestRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1
          },
          "config": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "name"
        ]
      },
      "PublicInterviewTemplateItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "config": {
            "type": "object",
            "additionalProperties": {}
          },
          "updated_at": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "config",
          "id",
          "name"
        ]
      },
      "PublicInviteDetailAssessment": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "slug",
          "title"
        ]
      },
      "PublicInviteDetailResponse": {
        "type": "object",
        "properties": {
          "assessment": {
            "$ref": "#/components/schemas/PublicInviteDetailAssessment"
          },
          "invite_token": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "reminded_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "assessment",
          "completed_at",
          "created_at",
          "email",
          "expires_at",
          "invite_token",
          "name",
          "reminded_at",
          "role",
          "started_at",
          "status"
        ]
      },
      "PublicInviteQuotaMeta": {
        "type": "object",
        "properties": {
          "plan": {
            "type": "string"
          },
          "invite_limit": {
            "type": "integer",
            "nullable": true
          },
          "invites_used": {
            "type": "integer"
          },
          "invites_remaining": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "invite_limit",
          "invites_remaining",
          "invites_used",
          "plan"
        ]
      },
      "PublicInviteRequestRequest": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "role": {
            "type": "string",
            "minLength": 1
          },
          "expires_days": {
            "type": "integer",
            "default": 7
          },
          "send_email": {
            "type": "boolean",
            "default": false
          },
          "external_id": {
            "type": "string",
            "maxLength": 255
          }
        },
        "required": [
          "email"
        ]
      },
      "PublicInviteResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "invite_token": {
            "type": "string"
          },
          "invite_url": {
            "type": "string"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "type": "string"
          },
          "external_id": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "expires_at",
          "invite_token",
          "invite_url",
          "message",
          "status"
        ]
      },
      "PublicMessageResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ]
      },
      "PublicOrgCase": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 500
          },
          "description": {
            "type": "string"
          },
          "case_type": {
            "enum": [
              "mcq",
              "coding",
              "text"
            ],
            "type": "string",
            "x-spec-enum-id": "c0a9d49340efbc59"
          },
          "difficulty": {
            "enum": [
              "easy",
              "medium",
              "hard"
            ],
            "type": "string",
            "x-spec-enum-id": "3d022f885ef2d73d"
          },
          "points": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "time_limit_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "question": {
            "type": "string"
          },
          "options": {
            "description": "List of {id, text, is_correct} dicts for MCQ"
          },
          "allow_multiple": {
            "type": "boolean",
            "description": "MCQ: allow selecting multiple answers"
          },
          "language": {
            "enum": [
              "python",
              "sql",
              "javascript",
              ""
            ],
            "type": "string",
            "x-spec-enum-id": "683820eec8dbf225"
          },
          "starter_code": {
            "type": "string"
          },
          "expected_output": {
            "type": "string"
          },
          "rubric": {
            "type": "string",
            "description": "Keywords/criteria for scoring"
          },
          "tags": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "title"
        ]
      },
      "PublicOrgCaseItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "case_type": {
            "type": "string"
          },
          "difficulty": {
            "type": "string"
          },
          "points": {
            "type": "integer"
          },
          "time_limit_minutes": {
            "type": "integer",
            "nullable": true
          },
          "question": {
            "type": "string"
          },
          "options": {},
          "allow_multiple": {
            "type": "boolean"
          },
          "language": {
            "type": "string"
          },
          "starter_code": {
            "type": "string"
          },
          "expected_output": {
            "type": "string"
          },
          "rubric": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "allow_multiple",
          "case_type",
          "created_at",
          "description",
          "difficulty",
          "expected_output",
          "id",
          "language",
          "options",
          "points",
          "question",
          "rubric",
          "starter_code",
          "time_limit_minutes",
          "title"
        ]
      },
      "PublicOrgCasePage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicOrgCaseItem"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicOrgCaseRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "description": {
            "type": "string"
          },
          "case_type": {
            "enum": [
              "mcq",
              "coding",
              "text"
            ],
            "type": "string",
            "x-spec-enum-id": "c0a9d49340efbc59"
          },
          "difficulty": {
            "enum": [
              "easy",
              "medium",
              "hard"
            ],
            "type": "string",
            "x-spec-enum-id": "3d022f885ef2d73d"
          },
          "points": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "time_limit_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "question": {
            "type": "string"
          },
          "options": {
            "description": "List of {id, text, is_correct} dicts for MCQ"
          },
          "allow_multiple": {
            "type": "boolean",
            "description": "MCQ: allow selecting multiple answers"
          },
          "language": {
            "enum": [
              "python",
              "sql",
              "javascript",
              ""
            ],
            "type": "string",
            "x-spec-enum-id": "683820eec8dbf225"
          },
          "starter_code": {
            "type": "string"
          },
          "expected_output": {
            "type": "string"
          },
          "rubric": {
            "type": "string",
            "description": "Keywords/criteria for scoring"
          },
          "tags": {}
        },
        "required": [
          "title"
        ]
      },
      "PublicOrgResponse": {
        "type": "object",
        "properties": {
          "meta": {
            "$ref": "#/components/schemas/PublicInviteQuotaMeta"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "squads_enabled": {
            "type": "boolean"
          },
          "invite_limit": {
            "type": "integer",
            "nullable": true
          },
          "invites_used": {
            "type": "integer"
          },
          "invites_remaining": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "invite_limit",
          "invites_remaining",
          "invites_used",
          "meta",
          "name",
          "plan",
          "slug",
          "squads_enabled"
        ]
      },
      "PublicOrgSquadBrief": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "slug"
        ]
      },
      "PublicOrgSquadDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "member_count": {
            "type": "integer"
          },
          "created_at": {
            "type": "string"
          }
        },
        "required": [
          "created_at",
          "id",
          "member_count",
          "name",
          "slug"
        ]
      },
      "PublicOrgStatsResponse": {
        "type": "object",
        "properties": {
          "total_invites": {
            "type": "integer"
          },
          "total_candidates": {
            "type": "integer"
          },
          "completed_assessments": {
            "type": "integer"
          },
          "passed_candidates": {
            "type": "integer"
          },
          "pass_rate": {
            "type": "number",
            "format": "double"
          },
          "average_score_percentage": {
            "type": "number",
            "format": "double"
          },
          "active_assessments": {
            "type": "integer"
          }
        },
        "required": [
          "active_assessments",
          "average_score_percentage",
          "completed_assessments",
          "pass_rate",
          "passed_candidates",
          "total_candidates",
          "total_invites"
        ]
      },
      "PublicOrgTeamMember": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "role": {
            "type": "string"
          },
          "joined_at": {
            "type": "string",
            "nullable": true
          },
          "squads": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicOrgSquadBrief"
            }
          }
        },
        "required": [
          "email",
          "joined_at",
          "name",
          "role",
          "squads"
        ]
      },
      "PublicOrgTeamPage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicOrgTeamMember"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicPipelineBulkEnrollRequestRequest": {
        "type": "object",
        "properties": {
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPipelineBulkEnrollRowRequest"
            }
          },
          "send_email": {
            "type": "boolean",
            "default": true
          },
          "expires_days": {
            "type": "integer",
            "default": 7
          },
          "file": {
            "type": "string",
            "format": "binary",
            "description": "Optional multipart CSV with email (+ optional name) columns."
          }
        }
      },
      "PublicPipelineBulkEnrollResponse": {
        "type": "object",
        "properties": {
          "enrolled": {
            "type": "array",
            "items": {}
          },
          "skipped": {
            "type": "array",
            "items": {}
          },
          "errors": {
            "type": "array",
            "items": {}
          },
          "enrolled_count": {
            "type": "integer"
          },
          "skipped_count": {
            "type": "integer"
          },
          "error_count": {
            "type": "integer"
          }
        },
        "required": [
          "enrolled",
          "enrolled_count",
          "error_count",
          "errors",
          "skipped",
          "skipped_count"
        ]
      },
      "PublicPipelineBulkEnrollRowRequest": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "email"
        ]
      },
      "PublicPipelineDetailResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "team_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "team_slug": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "stages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPipelineStageDetail"
            }
          }
        },
        "required": [
          "created_at",
          "description",
          "id",
          "slug",
          "stages",
          "team_id",
          "team_slug",
          "title"
        ]
      },
      "PublicPipelineEnrollRequestRequest": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "send_email": {
            "type": "boolean",
            "default": true
          }
        },
        "required": [
          "email"
        ]
      },
      "PublicPipelineEnrollResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "enrollment_id": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "current_stage": {
            "type": "integer"
          }
        },
        "required": [
          "current_stage",
          "enrollment_id",
          "message",
          "status"
        ]
      },
      "PublicPipelineEnrollmentListItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "candidate_name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "current_stage": {
            "type": "integer"
          },
          "reject_reason": {
            "type": "string"
          },
          "enrolled_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "candidate_name",
          "completed_at",
          "current_stage",
          "email",
          "enrolled_at",
          "id",
          "reject_reason",
          "status"
        ]
      },
      "PublicPipelineEnrollmentListPage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPipelineEnrollmentListItem"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicPipelineEnrollmentStatusResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "pipeline_title": {
            "type": "string"
          },
          "pipeline_slug": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "candidate_name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "status_code": {
            "type": "string"
          },
          "current_stage": {
            "type": "integer"
          },
          "reject_reason": {
            "type": "string"
          },
          "history": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPipelineHistoryRow"
            }
          },
          "enrolled_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "candidate_name",
          "completed_at",
          "current_stage",
          "email",
          "enrolled_at",
          "history",
          "id",
          "pipeline_slug",
          "pipeline_title",
          "status",
          "status_code"
        ]
      },
      "PublicPipelineHistoryRow": {
        "type": "object",
        "properties": {
          "assessment_title": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "score": {
            "type": "integer",
            "nullable": true
          },
          "passed": {
            "type": "boolean",
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "assessment_title",
          "completed_at",
          "passed",
          "score",
          "status"
        ]
      },
      "PublicPipelineListItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "stage_count": {
            "type": "integer"
          },
          "team_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "team_slug": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "created_at",
          "description",
          "id",
          "slug",
          "stage_count",
          "team_id",
          "team_slug",
          "title",
          "updated_at"
        ]
      },
      "PublicPipelineListPage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPipelineListItem"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicPipelineRejectRequestRequest": {
        "type": "object",
        "properties": {
          "reason": {
            "type": "string"
          }
        }
      },
      "PublicPipelineStageDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "stage_type": {
            "type": "string"
          },
          "assessment_title": {
            "type": "string",
            "nullable": true
          },
          "assessment_slug": {
            "type": "string",
            "nullable": true
          },
          "interview_template_id": {
            "type": "string",
            "nullable": true
          },
          "interview_template_name": {
            "type": "string",
            "nullable": true
          },
          "label": {
            "type": "string"
          },
          "order": {
            "type": "integer"
          },
          "pass_score_override": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "assessment_slug",
          "assessment_title",
          "id",
          "interview_template_id",
          "interview_template_name",
          "label",
          "order",
          "pass_score_override",
          "stage_type"
        ]
      },
      "PublicPlatformCasePage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicPlatformCasePageItem"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicPlatformCasePageItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "case_number": {
            "type": "string"
          },
          "difficulty": {
            "type": "string"
          },
          "submission_type": {
            "type": "string"
          },
          "xp_reward": {
            "type": "integer"
          },
          "track": {
            "$ref": "#/components/schemas/PublicPlatformCasePageTrack"
          }
        },
        "required": [
          "case_number",
          "difficulty",
          "id",
          "submission_type",
          "title",
          "track",
          "xp_reward"
        ]
      },
      "PublicPlatformCasePageTrack": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "slug"
        ]
      },
      "PublicResultCaseRow": {
        "type": "object",
        "properties": {
          "case_order": {
            "type": "integer"
          },
          "case_title": {
            "type": "string"
          },
          "score": {
            "type": "integer"
          },
          "max_score": {
            "type": "integer"
          },
          "status": {
            "type": "string"
          },
          "time_spent_seconds": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "case_order",
          "case_title",
          "max_score",
          "score",
          "status",
          "time_spent_seconds"
        ]
      },
      "PublicResultResponse": {
        "type": "object",
        "properties": {
          "violation_counts": {
            "$ref": "#/components/schemas/PublicViolationCounts"
          },
          "status": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "candidate_email": {
            "type": "string",
            "format": "email"
          },
          "candidate_name": {
            "type": "string"
          },
          "assessment": {
            "type": "string"
          },
          "started_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "score": {
            "type": "integer"
          },
          "max_score": {
            "type": "integer"
          },
          "score_percentage": {
            "type": "number",
            "format": "double"
          },
          "passed": {
            "type": "boolean",
            "nullable": true
          },
          "passing_score": {
            "type": "integer"
          },
          "integrity_review_status": {
            "type": "string",
            "nullable": true
          },
          "violation_events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicViolationEvent"
            }
          },
          "detailed_report_url": {
            "type": "string"
          },
          "cases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicResultCaseRow"
            }
          }
        },
        "required": [
          "violation_counts"
        ]
      },
      "PublicViolationCounts": {
        "type": "object",
        "properties": {
          "fullscreen_violations": {
            "type": "integer"
          },
          "copy_paste_violations": {
            "type": "integer"
          },
          "screen_share_violations": {
            "type": "integer"
          },
          "webcam_violations": {
            "type": "integer"
          },
          "focus_loss_violations": {
            "type": "integer"
          },
          "total_violations": {
            "type": "integer"
          }
        },
        "required": [
          "copy_paste_violations",
          "focus_loss_violations",
          "fullscreen_violations",
          "screen_share_violations",
          "total_violations",
          "webcam_violations"
        ]
      },
      "PublicViolationEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "violation_type": {
            "type": "string"
          },
          "case_order": {
            "type": "integer",
            "nullable": true
          },
          "created_at": {
            "type": "string"
          }
        },
        "required": [
          "case_order",
          "created_at",
          "id",
          "violation_type"
        ]
      },
      "PublicWebhook": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "description": "Display name for this destination. Auto-generated if left blank.",
            "maxLength": 80
          },
          "kind": {
            "enum": [
              "https",
              "slack",
              "teams"
            ],
            "type": "string",
            "x-spec-enum-id": "75595ebd33d4d365",
            "description": "https = signed JSON. slack/teams = chat message (OAuth or Incoming Webhook)."
          },
          "url": {
            "type": "string"
          },
          "display_target": {
            "type": "string",
            "readOnly": true
          },
          "slack_channel_id": {
            "type": "string",
            "maxLength": 32
          },
          "slack_channel_name": {
            "type": "string",
            "maxLength": 80
          },
          "slack_team_name": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "secret_key": {
            "type": "string",
            "readOnly": true
          },
          "is_active": {
            "type": "boolean"
          },
          "is_verified": {
            "type": "boolean",
            "readOnly": true,
            "description": "Set to True after a successful test ping."
          },
          "events": {
            "description": "List of event types this webhook subscribes to."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "last_triggered_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "failure_count": {
            "type": "integer",
            "readOnly": true
          },
          "probe_consecutive_failures": {
            "type": "integer",
            "readOnly": true,
            "description": "Failed health probes in a row; cleared on success. Endpoint pauses after threshold."
          },
          "auto_paused_by_health": {
            "type": "boolean",
            "readOnly": true,
            "description": "True when reachability probes auto-disabled this endpoint; used to queue deliveries while paused."
          },
          "pending_delivery_count": {
            "type": "integer",
            "readOnly": true
          },
          "livemode": {
            "type": "boolean",
            "readOnly": true,
            "description": "True for live destinations. False for test-mode destinations."
          }
        },
        "required": [
          "auto_paused_by_health",
          "created_at",
          "display_target",
          "failure_count",
          "id",
          "is_verified",
          "last_triggered_at",
          "livemode",
          "pending_delivery_count",
          "probe_consecutive_failures",
          "secret_key",
          "slack_team_name"
        ]
      },
      "PublicWebhookDeliveriesResponse": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicWebhookDeliveryRow"
            }
          }
        },
        "required": [
          "results"
        ]
      },
      "PublicWebhookDeliveryRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "event_id": {
            "type": "string"
          },
          "event_type": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "last_error": {
            "type": "string"
          },
          "attempts": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "delivered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "response_time_ms": {
            "type": "integer",
            "nullable": true
          },
          "response_status_code": {
            "type": "integer",
            "nullable": true
          },
          "response_body": {
            "type": "string"
          },
          "payload": {}
        },
        "required": [
          "attempts",
          "created_at",
          "delivered_at",
          "event_id",
          "event_type",
          "id",
          "last_error",
          "payload",
          "response_body",
          "response_status_code",
          "response_time_ms",
          "status"
        ]
      },
      "PublicWebhookItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "https",
              "slack",
              "teams"
            ],
            "type": "string",
            "x-spec-enum-id": "0d94c5382fc06fbc"
          },
          "url": {
            "type": "string"
          },
          "display_target": {
            "type": "string"
          },
          "slack_channel_id": {
            "type": "string"
          },
          "slack_channel_name": {
            "type": "string"
          },
          "slack_team_name": {
            "type": "string",
            "nullable": true
          },
          "secret_key": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "is_verified": {
            "type": "boolean"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_triggered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "failure_count": {
            "type": "integer"
          },
          "probe_consecutive_failures": {
            "type": "integer"
          },
          "auto_paused_by_health": {
            "type": "boolean"
          },
          "pending_delivery_count": {
            "type": "integer"
          }
        },
        "required": [
          "auto_paused_by_health",
          "created_at",
          "display_target",
          "events",
          "failure_count",
          "id",
          "is_active",
          "is_verified",
          "kind",
          "last_triggered_at",
          "name",
          "pending_delivery_count",
          "probe_consecutive_failures",
          "secret_key",
          "slack_channel_id",
          "slack_channel_name",
          "slack_team_name",
          "url"
        ]
      },
      "PublicWebhookListPage": {
        "type": "object",
        "properties": {
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicWebhookItem"
            }
          }
        },
        "required": [
          "next",
          "previous",
          "results"
        ]
      },
      "PublicWebhookRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Display name for this destination. Auto-generated if left blank.",
            "maxLength": 80
          },
          "kind": {
            "enum": [
              "https",
              "slack",
              "teams"
            ],
            "type": "string",
            "x-spec-enum-id": "75595ebd33d4d365",
            "description": "https = signed JSON. slack/teams = chat message (OAuth or Incoming Webhook)."
          },
          "url": {
            "type": "string"
          },
          "slack_channel_id": {
            "type": "string",
            "maxLength": 32
          },
          "slack_channel_name": {
            "type": "string",
            "maxLength": 80
          },
          "is_active": {
            "type": "boolean"
          },
          "events": {
            "description": "List of event types this webhook subscribes to."
          }
        }
      },
      "PublicWebhookRetryResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "event_id": {
            "type": "string"
          },
          "event_type": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "last_error": {
            "type": "string"
          },
          "attempts": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "delivered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "response_time_ms": {
            "type": "integer",
            "nullable": true
          },
          "response_status_code": {
            "type": "integer",
            "nullable": true
          },
          "response_body": {
            "type": "string"
          },
          "payload": {},
          "resent": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "attempts",
          "created_at",
          "delivered_at",
          "event_id",
          "event_type",
          "id",
          "last_error",
          "message",
          "payload",
          "resent",
          "response_body",
          "response_status_code",
          "response_time_ms",
          "status"
        ]
      },
      "PublicWebhookTestResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "status_code": {
            "type": "integer"
          },
          "is_verified": {
            "type": "boolean"
          }
        },
        "required": [
          "is_verified",
          "message",
          "status_code"
        ]
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Organisation API key created in Assess \u2192 Developer \u2192 API Keys. Format: `Bearer ct_live_<your-key>` (live) or `Bearer ct_test_<your-key>` (test). Optional per-key CIDR allowlists return 403 `IP_NOT_ALLOWED`."
      }
    }
  },
  "tags": [
    {
      "name": "Public API \u2014 Organisation",
      "description": "Read your organisation's profile, team, and aggregate statistics.\n\nRequired scope: `organisation:read`\n\nCanonical paths use `/org/\u2026`. The US-spelling aliases `/organisation/\u2026` also work at runtime but are omitted from this catalog to avoid duplicates."
    },
    {
      "name": "Public API \u2014 Assessments",
      "description": "List, retrieve, and inspect assessments and their case lists.\n\nRead endpoints require `assessments:read`. Assessment results (candidates) require `candidates:read`."
    },
    {
      "name": "Public API \u2014 Invitations",
      "description": "Manage candidate invitations across all assessments.\n\nListing / reading invitations requires `invitations:read`. Creating, reminding, or cancelling invitations requires `invitations:write`."
    },
    {
      "name": "Public API \u2014 Results",
      "description": "Retrieve per-invitation and per-assessment candidate results.\n\nRequired scope: `candidates:read`"
    },
    {
      "name": "Public API \u2014 Cases",
      "description": "Manage custom (organisation-owned) cases.\n\nListing / reading cases requires `cases:read`. Creating, updating, or deleting cases requires `cases:write`."
    },
    {
      "name": "Public API \u2014 Pipelines",
      "description": "Manage multi-stage hiring pipelines and candidate enrollments.\n\nListing / reading pipelines and enrollment status requires `pipelines:read`. Enrolling a candidate requires `pipelines:write`."
    },
    {
      "name": "Public API \u2014 Webhooks",
      "description": "Register and verify webhook endpoints for real-time event delivery.\n\nListing webhooks requires `webhooks:read`. Creating or testing webhooks requires `webhooks:write`."
    },
    {
      "name": "Public API \u2014 Interviews",
      "description": "Programmatic live AI and hybrid interviews.\n\nRead endpoints require `interviews:read`. Create, cancel, reschedule, and share require `interviews:write`."
    },
    {
      "name": "Public API \u2014 Integrations",
      "description": "Read ATS connection status, inbound webhook URLs, connect URLs, and credential tests.\n\nRequired scope: `organisation:read`"
    }
  ],
  "x-tagGroups": [
    {
      "name": "Public API (Integrations)",
      "tags": [
        "Public API \u2014 Organisation",
        "Public API \u2014 Assessments",
        "Public API \u2014 Invitations",
        "Public API \u2014 Results",
        "Public API \u2014 Cases",
        "Public API \u2014 Pipelines",
        "Public API \u2014 Webhooks",
        "Public API \u2014 Interviews",
        "Public API \u2014 Integrations"
      ]
    }
  ],
  "servers": [
    {
      "url": "https://assess.praxicraft.com",
      "description": "Production"
    },
    {
      "url": "{baseUrl}",
      "description": "Custom base URL",
      "variables": {
        "baseUrl": {
          "default": "https://assess.praxicraft.com",
          "description": "Full origin only (no path). Example: https://assess.praxicraft.com or http://localhost:8000"
        }
      }
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ]
}
