> This page is for API, version 2026-01-01 (Stable) (default).
> For other versions, use one of these documentation indexes:
> - 2026-01-01 (Stable) (default): https://developer.deel.com/api/stable/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.deel.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.deel.com/_mcp/server.

# Assign application to interview plan stage

POST https://api.letsdeel.com/rest/ats/applications/{application_id}/interview-plan-stages
Content-Type: application/json

Associates an application with a specific interview plan stage. Set `is_current_stage` to `true` to advance the application's active stage, or `false` to record a historical stage entry without changing the current stage. Pass `applicable_job_activities` to selectively trigger activities, omit it to trigger all, or pass an empty array to trigger none; if archiving the candidate, include `candidate_archivation_reason_id` and optionally `candidate_archivation_email_template_id` to send a rejection email.

 **Token scopes**: `ats:write`, `worker:write`

Reference: https://developer.deel.com/api/reference/endpoints/ats-applications/associate-application-with-an-interview-plan-stage-v-2026-01-01

## Authentication

- `Authorization` header (bearer token, required) — ## Authentication The Deel API uses bearer tokens to authenticate requests. All API calls must be made over HTTPS — calls over plain HTTP or without authentication will fail. ```curl curl -X GET 'https://api.letsdeel.com/rest/v2/contracts' \ -H 'Authorization: Bearer YOUR-TOKEN-HERE' ``` [Learn more about authentication](/api/authentication)
- `Authorization` header (bearer token, required) — Standard OAuth2 security scheme based on https://swagger.io/docs/specification/authentication/

## Servers

- `https://api.letsdeel.com/rest` (Production, default)
- `https://api-staging.letsdeel.com/rest` (Demo)

## Request

### Path parameters

- `application_id` (string, required) — ID of the application to be associated with the interview plan stage

### Body (application/json)

This endpoint expects an object.

- `data` (AtsApplicationsApplicationIdInterviewPlanStagesPostRequestBodyContentApplicationJsonSchemaData, required)

## Response

### 201

Application interview plan stage successfully created

- `data` (AtsApplicationsApplicationIdInterviewPlanStagesPostResponsesContentApplicationJsonSchemaData, required) — The created application interview plan stage record

## Errors

### 400 Bad Request Error

Operation failed.

- `errors` (list of AtsApplicationsApplicationIdInterviewPlanStagesPostResponsesContentApplicationJsonSchemaErrorsItems, required) — List of error objects

### 401 Unauthorized Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

### 403 Forbidden Error

Forbidden. ATS is not enabled for this organization or insufficient permissions.

- `errors` (list of AtsApplicationsApplicationIdInterviewPlanStagesPostResponsesContentApplicationJsonSchemaErrorsItems, required) — List of error objects

### 404 Not Found Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

### 500 Internal Server Error

Operation failed.

- `errors` (list of AtsApplicationsApplicationIdInterviewPlanStagesPostResponsesContentApplicationJsonSchemaErrorsItems, required) — List of error objects

## Types

### AtsApplicationsApplicationIdInterviewPlanStagesPostRequestBodyContentApplicationJsonSchemaData

- `creator_id` (string, required) — HRIS Organization User ID of the user creating the resource
- `is_current_stage` (boolean, required) — When true, sets this stage as the application's current stage in the hiring workflow. When false, creates a historical record without changing the application's current stage.
- `interview_plan_stage_id` (string, required) — The ID of the interview plan stage to associate with the application
- `delay_unit` (enum, optional) — The unit of time for the delay. Must be provided together with delay_amount. Cannot be used together with scheduled_send_at.
  - Allowed values: `hours`, `days`, `weeks`
