---
title: "Push a candidate to the ATS"
method: POST
path: "/api/v2/ats/candidates/push"
tags: ["ATS"]
---

# Push a candidate to the ATS

`POST /api/v2/ats/candidates/push`

Enqueue a candidate push to the connected ATS. If ``candidate.ats_candidate_id`` is null, a new candidate record is created in the ATS. Returns a queue ``item_id`` that can be polled via the push-status endpoint. Only Bullhorn and Avionte are currently supported.

## Headers

- `X-API-KEY` string, nullable
- `Authorization` string, nullable
- `X-Workspace-Id` string, nullable

## Request body

- PushCandidateRequest
  - `ats_name` string, required — ATS provider name (e.g. 'bullhorn').
  - `posting_id` string, nullable
  - `interview_id` string, nullable
  - `ingestion_token` string, nullable
  - `create_submission` boolean — Also create a candidate-to-job link in the ATS.
  - `candidate` PushCandidatePayload, required
    - `ats_candidate_id` string, nullable — Existing ATS candidate ID to update. Pass null to create a new candidate.
    - `first_name` string, nullable
    - `last_name` string, nullable
    - `email` string, nullable
    - `phone` string, nullable
    - `set_heymilo_source` boolean, nullable

## Response `200`

Successful Response

- SingleResponseEnqueuePushResponse
  - `data` EnqueuePushResponse, required
    - `status` string, required
    - `item_id` string, nullable — Queue item ID to poll for status.
    - `error` string, nullable
  - `meta` object, nullable — Optional metadata. Shape varies by endpoint.

## Other responses

- `400` — Unsupported ATS provider.
- `401` — Invalid or missing API key.
- `422` — Validation Error
- `429` — Rate limit exceeded.

---

[API](https://skmtc.net/heymilo/apis/heymilo-public-api.md) · [All operations](https://skmtc.net/heymilo/apis/heymilo-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/heymilo/heymilo-public-api/revisions/a93ca9c2c777/schema)
