Schedule Bulk FI Requests
curl --request POST \
--url https://api.example.com/v2/schedule/fi/requests \
--header 'Content-Type: <content-type>' \
--header 'appIdentifier: <appidentifier>' \
--header 'client_id: <client_id>' \
--header 'client_secret: <client_secret>' \
--header 'organisationId: <organisationid>' \
--data '
{
"reference_id": "<string>",
"consents_list": [
{
"consent_id": "<string>",
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
],
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
'import requests
url = "https://api.example.com/v2/schedule/fi/requests"
payload = {
"reference_id": "<string>",
"consents_list": [
{
"consent_id": "<string>",
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
],
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
headers = {
"client_id": "<client_id>",
"client_secret": "<client_secret>",
"appIdentifier": "<appidentifier>",
"organisationId": "<organisationid>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
client_id: '<client_id>',
client_secret: '<client_secret>',
appIdentifier: '<appidentifier>',
organisationId: '<organisationid>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({
reference_id: '<string>',
consents_list: [
{
consent_id: '<string>',
fiDataRangeFrom: '<string>',
fiDataRangeTo: '<string>',
configId: '<string>'
}
],
fiDataRangeFrom: '<string>',
fiDataRangeTo: '<string>',
configId: '<string>'
})
};
fetch('https://api.example.com/v2/schedule/fi/requests', 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.example.com/v2/schedule/fi/requests",
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([
'reference_id' => '<string>',
'consents_list' => [
[
'consent_id' => '<string>',
'fiDataRangeFrom' => '<string>',
'fiDataRangeTo' => '<string>',
'configId' => '<string>'
]
],
'fiDataRangeFrom' => '<string>',
'fiDataRangeTo' => '<string>',
'configId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"appIdentifier: <appidentifier>",
"client_id: <client_id>",
"client_secret: <client_secret>",
"organisationId: <organisationid>"
],
]);
$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.example.com/v2/schedule/fi/requests"
payload := strings.NewReader("{\n \"reference_id\": \"<string>\",\n \"consents_list\": [\n {\n \"consent_id\": \"<string>\",\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n }\n ],\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("client_id", "<client_id>")
req.Header.Add("client_secret", "<client_secret>")
req.Header.Add("appIdentifier", "<appidentifier>")
req.Header.Add("organisationId", "<organisationid>")
req.Header.Add("Content-Type", "<content-type>")
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.example.com/v2/schedule/fi/requests")
.header("client_id", "<client_id>")
.header("client_secret", "<client_secret>")
.header("appIdentifier", "<appidentifier>")
.header("organisationId", "<organisationid>")
.header("Content-Type", "<content-type>")
.body("{\n \"reference_id\": \"<string>\",\n \"consents_list\": [\n {\n \"consent_id\": \"<string>\",\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n }\n ],\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v2/schedule/fi/requests")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["client_id"] = '<client_id>'
request["client_secret"] = '<client_secret>'
request["appIdentifier"] = '<appidentifier>'
request["organisationId"] = '<organisationid>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"reference_id\": \"<string>\",\n \"consents_list\": [\n {\n \"consent_id\": \"<string>\",\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n }\n ],\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ver": "<string>",
"timestamp": "<string>",
"txnid": "<string>",
"status": "<string>",
"message": "<string>",
"data": {
"reference_id": "<string>",
"batch_id": "<string>",
"status": "<string>",
"total_records": 123,
"tracking_url": "<string>"
}
}Bulk Operations
Schedule Bulk FI Requests
Schedule multiple FI requests in a single batch using a JSON payload.
POST
/
v2
/
schedule
/
fi
/
requests
Schedule Bulk FI Requests
curl --request POST \
--url https://api.example.com/v2/schedule/fi/requests \
--header 'Content-Type: <content-type>' \
--header 'appIdentifier: <appidentifier>' \
--header 'client_id: <client_id>' \
--header 'client_secret: <client_secret>' \
--header 'organisationId: <organisationid>' \
--data '
{
"reference_id": "<string>",
"consents_list": [
{
"consent_id": "<string>",
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
],
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
'import requests
url = "https://api.example.com/v2/schedule/fi/requests"
payload = {
"reference_id": "<string>",
"consents_list": [
{
"consent_id": "<string>",
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
],
"fiDataRangeFrom": "<string>",
"fiDataRangeTo": "<string>",
"configId": "<string>"
}
headers = {
"client_id": "<client_id>",
"client_secret": "<client_secret>",
"appIdentifier": "<appidentifier>",
"organisationId": "<organisationid>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
client_id: '<client_id>',
client_secret: '<client_secret>',
appIdentifier: '<appidentifier>',
organisationId: '<organisationid>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({
reference_id: '<string>',
consents_list: [
{
consent_id: '<string>',
fiDataRangeFrom: '<string>',
fiDataRangeTo: '<string>',
configId: '<string>'
}
],
fiDataRangeFrom: '<string>',
fiDataRangeTo: '<string>',
configId: '<string>'
})
};
fetch('https://api.example.com/v2/schedule/fi/requests', 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.example.com/v2/schedule/fi/requests",
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([
'reference_id' => '<string>',
'consents_list' => [
[
'consent_id' => '<string>',
'fiDataRangeFrom' => '<string>',
'fiDataRangeTo' => '<string>',
'configId' => '<string>'
]
],
'fiDataRangeFrom' => '<string>',
'fiDataRangeTo' => '<string>',
'configId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"appIdentifier: <appidentifier>",
"client_id: <client_id>",
"client_secret: <client_secret>",
"organisationId: <organisationid>"
],
]);
$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.example.com/v2/schedule/fi/requests"
payload := strings.NewReader("{\n \"reference_id\": \"<string>\",\n \"consents_list\": [\n {\n \"consent_id\": \"<string>\",\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n }\n ],\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("client_id", "<client_id>")
req.Header.Add("client_secret", "<client_secret>")
req.Header.Add("appIdentifier", "<appidentifier>")
req.Header.Add("organisationId", "<organisationid>")
req.Header.Add("Content-Type", "<content-type>")
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.example.com/v2/schedule/fi/requests")
.header("client_id", "<client_id>")
.header("client_secret", "<client_secret>")
.header("appIdentifier", "<appidentifier>")
.header("organisationId", "<organisationid>")
.header("Content-Type", "<content-type>")
.body("{\n \"reference_id\": \"<string>\",\n \"consents_list\": [\n {\n \"consent_id\": \"<string>\",\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n }\n ],\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v2/schedule/fi/requests")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["client_id"] = '<client_id>'
request["client_secret"] = '<client_secret>'
request["appIdentifier"] = '<appidentifier>'
request["organisationId"] = '<organisationid>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"reference_id\": \"<string>\",\n \"consents_list\": [\n {\n \"consent_id\": \"<string>\",\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n }\n ],\n \"fiDataRangeFrom\": \"<string>\",\n \"fiDataRangeTo\": \"<string>\",\n \"configId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ver": "<string>",
"timestamp": "<string>",
"txnid": "<string>",
"status": "<string>",
"message": "<string>",
"data": {
"reference_id": "<string>",
"batch_id": "<string>",
"status": "<string>",
"total_records": 123,
"tracking_url": "<string>"
}
}Overview
The Schedule Bulk FI Requests API allows you to submit multiple Financial Information (FI) requests in a single API call.Notes
- Each batch requires a unique
reference_idfor tracking purposes. This ID is provided by you and must be unique across all your batches. - Duplicates in
consents_listare accepted and will be scheduled as separate rows. - You can specify global defaults for date ranges and config that apply to all records, with optional per-row overrides.
- Maximum batch size is 10,000 consents per request.
Authentication
This API requires authentication using the following headers:string
required
Your unique client identifier provided by FinPro during onboarding.
string
required
Your confidential client secret key provided by FinPro.
string
required
The unique identifier for your application.
string
required
Your organization’s unique identifier assigned by FinPro.
string
required
Must be set to
application/json.Request Body
string
required
A unique identifier for this batch, provided by you. Must be alphanumeric with hyphens and underscores allowed, between 5-60 characters. This ID is used for tracking and querying batch status.
array
required
An array of consent objects to process. Maximum 10,000 items per request.
Show consent object properties
Show consent object properties
string
required
The unique consent identifier from the Account Aggregator.
string
Start date for financial data (ISO 8601 format). Overrides the global default for this specific consent.
string
End date for financial data (ISO 8601 format). Overrides the global default for this specific consent.
string
Analytics configuration ID to use for this consent. Overrides the global default.
string
Global default start date for financial data (ISO 8601 format). Applied to all consents that don’t specify their own value.
string
Global default end date for financial data (ISO 8601 format). Applied to all consents that don’t specify their own value.
string
Global default analytics configuration ID. Applied to all consents that don’t specify their own value.
Request Example
{
"reference_id": "batch-20251110-001",
"consents_list": [
{
"consent_id": "54450ac0-8bcb-4b9c-ad74-29b4fabe18f7",
"fiDataRangeFrom": "2024-01-01T00:00:00Z",
"fiDataRangeTo": "2024-06-30T23:59:59Z",
"configId": "analytics-config-1"
},
{
"consent_id": "7b2d9e3a-1f4c-4a8b-9c6d-2e5f8a9b0c1d"
},
{
"consent_id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"fiDataRangeTo": "2024-12-31T23:59:59Z"
}
],
"fiDataRangeFrom": "2024-01-01T00:00:00Z",
"fiDataRangeTo": "2024-12-31T23:59:59Z",
"configId": "analytics-config-default"
}
- The first consent uses its own date range and config.
- The second consent uses the global defaults for all parameters.
- The third consent uses the global
fiDataRangeFromandconfigId, but overridesfiDataRangeTo.
Response Parameters
string
The API version that processed the request.
string
The timestamp when the response was generated (ISO 8601 format).
string
A unique transaction ID for this API call.
string
The status of the API call. Returns
"success" when the batch is accepted.string
A human-readable message describing the result.
object
Contains batch details and tracking information.
Show data properties
Show data properties
Success Response Example
{
"ver": "1.0",
"timestamp": "2024-11-10T12:00:00Z",
"txnid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "success",
"message": "Batch accepted and queued for processing",
"data": {
"reference_id": "batch-20251110-001",
"batch_id": "5284f779-69a5-4934-8816-40c648d6bb80",
"status": "READY",
"total_records": 3,
"tracking_url": "/bulk/status"
}
}
Error Responses
Missing Reference ID
When thereference_id field is not provided:
{
"ver": "1.0",
"timestamp": "2024-11-10T12:00:00Z",
"txnid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"errorCode": "MissingReferenceId",
"errorMsg": "reference_id is required"
}
400 Bad Request
Duplicate Reference ID
When thereference_id already exists:
{
"ver": "1.0",
"timestamp": "2024-11-10T12:00:00Z",
"txnid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"errorCode": "DuplicateReferenceId",
"errorMsg": "reference_id 'batch-20251110-001' already exists"
}
409 Conflict
Validation Failed
When the request body contains invalid data:{
"ver": "1.0",
"timestamp": "2024-11-10T12:00:00Z",
"txnid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"errorCode": "InvalidRequest",
"errorMsg": "consents_list cannot exceed 10,000 records",
"errorDetails": {
"field": "consents_list",
"provided": 15000,
"max": 10000
}
}
400 Bad Request
Common Error Codes
| Error Code | Description |
|---|---|
MissingReferenceId | The reference_id field is required but was not provided. |
DuplicateReferenceId | A batch with this reference_id already exists. |
InvalidRequest | The request body contains invalid data (e.g., too many records, invalid date format). |
InvalidDateRange | The fiDataRangeFrom is after fiDataRangeTo. |
Was this page helpful?
