Updates to POST /applications (Oct 2024)
Last updated: June 17, 2026
Overview
This guide walks through the recommended way to create a job application — and, if needed, the underlying candidate — in your customers' ATS using a single call to Merge's POST /applications endpoint.
Starting in October 2024, POST /applications accepts candidate information directly in the request body. This lets you power "apply" and "submit candidate" experiences with one request instead of two, while keeping the previous two-step flow fully supported.
This change is 100% backward compatible — you don't need to migrate unless you want the simpler flow.
When to use the simplified flow
Your product likely has a workflow where an end user (or your application acting on their behalf) submits a candidate to a job in your customer's ATS. Before October 2024, this required two sequential calls:
Create the candidate via
POST /candidates.Create the application via
POST /applications, referencing the candidate created in step 1.
With the updated endpoint, you can send the candidate object nested inside the application request body. Merge will:
Create the candidate if one does not already exist in the customer's ATS.
Attach the new application to the existing candidate if one is already present.
Best practice is to migrate to the single-call flow for supported integrations. It reduces request volume, removes a class of "orphaned candidate" errors, and simplifies your error handling.
Instructions
Step 1: Confirm the integration is supported
The simplified POST /applications behavior is available for the following ATS integrations:
Ashby
Asymbl
Avature
BambooHR
Bullhorn
Bullhorn Recruitment Cloud
Clockwork
Comeet
Cornerstone TalentLink
Crelate
Eploy
Greenhouse
Harbour ATS
iCIMS
JazzHR
JobAdder
Jobvite
Lever
Oracle Taleo
SAP SuccessFactors
SmartRecruiters
Taleez
Teamtailor
UKG Pro Recruiting
Workday
For integrations not on this list, continue using the two-step POST /candidates then POST /applications flow.
Step 2: Build the request body
Send the candidate as a nested object inside model, alongside the job and current_stage references the application needs. A typical request body looks like:
{
"model": {
"candidate": {
"first_name": "Jane",
"last_name": "Doe",
"email_addresses": [
{
"value": "[email protected]",
"email_address_type": "PERSONAL"
}
],
"phone_numbers": [
{
"value": "9293388299",
"phone_number_type": "MOBILE"
}
],
"attachments": [
{
"file_name": "Jane Doe Resume.pdf",
"file_url": "https://pdfobject.com/pdf/sample.pdf",
"attachment_type": "RESUME"
}
],
"applications": []
},
"job": "ecbadbed-4ff8-4191-9f8b-f31a9359ccca",
"current_stage": "6ecfc3e2-563f-4894-b2b3-4f69bdc0856f"
}
}
candidate— the candidate fields you would have sent toPOST /candidates. Merge uses these to look up or create the candidate.job— the MergeJobID the application is for. Fetch this from GET /jobs.current_stage— the MergeJobInterviewStageID representing where the application should start. Fetch from GET /job-interview-stages.
Step 3: Surface job and stage selection to your customer
Best practice is to give your end user (or your customer's recruiter) a UI to choose the job and current_stage rather than hard-coding them. A typical pattern:
After the customer links their ATS, fetch their jobs from
GET /jobsand store the IDs you need.For each job, fetch the available stages from
GET /job-interview-stagesso your UI can show the correct "starting stage" options.Pass the selected IDs into the
POST /applicationsrequest body shown in Step 2.
Step 4: Handle the response
POST /applications returns the created Application along with the resolved Candidate. Persist both IDs so subsequent updates (e.g., stage transitions via PATCH /applications/{id}) can reference them without another lookup.
If your product previously stored a candidate ID after POST /candidates, update your data model to capture the candidate ID returned by POST /applications instead.
Migrating from the two-step flow
If you already have a working POST /candidates + POST /applications integration:
Migration is optional — no action is required, the two-step flow continues to work.
When you do migrate, you can ship the change endpoint-by-endpoint. The simplified flow is per-request, so older code paths can keep using two calls while new code paths use one.
Test against at least one of your top integrations first (e.g., Greenhouse or Lever) before rolling out broadly.
Questions
If you'd like to request support for an additional integration, or have questions about migrating, please contact your customer success manager or email [email protected].