cURL
curl --request POST \
--url https://api.finosu.com/customers/{id}/cancel-servicing \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data @- <<EOF
{
"reason": "PAID_OFF",
"note": "Servicing recalled at the lender's request."
}
EOFimport requests
url = "https://api.finosu.com/customers/{id}/cancel-servicing"
payload = {
"reason": "PAID_OFF",
"note": "Servicing recalled at the lender's request."
}
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({reason: 'PAID_OFF', note: 'Servicing recalled at the lender\'s request.'})
};
fetch('https://api.finosu.com/customers/{id}/cancel-servicing', 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/{id}/cancel-servicing",
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([
'reason' => 'PAID_OFF',
'note' => 'Servicing recalled at the lender\'s request.'
]),
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/{id}/cancel-servicing"
payload := strings.NewReader("{\n \"reason\": \"PAID_OFF\",\n \"note\": \"Servicing recalled at the lender's request.\"\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/{id}/cancel-servicing")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"PAID_OFF\",\n \"note\": \"Servicing recalled at the lender's request.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers/{id}/cancel-servicing")
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 \"reason\": \"PAID_OFF\",\n \"note\": \"Servicing recalled at the lender's request.\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"loansUpdated": 3,
"stopServicingReason": "PAID_OFF",
"cancelledScheduledPayments": 9,
"cancelledCallSchedules": 3,
"cancelledEmailSchedules": 3,
"cancelledSmsSchedules": 3,
"cancelledCalls": 15,
"cancelledEmails": 6,
"cancelledSms": 9
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Servicing Lifecycle
Cancel Customer Servicing
Cancel servicing for all loans belonging to a customer. Sets all loans’ servicing status to NOT_SERVICING and cancels all pending scheduled payments, calls, emails, and SMS across all loans.
POST
/
customers
/
{id}
/
cancel-servicing
cURL
curl --request POST \
--url https://api.finosu.com/customers/{id}/cancel-servicing \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data @- <<EOF
{
"reason": "PAID_OFF",
"note": "Servicing recalled at the lender's request."
}
EOFimport requests
url = "https://api.finosu.com/customers/{id}/cancel-servicing"
payload = {
"reason": "PAID_OFF",
"note": "Servicing recalled at the lender's request."
}
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({reason: 'PAID_OFF', note: 'Servicing recalled at the lender\'s request.'})
};
fetch('https://api.finosu.com/customers/{id}/cancel-servicing', 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/{id}/cancel-servicing",
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([
'reason' => 'PAID_OFF',
'note' => 'Servicing recalled at the lender\'s request.'
]),
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/{id}/cancel-servicing"
payload := strings.NewReader("{\n \"reason\": \"PAID_OFF\",\n \"note\": \"Servicing recalled at the lender's request.\"\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/{id}/cancel-servicing")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"PAID_OFF\",\n \"note\": \"Servicing recalled at the lender's request.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers/{id}/cancel-servicing")
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 \"reason\": \"PAID_OFF\",\n \"note\": \"Servicing recalled at the lender's request.\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"loansUpdated": 3,
"stopServicingReason": "PAID_OFF",
"cancelledScheduledPayments": 9,
"cancelledCallSchedules": 3,
"cancelledEmailSchedules": 3,
"cancelledSmsSchedules": 3,
"cancelledCalls": 15,
"cancelledEmails": 6,
"cancelledSms": 9
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Overview
This endpoint cancels servicing for all loans belonging to a specific customer, stopping all automated communications and scheduled payments across all of their loans. Use this when a customer should no longer be actively serviced by the platform. This is a collections operation. To stop servicing a single loan, use Cancel Loan Servicing. To close an origination application that was funded, withdrawn, or rejected, use Close Origination instead.What Gets Cancelled
When you call this endpoint, the following actions are taken for all loans owned by the customer:- Loan Status: Sets all loans’ servicing status to
NOT_SERVICING - Stop Reason: Records the reason for stopping servicing (defaults to
API_REQUEST) - Scheduled Payments: Cancels all pending scheduled payments
- Scheduled Calls: Cancels all pending scheduled calls
- Scheduled Emails: Cancels all pending scheduled emails
- Scheduled SMS: Cancels all pending scheduled SMS messages
- Call Schedules: Cancels all active loan call schedules
- Email Schedules: Cancels all active loan email schedules
- SMS Schedules: Cancels all active loan SMS schedules
- Borrower Portal: Hides the loans from the borrower portal
Use Cases
- Customer has paid off all their loans
- Customer is leaving the platform entirely
- Customer filed for bankruptcy
- Fraud has been detected across the customer’s accounts
- Customer is deceased
- Customer requested to be removed from all servicing
Stop Servicing Reasons
You can optionally provide a reason for stopping servicing. Retrieve the current accepted values with List Stop Servicing Reasons instead of hardcoding a list. The same catalog applies to loan and customer cancellation. Send the selected case-sensitive string asreason; omitting it defaults to API_REQUEST.
This records a stop reason; it does not invoke the corresponding bankruptcy, dispute,
or other flag workflow.
Request Body
The request body is optional. If not provided, the reason defaults toAPI_REQUEST.
{
"reason": "API_REQUEST",
"note": "Servicing recalled at the lender's request."
}
note is optional free-form text, trimmed before storage, with a limit of 2,000
characters. Omit it or send null when no note is needed; blank notes are rejected.
Common SSN, card/account-number, email and phone patterns are redacted before
storage in each affected loan’s servicing audit history. Redaction is pattern-based,
not a guarantee of removing every sensitive detail. An identical repeated
request does not duplicate the latest audit entry. A different note is retained even
if servicing was already stopped, without replacing the original stop reason.
Response
The response includes the total count of all cancelled items across all loans:{
"id": "CUST-12345",
"loansUpdated": 3,
"stopServicingReason": "API_REQUEST",
"cancelledScheduledPayments": 9,
"cancelledCallSchedules": 3,
"cancelledEmailSchedules": 3,
"cancelledSmsSchedules": 3,
"cancelledCalls": 15,
"cancelledEmails": 6,
"cancelledSms": 9
}
Error Responses
| Status Code | Description |
|---|---|
| 422 | Invalid cancellation reason or request body |
| 404 | Customer not found |
| 500 | Internal server error |
422 responses, detail is a string when the supplied reason is not accepted,
or an array of validation errors when the request body has an invalid type or
structure (for example, {"reason": 123}). Each validation error includes loc
(the field location), msg (the message), and type (the error code); additional
fields may be present. Clients should handle both forms.Body
application/json
Optional reason for stopping servicing. Defaults to API_REQUEST if not specified.
Reason for stopping servicing. Retrieve current accepted values with GET /loans/stop-servicing-reasons. Defaults to API_REQUEST if not specified.
Available options:
PAID_OFF, BANKRUPTCY, FRAUD_CLAIM, MILITARY, DECEASED, INCARCERATED, DEBT_MANAGEMENT_COMPANY, NO_LOGIN_2M, NO_PAYMENT_OR_PLAN_3M, NO_PLAN_PAYMENT_2M, NO_PAYMENT_OR_PLAN_4M, SOLD_OFF, MISTAKE, DEBT_DISPUTE, COMPLAINT_TRIGGER, HISTORICAL_INELIGIBLE, DUPLICATE, REFUSES_TO_PAY, API_REQUEST, LMS_CLOSED, DATA_DEFECT_HOLD, COERCED_DEBT_CLAIM, TRANSFERRED_TO_FINOSU Example:
"PAID_OFF"
Optional free-form audit note (1–2000 characters after trimming). Common financial-secret and contact-detail patterns are redacted before storage. Does not change the selected reason or invoke a flag workflow.
Required string length:
1 - 2000Example:
"Servicing recalled at the lender's request."
Response
Customer servicing cancelled successfully