curl --request POST \
--url https://api.finosu.com/customers/schedule/sync \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"id": "<string>",
"taskType": "Collections",
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"timezone": "<string>",
"phoneNumber": "<string>",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": true,
"isTest": true,
"test": true,
"externalMetadata": {},
"sync": false,
"loanId": "<string>",
"scheduleMode": "replace"
}
'import requests
url = "https://api.finosu.com/customers/schedule/sync"
payload = {
"id": "<string>",
"taskType": "Collections",
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"timezone": "<string>",
"phoneNumber": "<string>",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": True,
"isTest": True,
"test": True,
"externalMetadata": {},
"sync": False,
"loanId": "<string>",
"scheduleMode": "replace"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
id: '<string>',
taskType: 'Collections',
firstName: '<string>',
lastName: '<string>',
email: '[email protected]',
birthday: '1985-06-15',
ssnLastFour: '1234',
timezone: '<string>',
phoneNumber: '<string>',
streetAddress1: '123 Main St',
streetAddress2: 'Apt 4B',
city: 'San Francisco',
state: 'CA',
zipCode: '94102',
doNotCall: true,
isTest: true,
test: true,
externalMetadata: {},
sync: false,
loanId: '<string>',
scheduleMode: 'replace'
})
};
fetch('https://api.finosu.com/customers/schedule/sync', 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.finosu.com/customers/schedule/sync",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => '<string>',
'taskType' => 'Collections',
'firstName' => '<string>',
'lastName' => '<string>',
'email' => '[email protected]',
'birthday' => '1985-06-15',
'ssnLastFour' => '1234',
'timezone' => '<string>',
'phoneNumber' => '<string>',
'streetAddress1' => '123 Main St',
'streetAddress2' => 'Apt 4B',
'city' => 'San Francisco',
'state' => 'CA',
'zipCode' => '94102',
'doNotCall' => true,
'isTest' => true,
'test' => true,
'externalMetadata' => [
],
'sync' => false,
'loanId' => '<string>',
'scheduleMode' => 'replace'
]),
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.finosu.com/customers/schedule/sync"
payload := strings.NewReader("{\n \"id\": \"<string>\",\n \"taskType\": \"Collections\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": true,\n \"test\": true,\n \"externalMetadata\": {},\n \"sync\": false,\n \"loanId\": \"<string>\",\n \"scheduleMode\": \"replace\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.finosu.com/customers/schedule/sync")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"<string>\",\n \"taskType\": \"Collections\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": true,\n \"test\": true,\n \"externalMetadata\": {},\n \"sync\": false,\n \"loanId\": \"<string>\",\n \"scheduleMode\": \"replace\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers/schedule/sync")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": \"<string>\",\n \"taskType\": \"Collections\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": true,\n \"test\": true,\n \"externalMetadata\": {},\n \"sync\": false,\n \"loanId\": \"<string>\",\n \"scheduleMode\": \"replace\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"scheduleCreated": true,
"tasksCreated": 1,
"existingTasksRemoved": 0,
"email": "[email protected]",
"birthday": "2023-12-25",
"ssnLastFour": "<string>",
"timezone": "<string>",
"phoneNumber": "<string>",
"streetAddress1": "<string>",
"streetAddress2": "<string>",
"city": "<string>",
"state": "<string>",
"zipCode": "<string>",
"doNotCall": true,
"isTest": true,
"taskType": "<string>",
"externalMetadata": {}
}{
"error": 123,
"message": "<string>"
}{
"detail": "<string>"
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}Customer Schedule Sync
Sync a customer schedule. Omit scheduleMode or use replace for the existing replacement behavior. Explicitly use enroll for company-enabled application enrollment that preserves cadence progress and requires an Idempotency-Key.
curl --request POST \
--url https://api.finosu.com/customers/schedule/sync \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"id": "<string>",
"taskType": "Collections",
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"timezone": "<string>",
"phoneNumber": "<string>",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": true,
"isTest": true,
"test": true,
"externalMetadata": {},
"sync": false,
"loanId": "<string>",
"scheduleMode": "replace"
}
'import requests
url = "https://api.finosu.com/customers/schedule/sync"
payload = {
"id": "<string>",
"taskType": "Collections",
"firstName": "<string>",
"lastName": "<string>",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"timezone": "<string>",
"phoneNumber": "<string>",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": True,
"isTest": True,
"test": True,
"externalMetadata": {},
"sync": False,
"loanId": "<string>",
"scheduleMode": "replace"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
id: '<string>',
taskType: 'Collections',
firstName: '<string>',
lastName: '<string>',
email: '[email protected]',
birthday: '1985-06-15',
ssnLastFour: '1234',
timezone: '<string>',
phoneNumber: '<string>',
streetAddress1: '123 Main St',
streetAddress2: 'Apt 4B',
city: 'San Francisco',
state: 'CA',
zipCode: '94102',
doNotCall: true,
isTest: true,
test: true,
externalMetadata: {},
sync: false,
loanId: '<string>',
scheduleMode: 'replace'
})
};
fetch('https://api.finosu.com/customers/schedule/sync', 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.finosu.com/customers/schedule/sync",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => '<string>',
'taskType' => 'Collections',
'firstName' => '<string>',
'lastName' => '<string>',
'email' => '[email protected]',
'birthday' => '1985-06-15',
'ssnLastFour' => '1234',
'timezone' => '<string>',
'phoneNumber' => '<string>',
'streetAddress1' => '123 Main St',
'streetAddress2' => 'Apt 4B',
'city' => 'San Francisco',
'state' => 'CA',
'zipCode' => '94102',
'doNotCall' => true,
'isTest' => true,
'test' => true,
'externalMetadata' => [
],
'sync' => false,
'loanId' => '<string>',
'scheduleMode' => 'replace'
]),
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.finosu.com/customers/schedule/sync"
payload := strings.NewReader("{\n \"id\": \"<string>\",\n \"taskType\": \"Collections\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": true,\n \"test\": true,\n \"externalMetadata\": {},\n \"sync\": false,\n \"loanId\": \"<string>\",\n \"scheduleMode\": \"replace\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.finosu.com/customers/schedule/sync")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"<string>\",\n \"taskType\": \"Collections\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": true,\n \"test\": true,\n \"externalMetadata\": {},\n \"sync\": false,\n \"loanId\": \"<string>\",\n \"scheduleMode\": \"replace\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers/schedule/sync")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": \"<string>\",\n \"taskType\": \"Collections\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": true,\n \"test\": true,\n \"externalMetadata\": {},\n \"sync\": false,\n \"loanId\": \"<string>\",\n \"scheduleMode\": \"replace\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"scheduleCreated": true,
"tasksCreated": 1,
"existingTasksRemoved": 0,
"email": "[email protected]",
"birthday": "2023-12-25",
"ssnLastFour": "<string>",
"timezone": "<string>",
"phoneNumber": "<string>",
"streetAddress1": "<string>",
"streetAddress2": "<string>",
"city": "<string>",
"state": "<string>",
"zipCode": "<string>",
"doNotCall": true,
"isTest": true,
"taskType": "<string>",
"externalMetadata": {}
}{
"error": 123,
"message": "<string>"
}{
"detail": "<string>"
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}{
"detail": {
"code": "<string>",
"message": "<string>"
}
}Choose a schedule mode
POST /customers/schedule/sync is one endpoint with two different operations.
Choose the mode before using the request schema or sending a request.
| Intent | scheduleMode | Guide |
|---|---|---|
| Enroll a new application or returning borrower in an enabled origination cadence, preserving existing progress on retries | "enroll" — explicit and required, with Idempotency-Key | Enroll an Application |
| Intentionally replace a customer’s pending schedules using an existing account integration | "replace" or omitted | Replacement behavior below |
scheduleMode: "enroll" and Idempotency-Key.
scheduleMode selects replacement behavior. It does not enroll an
application. Do not omit it when retrying an origination request.Replacement behavior
The remainder of this page describes replacement mode only. Enrollment has its own required fields, response receipt, and conflict rules in the linked guide. Existing replacement integrations do not need to add an idempotency header.Overview
Replacement mode creates or updates the customer and runs the account’s configured scheduling workflow. Where replacement proceeds, it cancels active call, email, and SMS schedules and their eligible pending communications before creating replacement schedules. Its effects are not limited to voice calls. Company and task-type support are checked independently of origination enrollment. Some integrations require an eligible active loan; the request can save the customer without creating a schedule when that requirement is not met. Existing schedule preservation also depends on the configured workflow. Do not interpret HTTP200 alone as a new cadence or an unconditional cancellation of all activity.
Repeating a replacement request can change schedule IDs and restart cadence
timing. It does not provide the durable replay semantics of enrollment mode.
Authentication
Authentication viaX-API-Key header. See Authentication for details.
Request Body
For replacement mode, use theSyncCustomerSchedule request schema with
scheduleMode: "replace" or omit scheduleMode. Its fields are described below.
For origination enrollment, use OriginationEnrollmentRequest with
scheduleMode: "enroll" and an Idempotency-Key header. See
Enroll an Application
for its required fields and examples. Both schemas use POST /customers/schedule/sync.
loanIds is not a scheduling input here. Enrollment-only fields such as
mobilePhone, oneOff, and cadence ages are ignored in replacement mode, so
sending them does not select an origination cadence.
This endpoint keeps its required fields and its loanId parameter. It participates in the
test → isTest migration: isTest is accepted now,
and test is deprecated and removed on 25 October 2026, the same date as customer creation
and batch enrollment. See the sync and enrollment window.
Always Required
id and taskType must be sent in the request. The remaining core fields below
must be available after optional LMS fetching; with sync: true, supported LMS
integrations can fill them before validation.
id- External customer reference ID (required)firstName- Customer’s first name (required)lastName- Customer’s last name (required)phoneNumber- Customer’s phone number (required) - Used for automated calling and SMS communicationstimezone- Customer’s timezone as an IANA timezone name (e.g., “America/New_York”, “America/Los_Angeles”, “America/Chicago”) (required) - Required for TCPA compliance to ensure calls are made during appropriate hours. Must be a valid IANA timezone identifier.taskType- Task type for customer’s call schedule (required)
Required unless sync: true
email- Customer email address (required)streetAddress1- Street address line 1 (required)city- City name (required)state- State code (e.g., “NY”, “CA”) (required)zipCode- ZIP/postal code (required)
Optional Fields
birthday- Customer birthday (YYYY-MM-DD format)ssnLastFour- Last 4 digits of SSNdoNotCall- Whether to mark customer for Do Not Call (optional; if not provided, existing value is preserved)isTest- Mark customer as test customer (optional; if not provided, the existing value is preserved). Replaces the deprecatedtestfieldtest- Deprecated, removed on 25 October 2026. Still accepted and still honored; sendisTestinstead. Sending both with different values is rejected with400externalMetadata- Custom JSON object with additional customer datastreetAddress2- Street address line 2loanId- External loan reference used by configured LMS workflows; supplying it does not itself enable notes or other write-backsync- Whentrue, auto-fetch missing customer data from your company’s LMS (default:false). See the Create Customer endpoint for details.
Response Body
Replacement mode returns the saved customer fields defined by the response model, along with scheduling counters. Optional fields can benull. This includes:
- Basic Information:
id,firstName,lastName,email,phoneNumber,timezone - Personal Information:
birthday,ssnLastFour - Address Information:
streetAddress1,streetAddress2,city,state,zipCode - Configuration:
taskType,doNotCall,isTest - Custom Data:
externalMetadata- The complete metadata object you provided - Sync Metadata:
scheduleCreated,tasksCreated,existingTasksRemoved- Information about the sync operation performed
loanId is not returned as a top-level customer field. The flag is returned as isTest, which is
now also the name to send it under.
replace mode, omitting the flag entirely leaves the customer’s existing value alone. Until 25 September 2026 a sync
that omitted test silently cleared it, un-marking an existing test customer; that is fixed.Sync Metadata Fields
In addition to all the customer fields, the response includes three metadata fields that describe the sync operation:-
scheduleCreated(boolean): Whether the configured workflow created a replacement schedule. A phone and timezone alone do not guarantee this; eligible loans and account configuration also matter. -
tasksCreated(integer): The workflow’s initial task counter, generally one per created schedule. It is not the total number of future calls in a cadence. Enrollment uses this field differently, as described in its guide. -
existingTasksRemoved(integer): Currently returned as0in replacement mode, including when existing schedules are cancelled. Do not use it to count cancellations or infer that no previous communications changed.
Schedule Creation
The response will indicate whether the schedule was successfully created via thescheduleCreated field.
Do Not Call Validation
If an existing customer is already marked as Do Not Call, the endpoint will return a 400 error unless you explicitly setdoNotCall: false in the request.
Behavior:
- If
doNotCallis not provided (omitted from request) and the customer has Do Not Call status → Error (prevents accidental schedule creation) - If
doNotCall: trueand the customer has Do Not Call status → Error (attempting to maintain Do Not Call while creating schedule) - If
doNotCall: falseand the customer has Do Not Call status → Success (explicitly removing Do Not Call and creating schedule) - If
doNotCallis not provided and the customer does NOT have Do Not Call status → Success (preserves existing state)
Idempotency
Replacement mode upserts the customer and may rebuild their pending schedules. It does not record anIdempotency-Key receipt. Confirm the current schedule
before repeating a request whose outcome is uncertain. Enrollment mode provides
durable retry receipts without resetting cadence progress.
Use Cases
This endpoint is useful for:- Re-syncing customer data from external systems
- Resetting call schedules after customer information changes
- Individual customer resyncs in an existing integration; this endpoint accepts one customer per request
- Integration workflows that intentionally replace pending schedules
Authorizations
Headers
Required only for scheduleMode=enroll. Reuse this key and the same payload when retrying. Scoped to your API-key company.
1 - 128^[A-Za-z0-9._:-]{1,128}$Body
Choose the enrollment schema for scheduleMode=enroll (requires Idempotency-Key), or the replacement schema for scheduleMode=replace or omitted. See the Origination guide for enrollment examples.
- Option 1
- OriginationEnrollmentRequest
Replacement-mode request. Send id and taskType. Unless sync is true, also send the core contact fields, email, and address listed below. With sync=true, a supported LMS must supply any missing core contact fields before scheduling. This contract is independent of Create Customer and origination enrollment.
Unique identifier for the customer. This is your customer reference and should match your internal system's ID.
Type of tasks to create for the customer's automated call schedule. Valid values depend on company configuration.
"Collections"
The first name of the customer. Required unless sync=true supplies it from a supported LMS.
The last name of the customer. Required unless sync=true supplies it from a supported LMS.
Customer email address. Required unless sync is true.
Customer birthday in YYYY-MM-DD format
"1985-06-15"
Last 4 digits of SSN
"1234"
Timezone of the customer (IANA timezone name, e.g., 'America/New_York', 'America/Los_Angeles'). Required for TCPA compliance so calls are placed during permitted hours. Required unless sync=true supplies it from a supported LMS.
Phone number of the customer. Required unless sync=true supplies it from a supported LMS.
Street address line 1. Required unless sync is true.
"123 Main St"
Street address line 2 (optional)
"Apt 4B"
City. Required unless sync is true.
"San Francisco"
State code. Required unless sync is true.
"CA"
ZIP/postal code. Required unless sync is true.
"94102"
Do not call the customer. If omitted, the existing value is preserved.
Mark customer as test customer. Matches the isTest field returned on every customer response, and replaces the deprecated test field. When omitted, the customer's existing value is preserved.
DEPRECATED — use isTest. Still accepted and still honored, and removed on 2026-10-25. Sending both test and isTest is allowed while they agree; conflicting values are rejected with 400. See /api-reference/upcoming-changes.
Additional custom metadata about the customer (e.g. employer information, pay schedule, additional contact details)
When true, auto-fetch missing customer data from your integrated lending system. Defaults to false.
External loan reference used by configured LMS workflows. Supplying it does not itself enable notes or other write-back.
Omit or use replace to retain the existing customer schedule replacement behavior.
replace Response
Customer schedule synced successfully
- Option 1
- Option 2
Replacement mode returns saved customer data. Enrollment mode builds customer fields from the normalized request alongside a saved scheduling receipt; phoneNumber falls back to mobilePhone and doNotCall is always false. Enrollment fields are not a read of the current customer record or proof of current calling eligibility. Optional fields may be null.
Customer ID (reference_id)
Customer's first name
Customer's last name
Whether a new schedule was created during this sync operation
true
Replacement: initial task counter, generally one per created schedule, not total future calls. Enrollment: receipt scheduledCallCount when status is scheduled, otherwise 0. Replays retain original counters.
1
Currently 0 in both modes. Replacement may still cancel schedules; this field is not a cancellation count.
0
Customer email address
Customer birthday in YYYY-MM-DD format
Last 4 digits of SSN
Timezone of the customer (IANA timezone name, e.g., 'America/New_York', 'America/Los_Angeles')
Phone number of the customer
Street address line 1
Street address line 2 (optional)
City name
State code (e.g., NY, CA)
ZIP/postal code
Do not call the customer
Indicates if this is a test customer
Type of tasks created for the customer's automated call schedule
Additional custom metadata about the customer