cURL
curl --request POST \
--url https://api.finosu.com/customers \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"timezone": "<string>",
"phoneNumber": "<string>",
"taskType": "collections",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": true,
"isTest": false,
"externalMetadata": {
"home_phone": "+14155555555",
"cell_phone": "+14155556666",
"employer_name": "Example employer",
"employer_address": "456 Business Ave",
"employer_city": "San Francisco",
"employer_state": "CA",
"employer_zip": "94103",
"employer_department": "Sales",
"employer_phone": "+14155557777",
"employer_direct_line": "+14155558888",
"pay_frequency": "biweekly",
"pay_day": "Friday"
},
"loanIds": [
123,
456,
789
],
"sync": false,
"loanId": "<string>"
}
'import requests
url = "https://api.finosu.com/customers"
payload = {
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"timezone": "<string>",
"phoneNumber": "<string>",
"taskType": "collections",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": True,
"isTest": False,
"externalMetadata": {
"home_phone": "+14155555555",
"cell_phone": "+14155556666",
"employer_name": "Example employer",
"employer_address": "456 Business Ave",
"employer_city": "San Francisco",
"employer_state": "CA",
"employer_zip": "94103",
"employer_department": "Sales",
"employer_phone": "+14155557777",
"employer_direct_line": "+14155558888",
"pay_frequency": "biweekly",
"pay_day": "Friday"
},
"loanIds": [123, 456, 789],
"sync": False,
"loanId": "<string>"
}
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>',
firstName: '<string>',
lastName: '<string>',
timezone: '<string>',
phoneNumber: '<string>',
taskType: 'collections',
email: '[email protected]',
birthday: '1985-06-15',
ssnLastFour: '1234',
streetAddress1: '123 Main St',
streetAddress2: 'Apt 4B',
city: 'San Francisco',
state: 'CA',
zipCode: '94102',
doNotCall: true,
isTest: false,
externalMetadata: {
home_phone: '+14155555555',
cell_phone: '+14155556666',
employer_name: 'Example employer',
employer_address: '456 Business Ave',
employer_city: 'San Francisco',
employer_state: 'CA',
employer_zip: '94103',
employer_department: 'Sales',
employer_phone: '+14155557777',
employer_direct_line: '+14155558888',
pay_frequency: 'biweekly',
pay_day: 'Friday'
},
loanIds: [123, 456, 789],
sync: false,
loanId: '<string>'
})
};
fetch('https://api.finosu.com/customers', 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",
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>',
'firstName' => '<string>',
'lastName' => '<string>',
'timezone' => '<string>',
'phoneNumber' => '<string>',
'taskType' => 'collections',
'email' => '[email protected]',
'birthday' => '1985-06-15',
'ssnLastFour' => '1234',
'streetAddress1' => '123 Main St',
'streetAddress2' => 'Apt 4B',
'city' => 'San Francisco',
'state' => 'CA',
'zipCode' => '94102',
'doNotCall' => true,
'isTest' => false,
'externalMetadata' => [
'home_phone' => '+14155555555',
'cell_phone' => '+14155556666',
'employer_name' => 'Example employer',
'employer_address' => '456 Business Ave',
'employer_city' => 'San Francisco',
'employer_state' => 'CA',
'employer_zip' => '94103',
'employer_department' => 'Sales',
'employer_phone' => '+14155557777',
'employer_direct_line' => '+14155558888',
'pay_frequency' => 'biweekly',
'pay_day' => 'Friday'
],
'loanIds' => [
123,
456,
789
],
'sync' => false,
'loanId' => '<string>'
]),
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"
payload := strings.NewReader("{\n \"id\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"taskType\": \"collections\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": false,\n \"externalMetadata\": {\n \"home_phone\": \"+14155555555\",\n \"cell_phone\": \"+14155556666\",\n \"employer_name\": \"Example employer\",\n \"employer_address\": \"456 Business Ave\",\n \"employer_city\": \"San Francisco\",\n \"employer_state\": \"CA\",\n \"employer_zip\": \"94103\",\n \"employer_department\": \"Sales\",\n \"employer_phone\": \"+14155557777\",\n \"employer_direct_line\": \"+14155558888\",\n \"pay_frequency\": \"biweekly\",\n \"pay_day\": \"Friday\"\n },\n \"loanIds\": [\n 123,\n 456,\n 789\n ],\n \"sync\": false,\n \"loanId\": \"<string>\"\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")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"taskType\": \"collections\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": false,\n \"externalMetadata\": {\n \"home_phone\": \"+14155555555\",\n \"cell_phone\": \"+14155556666\",\n \"employer_name\": \"Example employer\",\n \"employer_address\": \"456 Business Ave\",\n \"employer_city\": \"San Francisco\",\n \"employer_state\": \"CA\",\n \"employer_zip\": \"94103\",\n \"employer_department\": \"Sales\",\n \"employer_phone\": \"+14155557777\",\n \"employer_direct_line\": \"+14155558888\",\n \"pay_frequency\": \"biweekly\",\n \"pay_day\": \"Friday\"\n },\n \"loanIds\": [\n 123,\n 456,\n 789\n ],\n \"sync\": false,\n \"loanId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers")
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 \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"taskType\": \"collections\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": false,\n \"externalMetadata\": {\n \"home_phone\": \"+14155555555\",\n \"cell_phone\": \"+14155556666\",\n \"employer_name\": \"Example employer\",\n \"employer_address\": \"456 Business Ave\",\n \"employer_city\": \"San Francisco\",\n \"employer_state\": \"CA\",\n \"employer_zip\": \"94103\",\n \"employer_department\": \"Sales\",\n \"employer_phone\": \"+14155557777\",\n \"employer_direct_line\": \"+14155558888\",\n \"pay_frequency\": \"biweekly\",\n \"pay_day\": \"Friday\"\n },\n \"loanIds\": [\n 123,\n 456,\n 789\n ],\n \"sync\": false,\n \"loanId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"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,
"doNotText": true,
"doNotEmail": true,
"bankruptcy": true,
"debtConsolidation": true,
"deceased": true,
"militaryStatus": true,
"legalThreat": true,
"isTest": true,
"taskType": "<string>",
"externalMetadata": {}
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Customers
Create a Customer
Creates a new customer
POST
/
customers
cURL
curl --request POST \
--url https://api.finosu.com/customers \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"timezone": "<string>",
"phoneNumber": "<string>",
"taskType": "collections",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": true,
"isTest": false,
"externalMetadata": {
"home_phone": "+14155555555",
"cell_phone": "+14155556666",
"employer_name": "Example employer",
"employer_address": "456 Business Ave",
"employer_city": "San Francisco",
"employer_state": "CA",
"employer_zip": "94103",
"employer_department": "Sales",
"employer_phone": "+14155557777",
"employer_direct_line": "+14155558888",
"pay_frequency": "biweekly",
"pay_day": "Friday"
},
"loanIds": [
123,
456,
789
],
"sync": false,
"loanId": "<string>"
}
'import requests
url = "https://api.finosu.com/customers"
payload = {
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"timezone": "<string>",
"phoneNumber": "<string>",
"taskType": "collections",
"email": "[email protected]",
"birthday": "1985-06-15",
"ssnLastFour": "1234",
"streetAddress1": "123 Main St",
"streetAddress2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"zipCode": "94102",
"doNotCall": True,
"isTest": False,
"externalMetadata": {
"home_phone": "+14155555555",
"cell_phone": "+14155556666",
"employer_name": "Example employer",
"employer_address": "456 Business Ave",
"employer_city": "San Francisco",
"employer_state": "CA",
"employer_zip": "94103",
"employer_department": "Sales",
"employer_phone": "+14155557777",
"employer_direct_line": "+14155558888",
"pay_frequency": "biweekly",
"pay_day": "Friday"
},
"loanIds": [123, 456, 789],
"sync": False,
"loanId": "<string>"
}
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>',
firstName: '<string>',
lastName: '<string>',
timezone: '<string>',
phoneNumber: '<string>',
taskType: 'collections',
email: '[email protected]',
birthday: '1985-06-15',
ssnLastFour: '1234',
streetAddress1: '123 Main St',
streetAddress2: 'Apt 4B',
city: 'San Francisco',
state: 'CA',
zipCode: '94102',
doNotCall: true,
isTest: false,
externalMetadata: {
home_phone: '+14155555555',
cell_phone: '+14155556666',
employer_name: 'Example employer',
employer_address: '456 Business Ave',
employer_city: 'San Francisco',
employer_state: 'CA',
employer_zip: '94103',
employer_department: 'Sales',
employer_phone: '+14155557777',
employer_direct_line: '+14155558888',
pay_frequency: 'biweekly',
pay_day: 'Friday'
},
loanIds: [123, 456, 789],
sync: false,
loanId: '<string>'
})
};
fetch('https://api.finosu.com/customers', 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",
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>',
'firstName' => '<string>',
'lastName' => '<string>',
'timezone' => '<string>',
'phoneNumber' => '<string>',
'taskType' => 'collections',
'email' => '[email protected]',
'birthday' => '1985-06-15',
'ssnLastFour' => '1234',
'streetAddress1' => '123 Main St',
'streetAddress2' => 'Apt 4B',
'city' => 'San Francisco',
'state' => 'CA',
'zipCode' => '94102',
'doNotCall' => true,
'isTest' => false,
'externalMetadata' => [
'home_phone' => '+14155555555',
'cell_phone' => '+14155556666',
'employer_name' => 'Example employer',
'employer_address' => '456 Business Ave',
'employer_city' => 'San Francisco',
'employer_state' => 'CA',
'employer_zip' => '94103',
'employer_department' => 'Sales',
'employer_phone' => '+14155557777',
'employer_direct_line' => '+14155558888',
'pay_frequency' => 'biweekly',
'pay_day' => 'Friday'
],
'loanIds' => [
123,
456,
789
],
'sync' => false,
'loanId' => '<string>'
]),
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"
payload := strings.NewReader("{\n \"id\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"taskType\": \"collections\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": false,\n \"externalMetadata\": {\n \"home_phone\": \"+14155555555\",\n \"cell_phone\": \"+14155556666\",\n \"employer_name\": \"Example employer\",\n \"employer_address\": \"456 Business Ave\",\n \"employer_city\": \"San Francisco\",\n \"employer_state\": \"CA\",\n \"employer_zip\": \"94103\",\n \"employer_department\": \"Sales\",\n \"employer_phone\": \"+14155557777\",\n \"employer_direct_line\": \"+14155558888\",\n \"pay_frequency\": \"biweekly\",\n \"pay_day\": \"Friday\"\n },\n \"loanIds\": [\n 123,\n 456,\n 789\n ],\n \"sync\": false,\n \"loanId\": \"<string>\"\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")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"taskType\": \"collections\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": false,\n \"externalMetadata\": {\n \"home_phone\": \"+14155555555\",\n \"cell_phone\": \"+14155556666\",\n \"employer_name\": \"Example employer\",\n \"employer_address\": \"456 Business Ave\",\n \"employer_city\": \"San Francisco\",\n \"employer_state\": \"CA\",\n \"employer_zip\": \"94103\",\n \"employer_department\": \"Sales\",\n \"employer_phone\": \"+14155557777\",\n \"employer_direct_line\": \"+14155558888\",\n \"pay_frequency\": \"biweekly\",\n \"pay_day\": \"Friday\"\n },\n \"loanIds\": [\n 123,\n 456,\n 789\n ],\n \"sync\": false,\n \"loanId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers")
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 \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"taskType\": \"collections\",\n \"email\": \"[email protected]\",\n \"birthday\": \"1985-06-15\",\n \"ssnLastFour\": \"1234\",\n \"streetAddress1\": \"123 Main St\",\n \"streetAddress2\": \"Apt 4B\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94102\",\n \"doNotCall\": true,\n \"isTest\": false,\n \"externalMetadata\": {\n \"home_phone\": \"+14155555555\",\n \"cell_phone\": \"+14155556666\",\n \"employer_name\": \"Example employer\",\n \"employer_address\": \"456 Business Ave\",\n \"employer_city\": \"San Francisco\",\n \"employer_state\": \"CA\",\n \"employer_zip\": \"94103\",\n \"employer_department\": \"Sales\",\n \"employer_phone\": \"+14155557777\",\n \"employer_direct_line\": \"+14155558888\",\n \"pay_frequency\": \"biweekly\",\n \"pay_day\": \"Friday\"\n },\n \"loanIds\": [\n 123,\n 456,\n 789\n ],\n \"sync\": false,\n \"loanId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"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,
"doNotText": true,
"doNotEmail": true,
"bankruptcy": true,
"debtConsolidation": true,
"deceased": true,
"militaryStatus": true,
"legalThreat": true,
"isTest": true,
"taskType": "<string>",
"externalMetadata": {}
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Upcoming Contract Changes
The required-field contract for this endpoint is changing.birthday and ssnLastFour (optional
today) will become required; state (today required unless sync: true) becomes required in all
cases; email/phoneNumber and timezone/zipCode become at-least-one pairs; and loanId is
being removed in favor of loanIds.
One part is already live: validation failures now return 422, as described below. The remaining request fields documented on this page
reflect what is enforced today, and we will give partners ample time to adjust before introducing any
breaking changes. See Upcoming API Changes for the new contract, the
rationale, and migration examples.
Required Fields
Always required:id- Your customer reference ID; should match your internal system’s 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) - Valid task types depend on your company configuration. If an invalid task type is provided for your company, the API will return a422 Unprocessable Contenterror with a list of valid task types.
sync: true (when sync is enabled these are auto-fetched from your LMS — see below):
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)
birthday- Customer birthday (YYYY-MM-DD format) - Used for identity verification on calls. Will become required — see Upcoming API Changes.ssnLastFour- Last 4 digits of SSN - Used for identity verification on calls. Will become required — see Upcoming API Changes.streetAddress2- Street address line 2doNotCall- Whether to mark customer for Do Not Call (default: false)externalMetadata- Custom JSON object with additional customer dataloanIds- Array of loan IDs to import
422 Unprocessable Content naming the fields, e.g.
{"detail": "Missing required fields: firstName, timezone"}.
Existing Customers
If a customer with the sameid already exists for your company, this endpoint updates that
customer in place and still returns 201. Provided fields overwrite the stored values; omitted
optional fields (including externalMetadata) are preserved.
Response Body
The API returns all fields that were provided in the request body, along with any computed fields. This includes:- Basic Information:
id,firstName,lastName,email,phoneNumber,timezone - Personal Information:
birthday,ssnLastFour - Address Information:
streetAddress1,streetAddress2,city,state,zipCode - Configuration:
taskType,doNotCall,doNotText,doNotEmail,isTest - Custom Data:
externalMetadata- The complete metadata object you provided
Test Customers
You can mark a customer as a test customer by settingisTest to true in the request body. Test customers are useful for development and testing purposes and can be filtered separately when retrieving customers.
The same field is returned as isTest on every customer response.
External Metadata
TheexternalMetadata field allows you to store additional custom data about the customer as a JSON object. This is particularly useful for storing:
- Employer Information: Company name, address, department, contact details
- Pay Schedule: Pay frequency and pay day information
- Additional Contact Information: Multiple phone numbers and contact methods
- Custom Fields: Any other customer-specific data your system needs to track
LMS Auto-Fetch (sync)
If your company has a Loan Management System integrated with Finosu, you can use thesync field to automatically fetch customer data instead of providing it manually.
- Default:
false— all fields must be provided in the request - When
true: The API uses theidfield as the customer ID in your LMS and auto-fetches any missing fields (name, email, SSN, birthday, phone, address, zip, timezone) - Caller-supplied values take precedence — if you provide a field, the LMS value is not used
- Timezone is auto-resolved from the ZIP when omitted. An unresolvable ZIP defaults to
America/New_York; if both timezone and ZIP are absent after fetching, the request returns422for missing timezone. - The
idmust be numeric whensyncistrue
{
"id": "12345",
"taskType": "YourTaskType",
"sync": true
}
id, taskType, and sync: true — the rest is fetched from your LMS automatically. Contact your Finosu account manager to enable LMS integration for your company.
Loan IDs (Optional)
For companies with an LMS integration, theloanIds field specifies which loans should be imported for the customer when creating them:
- Format: Array of integers (e.g.,
[123, 456, 789]) - Behavior: If provided, only the specified loans will be fetched and imported. If omitted, all loans for the customer will be imported.
- Use Case: Useful when you only want to import specific loans instead of all loans associated with the customer. To import exactly one loan, pass a single-element array (e.g.,
[67890]).
Loan ID (Deprecated)
TheloanId field (string) is deprecated. It never selects loans to import — use loanIds for
that, passing a single-element array for one loan. For origination-boarding records at companies
explicitly configured for the supported LMS origination integration, loanId is read as the LMS application reference; on all other
records it is ignored. It will be removed in a future update. See
Upcoming API Changes.
Validation and LMS failures
Invalid caller-suppliedbirthday, phoneNumber, or timezone values return 422 for both new and
existing customers. With sync: true, a failed LMS fetch or invalid contact data returned by
the LMS returns 502, not 422. Malformed optional LMS birthdays are skipped;
an existing birthday is preserved. Unexpected internal failures remain 500.
A 5xx response does not guarantee that retrying a write is safe. Follow the operation’s
idempotency behavior and use bounded retries; do not retry unchanged invalid input.Body
application/json
Customer to add
Customer creation payload. NOTE: the required-field contract for this endpoint is changing — see the Upcoming API Changes page (/api-reference/upcoming-changes) for the new contract.
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. UPCOMING: at least one of timezone or zipCode will be required, and timezone will be derived from zipCode when omitted — see /api-reference/upcoming-changes.
Customer email address. Required unless sync is true. UPCOMING: at least one of email or phoneNumber will be required — see /api-reference/upcoming-changes.
Example:
Response
Customer response