curl --request GET \
--url https://api.finosu.com/customers/batch/{jobId} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.finosu.com/customers/batch/{jobId}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.finosu.com/customers/batch/{jobId}', 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/batch/{jobId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.finosu.com/customers/batch/{jobId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.finosu.com/customers/batch/{jobId}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers/batch/{jobId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending",
"totalCustomers": 123,
"processed": 123,
"failed": 123,
"progressPercentage": 123,
"createdAt": "2023-11-07T05:31:56Z",
"processingStartedAt": "2023-11-07T05:31:56Z",
"processingCompletedAt": "2023-11-07T05:31:56Z",
"errorMessage": "<string>",
"failures": [
{
"index": 4,
"customerId": "CUST127",
"message": "400: Missing required fields: phoneNumber"
}
],
"results": [
{
"index": 123,
"customerId": "<string>",
"status": "scheduled",
"loanId": "<string>",
"replayed": false,
"retryable": false,
"code": "<string>",
"message": "<string>",
"origination": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "scheduled",
"customerId": "<string>",
"loanId": "<string>",
"scheduleId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduledCallId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduledTime": "2023-11-07T05:31:56Z",
"scheduledCallCount": 123
}
}
]
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}Batch Progress and Results
Company-scoped job progress. Origination jobs return ordered per-row results and failures; customer-create jobs return failures with results empty. Partial while running. completed can include failed rows, so always inspect failed and the row outcomes.
curl --request GET \
--url https://api.finosu.com/customers/batch/{jobId} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.finosu.com/customers/batch/{jobId}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.finosu.com/customers/batch/{jobId}', 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/batch/{jobId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.finosu.com/customers/batch/{jobId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.finosu.com/customers/batch/{jobId}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/customers/batch/{jobId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending",
"totalCustomers": 123,
"processed": 123,
"failed": 123,
"progressPercentage": 123,
"createdAt": "2023-11-07T05:31:56Z",
"processingStartedAt": "2023-11-07T05:31:56Z",
"processingCompletedAt": "2023-11-07T05:31:56Z",
"errorMessage": "<string>",
"failures": [
{
"index": 4,
"customerId": "CUST127",
"message": "400: Missing required fields: phoneNumber"
}
],
"results": [
{
"index": 123,
"customerId": "<string>",
"status": "scheduled",
"loanId": "<string>",
"replayed": false,
"retryable": false,
"code": "<string>",
"message": "<string>",
"origination": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "scheduled",
"customerId": "<string>",
"loanId": "<string>",
"scheduleId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduledCallId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduledTime": "2023-11-07T05:31:56Z",
"scheduledCallCount": 123
}
}
]
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}jobId or Location returned by batch enrollment.
Authenticate with the company key used for submission. Another company’s job
returns 404.
202 acceptance does not mean processing is complete. While a job is running,
results contains only finished origination rows, ordered by the submitted
zero-based index. A completed job can include failures; inspect failed,
failures, and the per-row result before declaring the list successful.
For the existing customer-create batch workflow, results is empty; use
failures and the job counts. See retry rules
before resubmitting an origination row.Authorizations
Path Parameters
Job ID returned by POST /customers/batch
Response
Batch job status
completed still allows individual row failures — check failures. failed means the job hit a fatal error.
pending, processing, completed, failed, cancelled Customers submitted in the batch
Customers successfully processed
Customers that failed
Job-level error. Null unless status is failed.
Every row that could not be created, sorted by submitted index and never truncated. Partial while status is processing; final once status is completed or failed. Empty for jobs that ran before August 2026.
Show child attributes
Show child attributes
Origination row outcomes in original zero-based index order. Partial until terminal; empty for legacy customer-create batches.
Show child attributes
Show child attributes