
Job Application API
JobsYou send a POST request with a job URL and a candidate profile. We fill out the application — every field, every dropdown, every "please re-enter your resume" — and file it with the employer's ATS. You get a webhook.
📚 Documentation & Examples
Everything you need to integrate with Job Application API
🚀 Quick Start Examples
// Job Application API API Example
const response = await fetch('https://boringproject.ai', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);Job Application API — The Boring Project
The Boring Project is an API to apply on jobs programmatically. You send a POST request with a job posting URL and a structured candidate profile; the service detects the employer's applicant tracking system (ATS), fills every field — resume upload, dropdowns, screening questions — and files the application. Every request resolves to a webhook with a screenshot receipt of the confirmation page.
Base URL: https://apply-api.boringproject.ai/api/v1
Supported ATSs: 40+ systems, one schema — Workday, Greenhouse, Lever, iCIMS, Taleo, SuccessFactors, SmartRecruiters, Ashby, Workable and more. Median submit time is ~3 minutes; simple forms (Greenhouse, Lever, Ashby) usually finish in under a minute.
Authentication
Get an API key from the dashboard. Candidate consent is required on every application.
Apply to a job in one request
POST https://apply-api.boringproject.ai/api/v1/sessions/apply
{
"candidateProfileId": "prof_xyz789",
"jobs": [
{
"companyName": "Acme Corp",
"title": "Senior Software Engineer",
"jobId": "12345",
"link": "https://boards.greenhouse.io/acme/jobs/12345"
}
]
}
Response
{
"sessionId": "sess_abc123",
"type": "run_once",
"userId": "usr_abc123",
"candidateProfileId": "prof_xyz789",
"status": "active",
"stats": {
"totalRuns": 1,
"totalApplications": 0,
"successfulApplications": 0,
"failedApplications": 0,
"applicationsSkipped": 0,
"jobsQueued": 1
},
"searchContext": {
"titles": ["Senior Software Engineer"],
"locations": []
},
"createdAt": "2024-02-14T11:00:00Z"
}
How it works
- You POST — one request with the job posting URL and a candidate object: name, contact, work history, resume file, answers to common screeners.
- The ATS is identified — the URL resolves to its underlying applicant tracking system and the matching form adapter loads.
- The form gets filled — every field mapped, resume uploaded, screening questions answered from candidate data. Anything that can't be answered truthfully pauses for input — the API never guesses.
- You get a webhook — every application resolves to
submitted,needs_input, orfailed, with a screenshot receipt of the confirmation page.
Webhook statuses
| Status | Meaning |
|---|---|
submitted |
Application filed with the employer's ATS; screenshot receipt attached |
needs_input |
A screening question couldn't be answered from the candidate profile — supply the answer and the run resumes |
failed |
The application could not be completed; details included |
Products
| Product | What it is |
|---|---|
| Apply API | The core primitive: POST a job URL + candidate object, receive a submitted application. REST, JSON in, webhook out. |
| Search + Apply | Job discovery bundled with submission — query open roles by title, location, and ATS, then apply through the same pipeline. |
| Managed Applies | CSV in, receipts out. No integration required; per-application pricing with a human review queue. |
Notes
- Screening questions with stakes ("Are you willing to relocate?") are answered only from candidate data; anything unanswerable returns
needs_inputinstead of a guess. - Adapters run synthetic test applications daily; breakage windows are published on the status page.
- Per-employer rate limits are enforced and candidate consent is required per application.
- Built for developers and founders building job-search products: auto-apply tools, career copilots, staffing platforms, university career services.









