curl --request PATCH \
--url https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id} \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"config": {
"company_overview_delivery_mode": "summarized_delivery",
"instructions": "Updated step-only instructions."
}
}
'import requests
url = "https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}"
payload = { "config": {
"company_overview_delivery_mode": "summarized_delivery",
"instructions": "Updated step-only instructions."
} }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {
company_overview_delivery_mode: 'summarized_delivery',
instructions: 'Updated step-only instructions.'
}
})
};
fetch('https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'config' => [
'company_overview_delivery_mode' => 'summarized_delivery',
'instructions' => 'Updated step-only instructions.'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}"
payload := strings.NewReader("{\n \"config\": {\n \"company_overview_delivery_mode\": \"summarized_delivery\",\n \"instructions\": \"Updated step-only instructions.\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"company_overview_delivery_mode\": \"summarized_delivery\",\n \"instructions\": \"Updated step-only instructions.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"config\": {\n \"company_overview_delivery_mode\": \"summarized_delivery\",\n \"instructions\": \"Updated step-only instructions.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "13D77095",
"company_id": "comp_abc123",
"title": "Senior Software Engineer",
"description": "We are looking for a senior software engineer...",
"status": "active",
"finalized": true,
"archived": false,
"test_posting": false,
"object": "posting",
"name": "senior-software-engineer",
"language": "en",
"interviewer_name": "Sarah",
"workflow": [
{
"type": "web_interview",
"order": 1,
"id": "agent_vi_001",
"config": {}
}
],
"urls": {
"candidate_url": "https://candidates.heymilo.io/acme/senior-engineer",
"ingestion_url_key": "ibURejyPMSlw6de0OZUdoxyoXTgWO78ey2NUo96EOG1gY",
"review_url": "https://admin.heymilo.ai/w/ABC123/lab2/POST_ID/1-details"
},
"deadline": 1775174400,
"redirect_url": "https://acme.com/thank-you",
"scheduling_url": "https://cal.com/acme/interview",
"max_retakes": 1,
"allow_sms_comms": false,
"instructions": "<string>",
"company_overview": "<string>",
"job_overview": "<string>",
"interview_process_overview": "<string>",
"company_overview_delivery_mode": "<string>",
"job_overview_delivery_mode": "<string>",
"interview_process_overview_delivery_mode": "<string>",
"phone_number_id": "<string>",
"sender_email_id": "<string>",
"email_template_group_id": "<string>",
"design_template_group_id": "<string>",
"retake_cooldown_days": 123,
"email_report_to_candidate": false,
"ats_metadata": {
"ats_job_id": "WK-12345",
"ats_name": "workable",
"pending_activation": true,
"source": "job_sync"
},
"metadata": {
"external_id": "ats_12345",
"source": "workday"
},
"team_ids": [
"team_abc123"
],
"created_at": 1739612400,
"updated_at": 1739617200
},
"meta": {}
}{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "The request body failed validation",
"param": "<string>",
"doc_url": "<string>",
"errors": [
{
"code": "invalid_param",
"message": "title must be between 3 and 200 characters",
"param": "title"
}
]
}
}{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "The request body failed validation",
"param": "<string>",
"doc_url": "<string>",
"errors": [
{
"code": "invalid_param",
"message": "title must be between 3 and 200 characters",
"param": "title"
}
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "The request body failed validation",
"param": "<string>",
"doc_url": "<string>",
"errors": [
{
"code": "invalid_param",
"message": "title must be between 3 and 200 characters",
"param": "title"
}
]
}
}Update a workflow step's config
Partially update one workflow step’s config without touching other steps or posting-level fields. step_id is the step’s type or its 1-based order.
curl --request PATCH \
--url https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id} \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"config": {
"company_overview_delivery_mode": "summarized_delivery",
"instructions": "Updated step-only instructions."
}
}
'import requests
url = "https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}"
payload = { "config": {
"company_overview_delivery_mode": "summarized_delivery",
"instructions": "Updated step-only instructions."
} }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {
company_overview_delivery_mode: 'summarized_delivery',
instructions: 'Updated step-only instructions.'
}
})
};
fetch('https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'config' => [
'company_overview_delivery_mode' => 'summarized_delivery',
'instructions' => 'Updated step-only instructions.'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}"
payload := strings.NewReader("{\n \"config\": {\n \"company_overview_delivery_mode\": \"summarized_delivery\",\n \"instructions\": \"Updated step-only instructions.\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"company_overview_delivery_mode\": \"summarized_delivery\",\n \"instructions\": \"Updated step-only instructions.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.heymilo.ai/api/v2/postings/{posting_id}/workflow/{step_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"config\": {\n \"company_overview_delivery_mode\": \"summarized_delivery\",\n \"instructions\": \"Updated step-only instructions.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "13D77095",
"company_id": "comp_abc123",
"title": "Senior Software Engineer",
"description": "We are looking for a senior software engineer...",
"status": "active",
"finalized": true,
"archived": false,
"test_posting": false,
"object": "posting",
"name": "senior-software-engineer",
"language": "en",
"interviewer_name": "Sarah",
"workflow": [
{
"type": "web_interview",
"order": 1,
"id": "agent_vi_001",
"config": {}
}
],
"urls": {
"candidate_url": "https://candidates.heymilo.io/acme/senior-engineer",
"ingestion_url_key": "ibURejyPMSlw6de0OZUdoxyoXTgWO78ey2NUo96EOG1gY",
"review_url": "https://admin.heymilo.ai/w/ABC123/lab2/POST_ID/1-details"
},
"deadline": 1775174400,
"redirect_url": "https://acme.com/thank-you",
"scheduling_url": "https://cal.com/acme/interview",
"max_retakes": 1,
"allow_sms_comms": false,
"instructions": "<string>",
"company_overview": "<string>",
"job_overview": "<string>",
"interview_process_overview": "<string>",
"company_overview_delivery_mode": "<string>",
"job_overview_delivery_mode": "<string>",
"interview_process_overview_delivery_mode": "<string>",
"phone_number_id": "<string>",
"sender_email_id": "<string>",
"email_template_group_id": "<string>",
"design_template_group_id": "<string>",
"retake_cooldown_days": 123,
"email_report_to_candidate": false,
"ats_metadata": {
"ats_job_id": "WK-12345",
"ats_name": "workable",
"pending_activation": true,
"source": "job_sync"
},
"metadata": {
"external_id": "ats_12345",
"source": "workday"
},
"team_ids": [
"team_abc123"
],
"created_at": 1739612400,
"updated_at": 1739617200
},
"meta": {}
}{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "The request body failed validation",
"param": "<string>",
"doc_url": "<string>",
"errors": [
{
"code": "invalid_param",
"message": "title must be between 3 and 200 characters",
"param": "title"
}
]
}
}{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "The request body failed validation",
"param": "<string>",
"doc_url": "<string>",
"errors": [
{
"code": "invalid_param",
"message": "title must be between 3 and 200 characters",
"param": "title"
}
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "The request body failed validation",
"param": "<string>",
"doc_url": "<string>",
"errors": [
{
"code": "invalid_param",
"message": "title must be between 3 and 200 characters",
"param": "title"
}
]
}
}Authorizations
API key for authentication. Pass your key in the X-API-KEY header.
Body
Partial update of a workflow step's config.
Partial step config. Allowed keys depend on the step's agent type (see the matching step config in the create request). Nested objects are replaced as a whole. Unknown keys return 400.
{
"company_overview_delivery_mode": "summarized_delivery",
"instructions": "Updated step-only instructions."
}
Response
Successful Response
A job posting with its full agentic workflow configuration.
A posting represents a complete hiring pipeline — it defines the job, the AI agents involved, and how candidates progress through each screening step.
Show child attributes
Show child attributes
Optional metadata. Shape varies by endpoint.
Was this page helpful?