Money Movement

Learn how to move funds using Bultra: receive payments, send withdrawals, transfer between accounts, and exchange currencies.

Payments (Collections)

Collections are payments received from external entities into Bultra accounts. The process involves establishing a counterparty, generating a payment, and managing any information requests.

Creating a Payment

Creating a payment involves four sequential steps:

  1. Establish a Counterparty: Create an external fund source and obtain approval through AML screening
  2. Generate Payment: Create a payment using the approved counterparty ID
  3. Accept Payment: Authorize the transaction to obtain deposit instructions
  4. Handle RFIs: Upload required documents if Bultra requests additional information

Payment Status Tracking

Monitor payment progression using the Retrieve Payment Status endpoint. Payment states include:

Status Description
REQUESTED Payment created, awaiting acceptance
ACCEPTED Payment accepted, deposit instructions available
IN_PROGRESS Funds in transit
CHANGES_REQUESTED RFI triggered, documentation required
IN_REVIEW Under compliance review
EXECUTED Payment completed successfully

Payment Lifecycle Scenarios

Three common patterns exist:

Withdrawals

Withdrawals enable sending fiat or cryptocurrency to external entities (counterparties). The process is similar to payments but in the opposite direction.

Creating a Withdrawal

  1. Create a Counterparty: Establish an external recipient and obtain approval
  2. Create Withdrawal: Initiate the withdrawal using the counterparty
  3. Accept Withdrawal: Authorize the transaction
  4. Upload Documents: Provide documentation if Bultra requests additional information

Withdrawal Status Lifecycle

Withdrawals progress through similar states as payments:

Validation Rule: The PERSONAL_ACCOUNT purpose only applies to counterparties with profile.relationship_to_customer set as SELF. This designation cannot be used for third-party payments.

App Testing

In app.bultra.com environments, all fiat withdrawals exceeding $100 USD automatically trigger pre-acceptance RFI scenarios for testing purposes.

Transfers

Transfers move funds between any two accounts within the Bultra platform. Both accounts must hold the same asset type.

Key Constraints

Three-Step Process

  1. Setup the Transfer: Use the transfers endpoint to create the transfer and receive a transfer_id
  2. Execute the Transfer: Accept the transfer via the transfers/{transfer_id}/accept endpoint
  3. Retrieve Details: Query transfer information using the transfers/{transfer_id} endpoint
POST /v1/transfers HTTP/1.1
Host: api.bultra.com
Authorization: Bearer {access_token}
Content-Type: application/json

{
  "source_account_id": "acc_source_123",
  "destination_account_id": "acc_dest_456",
  "amount": "1000.00",
  "reference": "Monthly settlement"
}

Exchanges

Exchanges enable currency trades by moving assets between accounts with different asset types. Currently, one side of every exchange must be a stablecoin.

Note: Fiat-to-fiat exchanges require two separate transactions (fiat → stablecoin → fiat).

Trade Types

Type Execution Price
Market Trades Immediate at current market price May differ from quoted price
OTC Trades Arranged through support Executed at quoted price

Exchange Actions

The action field specifies which account has the fixed amount:

Slippage Management

Slippage applies only to market exchanges with FIX_DESTINATION action. It protects against price fluctuations between quote and execution.

Custom Slippage: Override the default by setting maximum_slippage in Accept Exchange requests. Lower slippage reduces required funds but increases rejection risk; higher slippage does the opposite.

Requests for Information (RFIs)

Bultra may request supporting documentation (such as invoices) to process payments or withdrawals. All RFIs require a response to proceed.

Important: All RFIs must be satisfied. Persistent non-compliance could result in processing delays, payment rejection, or potential customer offboarding.

Managing RFI Workflow

  1. Detection: Subscribe to PAYMENT_CHANGES_REQUESTED or WITHDRAWAL_CHANGES_REQUESTED webhook events for notifications
  2. Investigation: Use Retrieve Status endpoint to identify required documents and their IDs
  3. Response: Upload documents via the Upload Document API using the provided document ID
  4. Resolution: Processing resumes once Bultra approves submitted documentation

Common RFI Triggers

RFI Lifecycle Example

// 1. Webhook notification received
{
  "event_type": "PAYMENT_CHANGES_REQUESTED",
  "event_data": {
    "payment_id": "pay_123456",
    "status": "CHANGES_REQUESTED"
  }
}

// 2. Retrieve payment status to get document requirements
GET /v1/payments/pay_123456/status

// 3. Upload required document
POST /v1/documents/{document_id}/upload
Content-Type: multipart/form-data

// 4. Payment processing resumes automatically