- `delay_amount` (integer, optional) — The amount of time to delay the archivation email. Must be provided together with delay_unit. Cannot be used together with scheduled_send_at.
- `scheduled_send_at` (string, optional) — The exact future datetime to send the archivation email. Cannot be used together with delay_amount/delay_unit.
- `applicable_job_activities` (list of AtsApplicationsApplicationIdInterviewPlanStagesPostRequestBodyContentApplicationJsonSchemaDataApplicableJobActivitiesItems, optional) — Optional array of job activities to trigger when associating the application with this stage. If not provided, all activities will be triggered. If an empty array is provided, no activities will be triggered.
- `candidate_archivation_reason_id` (string, optional) — Optional ID of the archivation reason if the candidate is being archived
- `candidate_archivation_email_template_id` (string, optional) — Optional ID of the rejection email template if the candidate is being archived

### AtsApplicationsApplicationIdInterviewPlanStagesPostResponsesContentApplicationJsonSchemaData

The created application interview plan stage record

- `id` (string, required) — The unique identifier of the created application interview plan stage record
- `created_at` (string, required) — The timestamp when the record was created
- `updated_at` (string, required) — The timestamp when the record was last updated

### AtsApplicationsApplicationIdInterviewPlanStagesPostResponsesContentApplicationJsonSchemaErrorsItems

- `code` (string, required) — Machine-readable error code
- `message` (string, required) — Human-readable error message
- `field` (string, optional) — Request field related to the error, if applicable

### ApiErrorRequest

- `method` (string, optional) — The HTTP method of the failed request
- `url` (string, optional) — The relative URL of the failed request
- `status` (double, optional) — The status code of the response
- `api_req_id` (string, optional) — The request ID of the failed request
- `docs` (string, optional) — A link to the official documentation for the requested endpoint resource
- `source` (string, optional) — The source handler which produced the returned error
- `code` (double, optional) — The code of the source handler which produced the returned error

### ApiError

- `message` (string, optional) — A description of the returned error
- `path` (string, optional) — The JSON path where input validation failed

### AtsApplicationsApplicationIdInterviewPlanStagesPostRequestBodyContentApplicationJsonSchemaDataApplicableJobActivitiesItems

- `id` (string, required) — The ID of the job activity to trigger
- `participants` (list of AtsApplicationsApplicationIdInterviewPlanStagesPostRequestBodyContentApplicationJsonSchemaDataApplicableJobActivitiesItemsParticipantsItems, optional) — Optional array of custom participants for this activity. If not provided, the default participants from the job activity template will be used.
- `candidate_self_scheduling_email_template_id` (string, optional) — Optional custom email template ID for candidate self-scheduling (only applicable for interview scheduling activities)

### AtsApplicationsApplicationIdInterviewPlanStagesPostRequestBodyContentApplicationJsonSchemaDataApplicableJobActivitiesItemsParticipantsItems

- `role_slug` (enum, required) — The role of the participant in the activity
  - Allowed values: `REVIEWER`, `INTERVIEWER`
- `participant_hris_organization_user_id` (string, required) — The HRIS organization user ID of the participant

## Examples

**Request**

```json
{
  "data": {
    "creator_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "is_current_stage": true,
    "interview_plan_stage_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }
}
```

**Response**

```json
{
  "data": {
    "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "created_at": "2025-11-14T10:30:00Z",
    "updated_at": "2025-11-14T10:30:00Z"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages"

payload = { "data": {
        "creator_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
        "is_current_stage": True,
        "interview_plan_stage_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
    } }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"data":{"creator_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","is_current_stage":true,"interview_plan_stage_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479"}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages"

	payload := strings.NewReader("{\n  \"data\": {\n    \"creator_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"is_current_stage\": true,\n    \"interview_plan_stage_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"data\": {\n    \"creator_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"is_current_stage\": true,\n    \"interview_plan_stage_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"data\": {\n    \"creator_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"is_current_stage\": true,\n    \"interview_plan_stage_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n  }\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages', [
  'body' => '{
  "data": {
    "creator_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "is_current_stage": true,
    "interview_plan_stage_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"data\": {\n    \"creator_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"is_current_stage\": true,\n    \"interview_plan_stage_id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["data": [
    "creator_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "is_current_stage": true,
    "interview_plan_stage_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
  ]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.letsdeel.com/rest/ats/applications/faac641e-a484-4875-aed5-bfcb0a0691a0/interview-plan-stages")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```