Summary
We are tightening the required-field contract onPOST /customers and POST /customers/batch
so that every customer we board arrives with the data needed to contact them lawfully and verify their
identity. Two redundant fields are being removed at the same time.
Nothing on this page is enforced yet. Requests that are valid today remain valid until further notice.
We will give partners ample time to adjust before introducing any breaking changes — you will be
notified well in advance so you can migrate on your own schedule rather than in response to a failure.
Endpoints affected:
POST /customersPOST /customers/batch(same per-customer payload)
POST /customers/schedule/sync, PUT /customers/{id}, and every loan,
call, text, and payment endpoint.
What is changing
id, taskType, streetAddress1, and city are unchanged. streetAddress2, doNotCall,
externalMetadata, and loanIds remain optional.
Why each change
At least one ofemail or phoneNumber. Every customer needs at least one channel we can reach
them on — a record with neither cannot be worked. Today phoneNumber is unconditionally required,
which turns away email-only accounts. Relaxing that while requiring one of the pair is both stricter
in effect and more flexible in practice.
At least one of timezone or zipCode. We may only place calls during hours permitted by the
borrower’s local time, so TCPA compliance depends on knowing where they are. Supplying either is
sufficient: when timezone is omitted we derive it from zipCode. If the ZIP cannot be resolved to a
timezone, the request is rejected with 400 rather than silently defaulting — a wrong timezone means
calls placed outside legal hours.
state always required. State determines which lending and collections rules apply to the
account, and several states are restricted per-portfolio. We need it regardless of how the rest of the
record was populated.
birthday and ssnLastFour required. Both are used to verify a borrower’s identity before
discussing account details on a call. Without them, an agent cannot complete verification and the
conversation cannot proceed.
test → isTest. The API already returns isTest on every customer response, but accepts test
on the way in. Aligning the write field to the read field removes a needless asymmetry.
loanId removed. On POST /customers this field is accepted and then ignored — it has never had
any effect. loanIds is the field that actually controls which loans are imported, so a single loan
ID belongs there as a one-element array.
Migrating your payload
A request that is valid today:birthday and ssnLastFour added, test renamed to
isTest, loanId moved into loanIds:
loanIds is an array of integers, not strings.
Because email/phoneNumber and timezone/zipCode are at-least-one pairs, a minimal payload only
needs one of each:
What you can do now vs. what to wait for
Read this section carefully if you plan to migrate early — some of the new fields are not yet wired up. Safe to do now:- Start sending
birthday,ssnLastFour, andstateon every request. All three are already accepted and stored today; they are simply not yet enforced. - Move a single
loanIdvalue intoloanIds.loanIdsis already honored;loanIdis already ignored on this endpoint, so there is no behavior to lose.
- Do not switch
testtoisTestuntil we confirm the change is live.isTestis not accepted on the request today and unknown fields are ignored, so a payload sendingisTest: truewould silently create a non-test customer. Keep sendingtestuntil you are notified.
- Dropping
phoneNumber(relying onemailalone) or droppingtimezone(relying onzipCodealone). Both are unconditionally required today and omitting either returns a400until the new contract takes effect.
Error behavior
Missing required fields return400 Bad Request with the offending fields named, in the same shape
used today:
zipCode that
cannot be resolved to a timezone also returns 400.