{"openapi":"3.1.0","info":{"title":"Interview League Public API","description":"REST API for personal research agents and scripts.\n\n**Authentication.** Send a personal access token from Settings → API Access:\n`Authorization: Bearer il_pat_…`. Tokens expire (7, 30, or 90 days) and can be revoked at any time.\nOne token can create opportunities and interviewers and request intelligence generation; what\ngeneration unlocks is decided by the account's plan, checked on every request.\n\n**Plan limits.** Free personalizes the hiring manager (`roundType: \"hiring_manager\"`) on 1 opportunity;\nPro covers 10 active opportunities × 10 interviewers in any round plus paid intelligence sections.\nRecruiter rounds are never personalized (`409 ROUND_NOT_PERSONALIZABLE`). Limit errors include\n`limit`, `used`, and `upgradeUrl`.\n\n**Idempotency.** Send `Idempotency-Key` on create and generate requests. Same key + same body\nreplays the original response (`Idempotent-Replayed: true`); same key + different body returns\n`409 IDEMPOTENCY_KEY_REUSED`; a request still in flight returns `409 REQUEST_IN_PROGRESS`.\nGenerating again with unchanged inputs returns the existing job.\n\n**Input sources.** On `POST /opportunities`, `jdSource` (`url` | `pdf` | `text`) and `resumeSource`\n(`profile` | `pdf` | `text`) name the one input each comes from; the others must be empty\n(`422 INVALID_INPUT_SOURCE`). `jdSource: \"url\"` reads `postingUrl` server-side unless you send the\ntext as `jobDescription` (`422 JD_FETCH_FAILED` if the page can't be read). An unreadable PDF returns\n`422 EMPTY_PDF`. Omit both fields to keep the original behaviour.\n\n**Rate limits.** 60 requests/minute per token, 120/minute per account, 2 concurrent and 30 daily\ngenerations per account. Over a limit: `429` with `Retry-After`.\n\n**Errors.** RFC 9457 problem details (`application/problem+json`) with a stable `code`.\n","version":"1.0.0"},"paths":{"/api/v1/me":{"get":{"tags":["Public API v1"],"summary":"Caller identity, plan, and remaining usage","operationId":"get_me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/profile/resume":{"get":{"tags":["Public API v1"],"summary":"Get the default resume","operationId":"get_profile_resume_api_v1_profile_resume_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResume"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Public API v1"],"summary":"Set the default resume (JSON resumeText, or multipart resumeFile PDF)","description":"Opportunities created without a resume use this one. Changing it marks their intelligence stale.","operationId":"put_profile_resume_api_v1_profile_resume_put","requestBody":{"content":{"application/json":{"schema":{"properties":{"resumeText":{"type":"string","maxLength":50000,"minLength":1,"title":"Resumetext"}},"additionalProperties":false,"type":"object","required":["resumeText"],"title":"ProfileResumeUpdate"}},"multipart/form-data":{"schema":{"properties":{"resumeFile":{"type":"string","format":"binary","description":"PDF, max 5MB"}},"type":"object","required":["resumeFile"]}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResume"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/opportunities":{"get":{"tags":["Public API v1"],"summary":"List or search opportunities","description":"Search before creating to avoid saving the same role twice.","operationId":"list_opportunities_api_v1_opportunities_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"company","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Case-insensitive substring match","title":"Company"},"description":"Case-insensitive substring match"},{"name":"postingUrl","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"description":"Exact match after normalization (ignores query string, www., trailing slash)","title":"Postingurl"},"description":"Exact match after normalization (ignores query string, www., trailing slash)"},{"name":"includeArchived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Includearchived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpportunityList"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}},"post":{"tags":["Public API v1"],"summary":"Create an opportunity (JSON, or multipart with PDF files)","operationId":"create_opportunity_api_v1_opportunities_post","security":[{"HTTPBearer":[]}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Opportunity"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Omit resumeText to use the profile's default resume (PUT /profile/resume).\n\njdSource / resumeSource name the one input each comes from; the others must be\nempty. Omit them to keep the original behaviour (jobDescription, else the text\nof jdFile; resumeText, else resumeFile, else the profile default).","examples":[{"company":"Acme","jobDescription":"Lead product strategy for a B2B analytics platform…","postingUrl":"https://jobs.acme.com/vp-product","researchNotes":"Series C, 400 people, moving upmarket.","researchedAt":"2026-10-21","role":"VP Product","sources":["https://acme.com/about"]}],"properties":{"company":{"maxLength":200,"minLength":1,"title":"Company","type":"string"},"role":{"maxLength":200,"minLength":1,"title":"Role","type":"string"},"status":{"default":"active","enum":["active","inactive"],"title":"Status","type":"string"},"jobDescription":{"anyOf":[{"maxLength":50000,"type":"string"},{"type":"null"}],"title":"Jobdescription"},"resumeText":{"anyOf":[{"maxLength":50000,"type":"string"},{"type":"null"}],"title":"Resumetext"},"researchNotes":{"anyOf":[{"maxLength":20000,"type":"string"},{"type":"null"}],"title":"Researchnotes"},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources"},"researchedAt":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"title":"Researchedat"},"postingUrl":{"anyOf":[{"maxLength":1000,"type":"string"},{"type":"null"}],"description":"Job posting URL; used to detect duplicates","title":"Postingurl"},"jdSource":{"anyOf":[{"enum":["url","pdf","text"],"type":"string"},{"type":"null"}],"description":"Where the job description comes from. \"url\": read postingUrl server-side (or send the text you already read from it as jobDescription); \"pdf\": jdFile (multipart only); \"text\": jobDescription. postingUrl may accompany \"pdf\" and \"text\" as a reference link.","title":"Jdsource"},"resumeSource":{"anyOf":[{"enum":["profile","pdf","text"],"type":"string"},{"type":"null"}],"description":"Where the resume comes from. \"profile\": the default resume (send no resumeText or resumeFile); \"pdf\": resumeFile (multipart only); \"text\": resumeText.","title":"Resumesource"}},"required":["company","role"],"title":"OpportunityCreate","type":"object"}},"multipart/form-data":{"schema":{"type":"object","properties":{"company":{"type":"string"},"role":{"type":"string"},"status":{"type":"string"},"jobDescription":{"type":"string"},"postingUrl":{"type":"string"},"resumeText":{"type":"string"},"researchNotes":{"type":"string"},"researchedAt":{"type":"string"},"jdSource":{"type":"string","enum":["url","pdf","text"]},"resumeSource":{"type":"string","enum":["profile","pdf","text"]},"sources":{"type":"array","items":{"type":"string"}},"jdFile":{"type":"string","format":"binary","description":"PDF, max 5MB"},"resumeFile":{"type":"string","format":"binary","description":"PDF, max 5MB"}},"required":["company","role"]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}]}},"/api/v1/opportunities/{opportunity_id}":{"get":{"tags":["Public API v1"],"summary":"Get an opportunity with its interviewers","operationId":"get_opportunity_api_v1_opportunities__opportunity_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Opportunity"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}},"patch":{"tags":["Public API v1"],"summary":"Update an opportunity (omitted = unchanged, null = clear)","operationId":"patch_opportunity_api_v1_opportunities__opportunity_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Opportunity"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"resumeText: a string sets a custom resume for this opportunity; null reverts to the profile default.","properties":{"company":{"anyOf":[{"maxLength":200,"minLength":1,"type":"string"},{"type":"null"}],"title":"Company"},"role":{"anyOf":[{"maxLength":200,"minLength":1,"type":"string"},{"type":"null"}],"title":"Role"},"status":{"anyOf":[{"enum":["active","inactive"],"type":"string"},{"type":"null"}],"title":"Status"},"jobDescription":{"anyOf":[{"maxLength":50000,"type":"string"},{"type":"null"}],"title":"Jobdescription"},"resumeText":{"anyOf":[{"maxLength":50000,"type":"string"},{"type":"null"}],"title":"Resumetext"},"researchNotes":{"anyOf":[{"maxLength":20000,"type":"string"},{"type":"null"}],"title":"Researchnotes"},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources"},"researchedAt":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"title":"Researchedat"},"postingUrl":{"anyOf":[{"maxLength":1000,"type":"string"},{"type":"null"}],"description":"Job posting URL; used to detect duplicates","title":"Postingurl"}},"title":"OpportunityPatch","type":"object"}}}}}},"/api/v1/opportunities/{opportunity_id}/archive":{"post":{"tags":["Public API v1"],"summary":"Archive an opportunity (frees active capacity)","operationId":"archive_opportunity_api_v1_opportunities__opportunity_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Opportunity"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}}},"/api/v1/opportunities/{opportunity_id}/activate":{"post":{"tags":["Public API v1"],"summary":"Mark an opportunity active (subject to the active-opportunity cap)","operationId":"activate_opportunity_api_v1_opportunities__opportunity_id__activate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Opportunity"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}}},"/api/v1/opportunities/{opportunity_id}/interviewers":{"get":{"tags":["Public API v1"],"summary":"List interviewers on an opportunity","operationId":"list_interviewers_api_v1_opportunities__opportunity_id__interviewers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewerList"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}},"post":{"tags":["Public API v1"],"summary":"Add an interviewer (JSON, or multipart with a LinkedIn PDF)","operationId":"add_interviewer_api_v1_opportunities__opportunity_id__interviewers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewerSummary"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"examples":[{"linkedinUrl":"https://www.linkedin.com/in/danakim","name":"Dana Kim","notes":"Ex-founder; known to probe pricing and org design.","profileText":"CPO at Acme since 2022. Previously VP Product at …","scheduledDate":"2026-11-03","title":"Chief Product Officer"}],"properties":{"name":{"maxLength":200,"minLength":1,"title":"Name","type":"string"},"title":{"default":"","maxLength":200,"title":"Title","type":"string"},"linkedinUrl":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Linkedinurl"},"profileText":{"anyOf":[{"maxLength":20000,"type":"string"},{"type":"null"}],"title":"Profiletext"},"notes":{"anyOf":[{"maxLength":5000,"type":"string"},{"type":"null"}],"title":"Notes"},"scheduledDate":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"title":"Scheduleddate"},"roundType":{"anyOf":[{"enum":["recruiter","hiring_manager","panel","exec","other"],"type":"string"},{"type":"null"}],"description":"Interview round: recruiter, hiring_manager, panel, exec or other. Free plans personalize the hiring_manager round only; recruiter rounds are never personalized (they use round prep).","title":"Roundtype"}},"required":["name"],"title":"InterviewerCreate","type":"object"}},"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"},"linkedinUrl":{"type":"string"},"profileText":{"type":"string"},"notes":{"type":"string"},"scheduledDate":{"type":"string"},"linkedinFile":{"type":"string","format":"binary","description":"LinkedIn profile PDF, max 5MB"}},"required":["name"]}}}}}},"/api/v1/opportunities/{opportunity_id}/interviewers/{interviewer_id}":{"patch":{"tags":["Public API v1"],"summary":"Update an interviewer (omitted = unchanged, null = clear)","operationId":"patch_interviewer_api_v1_opportunities__opportunity_id__interviewers__interviewer_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}},{"name":"interviewer_id","in":"path","required":true,"schema":{"type":"string","title":"Interviewer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewerSummary"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"roundType":{"anyOf":[{"enum":["recruiter","hiring_manager","panel","exec","other"],"type":"string"},{"type":"null"}],"description":"Interview round: recruiter, hiring_manager, panel, exec or other. Free plans personalize the hiring_manager round only; recruiter rounds are never personalized (they use round prep).","title":"Roundtype"},"name":{"anyOf":[{"maxLength":200,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"title":"Title"},"linkedinUrl":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Linkedinurl"},"profileText":{"anyOf":[{"maxLength":20000,"type":"string"},{"type":"null"}],"title":"Profiletext"},"notes":{"anyOf":[{"maxLength":5000,"type":"string"},{"type":"null"}],"title":"Notes"},"scheduledDate":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"title":"Scheduleddate"}},"title":"InterviewerPatch","type":"object"}}}}}},"/api/v1/opportunities/{opportunity_id}/interviewers/{interviewer_id}/intelligence":{"get":{"tags":["Public API v1"],"summary":"Interviewer intelligence and generated questions (section-gated by plan)","operationId":"get_intelligence_api_v1_opportunities__opportunity_id__interviewers__interviewer_id__intelligence_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}},{"name":"interviewer_id","in":"path","required":true,"schema":{"type":"string","title":"Interviewer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intelligence"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}}},"/api/v1/opportunities/{opportunity_id}/interviewers/{interviewer_id}/generate":{"post":{"tags":["Public API v1"],"summary":"Start intelligence generation (async; poll the returned job)","operationId":"generate_api_v1_opportunities__opportunity_id__interviewers__interviewer_id__generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"opportunity_id","in":"path","required":true,"schema":{"type":"string","title":"Opportunity Id"}},{"name":"interviewer_id","in":"path","required":true,"schema":{"type":"string","title":"Interviewer Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}}},"/api/v1/jobs/{job_id}":{"get":{"tags":["Public API v1"],"summary":"Poll a generation job","operationId":"get_job_api_v1_jobs__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}}}},"/api/v1/tokens/self":{"delete":{"tags":["Public API v1"],"summary":"Revoke the token used for this request (logout)","operationId":"revoke_current_token_api_v1_tokens_self_delete","responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#token-expired","title":"Token expired","status":401,"code":"TOKEN_EXPIRED","detail":"This API token has expired","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"403":{"description":"Insufficient scope or plan limit reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#interviewer-limit-reached","title":"Interviewer limit reached","status":403,"code":"INTERVIEWER_LIMIT_REACHED","detail":"Free includes personalized prep for one hiring manager. Upgrade to Pro to prep the rest of the panel.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","limit":1,"used":1,"upgradeUrl":"https://interviewleague.com/settings"}}}},"404":{"description":"Resource not found or not owned by the caller","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#not-found","title":"Not found","status":404,"code":"NOT_FOUND","detail":"Opportunity not found","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e"}}}},"409":{"description":"Conflict: duplicate, idempotency conflict, or missing prerequisites","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#opportunity-exists","title":"Opportunity exists","status":409,"code":"OPPORTUNITY_EXISTS","detail":"An opportunity with this posting URL already exists.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","existingOpportunityId":"6ad8c25433eec15178940548"}}}},"422":{"description":"Request failed validation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#validation-failed","title":"Validation failed","status":422,"code":"VALIDATION_FAILED","detail":"Request body failed validation","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","errors":[{"field":"company","message":"Field required"}]}}}},"429":{"description":"Rate or generation limit reached; honor Retry-After","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://interviewleague.com/developers/errors#rate-limited","title":"Rate limited","status":429,"code":"RATE_LIMITED","detail":"Too many requests for this token. Retry later.","requestId":"5bd64604-2fdd-45ce-9c8a-4088ed85db2e","retryAfterSeconds":12}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"Entitlements":{"properties":{"plan":{"$ref":"#/components/schemas/PlanState"},"storedOpportunities":{"type":"integer","title":"Storedopportunities","description":"Non-archived opportunities; storage is unlimited on every plan"},"personalizedOpportunities":{"$ref":"#/components/schemas/Usage"},"activeOpportunities":{"anyOf":[{"$ref":"#/components/schemas/Usage"},{"type":"null"}],"description":"Pro only: active opportunities that can be personalized (cap 10). null on Free."},"personalizedInterviewersPerOpportunity":{"$ref":"#/components/schemas/Limit"},"freePersonalizedOpportunityId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freepersonalizedopportunityid","description":"Free only: the one opportunity where free AI interviewer prep is used"},"freePersonalizedInterviewers":{"anyOf":[{"$ref":"#/components/schemas/Usage"},{"type":"null"}]},"freePersonalizedRound":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freepersonalizedround","description":"Free only: the one interview round Free can personalize (hiring_manager)"},"paidSections":{"type":"boolean","title":"Paidsections"},"gapRadar":{"type":"boolean","title":"Gapradar","description":"Deprecated: Gap Radar is retired; always false. Pro gets expected panel coverage on the brief instead.","default":false},"dailyGenerations":{"$ref":"#/components/schemas/Usage"}},"type":"object","required":["plan","storedOpportunities","personalizedOpportunities","personalizedInterviewersPerOpportunity","paidSections","dailyGenerations"],"title":"Entitlements"},"GeneratedQuestion":{"properties":{"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"}},"type":"object","required":["id","text"],"title":"GeneratedQuestion"},"Intelligence":{"properties":{"interviewerId":{"type":"string","title":"Interviewerid"},"opportunityId":{"type":"string","title":"Opportunityid"},"generationStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generationstatus"},"overallConfidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overallconfidence"},"fallbackUsed":{"type":"boolean","title":"Fallbackused","default":false},"stale":{"type":"boolean","title":"Stale","default":false},"builtFromRevision":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Builtfromrevision"},"currentRevision":{"additionalProperties":{"type":"integer"},"type":"object","title":"Currentrevision"},"paidSectionsUnlocked":{"type":"boolean","title":"Paidsectionsunlocked","default":false},"intelligence":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intelligence"},"questions":{"items":{"$ref":"#/components/schemas/GeneratedQuestion"},"type":"array","title":"Questions","default":[]},"webUrl":{"type":"string","title":"Weburl"}},"type":"object","required":["interviewerId","opportunityId","currentRevision","webUrl"],"title":"Intelligence"},"InterviewerList":{"properties":{"interviewers":{"items":{"$ref":"#/components/schemas/InterviewerSummary"},"type":"array","title":"Interviewers"}},"type":"object","required":["interviewers"],"title":"InterviewerList"},"InterviewerSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title","default":""},"roundType":{"anyOf":[{"type":"string","enum":["recruiter","hiring_manager","panel","exec","other"]},{"type":"null"}],"title":"Roundtype","description":"Interview round: recruiter, hiring_manager, panel, exec or other. Free plans personalize the hiring_manager round only; recruiter rounds are never personalized (they use round prep)."},"linkedinUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedinurl"},"scheduledDate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduleddate"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"hasProfile":{"type":"boolean","title":"Hasprofile","default":false},"generationStatus":{"type":"string","title":"Generationstatus","default":"not_started"},"lockedReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lockedreason","description":"Public error code if generation is locked"},"stale":{"type":"boolean","title":"Stale","default":false},"inputRevision":{"type":"integer","title":"Inputrevision","default":0},"webUrl":{"type":"string","title":"Weburl"}},"type":"object","required":["id","name","webUrl"],"title":"InterviewerSummary"},"Job":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["queued","running","succeeded","failed","superseded"],"title":"Status"},"opportunityId":{"type":"string","title":"Opportunityid"},"interviewerId":{"type":"string","title":"Interviewerid"},"inputRevision":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Inputrevision"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat"},"startedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Startedat"},"finishedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finishedat"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"statusUrl":{"type":"string","title":"Statusurl"},"resultUrl":{"type":"string","title":"Resulturl"}},"type":"object","required":["id","status","opportunityId","interviewerId","statusUrl","resultUrl"],"title":"Job"},"Limit":{"properties":{"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["limit"],"title":"Limit"},"Me":{"properties":{"email":{"type":"string","title":"Email"},"token":{"$ref":"#/components/schemas/TokenInfo"},"entitlements":{"$ref":"#/components/schemas/Entitlements"},"upgradeUrl":{"type":"string","title":"Upgradeurl"},"webUrl":{"type":"string","title":"Weburl"}},"type":"object","required":["email","token","entitlements","upgradeUrl","webUrl"],"title":"Me"},"Opportunity":{"properties":{"id":{"type":"string","title":"Id"},"company":{"type":"string","title":"Company"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"jobDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jobdescription"},"resumeText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resumetext"},"hasJobDescription":{"type":"boolean","title":"Hasjobdescription","default":false},"hasResume":{"type":"boolean","title":"Hasresume","default":false},"researchNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Researchnotes"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources","default":[]},"researchedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Researchedat"},"postingUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postingurl"},"resumeSource":{"type":"string","enum":["profile","custom"],"title":"Resumesource","description":"'profile' = uses the account's default resume","default":"custom"},"inputRevision":{"type":"integer","title":"Inputrevision","default":0},"paidEntitlement":{"type":"boolean","title":"Paidentitlement","default":false},"interviewers":{"items":{"$ref":"#/components/schemas/InterviewerSummary"},"type":"array","title":"Interviewers","default":[]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat"},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat"},"webUrl":{"type":"string","title":"Weburl"}},"type":"object","required":["id","company","role","status","webUrl"],"title":"Opportunity"},"OpportunityList":{"properties":{"opportunities":{"items":{"$ref":"#/components/schemas/OpportunityListItem"},"type":"array","title":"Opportunities"}},"type":"object","required":["opportunities"],"title":"OpportunityList"},"OpportunityListItem":{"properties":{"id":{"type":"string","title":"Id"},"company":{"type":"string","title":"Company"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"postingUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postingurl"},"interviewerCount":{"type":"integer","title":"Interviewercount","default":0},"personalizedInterviewerCount":{"type":"integer","title":"Personalizedinterviewercount","default":0},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat"},"webUrl":{"type":"string","title":"Weburl"}},"type":"object","required":["id","company","role","status","webUrl"],"title":"OpportunityListItem"},"PlanState":{"properties":{"tier":{"type":"string","enum":["free","pro"],"title":"Tier"},"status":{"type":"string","title":"Status","description":"active | trialing | expired | past_due | canceled | none"},"currentPeriodEnd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currentperiodend"},"cancelAtPeriodEnd":{"type":"boolean","title":"Cancelatperiodend","default":false}},"type":"object","required":["tier","status"],"title":"PlanState"},"ProfileResume":{"properties":{"resumeText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resumetext"},"resumeFilename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resumefilename"},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat"},"usedByOpportunities":{"type":"integer","title":"Usedbyopportunities","description":"Opportunities using this default resume","default":0}},"type":"object","title":"ProfileResume"},"TokenInfo":{"properties":{"authType":{"type":"string","title":"Authtype"},"tokenId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokenid"},"expiresAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiresat"}},"type":"object","required":["authType"],"title":"TokenInfo"},"Usage":{"properties":{"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"null = unlimited"},"used":{"type":"integer","title":"Used","default":0},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"resetsAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resetsat"}},"type":"object","title":"Usage"},"Problem":{"type":"object","required":["type","title","status","code","detail"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","description":"Stable machine-readable error code"},"detail":{"type":"string"},"instance":{"type":"string"},"requestId":{"type":"string"},"limit":{"type":"integer"},"used":{"type":"integer"},"upgradeUrl":{"type":"string","format":"uri"},"requiredScope":{"type":"string"},"retryAfterSeconds":{"type":"integer"},"resetsAt":{"type":"string","format":"date-time"},"existingOpportunityId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer","bearerFormat":"il_pat_…","description":"Personal access token from Settings → API Access."}}},"servers":[{"url":"https://interview-prep-backend-production-3b9c.up.railway.app"}]}