Disbursements

Transfers APIs can be used for transfers of funds with disbursements.

Disbursements API Endpoints

Disbursements

This endpoint is used to transfer funds as follows:

  • From a program funding source to a consumer account (disbursementIn)
  • From a consumer account to a program funding source (disbursementOut)

For a disbursementIn and a disbursementOut to work, an account must be configured for the organization that will be the source of the funds. A fixed accountIdentifer will be assigned to these “Funding Source” accounts, and it will be required in all disbursement requests.

API Call Structure

POST /programs/{programCode}/transfers

Things to Remember

  • The POST /adjustments endpoint has replaced the POST /transfers endpoint for partner funded disbursements.
  • Therefore, POST /adjustments should be used for all new disbursement flows and integrations.
  • The POST /transfers endpoint should be used only for disbursements, if you have already integrated with it.
  • Automatic retries for Disbursements Out are enabled.

Request Bodies

Sample Request – Disbursement In:-
POST https://bospart/baas/v1/programs/yourprogram/transfers
{
   "transferIdentifier":“111bedee-de7f-4012-b647-fca0ffda23aa”,
   "transferType":"disbursementIn",
   "transferAuthorizationType":"execute",
   "partnerReferenceData":"Optional Partner Defined String",
   "initiator":“1117FD32-600A-4F4F-82F0-4940CC811111”,
   "transferRoute":{
      "transactionAmount":20,
      "sourceTransferEndpoint":{
         "transferEndpointType":"programFundingSource",
         "identifier":“1117FD32-600A-4F4F-82F0-4940CC811111”,
         "currency":"USD"
      },
      "targetTransferEndpoint":{
         "transferEndpointType":"account",
         "identifier":“111d697b-d01a-46d9-94f1-e7dd02111111”,
         "currency":"USD"
         }
   }
}

Sample Request – Disbursement Out:-
POST /programs/acme/transfers HTTP/1.1
{
   "transferIdentifier":“914f7ce8-8eab-4c8d-aad7-a96634583ae2”,
   "transferType":" disbursementOut",
   "transferAuthorizationType":"execute",
   "partnerReferenceData":"An optional string defined by the partner",
   "initiator":“05D81303-45A7-4859-87E2-FF75B49647DD”,
   "transferRoute":{
      "transactionAmount":10,
      "sourceTransferEndpoint":{
         "transferEndpointType":"account",
         "identifier":“05D81303-45A7-4859-87E2-FF75B49647DD”,
         "currency":"USD"
      },
      "targetTransferEndpoint":{
         "transferEndpointType":"programFundingSource",
         "identifier":“64888342-de79-4a61-8a39-909b2a7ebbb5”,
         "currency":"USD"
      }
   }
}

Request Parameters – Disbursements

FieldDescription
transferIdentifierIf the transaction is initiated through the transfers API, then the transferIdentifier uniquely identifying the initiating transfer will be included.
transferTypeUse either disbursementIn or disbursementOut to transfer funds between a Funding Source Account and a Consumer Account.
• The disbursementIn transfer will be declined for the following account statuses:
o Pending
o Restricted: This constraint will be implemented in the 4/7/20 release.
o Locked
o Closed
• The disbursementOut transfer will be declined for the following statuses:
o Pending
o Restricted: Except if the status reason is customerInitiatedSpendDown.
o Locked
o Closed
transferAuthorizationTypeOnly execute is valid for disbursement transfers at this time.
partnerReferenceDataOptional. When a valid disbursementIn or disbursementOut request is processed, the Partner has the option to provide information in the partnerReferenceData field that can be matched to the funding transfer request along with the corresponding transaction.

