Furnish Accounts
This page will help you get started with Bloom's Furnishment API.
Account
One consumer can hold multiple accounts. If a consumer has multiple accounts with the same product, such as a home loan with the same bank, then all the accounts will have the same Consumer name but a unique account ID that provides consumer loan details, EMI payment history, and principal amount balance details.
You can push all consumers' account details separately and their statements.
With the Furnishment API, you can create, update, retrieve, and delete accounts.
Create an Account
Important:
You must create a credit product and a consumer before creating an account. A consumer can have many accounts.
Once you create a credit product, you can start creating accounts. The account details include:
- Credit Product ID
- Primary Consumer ID
- Primary Address ID
- Primary Designation
- Branch Identifier
- Account Opened Date
- Terms Duration
- External Account Identifier
Business Accounts
If you select a business credit product for your account, you must enter the attributes
business_name
andbusiness_address
.
Check out the Create Account API reference to learn how to send a POST
request to the Furnishment API with the account's information in the request body.
The response will include an id (hereafter referred to as account_id
) that is used to uniquely identify the account.
Account Creation Example Request
You can see an example of a POST
request made to the Create Account endpoint below:
curl --location --request POST 'https://sandbox.bloom.dev/v2/furnishment/accounts/' \
--header 'Authorization: Bearer <ACCESS_TOKEN_WILL_BE_HERE>' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"type": "AccountCreate",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"branch_identifier": "ABCDEF",
"account_opened_date": "2006-01-20",
"terms_duration": "012"
}
}
}'
POST /v2/furnishment/accounts/ HTTP/1.1
Host: sandbox.bloom.dev
Authorization: Bearer <ACCESS_TOKEN_WILL_BE_HERE>
Content-Type: application/json
Content-Length: 599
{
"data": {
"type": "AccountCreate",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"branch_identifier": "ABCDEF",
"account_opened_date": "2006-01-20",
"terms_duration": "012"
}
}
}
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <ACCESS_TOKEN_WILL_BE_HERE>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"data": {
"type": "AccountCreate",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"branch_identifier": "ABCDEF",
"account_opened_date": "2006-01-20",
"terms_duration": "012"
}
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://sandbox.bloom.dev/v2/furnishment/accounts/", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
import requests
import json
url = "https://sandbox.bloom.dev/v2/furnishment/accounts/"
payload = json.dumps({
"data": {
"type": "AccountCreate",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"branch_identifier": "ABCDEF",
"account_opened_date": "2006-01-20",
"terms_duration": "012"
}
}
})
headers = {
'Authorization': 'Bearer <ACCESS_TOKEN_WILL_BE_HERE>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://sandbox.bloom.dev/v2/furnishment/accounts/',
'headers': {
'Authorization': 'Bearer <ACCESS_TOKEN_WILL_BE_HERE>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"data": {
"type": "AccountCreate",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"branch_identifier": "ABCDEF",
"account_opened_date": "2006-01-20",
"terms_duration": "012"
}
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://sandbox.bloom.dev/v2/furnishment/accounts/"
method := "POST"
payload := strings.NewReader(`{
"data": {
"type": "AccountCreate",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"branch_identifier": "ABCDEF",
"account_opened_date": "2006-01-20",
"terms_duration": "012"
}
}
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Authorization", "Bearer <ACCESS_TOKEN_WILL_BE_HERE>")
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
Account Creation Example Response
You can see an example of a response to an account creation request below:
{
"data": {
"id": "<ACCOUNT_ID_WILL_BE_HERE>",
"type": "Account",
"attributes": {
"credit_product_id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
"account_opened_date": "2006-01-20",
"primary_consumer_id": "<PRIMARY_CONSUMER_ID_WILL_BE_HERE>",
"primary_address_id": "<PRIMARY_ADDRESS_ID_WILL_BE_HERE>",
"primary_designation": "INDIVIDUAL",
"paid_off": false,
"terms_duration": "012",
"id": "<ACCOUNT_ID_WILL_BE_HERE>",
"external_account_identifier": "<EXTERNAL_ACCOUNT_IDENTIFIER_WILL_BE_HERE>",
"reported_consumer_account_number": "<REPORTED_CONSUMER_ACCOUNT_NUMBER_WILL_BE_HERE>",
"secondary_consumers": [],
"credit_line_suspended": false,
"organization_id": "<ORGANIZATION_ID_WILL_BE_HERE>",
"charge_off": {},
"collateral": {},
"collections": {},
"lien": {},
"positions": {},
"payment_default": {},
"forbearance": {}
}
}
}
Statement
A statement indicates the summary of an account. They can be granted for almost every account representing ongoing transactions where funds are repeatedly exchanged.
Statements typically list debits paid, incoming funds or credits received by the account holder, and fees associated with maintaining the account.
With the Furnishment API, you can submit and retrieve statements.
Submit a Statement
Once you create an account, you can start furnishing statements. The statement includes:
- Customer details
- Account details
- Payment details
Check out the Create Statement API reference to learn how to send a POST
request to the Furnishment API with the statement's information in the request body.
The response will include an id (hereafter referred to as statement_id
) that is used to uniquely identify the account.
Statement Creation Example Request
You can see an example of a POST
request made to the Create Statement endpoint below:
curl --location --request POST 'https://sandbox.bloom.dev/v2/furnishment/statements/' \
--header 'Authorization: Bearer <ACCESS_TOKEN_WILL_BE_HERE>' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"type": "StatementCreate",
"attributes": {
"id": "null",
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0.00,
"days_delinquent": 0,
"credit_limit": 252.0,
"scheduled_monthly_payment": 21.0,
"actual_monthly_payment": 0.00,
"amount_past_due": 0.00,
"statement_identifier": "123456789-123456789-123456789",
"last_payment_date": "2022-04-22"
}
}
}'
POST /v2/furnishment/statements/ HTTP/1.1
Host: sandbox.bloom.dev
Authorization: Bearer <ACCESS_TOKEN_WILL_BE_HERE>
Content-Type: application/json
Content-Length: 541
{
"data": {
"type": "StatementCreate",
"attributes": {
"id": "null",
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0.00,
"days_delinquent": 0,
"credit_limit": 252.0,
"scheduled_monthly_payment": 21.0,
"actual_monthly_payment": 0.00,
"amount_past_due": 0.00,
"statement_identifier": "123456789-123456789-123456789",
"last_payment_date": "2022-04-22"
}
}
}
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <ACCESS_TOKEN_WILL_BE_HERE>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"data": {
"type": "StatementCreate",
"attributes": {
"id": "null",
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0,
"days_delinquent": 0,
"credit_limit": 252,
"scheduled_monthly_payment": 21,
"actual_monthly_payment": 0,
"amount_past_due": 0,
"statement_identifier": "123456789-123456789-123456789",
"last_payment_date": "2022-04-22"
}
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://sandbox.bloom.dev/v2/furnishment/statements/", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
import requests
import json
url = "https://sandbox.bloom.dev/v2/furnishment/statements/"
payload = json.dumps({
"data": {
"type": "StatementCreate",
"attributes": {
"id": "null",
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0,
"days_delinquent": 0,
"credit_limit": 252,
"scheduled_monthly_payment": 21,
"actual_monthly_payment": 0,
"amount_past_due": 0,
"statement_identifier": "123456789-123456789-123456789",
"last_payment_date": "2022-04-22"
}
}
})
headers = {
'Authorization': 'Bearer <ACCESS_TOKEN_WILL_BE_HERE>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://sandbox.bloom.dev/v2/furnishment/statements/',
'headers': {
'Authorization': 'Bearer <ACCESS_TOKEN_WILL_BE_HERE>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"data": {
"type": "StatementCreate",
"attributes": {
"id": "null",
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0,
"days_delinquent": 0,
"credit_limit": 252,
"scheduled_monthly_payment": 21,
"actual_monthly_payment": 0,
"amount_past_due": 0,
"statement_identifier": "123456789-123456789-123456789",
"last_payment_date": "2022-04-22"
}
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://sandbox.bloom.dev/v2/furnishment/statements/"
method := "POST"
payload := strings.NewReader(`{
"data": {
"type": "StatementCreate",
"attributes": {
"id": "null",
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0.00,
"days_delinquent": 0,
"credit_limit": 252.0,
"scheduled_monthly_payment": 21.0,
"actual_monthly_payment": 0.00,
"amount_past_due": 0.00,
"statement_identifier": "123456789-123456789-123456789",
"last_payment_date": "2022-04-22"
}
}
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Authorization", "Bearer <ACCESS_TOKEN_WILL_BE_HERE>")
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
Statement Identifier
The
statement identifier
attribute is set by you according to your organization's guidelines, and is different from thestatement_id
in the response.
Statement Creation Example Response
You can see an example of a response to a Statement creation request below:
{
"data": {
"id": "<STATEMENT_ID_WILL_BE_HERE>",
"type": "Statement",
"attributes": {
"account_id": "<ACCOUNT_ID_WILL_BE_HERE>",
"statement_date": "2023-01-29",
"current_balance": 0.0,
"days_delinquent": 0,
"credit_limit": 252.0,
"scheduled_monthly_payment": 21.0,
"actual_monthly_payment": 0.0,
"amount_past_due": 0.0,
"last_payment_date": "2022-04-22",
"highest_balance": 0.0,
"statement_identifier": "123456789-123456789-123456789",
"charge_off": {},
"collateral": {},
"collections": {},
"lien": {},
"forbearance": {},
"positions": {},
"payment_default": {},
"deleted": {},
"id": "<STATEMENT_ID_WILL_BE_HERE>",
"modified_at": "2023-01-30T22:32:58.830855"
}
}
}
Updated 9 days ago