curl --request PUT \
--url https://api.reply.io/v3/schedules/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Updated business hours",
"timezoneId": "Central Standard Time",
"excludeHolidays": true,
"useProspectTimezone": false,
"useFollowUpSchedule": true,
"mainTimings": [
{
"weekDay": "Monday",
"isActive": true,
"timeRanges": [
{
"fromTime": {
"hour": 9,
"minute": 0
},
"toTime": {
"hour": 12,
"minute": 0
}
}
]
}
],
"followUpTimings": [
{
"weekDay": "Monday",
"isActive": true,
"timeRanges": [
{
"fromTime": {
"hour": 14,
"minute": 0
},
"toTime": {
"hour": 17,
"minute": 0
}
}
]
}
]
}
'import requests
url = "https://api.reply.io/v3/schedules/{id}"
payload = {
"name": "Updated business hours",
"timezoneId": "Central Standard Time",
"excludeHolidays": True,
"useProspectTimezone": False,
"useFollowUpSchedule": True,
"mainTimings": [
{
"weekDay": "Monday",
"isActive": True,
"timeRanges": [
{
"fromTime": {
"hour": 9,
"minute": 0
},
"toTime": {
"hour": 12,
"minute": 0
}
}
]
}
],
"followUpTimings": [
{
"weekDay": "Monday",
"isActive": True,
"timeRanges": [
{
"fromTime": {
"hour": 14,
"minute": 0
},
"toTime": {
"hour": 17,
"minute": 0
}
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Updated business hours',
timezoneId: 'Central Standard Time',
excludeHolidays: true,
useProspectTimezone: false,
useFollowUpSchedule: true,
mainTimings: [
{
weekDay: 'Monday',
isActive: true,
timeRanges: [{fromTime: {hour: 9, minute: 0}, toTime: {hour: 12, minute: 0}}]
}
],
followUpTimings: [
{
weekDay: 'Monday',
isActive: true,
timeRanges: [{fromTime: {hour: 14, minute: 0}, toTime: {hour: 17, minute: 0}}]
}
]
})
};
fetch('https://api.reply.io/v3/schedules/{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.reply.io/v3/schedules/{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([
'name' => 'Updated business hours',
'timezoneId' => 'Central Standard Time',
'excludeHolidays' => true,
'useProspectTimezone' => false,
'useFollowUpSchedule' => true,
'mainTimings' => [
[
'weekDay' => 'Monday',
'isActive' => true,
'timeRanges' => [
[
'fromTime' => [
'hour' => 9,
'minute' => 0
],
'toTime' => [
'hour' => 12,
'minute' => 0
]
]
]
]
],
'followUpTimings' => [
[
'weekDay' => 'Monday',
'isActive' => true,
'timeRanges' => [
[
'fromTime' => [
'hour' => 14,
'minute' => 0
],
'toTime' => [
'hour' => 17,
'minute' => 0
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.reply.io/v3/schedules/{id}"
payload := strings.NewReader("{\n \"name\": \"Updated business hours\",\n \"timezoneId\": \"Central Standard Time\",\n \"excludeHolidays\": true,\n \"useProspectTimezone\": false,\n \"useFollowUpSchedule\": true,\n \"mainTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 9,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 12,\n \"minute\": 0\n }\n }\n ]\n }\n ],\n \"followUpTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 14,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 17,\n \"minute\": 0\n }\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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(string(body))
}HttpResponse<String> response = Unirest.put("https://api.reply.io/v3/schedules/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Updated business hours\",\n \"timezoneId\": \"Central Standard Time\",\n \"excludeHolidays\": true,\n \"useProspectTimezone\": false,\n \"useFollowUpSchedule\": true,\n \"mainTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 9,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 12,\n \"minute\": 0\n }\n }\n ]\n }\n ],\n \"followUpTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 14,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 17,\n \"minute\": 0\n }\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/schedules/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Updated business hours\",\n \"timezoneId\": \"Central Standard Time\",\n \"excludeHolidays\": true,\n \"useProspectTimezone\": false,\n \"useFollowUpSchedule\": true,\n \"mainTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 9,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 12,\n \"minute\": 0\n }\n }\n ]\n }\n ],\n \"followUpTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 14,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 17,\n \"minute\": 0\n }\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 1,
"name": "Business hours",
"timezoneId": "Eastern Standard Time",
"excludeHolidays": true,
"useProspectTimezone": false,
"useFollowUpSchedule": false,
"mainTimings": [
{
"weekDay": "Monday",
"isActive": true,
"timeRanges": [
{
"fromTime": {
"hour": 9,
"minute": 0
},
"toTime": {
"hour": 17,
"minute": 0
}
}
]
}
],
"followUpTimings": [],
"isDefault": true,
"status": "active"
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/name",
"detail": "'Name' must not be empty."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ManageScheduler] are denied for userId 123",
"code": "schedule.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "Scheduler with ID 42 not found",
"code": "schedule.notFound"
}{
"title": "Conflict",
"status": 409,
"detail": "Scheduler with name 'My Schedule' already exists",
"code": "schedule.duplicateName"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Retry after 60 seconds."
}Update a schedule
sequences:write scope (or a broader one that includes it).
Replace a schedule in full. Send every value you want to keep, including the complete main and follow-up timings arrays.
curl --request PUT \
--url https://api.reply.io/v3/schedules/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Updated business hours",
"timezoneId": "Central Standard Time",
"excludeHolidays": true,
"useProspectTimezone": false,
"useFollowUpSchedule": true,
"mainTimings": [
{
"weekDay": "Monday",
"isActive": true,
"timeRanges": [
{
"fromTime": {
"hour": 9,
"minute": 0
},
"toTime": {
"hour": 12,
"minute": 0
}
}
]
}
],
"followUpTimings": [
{
"weekDay": "Monday",
"isActive": true,
"timeRanges": [
{
"fromTime": {
"hour": 14,
"minute": 0
},
"toTime": {
"hour": 17,
"minute": 0
}
}
]
}
]
}
'import requests
url = "https://api.reply.io/v3/schedules/{id}"
payload = {
"name": "Updated business hours",
"timezoneId": "Central Standard Time",
"excludeHolidays": True,
"useProspectTimezone": False,
"useFollowUpSchedule": True,
"mainTimings": [
{
"weekDay": "Monday",
"isActive": True,
"timeRanges": [
{
"fromTime": {
"hour": 9,
"minute": 0
},
"toTime": {
"hour": 12,
"minute": 0
}
}
]
}
],
"followUpTimings": [
{
"weekDay": "Monday",
"isActive": True,
"timeRanges": [
{
"fromTime": {
"hour": 14,
"minute": 0
},
"toTime": {
"hour": 17,
"minute": 0
}
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Updated business hours',
timezoneId: 'Central Standard Time',
excludeHolidays: true,
useProspectTimezone: false,
useFollowUpSchedule: true,
mainTimings: [
{
weekDay: 'Monday',
isActive: true,
timeRanges: [{fromTime: {hour: 9, minute: 0}, toTime: {hour: 12, minute: 0}}]
}
],
followUpTimings: [
{
weekDay: 'Monday',
isActive: true,
timeRanges: [{fromTime: {hour: 14, minute: 0}, toTime: {hour: 17, minute: 0}}]
}
]
})
};
fetch('https://api.reply.io/v3/schedules/{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.reply.io/v3/schedules/{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([
'name' => 'Updated business hours',
'timezoneId' => 'Central Standard Time',
'excludeHolidays' => true,
'useProspectTimezone' => false,
'useFollowUpSchedule' => true,
'mainTimings' => [
[
'weekDay' => 'Monday',
'isActive' => true,
'timeRanges' => [
[
'fromTime' => [
'hour' => 9,
'minute' => 0
],
'toTime' => [
'hour' => 12,
'minute' => 0
]
]
]
]
],
'followUpTimings' => [
[
'weekDay' => 'Monday',
'isActive' => true,
'timeRanges' => [
[
'fromTime' => [
'hour' => 14,
'minute' => 0
],
'toTime' => [
'hour' => 17,
'minute' => 0
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.reply.io/v3/schedules/{id}"
payload := strings.NewReader("{\n \"name\": \"Updated business hours\",\n \"timezoneId\": \"Central Standard Time\",\n \"excludeHolidays\": true,\n \"useProspectTimezone\": false,\n \"useFollowUpSchedule\": true,\n \"mainTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 9,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 12,\n \"minute\": 0\n }\n }\n ]\n }\n ],\n \"followUpTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 14,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 17,\n \"minute\": 0\n }\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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(string(body))
}HttpResponse<String> response = Unirest.put("https://api.reply.io/v3/schedules/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Updated business hours\",\n \"timezoneId\": \"Central Standard Time\",\n \"excludeHolidays\": true,\n \"useProspectTimezone\": false,\n \"useFollowUpSchedule\": true,\n \"mainTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 9,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 12,\n \"minute\": 0\n }\n }\n ]\n }\n ],\n \"followUpTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 14,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 17,\n \"minute\": 0\n }\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/schedules/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Updated business hours\",\n \"timezoneId\": \"Central Standard Time\",\n \"excludeHolidays\": true,\n \"useProspectTimezone\": false,\n \"useFollowUpSchedule\": true,\n \"mainTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 9,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 12,\n \"minute\": 0\n }\n }\n ]\n }\n ],\n \"followUpTimings\": [\n {\n \"weekDay\": \"Monday\",\n \"isActive\": true,\n \"timeRanges\": [\n {\n \"fromTime\": {\n \"hour\": 14,\n \"minute\": 0\n },\n \"toTime\": {\n \"hour\": 17,\n \"minute\": 0\n }\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 1,
"name": "Business hours",
"timezoneId": "Eastern Standard Time",
"excludeHolidays": true,
"useProspectTimezone": false,
"useFollowUpSchedule": false,
"mainTimings": [
{
"weekDay": "Monday",
"isActive": true,
"timeRanges": [
{
"fromTime": {
"hour": 9,
"minute": 0
},
"toTime": {
"hour": 17,
"minute": 0
}
}
]
}
],
"followUpTimings": [],
"isDefault": true,
"status": "active"
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/name",
"detail": "'Name' must not be empty."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ManageScheduler] are denied for userId 123",
"code": "schedule.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "Scheduler with ID 42 not found",
"code": "schedule.notFound"
}{
"title": "Conflict",
"status": 409,
"detail": "Scheduler with name 'My Schedule' already exists",
"code": "schedule.duplicateName"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Retry after 60 seconds."
}Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Path Parameters
Schedule ID
Body
Request body for updating an existing schedule.
Name of the schedule
Windows time zone identifier (e.g., "Eastern Standard Time"). IANA identifiers such as "America/New_York" are rejected.
Whether to skip sending on holidays from linked calendars
Whether to use the prospect's timezone instead of the schedule timezone
Whether a separate follow-up schedule is enabled
Primary schedule timings for each day of the week
Show child attributes
Show child attributes
Follow-up schedule timings (used when useFollowUpSchedule is true)
Show child attributes
Show child attributes
Response
Schedule updated successfully
Full representation of a schedule with timing configuration.
Unique identifier for the schedule
Name of the schedule
Windows time zone identifier (e.g., "Eastern Standard Time"). IANA identifiers such as "America/New_York" are rejected.
Whether to skip sending on holidays from linked calendars
Whether to use the prospect's timezone instead of the schedule timezone
Whether a separate follow-up schedule is enabled
Primary schedule timings for each day of the week
Show child attributes
Show child attributes
Follow-up schedule timings (used when useFollowUpSchedule is true)
Show child attributes
Show child attributes
Whether this is the default schedule
Current status of the schedule