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 and business_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 the statement_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"
        }
    }
}