Upon request, the partnerReferenceData can be included in the settlement report provided to the partner. Note: The purpose of the partnerReferenceData field being included in the request, is to allow you (the partner) the ability to cross reference the report information with your internal records.
InitiatorThis is the account the transfer was initiated from. It must be either the source or the target account.
transferRouteContains the information for a POST Transfer call involving a new source and new target.
transactionAmountThe amount to transfer.
sourceTransferEndpointRepresents the source of the funds.
transferEndpointTypeUse programFundingSource for disbursementIn and account for disbursementOut.
identifierThe accountIdentifer of the applicable account based on the transferEndpointType.
currency• If a currency code is provided in the request payload, then it must be a valid 3-character ISO code and be valid for the program for which the call is being made.
• Currency is optional and will default to USD if not provided.
• Only USD is supported for all programs.
targetTransferEndpointRepresents the target of the funds.
transferEndpointTypeUse account for disbursementIn or programFundingSource for disbursementOut.
IdentifierThe accountIdentifer of the applicable account based on the transferEndpointType.
currencyOnly USD is supported at this time.

Response Message

If the POST request is successful, the following response message will be returned along with a 201 HTTP status code.

New Transfer Created

Sample Response Body – Disbursement In & Disbursement Out

Note: Only the balance of the consumer account is returned in the response.

