ATS Integration API
Connect your Applicant Tracking System to Maatrics: add candidates, receive results, and pull reports over a simple REST API.
Base URL
https://api.maatrics.com
Format
JSON / REST
Auth
Bearer ats_…
External recruiting systems use this API to push candidates into Maatrics assessments, then track and retrieve their results. Candidates are matched across systems by remote_id — the unique id your ATS assigns. You choose it when adding applicants; Maatrics echoes it back in every response and webhook.
1. ATS ──GET /assessments ──▶ discover assessments
2. ATS ──POST /assessments/:id/applicants ──▶ add candidates → invite_url
3. Candidate ── completes the assessment in Maatrics
4. Maatrics ──POST webhook_url ──▶ result (applicant.analyzed)
5. ATS ──GET /applicants/:remote_id ──▶ poll status / results
6. ATS ──GET /api/ats/file/:remote_id ──▶ download PDF reportAuthentication
Every /api/v1/ats/* request must include a Bearer token. Tokens are issued per integration and begin with the prefix ats_ followed by 48 characters. A token is valid only while its integration is active.
Authorization: Bearer ats_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxGet or rotate your token from the Maatrics panel (ATS Integrations). The file endpoint /api/ats/file/:remoteId is the only public endpoint — the remote_id UUID itself acts as the access key, so treat report URLs as secrets.
Endpoints
/api/v1/ats/assessmentsAuth requiredReturns every assessment of your company that has at least one case, newest first. Use the returned id (hash) in the other calls.
curl -X GET "https://api.maatrics.com/api/v1/ats/assessments" \
-H "Authorization: Bearer ats_xxx"/api/v1/ats/assessments/{id}Auth requiredReturns a single assessment with its exams (case type, duration and language).
Path parameters
| Field | Type | Rules |
|---|---|---|
id* | string | Assessment hash |
curl -X GET "https://api.maatrics.com/api/v1/ats/assessments/9bk2f1a7c3" \
-H "Authorization: Bearer ats_xxx"/api/v1/ats/assessments/{id}/applicantsAuth requiredLists the candidates added to an assessment, newest first. Here status is the raw record state (pending, completed, failed).
Path parameters
| Field | Type | Rules |
|---|---|---|
id* | string | Assessment hash |
curl -X GET "https://api.maatrics.com/api/v1/ats/assessments/9bk2f1a7c3/applicants" \
-H "Authorization: Bearer ats_xxx"/api/v1/ats/assessments/{id}/applicantsAuth requiredAdds 1–100 candidates in one call. Creates a user when needed, sends the invitation email, and returns an invite_url per candidate. The result status is created, linked_existing or already_exists.
Path parameters
| Field | Type | Rules |
|---|---|---|
id* | string | Assessment hash |
Body parameters
| Field | Type | Rules |
|---|---|---|
applicants* | array | 1–100 items |
applicants[].remote_id* | string | max 255 |
applicants[].first_name* | string | max 255 |
applicants[].last_name* | string | max 255 |
applicants[].email* | string | valid email, max 255 |
applicants[].status | string | optional, max 50 (reserved) |
curl -X POST "https://api.maatrics.com/api/v1/ats/assessments/9bk2f1a7c3/applicants" \
-H "Authorization: Bearer ats_xxx" \
-H "Content-Type: application/json" \
-d '{
"applicants": [
{
"remote_id": "cand-3f2a9b7c",
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]"
}
]
}'/api/v1/ats/applicants/{remoteId}Auth requiredReturns the candidate lifecycle status. Once the result webhook has been issued for the candidate, report_url and the structured results are included too. Status is one of pending, in_progress, completed or failed.
Path parameters
| Field | Type | Rules |
|---|---|---|
remoteId* | string | Your candidate id |
curl -X GET "https://api.maatrics.com/api/v1/ats/applicants/cand-3f2a9b7c" \
-H "Authorization: Bearer ats_xxx"/api/ats/file/{remoteId}No authReturns the candidate's report as a PDF. No authentication is required — the remote_id itself acts as the access key. This is the same address delivered as report_url.
Path parameters
| Field | Type | Rules |
|---|---|---|
remoteId* | string | Candidate id (acts as access key) |
curl -X GET "https://api.maatrics.com/api/ats/file/cand-3f2a9b7c" -o report.pdfResult Webhook
When a candidate's analysis is published, Maatrics POSTs the payload below to your integration's webhook_url. Respond 2xx quickly, dedupe by remote_id, then fetch the PDF from report_url and/or call the candidate status endpoint for the structured results. The payload carries a report_data that varies by assessment type; an example payload for each of the three types is shown below.
The result shape depends on the assessment type. Before processing a result, switch on type and parse report_data accordingly — the Usage tab below shows exactly that.
| type | Assessment kind | report_data fields |
|---|---|---|
language | Language / English interview | word_accuracy · speaking_fluency · vocabulary · grammar · general_level |
proficiency | Competency interview | proficiencies[] (→ actions[]) |
technical · technical_code | Technical interview (incl. coding) | proficiencies[] · skills[] |
// On a result webhook — or the candidate status response —
// branch on `type` to parse report_data / results correctly:
function handleResult(payload) {
switch (payload.type) {
case "language":
// word_accuracy, speaking_fluency, vocabulary, grammar, general_level
return renderLanguageReport(payload.report_data);
case "proficiency":
// proficiencies[] — each with nested actions[]
return renderProficiencyReport(payload.report_data);
case "technical":
case "technical_code":
// proficiencies[] + skills[]
return renderTechnicalReport(payload.report_data);
default:
return; // unknown type — ignore
}
}Errors
Standard HTTP status codes are used. Validation failures return 422 with a field-keyed errors object. Every request is logged server-side for audit and debugging.
| Status | When |
|---|---|
401 | Missing API token |
401 | Invalid or inactive token |
404 | Assessment or applicant not found |
404 | Report file not generated yet (plain text) |
422 | Add-applicant validation failure |

