This API is organized around REST.
Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
You can use the API in test mode, which does not affect your live data. The API key you use to authenticate the request determines whether the request is in live mode or test mode.
Peach Finance API utilizes cursor-based pagination via the startingAfter
and endingBefore
parameters. Both parameters take an existing Object ID value and return objects in reverse chronological order. The endingBefore
parameter returns objects listed before the named object. The startingAfter
parameter returns objects listed after the named object. If both parameters are provided, only endingBefore
is used.
The size of the page can be limited using the limit
parameter. limit
is optional; the default is 25 and can be between 1 and 100. Sending both startingBefore
and endingAfter
is not currently supported.
Some endpoints will allow sending a sortBy
parameter, enumerating the fields that can be used to sort the results returned by that particular endpoint. For example, if the results can be sorted by createdAt
and updatedAt
, then sending sortBy=[updatedAt, -createdAt]
will return the results sorted by updatedAt
in ascending order and createdAt
in descending order lexicographically.
Some Peach objects have a metaData
attribute. You can use this attribute to pass key-value data as part of an object.
Metadata can be used when you need to store additional information on an object. Metadata is not used by Peach. It is stored as part of an object and returned to you.
Do not store any personal identifiable information (such as SSN) as metadata. Use dedicated attributes for PII as these attributes are encrypted.
Note: Metadata attribute can hold up to 50 keys, with key names up to 100 characters long and values up to 500 characters long.
Some Peach attributes use common formats.
YYYY-MM-DD
. Dates are computed relative to either2001-01-01T12:00:00Z
or with UTC offset like 2001-01-01T12:00:00-07:00
. Some date-times will include subsecond precision to an arbitrary number of digits like 2001-01-01T12:00:00.123Z
.Peach objects always have unique identifiers created by Peach. Some objects support external IDs. If external ID is supported, the object will have externalId
attribute. You can fetch objects using external ID (only objects that support external IDs). Peach IDs have the same format XX-YYYY-YYYY.
XX - is a prefix from the list below.
YYYY-YYYY - is a random set of numbers and letters (capital characters A-Z and digits 1-9). The digit zero is not used to avoid confusion with capital letter O.
External IDs allows avoiding the need to map IDs between your system and Peach. You can pass your IDs when creating various objects at Peach and then use the same IDs to fetch the information back.
When fetching data with external IDs or when sending a request that requires a reference to an object using its external ID (for example, inside a body of a POST request), there is a need to add a ext-
in front of the ID. This will make sure Peach knows these are external IDs being used.
For example, fetching a borrower using the external ID would look like GET /api/people/ext-MY_EXTERNAL_BORROWER_ID
.
When creating objects with external IDs, the ext-
prefix is not needed. For example, when creating a new borrower the body would look like:
POST /api/people
{
"externalId" : "MY_EXTERNAL_BORROWER_ID"
...
}
Prefix | Object |
---|---|
UR | User |
BO | Borrower |
BN | Person Name |
BI | Person Identity |
CT | Contact |
LT | Loan Type |
IR | Investor |
LN | Loan |
LN | Loan Draw |
LA | Installment Advances |
CP | Company |
TX | Transaction |
EV | Event |
EM | Event Message |
PT | Payment Instrument |
PA | Payment ID |
DD | Document Descriptor |
FT | Fee Type |
MS | Person Monitoring Status |
CS | Case |
CE | Case Type |
AP | Autopay |
IN | Interaction |
DT | Do Not Interact Type |
DN | Do Not Interact |
NT | Notification Type |
NO | Notification |
TD | Template Descriptor |
TV | Template Version |
CO | Code |
CR | Compliance Rule |
SR | Service |
FD | FEMA Disaster Details |
NT | Note |
CN | Consent |
LR | Legal Representative |
RL | Role |
PM | Permission |
WT | Workflow Type |
ST | Workflow Step Type |
IT | Workflow Item Type |
WF | Workflow |
WS | Workflow Step |
WI | Workflow Workitem |
VT | Verification Type |
VE | Verification |
VA | Verification Attempt |
OB | Obligation |
RE | Repayment Notification Descriptor |
LP | Loan People |
RA | InterestRate |
PE | Period (loan) |
IA | Loan Investor Association |
SE | Settlement |
RF | Loan Refund |
SM | Statement |
SA | Statement Activity |
SD | Statement Draw Info |
LF | Loan Fee |
AE | Autopay Expected Payment |
FE | FEMA Disaster |
TY | Loan Tape Type |
TA | Loan Tape |
MR | Merchant |
LS | Loan Reporting Status |
CA | Credit Agency |
CL | Collection Agency |
CI | Card Issuer |
WH | Webhook |
AF | ACHFile Upload Monitoring |
FB | Funding Account Balance |
BC | Borrower Campaign |
RN | Campaign Run |
CX | Contact Exporter |
TC | Transaction Chargeback |
PS | Promise to Pay Plan |
P2 | Promise to Pay Period |
LL | Loan Label |
AK | API Key |
AT | AI Call Transcription Result |
SU | AI Call Summary Result |
Our system supports pull events via our REST API. You can see more information here.
Compliance Guard covers core regulatory obligations related to servicing and collections. It does not cover rules required for debt collection agencies (though some of them are applicable to creditors and servicers as a best practice.)
Compliance Guard allows you to:
Peach ensures consistency of the loan's ledger and balances. In order to make sure that multiple operations are not writing to the ledger at the same time, Peach uses locks to protect the consistency of the loan.
In situations where an API call affects a loan's ledger, the system will lock the loan to protect its consistency. Subsequent calls that affect that loan's ledger might return a 423 Locked
status if the loan is still locked. In these cases, you can make a call to Lock Status to check if the loan is still locked.
If you are trying to make a call and get 423 Locked
, consider polling on the Lock Status to check when the lock is released. Most locks are short. Some API calls (e.g. retroactive interest adjustment or payment backdate) can trigger a loan replay. Loan replays can last several minutes, during which the loan will be locked.
Most of the API endpoints are asynchronous by design. There are situations in which you might want to wait until the API call/operation finishes. Some API endpoints have a special query parameter called sync
.
For example:
When sync=true
, the call will be blocked until the async operation has finished. If the operation takes too long, you will get a 408 Request Timeout
response. In that case, you need to poll on that specific operations' result. For example: if you make a call to add a Payment Instrument, and it times out, you can poll the /payment-instruments
endpoint to see if the new payment instrument has been added.
BETA - Standardization of error response bodies is in progress.
Peach uses conventional HTTP response codes to indicate the success or failure of an API request. In general, codes in the 2xx range indicate success, codes in the 4xx range indicate an error that resulted from the provided information (e.g., a required parameter was missing), and codes in the 5xx range indicate an error with the Peach service. Error response bodies have the following JSON format:
{
"statusCode": 400,
"message": "A description of the error.",
"errorType": "TheErrorType"
}
For a list of error types, see the Errors section.
https://sandboxapi.peach.finance/api/
Identity objects represent various forms of identification that a borrower may have. We allow one primary identity per borrower, and any number of secondary identities. The identity sent when creating a borrower is the primary identity, and cannot be deleted/archived or changed to be a secondary identity.
This object allows you to add and manage a Borrower's contact information. A Borrower can have an "unlimited" number of contacts. However, it is important to properly create key contact objects.
Peach Borrower Portal (if used by the lender), shows the following contacts only:
EMAIL
contactType=email, label=personal or work, affiliation=self, status=primary.
MOBILE PHONE
contactType=phone, label=personal, affiliation=self, status=primary.
HOME PHONE
contactType=phone, label=home, affiliation=self, status=secondary.
HOME ADDRESS
contactType=address, label=home, affiliation=self, status=primary.
The Peach system sends notices (e.g. payment reminder) to borrowers (if configured by the lender). In order for a notice to be sent successfully, both contact object and template must exist. If a contact cannot be found, the system will not send a notice. The system will try to find the following contact objects:
Email notices: contactType=email, valid=true, affiliation=self, status=primary (if "primary" is not found, the system searches for "secondary" and then for "additional")
Text message/SMS notices: contactType=phone, valid=true, affiliation=self, receiveTextMessages=true, label=personal, status=primary (if "primary" is not found, the system searches for "secondary" and then for "additional")
This object allows you to add or create documents related to a borrower. There are multiple ways to use document object:
To create a new document there are two steps:
When a new document is rendered from the template you just need to complete step #1.
A borrower verification session represents the question and response flow for an agent to verify the identity of a human who purports to be a particular borrower. For instance, upon receiving a phone call, an agent would initiate a borrower verification, ask the questions to the borrower, and enter their responses. A set of responses are either correct (thus verifying the human as the borrower) or they are incorrect.
The agent is never shown the correct answers, so privacy risks are minimized and socially engineered security attacks are mitigated.
The campaign feature allows lenders to create a list of borrower contacts that meet certain criteria, for consumption by auto-dialer systems. For example, if the "Auto-create collection cases" procedure is configured along with the auto-close feature you can create a query that looks at the open collection cases to understand what borrowers you consider to still be delinquent after starting collections on them. You can then layer on which cases have been snoozed and/or do not have scheduled calls. The campaign feature has two basic components. The Campaign, is a query that collects a list of borrowers to contact that can be triggered at predefined intervals. The Contact Exporter defines how and where the contacts are delivered. Multiple Campaigns can use a single Exporter. The lender can create and maintain a list of Campaigns and Contact Exporters as needed.
This object allows you to create custom Campaigns. A Campaign is characterized by a set of rules, defined as a SQL query created in Redash and associated with the Campaign. A Campaign can be triggered at predefined intervals. For example, a Campaign can be triggered every day to add borrowers who are 30 days past due. Campaigns can also be manually triggered. When a Campaign is triggered by schedule or manually, a query is executed against the lender's replica data and returns a list of person IDs. The output is sent to the configured Contact Exporter to be written as a configurable CSV file with contact information required by auto dialers and other systems.
A bulk sender object represents a campaign worker which sends messages to the borrowers returned by a campaign's query results.
For each row returned by the campaign a message is sent via the Send endpoint.
In order for a bulk sender to function, at a minimum the campaign's query results must return at least the column borrowerId
. For more details on required columns see per-InteractionSubject
documentation for Campaign run.
If no channel
is specified the campaign will send to all channels with a defined template.
This object allows you to add cases to a borrower that are relevant to servicing or collections. For example, a bankruptcy case. A borrower can have multiple cases. If you enabled Compliance Guard monitoring feature, we'll create a new case every time a borrower matches to one of the external data sources we use. For example, if you monitor for active military, and we match one of your borrowers to the SCRA (https://scra.dmdc.osd.mil/scra/) database we'll create a new case with type=militaryDuty
.
This object allows you to create custom case types. You then can create case instances from a case type. Peach has a predefined collection of special case types, such as bankruptcy
, identityTheft
, and more. You can use any of the special types as your base case type. To customize your case type you can:
Do Not Interact Types
If you don't want to use any of the special predefined case types, then use generic
as your base type.
The Smart Reviews system allows for creating reminder tasks in the Peach CRM based on certain key events or triggers. For example, a trigger could be when a borrower starts military service.
At creation time, all case types are supplied with a default smart review configuration that is disabled by default. Smart review tasks can be enabled by setting the smartReviews.enable
flag.
This object allows for the management of many cases across a number of borrowers. That is to say that a supercase can create, manage, and close many cases at once.
This is particularly useful if an issue occurs which affects a large group of borrowers.
subcases
/cases
endpoint)Managing "who" is affected by a supercase is an important aspect of supercases:
member
of a supercase is one "borrower-loan" pairing.population
is a set of members added at once.population
's membership may be changed until it is "committed" by setting isDraft: false
, at which time the memberships are locked and subcases are created.This object allows you to block interactions on a borrower; and must be connected with a case. You can create multiple Do Not Interact instances on a borrower but only one instance on a case. There are two ways to create Do Not Interacts:
Manually - after a case is created, you can manually create Do Not Interact objects on any borrower case.
In bulk on a Supercase, on the related subcases. See Create Do Not Interact instances on all subcases for more details.
This object allows you to create custom Do Not Interact Types
which will create Do Not Interact
instances automatically when case conditions are met. For example, when a new bankruptcy
case is initiated
, the system can automatically create Do Not Interact
to block debt collection related interactions for 30 calendar days.
The conditions are set in the following way. There are two triggers and one condition fields that you can configure:
onStatus
- triggered based on the case status.onOutcome
- triggered based on the case outcome.onCondition
- condition(s) based on case fields values.You must provide at least one trigger, onStatus
or onOutcome
, when creating a new Do Not Interact Type
object.
Few examples:
onStatus=processing
, onOutcome=null
, onCondition=null
- the Do Not Interact
instance will be created when the case status is changed to processing
.onStatus=completed
, onOutcome=approved
, onCondition=null
- the Do Not Interact
instance will be created when the case status is changed to completed
and the outcome is approved
.Do Not Interact Types
must be associated with Case Types
. A Do Not Interact Type
object can be associated with multiple Case Types
.
This object allows you to create custom Notification Types
which will create interaction
instances (such as emails, text messages, etc.) automatically when case conditions are met. For example, when a new bankruptcy
case is initiated
, the system can automatically send an email notification and ask the borrower to provide supporting documents.
The conditions are set in the following way. There are two triggers and one condition fields that you can configure:
onStatus
- triggered based on the case status.onOutcome
- triggered based on the case outcome.onCondition
- condition(s) based on case fields values.You must provide at least one trigger, onStatus
or onOutcome
, when creating a new Notification Type
object.
Few examples:
onStatus=processing
, onOutcome=null
, onCondition=null
- the interaction
instance will be created when the case status is changed to processing
.onStatus=completed
, onOutcome=approved
, onCondition=null
- the interaction
instance will be created when the case status is changed to completed
and the outcome is approved
.Notification Types
must be associated with Case Types
. A Notification Type
object can be associated with multiple Case Types
.
Task-Worker Pairing Configs are used to configure the behavior of tasks in the CRM. A TWPC is used to define the rules for how tasks are assigned to agents (i.e., workers).
In order to configure a TWPC you need to understand the contents of task and worker objects. See the List Unterminated Task endpoint and the List Workers endpoint for more details.
Borrowers typically have loans. We support multiple loan types and each loan type comes with its set of federal and state compliance rules. You can maintain different statuses of a loan. A borrower can have multiple loans. A loan can belong to multiple people, but only one borrower can be defined as a mainBorrower
. A loan is always created using the mainBorrower
borrower identifier. Other people can be added as part of the loan details.
All loan attributes can be updated as long as the loan is in pending
status. Once the loan status changes to originated
attributes of atOrigination
object become read only and cannot be updated.
A Loan doesn't start accruing interest until it is activated. To activate the loan, call Activate a loan
. On activation the loan can use the due dates and payments schedule from the atOrigination
object or the loan can be re-amortized using the activation date as the loan start date.
This object represents an installment advance (also called loan proceeds or loan disbursements). Advances should be used for installment loans of type "multiple advances". Advances can be made on Loan objects only. To clarify, Advances cannot be made on Line of Credit objects. Advances increase principal balance of a Loan. Each advance has a unique identifier.
This object represents a draw. Draws can be made on Line of Credit loans only. Draws can be amortized or non-amortized. If amortized, the draw will be amortized over the selected number of periods and aligned to the Line of Credit due dates. If non-amortized, the draw is due on a due date following the current period statement creation. A draw can have different interest and promo rates from the Line of Credit. Each draw has a unique identifier, similar to a loan.
This object represents a line of credit purchase. Purchases can be made on Draw objects only. Purchases of type regular increase principal balance of a Draw. Some purchase types, such as cashBack
or refund
are actually reduce the principal balance of a Draw. Each purchase has a unique identifier.
This object represents the expected loan payments on due dates. Expected payments are what we expect to receive from a borrower on a specific date. Expected payments are created as a result of loan amortization. The amounts and due dates can change during lifetime of a loan. For example, a borrower might change due dates frequency from monthly
to weekly
and it will lower periodic payment amount.
This object represents information on the borrower's obligation for a given loan period. It also provides information on the current status of the fulfillment of the obligation vis-Ã -vis the amount due and the due date. The obligation is dynamically changing as a result of factors such as payments and service credits made, and the crossing over of due dates.
Payment plans are a specific type of hardship tool that can be used to create a temporary loan schedule for a borrower. Lenders can create a payment plan by specifying the paymentPlanType
, numberOfPeriods
and amount
. After the numberOfPeriods
ends, any remaining periods of the loan will be paid according to the originally scheduled recurring amount and frequency of the loan at the time when the payment plan was created.
When the agreed upon recurring payment plan amount
is less than the originally scheduled payment amount, the system uses isExtendLoanDuration
to ascertain whether to keep the existing loan duration
or automatically extend the original loan duration
.
When the agreed upon recurring payment plan amount
is more than the originally scheduled recurring amount, the loan duration
will be shortened to the point where the remaining balance of the loan is paid off.
Only one active payment plan is allowed at a time. Please note that creating an active payment plan will overwrite changes made to the loan schedule such as due date deferrals, change due date, and change loan terms. This is because the payment plan by design creates a new loan schedule.
If a loan is on a payment plan, other hardship tools cannot be used. Lenders must cancel the payment plan and then make any required loan modifications.
Payment plan is presently for installment only.
This object represents a Promise to Pay Plan
. A Promise to Pay Plan
is a group of Promise to Pay Periods— unscheduled payments that was verbally committed by a borrower. Promise to Pay Plan
s are defined on an account level. Promise to Pay Plan
s are not guaranteed payments. They are used to track verbal commitments made by borrowers.
Note: When creating or updating a Promise to Pay Plan
, either pass a schedule
object, or pass schedule descriptor attributes— startDate
, frequency
, specificDays
, duration
and amount
. Mixing the two approaches is not allowed.
This object represents the interest and promo rates of the loan. You can modify interest and promo rates at any time. If a rate is modified or added with an effective date in the past, we will recalculate loan balances retroactively and future expected payments from the effective date. If a rate is modified or added with effective date in the future, we will recalculate future expected payments only.
This object represents line of credit (e.g. credit card) or loan (e.g. personal installment) statement. Each statement is associated with one due date.
For lines of credit, statements are created one calendar day after the period end date. The number of dates between a statement creation and a due date can be configured by lenders, but are normally 14 or 21 days.
For installments, there are two options for when statements can be created:
Render the template and return as a JSON response.
It selects an appropriate Template Descriptor (matching subject
, channel
), and renders the active Template Version with the given context
.
The three contents are returned in a single JSON response, they are contentHtml
, contentText
and subjectLine
.
NOTE: This is different from the /render
endpoints because it does not return a file but rather the simple text-respresentation of the rendered templates that would be used in rendering a file. It is generally easier to test and debug the rendered templates as JSON strings rather than, for instance a PDF file.
Template selectors and the data.
The channel where interactions with a borrower occur. For example, an outbound call with a borrower is considered a voice
interaction.
DEPRECATED: The fax
channel is deprecated: new interactions cannot be created with the fax
channel. It will be removed from completely in the future.
The template version ID (like TV-AAAA-BBBB
) or template descriptor ID (like TD-AAAA-BBBB
) to use.
If a template descriptor is given, then the current template descriptor's activeVersionId
is used.
This should be used in special cases where you do not want to use the implicit template selected by the subject
and channel
fields.
The subject of the interaction. The subject identifies the category of the content in the message.
Most subjects have an associated implicit theme. e.g., loanOverdueFirstNotice
has a theme of opsCollDebt
. For these subjects it is not necessary to specify a theme.
Some subjects like freeForm
and custom<N>
do not have an implicit theme. When using these subjects you must specify a theme
.
DEPRECATED: locStatementGenerated
and locStatementRegenerated
are deprecated. They will be automatically converted into statementGenerated
and statementRegenerated
respectively. You should switch to use those subjects directly.
DEPRECATED: failedSettlementPeach
is deprecated. This was always a subject used by the Peach application internally, and will no longer be used. Attempts to set this subject will be rejected with a 400 error.
https://sandboxapi.peach.finance/api/communicator/preview
curl -i -X POST \
https://sandboxapi.peach.finance/api/communicator/preview \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"caseId": "string",
"channel": "voice",
"context": {},
"loanId": "string",
"overrideTemplateId": "TV-AAAA-BBBB",
"personId": "string",
"subject": "annualPrivacyPolicyNotice"
}'
{ "contentHtml": "string", "contentText": "string", "subjectLine": "string" }
Render a template for "free-form" emails and return is as JSON.
A free-form message is one that can contain any content.
Templates previewed via this endpoint will be free-form but still be branded. i.e., they will use the freeFormBranded
interaction subject, not freeForm
.
This returns the three contents of a template in a single JSON response, they are contentHtml
, contentText
and subjectLine
.
Subject line and content of the free form email.
https://sandboxapi.peach.finance/api/communicator/preview-free-form-email
curl -i -X POST \
https://sandboxapi.peach.finance/api/communicator/preview-free-form-email \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"contentHtml": "string",
"contentPlain": "string",
"subjectLine": "string"
}'
{ "contentHtml": "string", "contentText": "string", "subjectLine": "string" }
Receive a message.
This is different from a normal /interactions
creation because it creates the interaction and also performs associated "inbound message" actions:
handleInboundInteraction
or handleUnboundInboundInteraction
).The reason why an interaction occurred.
For example:
opsCollDebt
.opsServicing
.opsServicing
.DEPRECATED: inbBug
, inbHumanLove
, and opsServicingNegativeCreditReportNotice
are deprecated: you cannot create or update interactions to have these values.
Start time of the interaction. If not provided we'll assume it's a timestamp of the API call. If time of day is not required provide only date.
For CRM-managed voice
interactions, an inbound
call is considered started when the CRM system answers the call, and an outbound
call is considered started when the CRM system initiates the call.
The status of an interaction.
status
is important, as it can impact future interactions. For instance, in jurisdictions which cap the number of outbound collection communications to a borrower, status=failed
interactions do not count against the legal allotment.
Interaction status
can be updated as the interaction status changes. For example, when an email is sent, set the status to attempted
. If the email is opened, set the status to succeeded
. If the email bounces, set the status to failed
. attempted
is assumed to be a successful interaction. Optionally, you can also use 'statusDetails' to provide additional details about status.
Some interactions—like an email—take place at a single point in time, others might be ongoing for many minutes—like a phone call.
Ongoing interactions like voice and chat may have their status set to inProgress
.
Some interactions might be scheduled for the future. These interactions have a status of scheduled
. If this scheduled interaction is unscheduled then it has a status of canceled
.
Note that null
is not a valid status name but rather can be used to specify a query for interactions with a status
of null
Provides more details about the status of an interaction.
Note that statusDetails
related to the "technical" status of an interaction: e.g., Did it connect? Did it fail to send? Was it blocked by Compliance Guard?
For the "human" outcome of an interaction see agentOutcome
: e.g., Did you talk the person you intended to? Did the other chat recipient become unresponsive?
Certain status details must have a particular status
associated with them; attempting to use them otherwise will result in an error.
The following status details are considered status=succeeded
emailDelivered
- The email was successfully deliveredemailOpened
- The email was openedemailClick
- A link in the email was clickedletterDelivered
- The letter is successfully deliveredchatRead
- The chat message was readThe following status details are considered status=attempted
.
voiceReceivedOutsideOpenHours
- Caller tried to contact the lender outside designated business hoursvoiceConnected
- Voice call connected successfullyemailSent
- Email was sent, but delivery cannot be confirmedletterCreated
- Letter is successfully createdletterRenderedPdf
- Letter's PDF proof is successfully renderedletterRenderedThumbnails
- Letter's thumbnails are successfully renderedletterInTransit
- Letter received an "In Transit" eventletterInLocalArea
- Letter is in the local arealetterProcessedForDelivery
- Letter is in the local arealetterRerouted
- Letter is re-routedchatPosted
- Chat message senttextConvoTimeoutAutoclose
- This text conversation was closed automatically due to a timeout.textConvoClosedStale
- (DEPRECATED) An open but outdated text conversation was closed automatically when a new text conversation was started. New text conversations should never enter into this state, but old conversations may be in this state.textConvoClosedByAgent
- The agent manually marked the text conversation as ended.The following status details are considered status=failed
.
Generally an interaction is failed
if some part of connecting or completing the interaction failed due to a technical failure, misconfiguration, or attempt to communicate in a way disallowed by rules.
emailBlocked
- Receiving server could not or would not accept the message temporarilyemailBounced
- Receiving server could not or would not accept mail to this recipient permanentlyemailDropped
- Email rejected for a number of reasons: rejected as SPAM, Unsubscribed Address, Bounced Address, Email InvalidemailFailedToSend
- Not currently in use - reserved for future useemailReportedAsSpam
- Email was delivered, but later reported as SPAM by recipientletterDeleted
- Letter is successfully canceledletterFailedToCreate
- Request to create the letter failed. Provider did not return 200 OK status codeletterReturnedToSender
- Letter is returned to the sendertextA2PCampaignUnregistered
- The text was not sent because the lender has not registered this phone number with an A2P campaign.textAccountSuspended
- The account was suspended between message queuing and delivery.textCarrierViolation
- The message was flagged as 'objectionable' or 'spam' by the phone carrier and was blocked.textConvoUnknownNumberRejected
- This text was received from an unknown number, and so was rejected.textDeviceUnreachable
- The destination phone number temporarily could not be reached - it was turned off, out of service area, etc.textLandlineOrUnreachableCarrier
- The destination phone number could not receive the message. Reasons include the destination number being a landline phone or the carrier being temporarily unavailable.textLenderDisabledInboundTexts
- The inbound text was not received because the lender does not have inbound texting enabled.textMessageBlocked
- The destination phone number is blocked from receiving the message.textMessagePriceExceedsMax
- The price of the message exceeds the max price parameter.textMissingSegment
- One or more parts of a multipart message were not received.textNumberDisconnected
- The destination phone number could not be reached and may be disconnected.textQueueOverflow
- Too many messages were queued to be sent, and some were dropped as a result.textRegionInvalid
- Permission to send an SMS or MMS has not been enabled for the region indicated by the 'To' numbertextUnknownError
- An unknown error occurred when attempting to send the message.textUnsubscribedRecipient
- The person you are trying to message has opted out of receiving messages from your Twilio phone number, Channels sender, or Messaging Service.voiceFailedToInitiate
- Outbound voice call could not start for some reasonvoiceLenderDisabledInboundCalls
- Inbound call received while lender has inbound voice call disabledvoiceNumberDisconnected
- Outbound voice call to disconnected phone numbervoiceNumberInvalid
- Invalid 'To' Phone NumbervoiceReceivedNoAgentsAvailable
- Inbound call received while lender had no agents to answer itvoiceNumberDisconnected
can only be used for interactions with channel=voice
. Using them otherwise will result in an errorinvalidContact
and blockedByComplianceGuard
are valid for all channelsCertain status details are only valid with certain direction
settings. Using them with an invalid direction
will result in an error. For example...
voiceReceivedNoAgentsAvailable
can only be set for inbound
phone callsvoiceNumberDisconnected
can only be set for outbound
phone callsvoiceUnexpectedDisconnect
can be set for either directionNote that null
is not a valid status name but rather can be used to specify a query for interactions with a status
of null
The subject of the interaction. The subject identifies the category of the content in the message.
Most subjects have an associated implicit theme. e.g., loanOverdueFirstNotice
has a theme of opsCollDebt
. For these subjects it is not necessary to specify a theme.
Some subjects like freeForm
and custom<N>
do not have an implicit theme. When using these subjects you must specify a theme
.
DEPRECATED: locStatementGenerated
and locStatementRegenerated
are deprecated. They will be automatically converted into statementGenerated
and statementRegenerated
respectively. You should switch to use those subjects directly.
DEPRECATED: failedSettlementPeach
is deprecated. This was always a subject used by the Peach application internally, and will no longer be used. Attempts to set this subject will be rejected with a 400 error.
The reason why an interaction occurred.
For example:
opsCollDebt
.opsServicing
.opsServicing
.DEPRECATED: inbBug
, inbHumanLove
, and opsServicingNegativeCreditReportNotice
are deprecated: you cannot create or update interactions to have these values.
Provides details on the outcome of the interaction according to an agent.
Note this captures the "human" outcome of an interaction: e.g., Did you talk the person you intended to? Did the other chat recipient become unresponsive?
For the "technical" status of an interaction, see statusDetails
. e.g., : Did it fail to send? Was it blocked by Compliance Guard?
voiceSpokeWithFirstParty
- Agent spoke with borrowervoiceSpokeWithThirdParty
- Agent spoke with someone other than the borrowervoiceLeftVoicemail
- Agent left voicemailvoiceReachedVoicemailNoMessageLeft
- Agent reached voicemail but did not leave a messagevoiceRangNoPickup
- Phone rang, no voicemail was reached, and the call ended, or the agent hung upvoiceLineBusyNoRing
- Agent reached busy phone linevoicePickedHungUp
- Agent heard call pick up and immediate hang upvoiceDisconnectedWhileQueuedOnHold
- Caller hung up while on holdvoiceUnexpectedDisconnect
- The call was unexpectedly disconnectedvoiceFailedToInitiate
- Outbound voice call could not start for some reasonvoiceNumberDisconnected
- Outbound voice call to disconnected phone numberRepresents various users such as a borrower, co-borrower, co-signer, etc. A lender can choose to provide PII or not. If no PII is provided, Peach cannot monitor for bankruptcy, deceased and SCRA.
The Compliance Guard rule identifier that blocked the interaction. Only applicable if the statusDetails=blockedByComplianceGuard
and a rule actually blocked the interaction. In some cases the interaction can be blocked before rules are checked (e.g. a borrower is missing an address). In such a case the complianceGuardRuleId
will be empty/null.
The contact details. A contact can be email, phone, address, etc. The name
attribute is optional, and is useful for third-party contacts such as spouse, attorney, etc.
The lender's identifier of the contact information.
This should not include any ext-
prefix as we know this is an external ID field.
End time of the interaction. This attribute is optional and is used for logging only.
For CRM-managed voice
interactions, a call is considered ended when either the borrower or the agent disconnects.
The lender's identifier for the interaction.
After the object is successfully created, a lender can use ID or externalId identifiers to fetch the object.
To fetch the object using externalId you need to add ext-
to the URL.
Note: Don't add ext- to the identifier value. For example: if the external identifier is ABCDE
, then pass externalId=ACBCE and NOT ext-ABCDE when creating the object.
Detailed text describing the failure reason and any appropriate actions the user may take to fix the issue.
Short text describing the failure reason. Normally displayed in UI.
Boolean indicating the source of an Interaction. If true
, the interaction was supplied by the lender via API. If false
, the interaction was created by Peach.
true
when this interaction is considered "transactional".
Transactional interactions are those which are sent via an automated system in response to an event or some action taken. e.g., an email sent to confirm a payment was made is transactional; likewise an email sent to confirm a password change is transacrtional. Examples of non-transactional messages would be: those sent by an agent in response to a customer request, for collections, or for marketing.
It's important to mark these messages correctly, because different laws may apply to messages depending on if they're considered "transactional".
Note: Can be null
for interactions sent before the transactional-ness was added to the API.
The last task that was terminated (completed or canceled) for this interaction.
The ID of a Loan. This marks a particular loan as associated with this interaction.
The IDs of several loans. This marks several loans as associated with this interaction.
If a previous interaction identifier is provided, the current and previous interactions will be linked. This can either be Peach's or a lender's external identifier.
Set this flag if this interaction has sensitive information. The flag is used for proper authorization of access to the information.
https://sandboxapi.peach.finance/api/communicator/receive
curl -i -X POST \
https://sandboxapi.peach.finance/api/communicator/receive \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"channel": "fax",
"content": {},
"createdAt": "2019-08-24T14:15:22Z",
"deletedAt": "2019-08-24T14:15:22Z",
"id": "string",
"updatedAt": "2019-08-24T14:15:22Z",
"borrowerSelectedTheme": "agentNotification",
"contactId": "string",
"metaData": {},
"personId": "string",
"scheduledAtFrom": "2019-08-24T14:15:22Z",
"scheduledAtTo": "2019-08-24T14:15:22Z",
"startedAt": "2019-08-24T14:15:22Z",
"status": "attempted",
"statusDetails": "voiceSpokeWithFirstParty",
"subject": "annualPrivacyPolicyNotice",
"theme": "agentNotification",
"agentOutcome": "voiceSpokeWithFirstParty",
"borrower": {
"createdAt": "2019-08-24T14:15:22Z",
"deletedAt": "2019-08-24T14:15:22Z",
"id": "string",
"updatedAt": "2019-08-24T14:15:22Z",
"borrowerType": "person",
"collectionsIntensity": "light",
"commPreferences": {
"sendRemindersWhenCurrent": true,
"statementDeliveryChannels": [
"email"
]
},
"companyId": "string",
"externalId": "string",
"metaData": {},
"monitorStartDate": "2019-08-24",
"status": "active"
},
"complianceGuardRuleId": "string",
"contact": {
"createdAt": "2019-08-24T14:15:22Z",
"deletedAt": "2019-08-24T14:15:22Z",
"id": "string",
"updatedAt": "2019-08-24T14:15:22Z",
"address": {
"POBox": "string",
"addressLine1": "string",
"addressLine2": "string",
"city": "string",
"country": "string",
"countyOrRegion": "string",
"postalCode": "string",
"state": "strin"
},
"affiliation": "self",
"authorizedThirdParty": false,
"contactType": "phone",
"externalId": "string",
"label": "personal",
"name": "string",
"phoneDisconnectionDetails": {
"disconnectionStatus": "disconnected",
"lastDisconnectCheckDate": "2019-08-24",
"lastKnownConnectionDate": "2019-08-24"
},
"powerOfAttorney": false,
"receiveTextMessages": false,
"status": "primary",
"valid": true,
"value": "string",
"verified": false
},
"contactExternalId": "string",
"direction": "outbound",
"endedAt": "2019-08-24T14:15:22Z",
"externalId": "string",
"failureDescriptionLong": "string",
"failureDescriptionShort": "string",
"isExternal": true,
"isTransactional": true,
"lastTaskMeta": {
"assignedEmployee": {
"firstName": "string",
"id": "string",
"lastName": "string",
"userId": "string"
},
"assignmentStatus": "completed",
"sid": "string",
"taskInitAt": "2019-08-24T14:15:22Z",
"taskType": "answerInboundVoiceCall"
},
"loanId": "LN-AAAA-BBBB",
"loanIds": [
"LN-AAAA-BBBB",
"LB-CCCC-DDDD"
],
"previousInteractionId": "string",
"sensitive": false,
"twilioErrorCode": "string"
}'
{ "message": "string", "status": 0, "data": { "channel": "string", "content": null, "createdAt": "2019-08-24T14:15:22Z", "deletedAt": "2019-08-24T14:15:22Z", "id": "string", "updatedAt": "2019-08-24T14:15:22Z", "borrowerSelectedTheme": "agentNotification", "contactId": "string", "metaData": {}, "personId": "string", "scheduledAtFrom": "2019-08-24T14:15:22Z", "scheduledAtTo": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "status": "attempted", "statusDetails": "voiceSpokeWithFirstParty", "subject": "annualPrivacyPolicyNotice", "theme": "agentNotification", "agentOutcome": "voiceSpokeWithFirstParty", "agentOutcomeUpdatedAt": "2019-08-24T14:15:22Z", "borrower": { … }, "companyId": "string", "complianceGuardRuleId": "string", "contact": { … }, "createdBy": { … }, "direction": "outbound", "endedAt": "2019-08-24T14:15:22Z", "externalId": "string", "failureDescriptionLong": "string", "failureDescriptionShort": "string", "isExternal": true, "isTransactional": true, "lastTaskMeta": { … }, "loanId": "LN-AAAA-BBBB", "loanIds": [ … ], "object": "interaction", "previousInteractionId": "string", "sendAt": "2019-08-24T14:15:22Z", "sensitive": false, "sensitiveBorrowerOnly": false, "statusDetailsUpdatedAt": "2019-08-24T14:15:22Z", "statusUpdatedAt": "2019-08-24T14:15:22Z", "supercaseBulkOperationId": "string", "templateVersionId": "string", "twilioErrorCode": "string" } }
Interactions represent communications with a borrower.
Whenever Peach communicates with a borrower an interaction is recorded.
Additionally, communications taking place outside of Peach should be recorded as interactions.
Past interactions information is used by Compliance Guard to make decisions about when and how it is appropriate to communicate again with a borrower.
Peach allows clients to bring their own/partner bank to process ACH payments. If configured, the Peach system will create NACHA files and upload them to the provided destination (SFTP). The Peach system will download NACHA return files from the same destination. Make sure you coordinate this setup with the Peach team.
NACHA requires bank accounts to be verified. If you are using Peach system to process ACH payments, borrowers have two options to verify their bank account:
Please note the following logic of how Peach system selects payment processor for micro-deposits. A payment method is associated with a borrower object instead of a specific loan because the same method can be used to pay multiple loans.
default=true
, the system will use the default=true
payment processor to initiate micro-deposits.default=true
, the system will use the default=true
payment processor to initiate micro-deposits.pending
, originated
, active
, frozen
, accelerated
, chargedOff
] of ONE loan type only, the system will use that loan type's ACH payment processor for micro-deposits. If the loan type doesn't have an ACH payment processor associated, the system will use the default=true
processor to initiate micro-deposits.pending
, originated
, active
, frozen
, accelerated
, chargedOff
] of more than one loan type, the system will use the default=true
processor to initiate micro-deposits.Allows lenders to keep track of merchants associated with loans and purchases. Merchant details can be shown in the Peach Borrower Portal. The following attributes are shown to a borrower:
NAME
businessName
ADDRESS
address
DEPARTMENT OR CONTACT NAME
primaryContactName
EMAIL
primaryContactEmail
PHONE
primaryContactPhone
This object represents an event. Events are sent from Peach to you. Events can be related to any object in this API.
Event Name | Occurs when | Related Object |
---|---|---|
advance.statuschanged | an advance status changes | Advance |
advance.updated | an advance amount is updated | Advance |
autopay.schedule.created | an autopay schedule is set up | Autopay |
autopay.schedule.cancel | an autopay schedule is canceled | Autopay |
autopay.schedule.changed | an autopay schedule is changed | Autopay |
autopay.payment.rescheduled | an autopay payment is rescheduled | Autopay |
autopay.payment.canceled | an autopay payment is canceled | Autopay |
card.created | a card is created | Card |
card.replacement.requested | a card replacement is requested | Card |
card.status.changed | a card's status is changed | Card |
case.changed | a case is created, updated, or deleted, with precise change information | Case |
case.created | [DEPRECATED - use case.changed instead] a case is created | Case |
case.deleted | [DEPRECATED - use case.changed instead] a case is deleted | Case |
case.updated | [DEPRECATED - use case.changed instead] a case is updated | Case |
case.association.added | an association is added to a case | Case |
case.association.removed | an association is removed from a case | Case |
case.donotinteract.changed | a DoNotInteract object is created, updated, or deleted, with precise change information | Case |
case.donotinteract.created | [DEPRECATED - use case.donotinteract.changed instead] a DoNotInteract object is created | Case |
case.donotinteract.deleted | [DEPRECATED - use case.donotinteract.changed instead] a DoNotInteract object is deleted | Case |
case.donotinteract.updated | [DEPRECATED - use case.donotinteract.changed instead] a DoNotInteract object is updated | Case |
case.donotinteract.expired | a DoNotInteract object has expired | Case |
case.escalation.changed | a case escalation is created, updated, or deleted, with precise change information | Case |
case.escalation.created | [DEPRECATED - use case.escalation.changed instead] a case escalation is created | Case |
case.escalation.canceled | [DEPRECATED - use case.escalation.changed instead] a case escalation is canceled | Case |
contact.created | a contact is created | Contact |
contact.deleted | a contact is deleted | Contact |
contact.updated | a contact is updated | Contact |
communication.send | communication is attempted | Interaction |
indexrate.created | index rate is created | Loan Type |
indexrate.updated | index rate is updated | Loan Type |
interaction.blocked | interaction is blocked for a borrower | Interaction |
loan.balance.changed | a loan balance changed | Loan |
loan.closed | a loan is closed | Loan |
loan.created | a loan is created | Loan |
loan.credit.limit.changed | a loan credit limit was changed | Loan |
draw.credit.limit.changed | a draw credit limit was changed | Draw |
loan.creditreporting.created | a loan is scheduled to start credit reporting | Credit Reporting Status |
loan.creditreporting.stopped | a loan is scheduled to stop credit reporting | Credit Reporting Status |
loan.current | a loan is current or became current | Loan |
loan.duedate.defer | a single loan due date is deferred | Loan |
loan.fee.booked | a dynamic fee is applied | Loan |
loan.fee.canceled | a dynamic fee is canceled | Loan |
loan.fee.changed | a dynamic fee is changed | Loan |
loan.interest.capitalized | interest capitalization is triggered after a due date | Loan |
loan.interestaccrued.min | minimum interest charge is triggered on a draw | Draw |
loan.latefee.booked | a late fee is applied | Loan |
loan.modificationfee.booked | a modification fee is applied | Loan |
loan.migration.succeeded | a loan migration succeeds | Loan |
loan.migration.failed | a loan migration fails | Loan |
loan.obligation.statuschanged | a change in a loan's obligation status is recorded | Loan |
loan.overdue | a loan is overdue | Loan |
loan.overdue.update | a loan is overdue | Loan |
loan.ownerchanged | a loan changes owners | Loan |
loan.paymentplan.setup | a loan payment plan is set up | Loan |
loan.period.started | a loan period has started | Loan |
loan.promiseplan.created | a promise to pay plan is created | Promise to Pay Plan |
loan.promiseplan.statuschanged | a promise to pay plan status changes | Promise to Pay Plan |
loan.promiseplan.due.today | a promise to pay plan is due today | Promise to Pay Plan |
loan.promiseplan.overdue | a promise to pay plan becomes "overdue" | Promise to Pay Plan |
loan.promiseplan.current | a promise to pay plan changes from "overdue" to "current" | Promise to Pay Plan |
loan.promoprogram.created | a promo program is created | Loan |
loan.promoprogram.updated | a promo program is updated | Loan |
loan.rate.created | rate is created | Loan |
loan.rate.updated | rate is updated | Loan |
loan.refunded | payments on a loan are refunded | Loan |
loan.reimbursement.initiated | a borrower reimbursement is initiated | Loan |
loan.reimbursement.processed | a borrower reimbursement is processed | Loan |
loan.schedule.defer | a loan schedule is deferred | Loan |
loan.servicefee.booked | a service fee is booked | Loan |
loan.statuschanged | a loan changes status | Loan |
person.consent.updated | a borrower updates their consents | Borrower |
person.created | a borrower is created | Borrower |
person.monitoring.bankruptcy.started | bankruptcy and deceased monitoring begins for a borrower | Borrower |
person.monitoring.scra.started | SCRA monitoring begins for a borrower | Borrower |
payment.instrument.created | a payment instrument is created | Payment Instrument |
payment.instrument.updated | a payment instrument is updated | Payment Instrument |
payment.instrument.deactivated | a payment instrument is deactivated | Payment Instrument |
payment.applied | DEPRECATED used in place of payment.initiated for internal ACH prior to deprecation. | Transaction |
payment.chargeback | a payment is charged back | Transaction |
payment.chargeback.reversed | a payment is chargeback is reversed | Transaction |
payment.failed | a payment fails | Transaction |
payment.initiated | a payment is initiated | Transaction |
payment.pending | a payment is pending | Transaction |
payment.reversed | a payment is reversed | Transaction |
payment.succeeded | a payment is succeeded | Transaction |
payment.scheduled | a payment is scheduled | Transaction |
payment.rescheduled | a payment is rescheduled | Transaction |
payment.due.today | periodically for external transactions with a status of "scheduled" | Transaction |
payment.hold.days.expired | a transaction's hold days expired | Transaction |
paymentplan.created | a payment plan is created | Payment Plan |
paymentplan.statuschanged | a payment plan changes status | Payment Plan |
purchase.authorized | a purchase is authorized | Purchase |
purchase.settled | a purchase is settled | Purchase |
purchase.applied | a purchase is applied. | Purchase |
purchase.created | a purchase is created | Purchase |
purchase.changed | a purchase is updated | Purchase |
purchase.dispute.created | a purchase dispute is created | Purchase Dispute |
purchase.dispute.updated | a purchase dispute is updated | Purchase Dispute |
statement.created | a statement is created | Loan |
reconciliation.payment.failed | a reconciliation payment fails | Transaction |
This utility function is used for managing index interest rates (for example, a rate that is pegged to the prime rate of the Fed). Index Interest Rates are set at the loan type level and can be used by loans associated with the loanTypeId. Index Interest Rates are only relevant to interest rates and not relevant to promo rates.
Index Interest Rate values can be updated with a new value with an effective date in the past. When a new Index Interest Rate value is set, the previous rate end date will be set to one calendar day before the new rate's effective date. If the new rate's effective date is in the past, the Peach system will replay all Active loans (to clarify, Active loans at the time of Index Interest Rate update) with the new Index Interest Rate value and re-accrue loans' interest.
Allows lenders to keep track of different collection agencies that charged-off loans may be assigned to. This is useful when a lender assigns charged off loans to a third party debt collection agency. The Peach Borrower Portal will display the collection agency information to the borrower. The lender can continue to use Peach as the system of record / ledger for charged off loans. The lender can post any payments collected by the collection agency as isExternal=true
transactions. The Peach system will waterfall the payments and update loan balances.