Errors & limits

Errors use RFC 9457 problem details (application/problem+json). Branch on code; it's stable. Quote requestId when contacting support.

json
{
  "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.",
  "limit": 1,
  "used": 1,
  "upgradeUrl": "https://interviewleague.com/settings",
  "requestId": "6f1c…"
}

Error codes

CodeHTTPMeaning
UNAUTHENTICATED401Missing or invalid token.
TOKEN_EXPIRED401Create a new token in Settings.
TOKEN_REVOKED401Token was revoked (or the account identity changed).
INSUFFICIENT_SCOPE403Token lacks requiredScope (only for older restricted tokens).
VALIDATION_FAILED422See errors[] for field-level messages. Also used for bad files (413/415).
NOT_FOUND404Resource doesn't exist or isn't yours.
OPPORTUNITY_LIMIT_REACHED403Free plan personalizes one opportunity. Includes limit, used, upgradeUrl.
INTERVIEWER_LIMIT_REACHED403Per-opportunity interviewer cap (Free 1 hiring manager, Pro 10).
ACTIVE_OPPORTUNITY_LIMIT_REACHED403Pro allows 10 active opportunities. Archive one first.
OPPORTUNITY_EXISTS409This posting URL is already saved. Includes existingOpportunityId and webUrl.
OPPORTUNITY_INACTIVE409Activate the opportunity before generating.
SUBSCRIPTION_REQUIRED403Feature requires Pro. Also returned when Free tries to personalize anyone other than the hiring manager.
ROUND_NOT_PERSONALIZABLE409Recruiter rounds use round prep and are never personalized, on any plan.
INVALID_INPUT_SOURCE422jdSource or resumeSource names an input that's missing, or another input for it is also filled in.
JD_FETCH_FAILED422jdSource is url and the posting couldn't be read (blocked, sign-in wall, not found). Send jobDescription or jdFile instead.
EMPTY_PDF422The PDF named by jdSource or resumeSource has no readable text (often a scan). Send the text instead.
MISSING_PREREQUISITES409Add a job description and resume before generating.
IDEMPOTENCY_KEY_REUSED409Same Idempotency-Key with a different request body.
REQUEST_IN_PROGRESS409Same key still processing. Honor Retry-After.
GENERATION_LIMIT_REACHED429Daily generation cap (30/day). Includes resetsAt.
RATE_LIMITED429Too many requests or concurrent generations. Honor Retry-After.

Plan limits

FreePro
Personalized opportunities1Up to 10 active at a time
Personalized interviewers per opportunity1 (hiring manager)10, any round except recruiter
Intelligence sectionsSummary, role in decision, focus areas, questionsAll, including positioning, experiences to highlight, red flags, questions to ask
Storing opportunities & interviewersUnlimitedUnlimited

Limits are enforced identically for the API and the web app. A plan change applies to existing tokens on the next request.

Rate limits

  • 60 requests per minute per token, and 120 per minute per account across all tokens.
  • Up to 2 generations running at once and 30 generations per day per account. Failed generations don't count.
  • Over a limit, you get 429 with a Retry-After header.

Field limits

  • Job description and resume: 50,000 characters each. Research notes: 20,000. Up to 25 source URLs.
  • Interviewer notes: 5,000 characters. Interviewer profile text: 20,000.
  • PDF uploads: 5MB, must be real PDFs.