Application Scoring
This guide walks you through the complete flow to get AI-powered application scores from CarvOS. You'll push a candidate with their CV, a vacancy, create an application linking them, and receive the scored result via webhook.
Prerequisites¶
- A provisioned workspace (see Workspace Management)
- Completed the Quick Start (API key, webhook receiver configured)
Overview¶
sequenceDiagram
participant ATS
participant CarvOS
ATS->>CarvOS: 1. Upload CV
CarvOS-->>ATS: 200 OK (carv_file_id)
ATS->>CarvOS: 2. Push candidate (with CV)
CarvOS-->>ATS: 202 Accepted
CarvOS->>ATS: candidate.created
ATS->>CarvOS: 3. Push vacancy
CarvOS-->>ATS: 202 Accepted
CarvOS->>ATS: vacancy.created
ATS->>CarvOS: 4. Create application (links candidate + vacancy)
CarvOS-->>ATS: 202 Accepted
Note over CarvOS: AI scoring
CarvOS->>ATS: application.created (with score)
Every step after the upload returns 202 Accepted immediately. CarvOS
processes asynchronously and delivers results via outgoing webhooks.
Step 1: Upload the CV¶
Required for accurate scoring
The CV is the primary source of knowledge for application scoring. Without a CV attached to the candidate or application, CarvOS cannot produce an accurate score. Always upload and attach the CV before creating the application.
Upload the candidate's CV before sending the candidate data. You'll reference
the returned carv_file_id in the next step.
curl -X POST "https://api.carvos.io/uploads" \
-H "X-API-Key: your-api-key" \
-H "X-ATS-Client-ID: acme-corp" \
-F "file=@resume.pdf"
The response includes the file reference and an expiration deadline:
{
"carv_file_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"file_name": "resume.pdf",
"content_type": "application/pdf",
"file_size": 245760,
"uploaded_at": "2026-03-12T10:30:00Z",
"expires_at": "2026-03-15T10:30:00Z"
}
Warning
Files expire at the expires_at deadline if not referenced in a webhook.
Send the candidate or application webhook before then.
One upload per webhook
Each carv_file_id can only be used in one webhook. If you need to
attach the same CV to both a candidate and an application, upload the file
twice to get two separate carv_file_id values.
See File Uploads for supported file types, size limits, and error handling.
Step 2: Push a Candidate with the CV¶
Send candidate data with the uploaded CV attached. The files.resume field
references the carv_file_id from the previous step.
curl -X POST "https://api.carvos.io/v1/candidates" \
-H "X-API-Key: your-api-key" \
-H "X-ATS-Client-ID: acme-corp" \
-H "X-ATS-User-ID: admin-user" \
-H "Content-Type: application/json" \
-d '{
"candidate_id": "candidate-123",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane.smith@example.com",
"files": {
"resume": {
"carv_file_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
}'
curl -X POST "https://api.carvos.io/v1/webhooks/your-ats-id" \
-H "X-Webhook-Signature: t=1234567890,v1=abc123..." \
-H "Content-Type: application/json" \
-d '{
"event": "candidate.created",
"event_id": "evt-001",
"client_id": "acme-corp",
"user_id": "admin-user",
"candidate_id": "candidate-123",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane.smith@example.com",
"files": {
"resume": {
"carv_file_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
}'
CarvOS confirms with a candidate.created outgoing webhook once the profile is
normalized.
See the API Reference for the full candidate schema.
Step 3: Push a Vacancy¶
Send the vacancy (open position) that the candidate will apply to:
curl -X POST "https://api.carvos.io/v1/vacancies" \
-H "X-API-Key: your-api-key" \
-H "X-ATS-Client-ID: acme-corp" \
-H "X-ATS-User-ID: admin-user" \
-H "Content-Type: application/json" \
-d '{
"vacancy_id": "vacancy-456",
"title": "Senior Software Engineer",
"description": "We are looking for..."
}'
curl -X POST "https://api.carvos.io/v1/webhooks/your-ats-id" \
-H "X-Webhook-Signature: t=1234567890,v1=abc123..." \
-H "Content-Type: application/json" \
-d '{
"event": "vacancy.created",
"event_id": "evt-002",
"client_id": "acme-corp",
"user_id": "admin-user",
"vacancy_id": "vacancy-456",
"title": "Senior Software Engineer",
"description": "We are looking for..."
}'
CarvOS confirms with a vacancy.created outgoing webhook.
See the API Reference for the full vacancy schema.
Step 4: Create an Application¶
Link the candidate to the vacancy by creating an application. This triggers AI scoring.
If you attached the CV to the candidate in Step 2, the application doesn't need
a file reference — CarvOS already has the CV. If you prefer to attach the CV to
the application instead, upload the file separately (a new carv_file_id) and
include it in the files.resume field here.
curl -X POST "https://api.carvos.io/v1/webhooks/your-ats-id" \
-H "X-Webhook-Signature: t=1234567890,v1=abc123..." \
-H "Content-Type: application/json" \
-d '{
"event": "application.created",
"event_id": "evt-003",
"client_id": "acme-corp",
"user_id": "admin-user",
"application_id": "app-789",
"candidate_id": "candidate-123",
"vacancy_id": "vacancy-456"
}'
CarvOS processes the application, scores the candidate-vacancy match, and
delivers the result via an application.created outgoing webhook.
See the API Reference for the full application schema.
Step 5: Receive the Score¶
CarvOS delivers the scored application to your webhook endpoint. Check your
webhook receiver for the application.created event with the scoring data.
Outgoing Events Reference¶
| Event | When |
|---|---|
candidate.created |
Candidate profile created and normalized |
candidate.updated |
Candidate data updated after a change |
candidate.deleted |
Candidate removed |
vacancy.created |
Vacancy created and normalized |
vacancy.updated |
Vacancy data updated |
vacancy.deleted |
Vacancy removed |
application.created |
Application created and scored |
application.updated |
Application data updated |
application.deleted |
Application removed |
If processing fails permanently, CarvOS sends the same event type with
status: "failure", data: null, and an error object. See
Failure Events for details.
For full payload schemas, see the API Reference for Candidates, Vacancies, and Applications.
Next Steps¶
-
Meeting Intelligence
Get transcripts, summaries, and notes from meetings
-
Webhook Sandbox
Test webhook delivery before going live