Reference
Candidates
People who applied to your jobs, with their submitted CV. API key only.
Get an application
/v1/candidates/{applicationId}Returns one application in full: the candidate identity and live profile, the CV document they submitted, any other CVs on their account, their cover letter, and a short-lived download link when they uploaded a resume file. The download link expires, so fetch it when you need it rather than storing it.
Path parameters
| Field | Type | Description |
|---|---|---|
| applicationIdrequired | string | The Tabbio application id. |
Response
These fields sit inside data.
| Field | Type | Description |
|---|---|---|
| applicationIdalways | string | The application id. Use it on detail. |
| jobIdalways | string | The job applied to. |
| companyIdalways | string | The company that owns the job. |
| statusalways | string | applied, reviewed, shortlisted, interview, offered, rejected or withdrawn. |
| appliedAtalways | string | When the application arrived. |
| updatedAtalways | string | When it last changed. |
| sourcealways | string or null | How the application arrived: tabbio_app, public_page or public_new_user. |
| screeningAnswersalways | object[] | Their answers to the job’s screening questions. |
| questionIdalways | string | Which screening question this answers. |
| type | string | The question type that was asked. |
| value | string | The answer, typed to match the question. |
| statusHistoryalways | object[] | Every stage change, oldest first. |
| statusalways | string | The stage the application moved to. |
| atalways | string | When it moved. |
| candidatealways | object | Who applied. |
| userIdalways | string | The applicant’s Tabbio user id. |
| namealways | string | Their name. |
| usernamealways | string or null | Their Tabbio handle, when they set one. |
| imagealways | string or null | Profile photo. |
| emailalways | string | The email on their Tabbio account. |
| titlealways | string or null | The headline on their profile. |
| submittedCvalways | object or null | The CV they submitted, or null when they uploaded a file. |
| idalways | string | The CV id. |
| titlealways | string | What the candidate calls it. |
| updatedAtalways | string | When that CV last changed. |
| coverLetteralways | string or null | What they wrote with the application. |
| candidateProfilealways | object | Their live Tabbio profile, next to the CV they submitted. |
| bioalways | string or null | Their short bio. |
| aboutalways | string or null | Their longer About section. |
| skillsalways | string[] | Skills on their live profile. |
| interestsalways | string[] | Interests on their profile. |
| submittedCvDocumentalways | object or null | The CV as it was at the moment they applied. |
| idalways | string | The CV id. |
| titlealways | string | What the candidate calls it. |
| summaryalways | string or null | The CV summary paragraph. |
| createdAtalways | string | When the CV was created. |
| updatedAtalways | string | When it last changed. |
| snapshot | boolean | False when this is the candidate’s live CV rather than the frozen submission. |
| additionalCvDocumentsalways | object[] | Other CVs on their account. |
| idalways | string | The CV id. |
| titlealways | string | What the candidate calls it. |
| summaryalways | string or null | The CV summary paragraph. |
| createdAtalways | string | When the CV was created. |
| updatedAtalways | string | When it last changed. |
| snapshot | boolean | False when this is the candidate’s live CV rather than the frozen submission. |
| resumealways | object or null | A short-lived download for an uploaded resume file, when the application carried one. |
| downloadUrlalways | string | Presigned link. Fetch it, do not store it. |
| expiresAtalways | string | When the link stops working. |
| filenamealways | string or null | The file name they uploaded. |
Status codes
- 200
The application.
- 401
The API key is missing, expired, or revoked.
- 403
The record belongs to a company your app does not manage, or the key is missing the candidates:read scope.
- 404
No application with this id.
curl https://server.tabbio.com/v1/candidates/$APPLICATION_ID \
-H "Authorization: Bearer $TABBIO_API_KEY"const response = await fetch(
`https://server.tabbio.com/v1/candidates/${applicationId}`,
{
headers: {
Authorization: `Bearer ${process.env.TABBIO_API_KEY}`,
},
},
);
const payload = await response.json();import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['TABBIO_API_KEY']}",
}
response = requests.get(f"https://server.tabbio.com/v1/candidates/{application_id}", headers=headers)
response.raise_for_status()
payload = response.json(){
"data": {
"applicationId": "app_3e77b0",
"jobId": "job_5c19d8",
"companyId": "com_7b31c4",
"status": "reviewed",
"appliedAt": "2026-08-22T09:14:03.000Z",
"updatedAt": "2026-08-24T12:40:18.000Z",
"source": "tabbio_app",
"screeningAnswers": [
{
"questionId": "q_experience_years",
"type": "number",
"value": 9
}
],
"statusHistory": [
{
"status": "applied",
"at": "2026-08-22T09:14:03.000Z"
},
{
"status": "reviewed",
"at": "2026-08-24T12:40:18.000Z"
}
],
"candidate": {
"userId": "usr_6d1904",
"name": "Omar Nassar",
"username": "omarnassar",
"image": "https://cdn.tabbio.com/avatars/omar.jpg",
"email": "omar.nassar@example.com",
"title": "Operations Manager"
},
"submittedCv": {
"id": "cv_8a1e42",
"title": "Operations roles",
"updatedAt": "2026-08-21T18:02:11.000Z"
},
"coverLetter": "I have run cold chain operations in Dubai for nine years and would like to bring that to Northwind.",
"candidateProfile": {
"bio": "Operations manager, cold chain and last mile.",
"about": "Nine years running regional logistics operations in the UAE and Saudi Arabia.",
"skills": [
"Operations",
"Cold chain",
"Team leadership"
],
"interests": [
"Supply chain analytics"
],
"experience": [
{
"id": "exp_5f10",
"company": "Gulf Cold Stores",
"title": "Operations Manager",
"location": "Dubai, United Arab Emirates",
"locationType": "On-site",
"employmentType": "Full-time",
"startDate": "2019-04-01T00:00:00.000Z",
"endDate": null,
"current": true,
"description": "Run two cold stores and a fleet of 40 vehicles.",
"achievements": [
"Cut cost per shipment by 18 percent over two years."
]
}
],
"education": [],
"certifications": [],
"highlights": [],
"projects": []
},
"submittedCvDocument": {
"id": "cv_8a1e42",
"title": "Operations roles",
"summary": "Operations manager, cold chain and last mile.",
"createdAt": "2026-06-02T08:44:15.000Z",
"updatedAt": "2026-08-21T18:02:11.000Z",
"snapshot": true,
"sections": []
},
"additionalCvDocuments": [
{
"id": "cv_44b907",
"title": "General CV",
"summary": null,
"createdAt": "2026-02-11T15:09:33.000Z",
"updatedAt": "2026-05-30T11:47:02.000Z",
"snapshot": false,
"sections": []
}
],
"resume": {
"downloadUrl": "https://tabbio.fra1.digitaloceanspaces.com/public-apply/usr_6d1904/omar-nassar-cv.pdf?X-Amz-Expires=900&X-Amz-Signature=8f1c",
"expiresAt": "2026-08-30T09:27:04.000Z",
"filename": "omar-nassar-cv.pdf"
}
},
"error": null,
"meta": null
}List applications for a job
/v1/jobs/{jobId}/candidatesLists the people who applied to a job your app manages, newest first. Each row carries the candidate identity, their screening answers and the CV they submitted. Use GET /v1/candidates/{applicationId} for the full application.
Path parameters
| Field | Type | Description |
|---|---|---|
| jobIdrequired | string | The Tabbio job id. |
Query parameters
| Field | Type | Description |
|---|---|---|
| page | integer | 1-based page number. Defaults to 1. |
| pageSize | integer | Items per page, 1 to 100. Defaults to 25. |
| status | string | Filter by application status. One of |
| query | string | Free text search over the candidate name, email and CV title. |
Response
These fields sit inside data.
| Field | Type | Description |
|---|---|---|
| applicationIdalways | string | The application id. Use it on detail. |
| jobIdalways | string | The job applied to. |
| companyIdalways | string | The company that owns the job. |
| statusalways | string | applied, reviewed, shortlisted, interview, offered, rejected or withdrawn. |
| appliedAtalways | string | When the application arrived. |
| updatedAtalways | string | When it last changed. |
| sourcealways | string or null | How the application arrived: tabbio_app, public_page or public_new_user. |
| screeningAnswersalways | object[] | Their answers to the job’s screening questions. |
| questionIdalways | string | Which screening question this answers. |
| type | string | The question type that was asked. |
| value | string | The answer, typed to match the question. |
| statusHistoryalways | object[] | Every stage change, oldest first. |
| statusalways | string | The stage the application moved to. |
| atalways | string | When it moved. |
| candidatealways | object | Who applied. |
| userIdalways | string | The applicant’s Tabbio user id. |
| namealways | string | Their name. |
| usernamealways | string or null | Their Tabbio handle, when they set one. |
| imagealways | string or null | Profile photo. |
| emailalways | string | The email on their Tabbio account. |
| titlealways | string or null | The headline on their profile. |
| submittedCvalways | object or null | The CV they submitted, or null when they uploaded a file. |
| idalways | string | The CV id. |
| titlealways | string | What the candidate calls it. |
| updatedAtalways | string | When that CV last changed. |
Status codes
- 200
One page of applications.
- 401
The API key is missing, expired, or revoked.
- 403
The record belongs to a company your app does not manage, or the key is missing the candidates:read scope.
- 404
No job with this id.
curl https://server.tabbio.com/v1/jobs/$JOB_ID/candidates \
-H "Authorization: Bearer $TABBIO_API_KEY"const response = await fetch(
`https://server.tabbio.com/v1/jobs/${jobId}/candidates`,
{
headers: {
Authorization: `Bearer ${process.env.TABBIO_API_KEY}`,
},
},
);
const payload = await response.json();import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['TABBIO_API_KEY']}",
}
response = requests.get(f"https://server.tabbio.com/v1/jobs/{job_id}/candidates", headers=headers)
response.raise_for_status()
payload = response.json(){
"data": [
{
"applicationId": "app_3e77b0",
"jobId": "job_5c19d8",
"companyId": "com_7b31c4",
"status": "reviewed",
"appliedAt": "2026-08-22T09:14:03.000Z",
"updatedAt": "2026-08-24T12:40:18.000Z",
"source": "tabbio_app",
"screeningAnswers": [
{
"questionId": "q_experience_years",
"type": "number",
"value": 9
}
],
"statusHistory": [
{
"status": "applied",
"at": "2026-08-22T09:14:03.000Z"
},
{
"status": "reviewed",
"at": "2026-08-24T12:40:18.000Z"
}
],
"candidate": {
"userId": "usr_6d1904",
"name": "Omar Nassar",
"username": "omarnassar",
"image": "https://cdn.tabbio.com/avatars/omar.jpg",
"email": "omar.nassar@example.com",
"title": "Operations Manager"
},
"submittedCv": {
"id": "cv_8a1e42",
"title": "Operations roles",
"updatedAt": "2026-08-21T18:02:11.000Z"
}
}
],
"error": null,
"meta": {
"page": 1,
"pageSize": 25,
"total": 1,
"totalPages": 1
}
}Base URL https://server.tabbio.com. Every response outside the token endpoint uses the { data, error, meta } envelope.