ATS Resume Scanning
Deterministic and AI-assisted ATS resume scanning against a job description.
Description
The ATS module scores a resume's readiness for applicant tracking systems in two layers:
- A deterministic, rule-based scan (
/ats/check) — computed entirely server-side with no AI call, works for anonymous callers, and produces areadinessScore, an optionaljobMatchScore, and a list of prioritized fixes. - An AI deep-analysis pass (
/ats/analyze) — runs the same deterministic scan and layers an AI explanation, missing-evidence list, and keyword opportunities on top. Requires authentication.
Check and analyze share one quota
/ats/check and /ats/analyze draw from the same ATS scan-quota bucket — there is no
separate "AI analysis" allowance. Limits: anonymous callers get 1 scan / 48 hours, free logged-in
users get 2 scans / 24 hours, and subscribers (active AI Credits or Bundle plan) get 300 scans /
billing period. Check current usage with GET /ats/quota.
Two supporting endpoints round out the module:
POST /ats/extractpulls plain text out of an uploaded PDF/DOCX/TXT/Markdown/JSON resume file (5 MB max). It draws on a separate upload budget — 3 uploads for anonymous callers, 6 for free logged-in users, 300 for subscribers — so uploading a file never spends a scan.GET /ats/quotareports it underextract.POST /ats/convert-resumeuses AI to turn raw resume text into structured JSON Resume fields. It requires an active AI Credits or Bundle entitlement and spends credits independently of both budgets above.
/ats/analyze also supports fetching a job description directly from a URL instead of requiring
pasted text. That fetch is SSRF-hardened: HTTPS-only on the standard port, blocks
localhost/private/link-local addresses, resolves DNS once and pins that IP for the whole request
(including redirects), and caps redirects, response size, and timeout.
Authentication
| Method | Access Level | Requirement |
|---|---|---|
| Quota / Extract / Check | Public or Authenticated | Optional — works anonymously, or with a session/API key. |
| Analyze / Convert Resume | Authenticated | Session cookie or API key with the ai:write scope. |
Available Endpoints
GET /ats/quota— Get ATS Scan QuotaPOST /ats/extract— Extract Resume TextPOST /ats/check— Run Deterministic ATS ScanPOST /ats/analyze— Run AI-Powered ATS AnalysisPOST /ats/convert-resume— Convert Resume Text To Structured JSON
Generate AI ContentPOST
Runs an AI generation action (rewriting a section, generating a cover letter, tailoring a resume to a job description, etc). Requires the `ai:write` scope when called with an API key. Credits are handled with a two-phase reserve → commit/release flow: the cost for the chosen action + mode is reserved from the caller's AI credit wallet before the AI provider is called, then committed only after a successful response. If the AI call fails or errors out, the reservation is released instead of committed — a failed generation never burns credits. Expert mode uses a stronger, more expensive model than Standard mode for the same action.
Get ATS Scan QuotaGET
Returns the caller's current ATS scan quota status. This endpoint works for anonymous callers too (quota is keyed by a hashed IP when unauthenticated). There is a single shared scan-quota bucket for both the deterministic `/ats/check` scan and the AI-powered `/ats/analyze` deep analysis — they are **not** two separate quotas. Limits: - Anonymous: 1 scan / 48 hours - Free logged-in: 2 scans / 24 hours - Subscriber (active AI Credits or Bundle plan): 300 scans / billing period