Unified ATS API
Knit's Unified ATS API gives you a single integration to read and write recruiting data across Greenhouse, Lever, Workable, iCIMS, and 30+ more applicant tracking systems. Build once — support every ATS your customers use.
What Is a Unified ATS API?
A unified ATS API is a single, standardized programming interface that lets your product read and write recruiting data — candidates, jobs, applications, interviews, and offers — across multiple applicant tracking systems without building a separate integration for each one.
ATS platforms like Greenhouse, Lever, and Workable each expose unique APIs with different authentication schemes, data models, and endpoint conventions. Knit normalizes these differences so your engineering team integrates once, and Knit handles the translation layer for every ATS your customers use.
Knit normalizes four things across all ATS providers:
| Layer | What Knit handles |
|---|---|
| Data models | Consistent field names and structures — candidates from Greenhouse, Lever, and Workable return the same schema |
| Authentication | OAuth, API keys, and tokens managed per-provider; you pass a single X-Knit-Integration-Id header |
| Pagination | Cursor-based pagination works identically regardless of how the provider implements it |
| Error formats | Standardized error responses with provider context where available |
Building AI agents?Knit is MCP-compatible (Model Context Protocol). Your agents can perform authenticated read and write actions across 30+ ATS platforms with zero per-provider logic. Try MCP Hub→
How It Works
1. Your customer connects their ATS Knit's pre-built embedded auth UI handles OAuth, API keys, and token management per provider. Your team writes zero auth code.
2. Knit normalizes the data Candidate profiles, job postings, applications, interview stages, and EEOC data are all mapped to Knit's unified schema — regardless of how each ATS stores it internally.
3. Your product calls one API Use a single set of endpoints and data models across your entire product. Add a new ATS later? No code changes on your side.
4. Stay in sync with real-time webhooks Native and virtual webhooks fire on recruiting changes — new applications, stage updates, offer decisions — with a consistent event schema across all providers.
ATS Data Objects
The following objects are available through the unified schema. All fields are normalized across providers.
Jobs
Job postings, requisitions, and open positions — including compensation ranges, skill requirements, interview questions, and job board distribution status.
id, title, description, status, applyUrl, departments[], offices[],
hiringManagers[], recruiters[], stages[], jobPosts[],
jobCompensation.salary{minAmount, maxAmount, currency, period}, jobRequirements.skills[],
jobRequirements.education, jobQuestions[], employmentType,
jobInfoEnhanced.workArrangement→ List jobs · Get job · Create job · Job data models
Candidates
Applicant profiles including contact details, work history, education, skills, tags, and resume attachments.
id, firstName, lastName, emails[], phones[], links[], tags[], title, company,
education[]{degree, institute, major, score}, experiences[]{company, jobTitle, dates},
skills[]{name, level}, locations[], attachments[]{type, link, content}→ List candidates · Get candidate · Search candidates · Candidate data models
Applications
Job application records linking candidates to jobs, with stage tracking, answers to screening questions, and resume attachments.
id, status, candidateId, jobId, origin, appliedAt, updatedAt,
currentStage{id, text}, interviews[], offers[], attachments[],
questionResponses[]{questionId, questionText, questionType, answer}→ List applications · Get application · Create application · Update stage · Reject application
Notes & Activities
Candidate notes, recruiter activity logs, and internal comments across the hiring pipeline.
id, candidateId, applicationId, content, userId, createdAt, updatedAt→ List notes · Get note · Create candidate note
Tags
Candidate-level and global tags for pipeline organization, sourcing categorization, and custom segmentation.
tag_id, name, candidateId (candidate tags), global (workspace-wide tags)→ Get candidate tags · Add candidate tag · Get global tags
Departments & Users
ATS-specific departments and user accounts (recruiters, hiring managers) associated with jobs and applications.
department_id, name
user_id, email, role→ List departments · List users
EEOC Data
Equal Employment Opportunity Commission (EEOC) demographic data — available where provided by the candidate and permitted by the ATS. Critical for compliance reporting, diversity analytics, and HR audit workflows.
eeoc_id, candidateId, applicationId, race, gender, veteranStatus, disabilityStatusRejection Reasons
Standardized rejection reason codes from the ATS — used when programmatically rejecting applications to maintain consistent pipeline hygiene.
id, text
Custom fieldsFields outside the unified schema are accessible via custom fields that you can map to the unified model, or via the Passthrough API which lets you make direct calls to the underlying ATS using Knit's auth layer without giving up the unified platform.
API Reference
All ATS endpoints are organized by category. Each endpoint works identically regardless of the underlying ATS — pass your API key and the customer's X-Knit-Integration-Id and the response schema is consistent across all providers.
Job APIs
| Endpoint | Description |
|---|---|
| Job data models | Full field reference for the normalized job object |
| List jobs | Retrieve all jobs with filtering by status, department, office, or tag |
| Get job | Fetch a single job by ID including stages, compensation, and requirements |
| Create job | Create a new job requisition in the connected ATS |
Candidate APIs
| Endpoint | Description |
|---|---|
| Candidate data models | Full field reference for the normalized candidate object |
| List candidates | List candidates with filtering by job, email, tag, or date range |
| Get candidate | Fetch a single candidate by ID including education, experience, and attachments |
| Search candidates | Search by name, email, phone, or custom metadata |
| Get candidate tags | Retrieve tags assigned to a specific candidate |
| Add candidate tag | Assign a tag to a candidate |
| Get global tags | Retrieve all workspace-level tags available in the ATS |
Application APIs
| Endpoint | Description |
|---|---|
| List applications | List applications with filtering by job, candidate, stage, or date |
| Get application | Fetch a single application by ID with full stage history |
| Create application | Create a new job application, optionally with a new candidate record |
| Update application stage | Move an application to a new stage in the hiring pipeline |
| Reject application | Reject an application with a standardized reason code |
| Update application | Update application metadata or answers |
| Delete application | Remove an application record from the ATS |
| Add attachment | Attach a resume, cover letter, or offer letter to an application |
Notes APIs
| Endpoint | Description |
|---|---|
| List notes | Retrieve all notes associated with candidates or applications |
| Get note | Fetch a single note by ID |
| Create candidate note | Add a recruiter note to a candidate profile |
EEOC & Compliance APIs
| Endpoint | Description |
|---|---|
| List EEOC | Retrieve EEOC demographic records for candidates |
| Get EEOC record | Fetch a single EEOC record by ID |
| List rejection reasons | Fetch valid rejection reason codes from the ATS |
Department & User APIs
| Endpoint | Description |
|---|---|
| List departments | Retrieve ATS departments linked to jobs |
| Get department | Fetch a single department by ID |
| List users | List all ATS users (recruiters, hiring managers) |
| Get user | Fetch a single ATS user by ID |
Supported ATS Platforms
Knit connects to 30+ ATS and recruiting platforms. A single integration gives you access to all of them.
| Category | Platforms |
|---|---|
| Enterprise ATS | iCIMS, SAP SuccessFactors, Oracle Taleo, Workday Recruiting |
| Mid-market ATS | Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Jobvite |
| SMB / Fast-growth | Breezy HR, JazzHR, Pinpoint, Recruitee, Teamtailor, Zoho Recruit |
| Global / Distributed | Rippling ATS, Personio Recruiting |
→ View the full list of supported ATS integrations →
Don't see a platform? Use the AI Connector Builder to add it yourself in hours, not weeks.
Key Capabilities
Real-Time Sync & Webhooks
Knit supports both native webhooks (forwarded directly from platforms that emit them) and virtual webhooks (Knit polls the source, detects changes, and emits events). Both use the same subscription interface and event schema — your integration code is identical either way.
Zero Data Storage
Knit never stores your customers' candidate data at rest. Every API request passes through to the source ATS in real time. This reduces your GDPR, CCPA, and SOC 2 compliance scope significantly.
Rich Job Data Model
Unlike most unified ATS APIs that expose only basic job fields, Knit's job data model includes salary and equity ranges, required skills and certifications, education requirements, experience levels, work arrangement (remote/hybrid/onsite), job board distribution URLs, and custom screening questions — all normalized across every ATS.
EEOC & Diversity Data
Knit is one of the few unified ATS APIs to expose EEOC demographic records through a normalized interface. Build compliant diversity dashboards, audit trails, and DEI reporting tools.
AI Connector Builder
When a customer's ATS isn't in Knit's library, the AI Connector Builder lets your team define a new connector in hours.
Passthrough API
Direct calls to the underlying ATS using Knit's authentication layer for fields or endpoints outside the unified schema.
MCP Compatibility
Knit is compatible with the Model Context Protocol (MCP), enabling AI agents to perform authenticated read and write operations across ATS platforms without any per-provider logic.
Quick Start
Authentication
Authorization: Bearer YOUR_API_KEY
X-Knit-Integration-Id: YOUR_CUSTOMER_INTEGRATION_IDList open jobs
curl --request GET \
--url 'https://api.getknit.dev/v1.0/ats.job.list?status=OPEN' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'X-Knit-Integration-Id: YOUR_INTEGRATION_ID' \
--header 'accept: application/json'Response:
{
"success": true,
"data": {
"jobs": [
{
"info": {
"id": "DIJxrpmwXfedgno",
"title": "Frontend Engineer",
"status": "OPEN",
"applyUrl": "https://company.com/apply/frontend",
"createdAt": "2024-11-16T17:20:38Z"
},
"departments": [{ "id": "dept_001", "name": "Engineering" }],
"offices": [{ "name": "San Francisco HQ", "address": { "city": "San Francisco", "country": "US" } }],
"hiringManagers": [{ "email": "[email protected]" }],
"stages": [
{ "id": "stage_001", "text": "Application Review" },
{ "id": "stage_002", "text": "Technical Screen" },
{ "id": "stage_003", "text": "Final Interview" }
],
"jobCompensation": {
"salary": { "minAmount": 120000, "maxAmount": 160000, "currency": "USD", "period": "ANNUAL" }
},
"jobRequirements": {
"skills": [{ "name": "React", "proficiencyLevel": "EXPERT", "isRequired": true }],
"experience": { "minimumYears": 3 }
}
}
],
"nextPageToken": "eyJsYXN0SWQiOiJhYmMxMjMifQ"
}
}Create an application
curl --request POST \
--url https://api.getknit.dev/v1.0/ats.application.create \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'X-Knit-Integration-Id: YOUR_INTEGRATION_ID' \
--header 'content-type: application/json' \
--data '{
"jobId": "DIJxrpmwXfedgno",
"initialStageId": "stage_001",
"candidate": {
"firstName": "Emily",
"lastName": "Watson",
"emails": [{ "type": "PERSONAL", "email": "[email protected]" }],
"phones": [{ "type": "PERSONAL", "phoneNumber": "+1-202-555-0143" }]
},
"attachment": {
"fileName": "resume.pdf",
"fileType": "RESUME",
"fileUrl": "https://storage.example.com/resume-emily.pdf"
},
"source": "LinkedIn"
}'Move an application to the next stage
curl --request POST \
--url https://api.getknit.dev/v1.0/ats.application.stage.update \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'X-Knit-Integration-Id: YOUR_INTEGRATION_ID' \
--header 'content-type: application/json' \
--data '{
"applicationId": "8gWNi96zVnNIq3n",
"toStageId": "stage_002",
"currentStageId": "stage_001",
"candidateId": "IZYVFoL6ORBq2S1",
"jobId": "DIJxrpmwXfedgno"
}'Use Cases
Candidate Sourcing & Job Board Tools
Source candidates and push them into customers' ATS pipelines. Flow: Search candidates → check duplicates → Create application with resume → Add candidate tag
Interview Scheduling & Coordination
Access live stage data to automate scheduling. Flow: List jobs → List applications by stage → send invite → Update application stage
AI-Powered Candidate Screening
Feed normalized data into LLM pipelines for automated screening. Flow: Sync jobs + candidates → embed → score against requirements → Create note → Update stage
Background Check Integration
Trigger checks at offer stage and write results back. Flow: Webhook on stage=Offer → Get candidate → initiate check → Add attachment → Update stage
Recruiting Analytics & DEI Reporting
Pull structured data from multiple ATS into unified dashboards. Flow: Sync candidates + applications + EEOC → compute pipeline velocity, DEI metrics
Offer Management
Build offer tools that plug into ATS workflows. Flow: Get application at offer stage → generate letter → Add attachment → Update stage or Reject
HRIS Onboarding Automation
Detect new hires and trigger onboarding. Flow: Webhook on stage=Hired → Get candidate → Create employee in HRIS → provision SSO
FAQ
What is a unified ATS API? A unified ATS API is a single, standardized interface that lets your product read and write recruiting data across multiple applicant tracking systems without building a separate integration for each one.
Which ATS platforms does Knit support? 30+ including Greenhouse, Lever, Workable, iCIMS, SAP SuccessFactors, Ashby, SmartRecruiters, Jobvite, JazzHR, Breezy HR, Recruitee, Teamtailor, Zoho Recruit, Rippling, and more.
How long does it take to integrate? 1–3 days with Knit vs. 4–8 weeks for a single native ATS integration.
Does Knit store candidate data? No. Pass-through only — no candidate data stored at rest.
Does Knit support EEOC and diversity data? Yes — normalized EEOC demographic records where supported by the ATS.
How do webhooks work for ATS platforms without native support? Virtual webhooks poll the source, detect changes, and emit events using the same interface as native webhooks.
Can I access fields outside the unified ATS schema? Yes, via the Passthrough API.
Is Knit compatible with AI agents and MCP? Yes — MCP-compatible for authenticated ATS read/write with no per-provider logic.
How does Knit handle screening questions in applications? Pass structured answers (single-choice, multi-choice, file attachment) when creating applications; Knit maps these to the correct ATS format.
Knit vs. direct integrations comparison table:
| Direct integrations | Knit Unified ATS API | |
|---|---|---|
| Platforms per integration | 1 | 30+ |
| Time to first integration | 4–8 weeks | 1–3 days |
| Auth management | Per-provider | Handled by Knit |
| Maintenance when APIs change | Your team | Knit's team |
| EEOC data | Custom per ATS | Normalized, ready to use |
| New platforms | Weeks of eng work | Hours with AI Connector Builder |
Next Steps
| 🚀 Get your API key | Start building in minutes |
| 📋 Job Data Models | Full field reference |
| 👤 Candidate data models | Profile, education, experience, attachments |
| 📝 Application API | Create, stage, and reject applications |
| 📊 EEOC API | Compliance and diversity data |
| 🔗 Supported ATS integrations | Full list of connected platforms |
| 🤖 MCP Hub | AI agent access to ATS data |
Updated 20 days ago
