Run Deterministic ATS Scan
Runs the free, rule-based ATS readiness scan — no AI call is made. Works for anonymous callers. Consumes one unit from the shared ATS scan quota (see `GET /ats/quota`).
Your personal API key — vw_ followed by 64 hex characters. The same key is also accepted
as Authorization: Bearer vw_....
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "https://example.com/api/v1/ats/check" \ -H "Content-Type: application/json" \ -d '{ "resume": "Jane Doe\\nSoftware Engineer\\n...", "jobDescription": "We are looking for a Software Engineer with React experience..." }'{ "success": true, "message": "string", "data": { "report": { "version": "ats-v2", "restricted": false, "verdict": "strong", "readinessScore": 0, "jobMatchScore": 0, "matchedKeywords": [ "string" ], "missingKeywords": [ "string" ], "parsingWarnings": [ "string" ], "strengths": [ "string" ], "failedChecks": [ { "id": "string", "category": "string", "severity": "info", "passed": true, "evidence": "string", "scoreImpact": 0, "fix": "string" } ], "prioritizedFixes": [ "string" ], "rules": [ { "id": "string", "category": "string", "severity": "info", "passed": true, "evidence": "string", "scoreImpact": 0, "fix": "string" } ], "categories": [ { "category": "string", "score": 0, "passed": 0, "total": 0, "lost": 0, "possible": 0 } ], "checksPassed": 0, "checksTotal": 0, "wordCount": 0, "parsed": { "name": "string", "email": "string", "phone": "string", "links": [ "string" ], "roles": [ { "title": "string", "employer": "string", "current": true, "start": { "year": 0, "month": 0 }, "end": { "year": 0, "month": 0 } } ], "education": [ { "school": "string", "credential": "string", "level": "diploma", "end": { "year": 0, "month": 0 } } ], "skills": [ "string" ], "monthsOfExperience": 0, "highestDegree": "diploma" } }, "ai": null, "creditsSpent": 0, "quota": { "tier": "anonymous", "limit": 0, "used": 0, "remaining": 0, "resetsAt": "2019-08-24T14:15:22Z", "canConvertResume": true, "pricing": { "analysisCredits": { "min": 0, "max": 0 }, "jobUrlAnalysisCredits": { "min": 0, "max": 0 }, "resumeConversionCredits": 0 }, "extract": { "limit": 0, "used": 0, "remaining": 0 } } }}Extract Resume TextPOST
Extracts plain text from an uploaded resume file (PDF, DOCX, TXT, Markdown, or JSON, max 5MB) for use as the `resume` field on `/ats/check` or `/ats/analyze`. Does not consume ATS scan quota — only the check/analyze endpoints do.
Run AI-Powered ATS AnalysisPOST
Runs the deterministic scan plus an AI deep-analysis pass on top of it (explanation, missing evidence, keyword opportunities, prioritized fixes). Requires authentication. Consumes one unit from the same shared ATS scan quota as `/ats/check` — this is not a second, separate quota. Requires the `ai:write` API key scope when called with an API key. Optionally fetches a job description from a URL instead of requiring pasted text (`fetchJobUrl: true` + `jobUrl`). The fetch is SSRF-hardened: HTTPS-only on the standard port, rejects localhost/private/link-local addresses, resolves DNS once and pins that IP for the whole request (including redirects), and caps redirects to 3, response size to 2MB, and the request timeout to 8 seconds.