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:

LayerWhat Knit handles
Data modelsConsistent field names and structures — candidates from Greenhouse, Lever, and Workable return the same schema
AuthenticationOAuth, API keys, and tokens managed per-provider; you pass a single X-Knit-Integration-Id header
PaginationCursor-based pagination works identically regardless of how the provider implements it
Error formatsStandardized 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, disabilityStatus

List EEOC · Get EEOC record


Rejection Reasons

Standardized rejection reason codes from the ATS — used when programmatically rejecting applications to maintain consistent pipeline hygiene.

id, text

List rejection reasons


📘

Custom fields

Fields 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

EndpointDescription
Job data modelsFull field reference for the normalized job object
List jobsRetrieve all jobs with filtering by status, department, office, or tag
Get jobFetch a single job by ID including stages, compensation, and requirements
Create jobCreate a new job requisition in the connected ATS

Candidate APIs

EndpointDescription
Candidate data modelsFull field reference for the normalized candidate object
List candidatesList candidates with filtering by job, email, tag, or date range
Get candidateFetch a single candidate by ID including education, experience, and attachments
Search candidatesSearch by name, email, phone, or custom metadata
Get candidate tagsRetrieve tags assigned to a specific candidate
Add candidate tagAssign a tag to a candidate
Get global tagsRetrieve all workspace-level tags available in the ATS

Application APIs

EndpointDescription
List applicationsList applications with filtering by job, candidate, stage, or date
Get applicationFetch a single application by ID with full stage history
Create applicationCreate a new job application, optionally with a new candidate record
Update application stageMove an application to a new stage in the hiring pipeline
Reject applicationReject an application with a standardized reason code
Update applicationUpdate application metadata or answers
Delete applicationRemove an application record from the ATS
Add attachmentAttach a resume, cover letter, or offer letter to an application

Notes APIs

EndpointDescription
List notesRetrieve all notes associated with candidates or applications
Get noteFetch a single note by ID
Create candidate noteAdd a recruiter note to a candidate profile

EEOC & Compliance APIs

EndpointDescription
List EEOCRetrieve EEOC demographic records for candidates
Get EEOC recordFetch a single EEOC record by ID
List rejection reasonsFetch valid rejection reason codes from the ATS

Department & User APIs

EndpointDescription
List departmentsRetrieve ATS departments linked to jobs
Get departmentFetch a single department by ID
List usersList all ATS users (recruiters, hiring managers)
Get userFetch 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.

CategoryPlatforms
Enterprise ATSiCIMS, SAP SuccessFactors, Oracle Taleo, Workday Recruiting
Mid-market ATSGreenhouse, Lever, Ashby, Workable, SmartRecruiters, Jobvite
SMB / Fast-growthBreezy HR, JazzHR, Pinpoint, Recruitee, Teamtailor, Zoho Recruit
Global / DistributedRippling 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_ID

List 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 integrationsKnit Unified ATS API
Platforms per integration130+
Time to first integration4–8 weeks1–3 days
Auth managementPer-providerHandled by Knit
Maintenance when APIs changeYour teamKnit's team
EEOC dataCustom per ATSNormalized, ready to use
New platformsWeeks of eng workHours with AI Connector Builder

Next Steps

🚀 Get your API keyStart building in minutes
📋 Job Data ModelsFull field reference
👤 Candidate data modelsProfile, education, experience, attachments
📝 Application APICreate, stage, and reject applications
📊 EEOC APICompliance and diversity data
🔗 Supported ATS integrationsFull list of connected platforms
🤖 MCP HubAI agent access to ATS data