curl --request PUT \
--url https://api.kit.com/v4/sequences/{sequence_id}/emails/{id} \
--header 'Content-Type: application/json' \
--header 'X-Kit-Api-Key: <api-key>' \
--data '
{
"subject": "Updated subject",
"preview_text": "Updated preview",
"content": null,
"delay_value": 3,
"delay_unit": "days",
"email_template_id": null,
"published": true,
"send_days": [
"monday",
"wednesday",
"friday"
],
"position": null
}
'require 'uri'
require 'net/http'
url = URI("https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Kit-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subject\": \"Updated subject\",\n \"preview_text\": \"Updated preview\",\n \"content\": null,\n \"delay_value\": 3,\n \"delay_unit\": \"days\",\n \"email_template_id\": null,\n \"published\": true,\n \"send_days\": [\n \"monday\",\n \"wednesday\",\n \"friday\"\n ],\n \"position\": null\n}"
response = http.request(request)
puts response.read_bodyconst options = {
method: 'PUT',
headers: {'X-Kit-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subject: 'Updated subject',
preview_text: 'Updated preview',
content: null,
delay_value: 3,
delay_unit: 'days',
email_template_id: null,
published: true,
send_days: ['monday', 'wednesday', 'friday'],
position: null
})
};
fetch('https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}"
payload := strings.NewReader("{\n \"subject\": \"Updated subject\",\n \"preview_text\": \"Updated preview\",\n \"content\": null,\n \"delay_value\": 3,\n \"delay_unit\": \"days\",\n \"email_template_id\": null,\n \"published\": true,\n \"send_days\": [\n \"monday\",\n \"wednesday\",\n \"friday\"\n ],\n \"position\": null\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Kit-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))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'subject' => 'Updated subject',
'preview_text' => 'Updated preview',
'content' => null,
'delay_value' => 3,
'delay_unit' => 'days',
'email_template_id' => null,
'published' => true,
'send_days' => [
'monday',
'wednesday',
'friday'
],
'position' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Kit-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}"
payload = {
"subject": "Updated subject",
"preview_text": "Updated preview",
"content": None,
"delay_value": 3,
"delay_unit": "days",
"email_template_id": None,
"published": True,
"send_days": ["monday", "wednesday", "friday"],
"position": None
}
headers = {
"X-Kit-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"email": {
"id": 78,
"sequence_id": 197,
"subject": "Updated subject",
"preview_text": "Updated preview",
"email_address": "joe2906@ck.lol",
"email_template_id": null,
"published": true,
"position": null,
"delay_value": 3,
"delay_unit": "days",
"send_days": [
"monday",
"wednesday",
"friday"
],
"content": "Content 44"
}
}{
"errors": [
"The access token is invalid"
]
}{
"errors": [
"Not Found"
]
}{
"errors": [
"delay_unit must be one of: days, hours"
]
}Update a sequence email
Updates any field on a sequence email — subject, preview_text, content, delay_value, delay_unit, send_days, position, email_template_id, or published. Only fields included in the request body change; everything else is preserved.
Note: pass send_days: null to revert a per-email schedule override and inherit the parent sequence’s send_days again. The response will then return all 7 days, indicating no per-email restriction.
Warning: sending send_days on an email with delay_unit: "hours" returns 422 — send_days only applies to day-based emails.
Warning: changing position while subscribers are actively progressing through the sequence can cause emails to be sent out of order or skipped. The same caution applies to flipping published on a position: 0 email — it triggers Kit to process all queued subscribers for that email.
For the sequence-email model and how delay_unit and send_days interact, see Create a sequence email.
curl --request PUT \
--url https://api.kit.com/v4/sequences/{sequence_id}/emails/{id} \
--header 'Content-Type: application/json' \
--header 'X-Kit-Api-Key: <api-key>' \
--data '
{
"subject": "Updated subject",
"preview_text": "Updated preview",
"content": null,
"delay_value": 3,
"delay_unit": "days",
"email_template_id": null,
"published": true,
"send_days": [
"monday",
"wednesday",
"friday"
],
"position": null
}
'require 'uri'
require 'net/http'
url = URI("https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Kit-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subject\": \"Updated subject\",\n \"preview_text\": \"Updated preview\",\n \"content\": null,\n \"delay_value\": 3,\n \"delay_unit\": \"days\",\n \"email_template_id\": null,\n \"published\": true,\n \"send_days\": [\n \"monday\",\n \"wednesday\",\n \"friday\"\n ],\n \"position\": null\n}"
response = http.request(request)
puts response.read_bodyconst options = {
method: 'PUT',
headers: {'X-Kit-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subject: 'Updated subject',
preview_text: 'Updated preview',
content: null,
delay_value: 3,
delay_unit: 'days',
email_template_id: null,
published: true,
send_days: ['monday', 'wednesday', 'friday'],
position: null
})
};
fetch('https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}"
payload := strings.NewReader("{\n \"subject\": \"Updated subject\",\n \"preview_text\": \"Updated preview\",\n \"content\": null,\n \"delay_value\": 3,\n \"delay_unit\": \"days\",\n \"email_template_id\": null,\n \"published\": true,\n \"send_days\": [\n \"monday\",\n \"wednesday\",\n \"friday\"\n ],\n \"position\": null\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Kit-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))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'subject' => 'Updated subject',
'preview_text' => 'Updated preview',
'content' => null,
'delay_value' => 3,
'delay_unit' => 'days',
'email_template_id' => null,
'published' => true,
'send_days' => [
'monday',
'wednesday',
'friday'
],
'position' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Kit-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.kit.com/v4/sequences/{sequence_id}/emails/{id}"
payload = {
"subject": "Updated subject",
"preview_text": "Updated preview",
"content": None,
"delay_value": 3,
"delay_unit": "days",
"email_template_id": None,
"published": True,
"send_days": ["monday", "wednesday", "friday"],
"position": None
}
headers = {
"X-Kit-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"email": {
"id": 78,
"sequence_id": 197,
"subject": "Updated subject",
"preview_text": "Updated preview",
"email_address": "joe2906@ck.lol",
"email_template_id": null,
"published": true,
"position": null,
"delay_value": 3,
"delay_unit": "days",
"send_days": [
"monday",
"wednesday",
"friday"
],
"content": "Content 44"
}
}{
"errors": [
"The access token is invalid"
]
}{
"errors": [
"Not Found"
]
}{
"errors": [
"delay_unit must be one of: days, hours"
]
}Authorizations
Authenticate API requests via an API Key
Body
New subject line for the email
New preview text shown in email clients before the email is opened
New HTML body content of the email
New delay value
New delay unit. Use days for schedule-aware delivery, hours for a fixed hourly delay
days, hours New email template ID for layout and styling. Pass null to clear
Pass true to publish a draft email or false to unpublish it
Days of the week this email may be sent. Pass a subset to restrict delivery, or null to reset to all days (inherits the sequence schedule)
New zero-based position of the email in the sequence
Response
Updates the sequence email and returns its details
Show child attributes
Show child attributes
Related topics
Get a sequence emailDelete a sequence emailChangelogUpdate a sequenceCreate a sequence emailWas this page helpful?