"responseDetails":[
   {
      "code":0,
      "subCode":0,
      "description":"Success",
      "url":"http://tbd"
   }
]
{
   "transfer":{
      "transferIdentifier":"111bedee-de7f-4012-b647-fca0ffda23aa",
      "transferStatus":"completed"
   },
   "accounts":[
      {
         "accountIdentifier":"111d697b-d01a-46d9-94f1-e7dd02111111",
         "purses":[
            {
               "purseIdentifier":"11111820-6f9b-4821-a848-cff108d11111",
               "purseType":"primary",
               "availableBalance":20.0,
               "ledgerBalance":20.0,
               "availableBalanceAsOfDateTime":"2019-07-30T14:56:12Z",
               "ledgerBalanceAsOfDateTime":"2019-07-30T14:56:12Z",
               "isHidden":false,
               "status":"0"
            }
         ]
      }
   ]

Response Parameters – Disbursement In & Disbursement Out

FieldDescription
"responseDetails": [ { "code": 0, "subCode": 0, "description": "Success", "url": "http://tbd" }]See Response Details for more information.
transferContains the returned information in response to the POST /transfer call.
transferIdentifierUnique identifier for the transfer.
transferStatusStatus of the transfer. Available status options are:
• completed
• pending
• failed
• canceled
• declined
• returned
• rejected
• expired
accountsContains the account information.
accountIdentifierUnique identifier for an account within a program.
pursesA purse is a balance holding object. This returns all purses including the primary/checking purse.
purseIdentifierUnique identifier for the purse that is returned.
purseTypeType of purse being returned.
availableBalanceThe amount available on the account.
ledgerBalanceThe amount of the ledger.
availableBalanceAsOfDateTimeThe date and time (UTC) that the available balance is reflective of. Since events can be published out of chronological order, the available balance should not be updated, if a more recent available balance as of date was previously processed.
ledgerBalancesAsOfDateTimeThe date and time (UTC) that the ledger balance is reflective of. Since events can be published out of chronological order, do not update the ledger balance if a more recent ledger balance as of date was previously processed.
isHiddenAllows the customer (user) to show or hide their purse on the mobile app.
statusN/A

Valid/Invalid Character Constraints

Note: Invalid characters are highlighted in bold. Anything outside the range in this table is also considered invalid.

AsciiCharacterAllowed in Partner Reference Data
32spaceY
33!Y
34"Y
35#Y
36$Y
37%Y
38&Y
39'Y
40(Y
41)Y
42*Y
43+Y
44,N
45-Y
46.Y
47/Y
480Y
491Y
502Y
513Y
524Y
535Y
546Y
557Y
568Y
579Y
58:Y
59;N
60<Y
61=Y
62>Y
63?Y
64@Y
65AY
66BY
67CY
68DY
69EY
70FY
71GY
72HY
73IY
74JY
75KY
76LY
77MY
78NY
79OY
80PY
81QY
82RY
83SY
84TY
85UY
86VY
87WY
88XY
89YY
90ZY
91[Y
92backslash YY
93]Y
94^Y
95_Y
96`N
97aY
98bY
99cY
100dY
101eY
102fY
103gY
104hY
105iY
106jY
107kY
108lY
109mY
110nY
111oY
112pY
113qY
114rY
115sY
116tY
117uY
118vY
119wY
120xY
121yY
122zY
123{Y
124|N
125}Y
126~Y

Retry Process

A retry process has been implemented for disbursementIn and disbursementOut transfer requests and reversals.

How it Works

If POST /transfers (disbursementIn and disbursementOut only) is called when a timeout with a downstream service has occurred, then:

  • The HTTP response to the partner will be 202 to indicate the Disbursement request is correctly pending retry
  • Transfer status is initially pending AND
  • The retry service will try to successfully complete the transaction every 30 minutes, for up to 24 hours.
  • If the transaction is not completed successfully after 24 hours, the transfer will be canceled. If an error occurs while the retry service is trying to cancel the transfer, then the transfer status will be marked as failed.
  • Note: When the transfer is in pending status due to a timeout AND the retry service fails to complete the transaction within 24 hours, then the status will be updated to canceled instead of failed.
  • A Webhook alert will be published

Transfer To/From Account under Same Partner Account (P2P)

This endpoints permits partners with multiple program codes to transfer money between accounts within those programs.

API Call Structure

POST /programs/{programCode}/transfers

How it Works

Simply call POST Transfers with the following information in your request: Refer to the Request Parameters table in the KYC API for details.

If the P2P request was put on hold then it needs to be executed, canceled or rejected. This is performed using the PUT /transfers API.

Call PUT programs/{programCode}/transfers/{transferIdentifier} to update the request to cancel, reject or execute, which will be reflected in the transferAuthorizationType.

Request Body

Sample Request Body:-
{
   "transferIdentifier":"d4ce622e-defa-4475-8d62-817c628b80e7",
   "transferType":"peerPayment",
   "transferAuthorizationType":"execute",
   "initiator":"0b830092-e5d4-45b8-ad26-8a42c94ddd4c",
   "memo":"string",
   "transferRoute":{
      "transactionAmount":5,
      "sourceTransferEndpoint":{
         "transferEndpointType":"account",
         "identifier":"0b830092-e5d4-45b8-ad26-8a42c94ddd4c",
         "currency":"USD"
      },
      "targetTransferEndpoint":{
         "transferEndpointType":"account",
         "identifier":"0b830092-e5d4-45b8-ad26-8a42c94ddd4c",
         "currency":"USD",
         "handleData":{
            "firstName":"string",
            "lastName":"string"
         }
      }
   }
}

Request Parameters

FieldDescription
transferIdentifierIf the transaction is initiated through the transfers API, then the transferIdentifier uniquely identifying the initiating transfer will be included.
transferTypeType of transfer being done
transferAuthorizationTypeCan be one of the following:

•execute: Use if the recipient has auto-accept enabled.

•hold: Use if the recipient prefers to manually accept.
initiatorSource of transfer
memoAn optional short description that is provided in the P2P message. Note: The memo can be retrieved via the GET /transfers by ID API. Details will be provided in the next sprint’s release notes (10/22).
transactionAmountAmount of transaction excluding fees.
sourceTransferEndpointContains information about the source of the transfer.
transferEndpointTypeType of endpoint the transfer is coming from (i.e. account).
identifierAccount identifier for the source account.
currencyType of money being transferred (i.e. USD)
targetTransferEndpointContains the encrypted data of the endpoint (account) that the transfer is going to.
transferEndpointTypeType of endpoint the transfer is going to (i.e. purse.
identifierAccount identifier for the target account.
currencyType of money being accepted by the target account (i.e. USD).

• If a currency code is provided in the request payload, then it must be a valid 3-character ISO code and be valid for the program for which the call is being made.

• Currency is optional and will default to USD if not provided.

• Only USD is supported for all programs.
handleDataOptional and is used in case the sender is identifying the recipient by a first and last name that may be different from the name on the recipient’s account.

Sample Response Body

Sample Response:-
{
   "responseDetails":[
      {
         "code":0,
         "subCode":0,
         "description":"string",
         "url":"string"
      }
   ],
   "transfer":{
      "transferIdentifier":"string",
      "transferStatus":"completed"
   },
   "accounts":[
      {
         "accountIdentifier":"0b830092-e5d4-45b8-ad26-8a42c94ddd4c",
         "purses":[
            {
               "purseIdentifier":"562a27ec-6cae-4459-a522-be94b4570f78",
               "purseType":"primary",
               "availableBalance":0,
               "ledgerBalance":0,
               "availableBalanceAsOfDateTime":"2019-09-13T17:49:33.932Z",
               "ledgerBalanceAsOfDateTime":"2019-09-13T17:49:33.932Z"
            }
         ]
      }
   ]
}

Response Parameters

FieldDescription
"responseDetails": [ { "code": 0, "subCode": 0, "description": "Success", "url": "http://tbd" }]See Response Details for more information.
transferContains the returned information in response to the POST /transfer call.
transferIdentifierUnique identifier for the transfer.
transferStatusStatus of the transfer. Available status options are:

• completed
• pending
• failed
• canceled
• declined
• returned
• rejected
• expired
accountsContains the account information.
accountIdentifierUnique identifier for an account within a program.
pursesA purse is a balance holding object. This returns all purses including the primary/checking purse.
purseIdentifierUnique identifier for the purse that is returned.
purseTypeType of purse being returned.
availableBalanceThe amount available on the account.
ledgerBalanceThe amount of the ledger.
availableBalanceAsOfDateTimeThe date and time (UTC) that the available balance is reflective of. Since events can be published out of chronological order, the available balance should not be updated, if a more recent available balance as of date was previously processed.
ledgerBalancesAsOfDateTimeThe date and time (UTC) that the ledger balance is reflective of. Since events can be published out of chronological order, do not update the ledger balance if a more recent ledger balance as of date was previously processed.

Sample Update Request

Sample Update Request:-
{
   "transferAuthorizationType":"execute"
}

Sample Update Response:-
{
   "responseDetails":[
      {
         "code":0,
         "subCode":0,
         "description":"string",
         "url":"string"
      }
   ],
   "transfer":{
      "transferStatus":"completed"
      }
}

Transfer from Business to Customer Card

This API performs a transfer from a business account to a customer card.

API Call Structure

POST ​/programs​/{programCode}​/transfers​/singlecommit

Request Body

{  "transferRoute": {
    "transactionAmount": 0,
    "sourceTransferEndpoint": {
      "transferEndPointType": "string",
      "identifier": "string",
      "currency": "string",
      "encryptedCardData": {
        "version": "string",
        "ephemeralPublicKey": "string",
        "publicKeyHash": "string",
        "data": "string"
      },
      "encryptedBankAccount": {
        "version": "string",
        "ephemeralPublicKey": "string",
        "publicKeyHash": "string",
        "data": "string"
      },
      "encryptedUserData": {
        "version": "string",
        "ephemeralPublicKey": "string",
        "publicKeyHash": "string",
        "data": "string"
      }
    },
    "targetTransferEndpoint": {
      "transferEndPointType": "string",
      "identifier": "string",
      "currency": "string",
      "encryptedCardData": {
        "version": "string",
        "ephemeralPublicKey": "string",
        "publicKeyHash": "string",
        "data": "string"
      },
      "encryptedBankAccount": {
        "version": "string",
        "ephemeralPublicKey": "string",
        "publicKeyHash": "string",
        "data": "string"
      },
      "encryptedUserData": {
        "version": "string",
        "ephemeralPublicKey": "string",
        "publicKeyHash": "string",
        "data": "string"
      }
    }
  },
  "transferIdentifier": "string",
  "transferType": "string",
  "transferAuthorizationType": "string",
  "initiator": "string",
  "transferDescription": "string",
  "partnerReferenceData": "string"
}

Response Body

{
  "transfer": {
    "transferIdentifier": "string",
    "transferStatus": "string"
  },
  "accounts": [
    {
      "accountIdentifier": "string",
      "accountReferenceNumber": "string",
      "productCode": "string",
      "cipLevel": "string",
      "productMaterialType": "string",
      "currency": "string",
      "status": "string",
      "instantIssue": true,
      "statusReasons": [
        "string"
      ],
      "statusCure": "string",
      "accountStatusChangedDateTime": "string",
      "activationDate": "string",
      "directDepositInformation": {
        "accountNumber": "string",
        "routingNumber": "string"
      },
      "purses": [
        {
          "purseIdentifier": "string",
          "purseType": "string",
          "purseDescription": "string",
          "availableBalance": 0,
          "ledgerBalance": 0,
          "availableBalanceAsOfDateTime": "string",
          "ledgerBalanceAsOfDateTime": "string",
          "isHidden": true,
          "status": "string",
          "goalAmount": 0,
          "goalDate": "string",
          "iconName": "string",
          "createDate": "2023-01-29T22:59:31.772Z",
          "changeDate": "2023-01-29T22:59:31.772Z",
          "purseNumber": "string",
          "interestRateTierIdentifier": "string",
          "interestRateTier": "string",
          "interestYieldStartDate": "string",
          "interestYieldEndDate": "string",
          "APY": 0,
          "purseSubType": "string"
        }
      ],
      "additionalPurses": [
        {
          "purseIdentifier": "string",
          "purseType": "string",
          "purseDescription": "string",
          "availableBalance": 0,
          "ledgerBalance": 0,
          "availableBalanceAsOfDateTime": "string",
          "ledgerBalanceAsOfDateTime": "string",
          "isHidden": true,
          "status": "string",
          "goalAmount": 0,
          "goalDate": "string",
          "iconName": "string",
          "createDate": "2023-01-29T22:59:31.772Z",
          "changeDate": "2023-01-29T22:59:31.772Z",
          "purseNumber": "string",
          "interestRateTierIdentifier": "string",
          "interestRateTier": "string",
          "interestYieldStartDate": "string",
          "interestYieldEndDate": "string",
          "APY": 0,
          "purseSubType": "string"
        }
      ],
      "accountHolders": [
        {
          "paymentInstruments": [
            {
              "encryptedPrivatePaymentInstrumentData": {
                "version": "string",
                "ephemeralPublicKey": "string",
                "publicKeyHash": "string",
                "data": "string"
              },
              "privatePaymentInstrumentData": {
                "pan": "string",
                "cvv": "string",
                "expiration": {
                  "month": "string",
                  "year": "string"
                }
              },
              "paymentIdentifier": "string",
              "paymentInstrumentIdentifier": "string",
              "paymentInstrumentType": "string",
              "status": "string",
              "statusReasons": [
                "damaged"
              ],
              "isPinSet": true,
              "last4Pan": "string",
              "activatedDateTime": "string",
              "cardPausedDateTime": "string",
              "issuedDateTime": "string",
              "isOverIssuedDaysLimit": true,
              "isPrivateDataViewable": true,
              "embossedName": "string",
              "customCardImageIdentifier": "string",
              "paymentInstrumentLevel": "personalized"
            }
          ],
          "user": {
            "firstName": "string",
            "lastName": "string",
            "dobStatus": "string",
            "last4Identity": "string",
            "identityType": "string",
            "userIdentifier": "string",
            "peerTransferAcceptPreference": "string",
            "status": "string",
            "isPrimaryAccountHolder": true,
            "kycStateData": {
              "ofacStatus": "string",
              "kycStatus": "string",
              "kycPendingGate": "string"
            }
          },
          "accountHolderIdentifier": "string"
        }
      ],
      "termsAcceptances": [
        {
          "termsIdentifier": "string",
          "termsAcceptanceDateTime": "string",
          "termsAcceptanceFlag": true
        }
      ],
      "fraudData": {
        "additionalProp1": "string",
        "additionalProp2": "string",
        "additionalProp3": "string"
      },
      "accountType": "string",
      "language": "string",
      "accountCycleDay": 0,
      "accountEligibility": {
        "contactChangeEligibility": {
          "address": [
            "string"
          ],
          "email": [
            "string"
          ],
          "phone": [
            "string"
          ]
        }
      }
    }
  ],
  "fraudData": {
    "additionalProp1": "string",
    "additionalProp2": "string",
    "additionalProp3": "string"
  },
  "responseDetails": [
    {      "code": 0,
      "subCode": 0,
      "description": "string",
      "url": "string"
    }
  ]
}