Deel ATS API

Applicant Tracking System API for managing the full recruiting pipeline — jobs and job postings, candidates, applications, attachments, offers, departments, locations, email templates, hiring members, employment types, application sources, tags, and reasons. End-to-end flow candidate-to-contract via the Deel Hire handoff.

OpenAPI Specification

deel-ats-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Deel ATS API
  description: |
    Applicant Tracking System API for managing the full recruiting pipeline — jobs and
    job postings, candidates, applications, attachments, offers, departments, locations,
    email templates, hiring members, employment types, application sources, tags, and
    reasons — with an end-to-end candidate-to-contract flow via Deel Hire.
  version: '2026-05-25'
  contact:
    name: Deel Developer Support
    url: https://developer.deel.com/api/ats-guides/introduction

servers:
  - url: https://api.letsdeel.com/rest/v2
    description: Production
  - url: https://api-sandbox.demo.deel.com/rest/v2
    description: Sandbox

security:
  - BearerAuth: []

tags:
  - name: Jobs
    description: Job and job-posting management
  - name: Candidates
    description: Candidate records and resume attachments
  - name: Applications
    description: Application lifecycle and pipeline stages
  - name: Offers
    description: Offer creation and acceptance
  - name: Reference Data
    description: Departments, locations, employment types, sources, tags, reasons

paths:
  /ats/jobs:
    get:
      operationId: getAtsJobs
      summary: List ATS Jobs
      tags: [Jobs]
      parameters:
        - { name: status, in: query, schema: { type: string, enum: [draft, open, on_hold, closed, filled] } }
      responses:
        '200':
          description: Jobs
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { $ref: '#/components/schemas/AtsJob' } }
    post:
      operationId: createAtsJob
      summary: Create ATS Job
      tags: [Jobs]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/AtsJobCreate' }
      responses:
        '201':
          description: Job created
          content:
            application/json:
              schema: { $ref: '#/components/schemas/AtsJob' }

  /ats/jobs/{job_id}/postings:
    get:
      operationId: getAtsJobPostings
      summary: List Job Postings
      tags: [Jobs]
      parameters:
        - { name: job_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Postings
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { $ref: '#/components/schemas/AtsJobPosting' } }

  /ats/candidates:
    get:
      operationId: getAtsCandidates
      summary: List ATS Candidates
      tags: [Candidates]
      parameters:
        - { name: search, in: query, schema: { type: string } }
      responses:
        '200':
          description: Candidates
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { $ref: '#/components/schemas/AtsCandidate' } }
    post:
      operationId: createAtsCandidate
      summary: Create ATS Candidate
      tags: [Candidates]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/AtsCandidateCreate' }
      responses:
        '201':
          description: Candidate created
          content:
            application/json:
              schema: { $ref: '#/components/schemas/AtsCandidate' }

  /ats/applications:
    get:
      operationId: getAtsApplications
      summary: List Applications
      tags: [Applications]
      parameters:
        - { name: job_id, in: query, schema: { type: string } }
        - { name: candidate_id, in: query, schema: { type: string } }
        - { name: stage, in: query, schema: { type: string, enum: [new, screening, interview, offer, hired, rejected, withdrawn] } }
      responses:
        '200':
          description: Applications
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { $ref: '#/components/schemas/AtsApplication' } }
    post:
      operationId: createAtsApplication
      summary: Create Application
      tags: [Applications]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/AtsApplicationCreate' }
      responses:
        '201':
          description: Application created
          content:
            application/json:
              schema: { $ref: '#/components/schemas/AtsApplication' }

  /ats/applications/{application_id}/stage:
    patch:
      operationId: advanceApplicationStage
      summary: Advance Application Stage
      tags: [Applications]
      parameters:
        - { name: application_id, in: path, required: true, schema: { type: string } }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [stage]
              properties:
                stage: { type: string, enum: [new, screening, interview, offer, hired, rejected, withdrawn] }
                reason_id: { type: string }
                notes: { type: string }
      responses:
        '200': { description: Stage updated }

  /ats/offers:
    post:
      operationId: createAtsOffer
      summary: Create ATS Offer
      tags: [Offers]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/AtsOfferCreate' }
      responses:
        '201':
          description: Offer created
          content:
            application/json:
              schema: { $ref: '#/components/schemas/AtsOffer' }

  /ats/offers/{offer_id}:
    get:
      operationId: getAtsOffer
      summary: Retrieve Offer
      tags: [Offers]
      parameters:
        - { name: offer_id, in: path, required: true, schema: { type: string } }
      responses:
        '200':
          description: Offer
          content:
            application/json:
              schema: { $ref: '#/components/schemas/AtsOffer' }

  /ats/departments:
    get:
      operationId: getAtsDepartments
      summary: List ATS Departments
      tags: [Reference Data]
      responses:
        '200':
          description: Departments
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { type: object, properties: { id: { type: string }, name: { type: string } } } }

  /ats/employment-types:
    get:
      operationId: getAtsEmploymentTypes
      summary: List ATS Employment Types
      tags: [Reference Data]
      responses:
        '200':
          description: Employment types
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { type: object, properties: { id: { type: string }, name: { type: string, enum: [full_time, part_time, contract, internship, temporary] } } } }

  /ats/locations:
    get:
      operationId: getAtsLocations
      summary: List ATS Locations
      tags: [Reference Data]
      responses:
        '200':
          description: Locations
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { type: array, items: { type: object, properties: { id: { type: string }, name: { type: string }, country: { type: string }, city: { type: string }, remote: { type: boolean } } } }

