Interview League API
Bring your research into Interview League
Research a company, role, and panel with your own agent (Hermes, Muse, Instinct, or a script), then send it straight into Interview League. The API creates the opportunity with its job description and your resume, adds each interviewer, generates interviewer intelligence, and returns a link you can open to practice.
The API is available on every plan. Your plan's limits apply exactly as they do in the app: Free personalizes one opportunity and two interviewers; Pro covers ten active opportunities with up to ten interviewers each, plus the paid intelligence sections.
1. Create a token
Go to Settings → API Access, choose a name and an expiry (7, 30, or 90 days), and copy the token. It starts with il_pat_ and is shown only once.
export INTERVIEWLEAGUE_TOKEN="il_pat_..."
export IL_API="https://interview-prep-backend-production-3b9c.up.railway.app/api/v1"2. Check who you are and what you can do
curl -s "$IL_API/me" -H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN"The response includes your plan (entitlements.plan.tier and status), the token's expiry, and remaining usage, such as how many personalized interviewers you have left.
3. Save your default resume once
curl -s -X PUT "$IL_API/profile/resume" \
-H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN" -H "Content-Type: application/json" \
-d '{"resumeText": "…your resume…"}'Opportunities created without a resumeText use it automatically. Send resumeText on an opportunity to use a tailored resume for that role instead.
4. Check you haven't saved the role already, then create it
curl -s "$IL_API/opportunities?postingUrl=https://jobs.acme.com/vp-product" \
-H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN"curl -s -X POST "$IL_API/opportunities" \
-H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"company": "Acme",
"role": "VP Product",
"postingUrl": "https://jobs.acme.com/vp-product",
"jobDescription": "…full JD text…",
"researchNotes": "Series C, 400 people, moving upmarket",
"sources": ["https://acme.com/about"]
}'Prefer files? Send multipart/form-data with jdFile and/or resumeFile (PDF, up to 5MB).
Saving the same postingUrl twice returns 409 OPPORTUNITY_EXISTS with the existing opportunity's id. Tracking parameters (utm_*, gclid, ref…), www., and trailing slashes are ignored; other query parameters, such as a job ID, are kept.
5. Add interviewers and generate
curl -s -X POST "$IL_API/opportunities/$OPP_ID/interviewers" \
-H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN" -H "Content-Type: application/json" \
-d '{"name": "Dana Kim", "title": "CPO", "linkedinUrl": "https://www.linkedin.com/in/…",
"profileText": "…pasted profile…", "notes": "Ex-founder; probes pricing"}'
curl -s -X POST "$IL_API/opportunities/$OPP_ID/interviewers/$IV_ID/generate" \
-H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN"
# -> 202 {"id": "…", "status": "queued", "statusUrl": "…"}6. Poll, then open the result
curl -s "$IL_API/jobs/$JOB_ID" -H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN"
curl -s "$IL_API/opportunities/$OPP_ID/interviewers/$IV_ID/intelligence" \
-H "Authorization: Bearer $INTERVIEWLEAGUE_TOKEN"Every response includes a webUrl. Hand it back to the user to finish the loop.
Next
- Use with AI agents: copy-paste instructions for your agent.
- Authentication
- Errors & limits
- API reference
A command-line tool (@interviewleague/cli) built on this API is planned.