Furnish Accounts

This page will help you get started with Bloom's Furnishment API.

Credit Products

An Organization may offer a variety of products to its customers, each having its own unique characteristics.

When an organization signs a customer to one of its products, the outcome is the creation of a new customer ID and its related account(s). An account is an instance of a credit product and its relation to one or more consumers. A credit product can also be thought of as a grouping of accounts that belong to the same class.

For example, a customer has a home loan or a vehicle loan with the Organization named Sunset. When comparing the products, each loan might offer different features, interest rates, and other terms. All these are updated by the Organizations through Furnishment API.

When a customer applies for a loan, the credit of the customer is checked to see whether the customer qualifies for a loan, and then only the loan is approved.

Upon loan approval, Sunset signs a new customer, and a new account is created under the chosen product. A single customer may hold multiple accounts (i.e. credit cards, loans) at Sunset, each with the same or different credit product.

The customer must pay the amount based on the terms of the credit product and the payment information is furnished by the Organization through the Furnishment API.

πŸ“˜

Note:

Bloom Credit helps you with onboarding by creating a credit product and adding consumers. Once you have created the product, start with adding consumers and their accounts.

Create a Credit Product

Once you create a consumer, you can start creating and assigning credit products to them. The credit product details include:

  • Name of the Credit Product
  • Industry
  • Portfolio Type
  • Account Type
    • Refer to CRRG Exhibit 1 for possible values
  • Interest Type
  • Terms frequency

Check out the Create a credit product API reference to learn how to send a POST request to the Furnishment API with the credit product's information in the request body.

The response will include an id (hereafter referred to as credit_product_id) that is used to uniquely identify the credit product.

Credit Product Creation Example Request

You can see an example of a POST request made to the Create Credit Product endpoint below:

curl --location --request POST 'https://sandbox.bloom.dev/v2/furnishment/credit-products/' \
--header 'Authorization: Bearer <ACCESS_TOKEN_WILL_BE_HERE>'\
--header 'Content-Type: application/json' \
--data-raw '{
    "data": {
        "type": "CreditProductCreateRequest",
        "attributes": {
            "name": "Example Credit Card",
            "industry": "CREDIT_CARD_ISSUER",
            "portfolio_type": "REVOLVING",
            "account_type": "SECURED_CREDIT_CARD",
            "interest_type": "VARIABLE",
            "terms_frequency": "MONTHLY"
        }
    }
}
'
POST /v2/furnishment/credit-products/ HTTP/1.1
Host: sandbox.bloom.dev
Authorization: Bearer <ACCESS_TOKEN_WILL_BE_HERE>
Content-Type: application/json
Content-Length: 367

{
    "data": {
        "type": "CreditProductCreateRequest",
        "attributes": {
            "name": "Example Credit Card",
            "industry": "CREDIT_CARD_ISSUER",
            "portfolio_type": "REVOLVING",
            "account_type": "SECURED_CREDIT_CARD",
            "interest_type": "VARIABLE",
            "terms_frequency": "MONTHLY"
        }
    }
}


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": "CreditProductCreateRequest",
    "attributes": {
      "name": "Example Credit Card",
      "industry": "CREDIT_CARD_ISSUER",
      "portfolio_type": "REVOLVING",
      "account_type": "SECURED_CREDIT_CARD",
      "interest_type": "VARIABLE",
      "terms_frequency": "MONTHLY"
    }
  }
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://sandbox.bloom.dev/v2/furnishment/credit-products/", 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/credit-products/"

payload = json.dumps({
  "data": {
    "type": "CreditProductCreateRequest",
    "attributes": {
      "name": "Example Credit Card",
      "industry": "CREDIT_CARD_ISSUER",
      "portfolio_type": "REVOLVING",
      "account_type": "SECURED_CREDIT_CARD",
      "interest_type": "VARIABLE",
      "terms_frequency": "MONTHLY"
    }
  }
})
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/credit-products/',
  'headers': {
    'Authorization': 'Bearer <ACCESS_TOKEN_WILL_BE_HERE>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "data": {
      "type": "CreditProductCreateRequest",
      "attributes": {
        "name": "Example Credit Card",
        "industry": "CREDIT_CARD_ISSUER",
        "portfolio_type": "REVOLVING",
        "account_type": "SECURED_CREDIT_CARD",
        "interest_type": "VARIABLE",
        "terms_frequency": "MONTHLY"
      }
    }
  })

};
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/credit-products/"
  method := "POST"

  payload := strings.NewReader(`{
    "data": {
        "type": "CreditProductCreateRequest",
        "attributes": {
            "name": "Example Credit Card",
            "industry": "CREDIT_CARD_ISSUER",
            "portfolio_type": "REVOLVING",
            "account_type": "SECURED_CREDIT_CARD",
            "interest_type": "VARIABLE",
            "terms_frequency": "MONTHLY"
        }
    }
}
`)

  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))
}
Credit Product Creation Example Response

You can see an example of a response to a Credit Product creation request below:

{
    "data": {
        "id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
        "type": "CreditProductAPIResponse",
        "attributes": {
            "name": "Example Credit Card",
            "industry": "CREDIT_CARD_ISSUER",
            "portfolio_type": "REVOLVING",
            "account_type": "SECURED_CREDIT_CARD",
            "interest_type": "VARIABLE",
            "terms_frequency": "MONTHLY",
            "id": "<CREDIT_PRODUCT_ID_WILL_BE_HERE>",
            "organization_id": "<ORGANIZATION_ID_WILL_BE_HERE>",
            "created_at": "2023-01-30T20:10:07.828600",
            "modified_at": "2023-01-30T20:10:07.828600"
        }
    }
}

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"
        }
    }
}