components:
  securitySchemes:
    BearerAuth: { type: http, scheme: bearer, bearerFormat: opaque }
  schemas:
    AtsJob:
      type: object
      properties:
        id: { type: string }
        title: { type: string }
        status: { type: string, enum: [draft, open, on_hold, closed, filled] }
        department_id: { type: string }
        location_id: { type: string }
        employment_type: { type: string }
        hiring_manager_id: { type: string }
        created_at: { type: string, format: date-time }
    AtsJobCreate:
      type: object
      required: [title]
      properties:
        title: { type: string }
        department_id: { type: string }
        location_id: { type: string }
        employment_type: { type: string }
        hiring_manager_id: { type: string }
        description: { type: string }
    AtsJobPosting:
      type: object
      properties:
        id: { type: string }
        job_id: { type: string }
        title: { type: string }
        url: { type: string, format: uri }
        status: { type: string, enum: [draft, posted, closed] }
        channel: { type: string, enum: [website, linkedin, indeed, internal, other] }
    AtsCandidate:
      type: object
      properties:
        id: { type: string }
        first_name: { type: string }
        last_name: { type: string }
        email: { type: string, format: email }
        phone: { type: string }
        location: { type: string }
        resume_url: { type: string, format: uri }
        linkedin_url: { type: string, format: uri }
        source_id: { type: string }
        tags: { type: array, items: { type: string } }
        created_at: { type: string, format: date-time }
    AtsCandidateCreate:
      type: object
      required: [first_name, last_name, email]
      properties:
        first_name: { type: string }
        last_name: { type: string }
        email: { type: string, format: email }
        phone: { type: string }
        location: { type: string }
        linkedin_url: { type: string, format: uri }
        source_id: { type: string }
    AtsApplication:
      type: object
      properties:
        id: { type: string }
        job_id: { type: string }
        candidate_id: { type: string }
        stage: { type: string, enum: [new, screening, interview, offer, hired, rejected, withdrawn] }
        rejection_reason_id: { type: string }
        applied_at: { type: string, format: date-time }
        last_activity_at: { type: string, format: date-time }
    AtsApplicationCreate:
      type: object
      required: [job_id, candidate_id]
      properties:
        job_id: { type: string }
        candidate_id: { type: string }
        source_id: { type: string }
    AtsOfferCreate:
      type: object
      required: [application_id, salary, currency, start_date]
      properties:
        application_id: { type: string }
        salary: { type: number }
        currency: { type: string }
        bonus: { type: number }
        equity: { type: string }
        start_date: { type: string, format: date }
        expires_at: { type: string, format: date }
        notes: { type: string }
    AtsOffer:
      type: object
      properties:
        id: { type: string }
        application_id: { type: string }
        status: { type: string, enum: [draft, sent, accepted, declined, expired, withdrawn] }
        salary: { type: number }
        currency: { type: string }
        start_date: { type: string, format: date }
        sent_at: { type: string, format: date-time }
        accepted_at: { type: string, format: date-time }