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:
- Establish a Counterparty: Create an external fund source and obtain approval through AML screening
- Generate Payment: Create a payment using the approved counterparty ID
- Accept Payment: Authorize the transaction to obtain deposit instructions
- 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:
- Happy Path: No RFI involvement—payment progresses smoothly from acceptance to execution
- Upfront RFI: Information requested before acceptance
- Post-Acceptance RFI: Documentation required during AML review after initial authorization
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
- Create a Counterparty: Establish an external recipient and obtain approval
- Create Withdrawal: Initiate the withdrawal using the counterparty
- Accept Withdrawal: Authorize the transaction
- Upload Documents: Provide documentation if Bultra requests additional information
Withdrawal Status Lifecycle
Withdrawals progress through similar states as payments:
REQUESTED→ACCEPTED→IN_PROGRESS→EXECUTED- May enter
CHANGES_REQUESTEDif RFI is triggered
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
- Both source and destination accounts must hold the same asset type
- Accounts can belong to different customers
- For cross-asset transfers, use the Exchange functionality instead
Three-Step Process
- Setup the Transfer: Use the
transfersendpoint to create the transfer and receive atransfer_id - Execute the Transfer: Accept the transfer via the
transfers/{transfer_id}/acceptendpoint - 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:
- FIX_SOURCE: Debits a set amount from the source account; the quote shows destination credit amount. Think of this as "selling."
- FIX_DESTINATION: Credits a fixed amount to the destination account; the quote shows source debit amount. This is like "buying" the destination amount.
Slippage Management
Slippage applies only to market exchanges with FIX_DESTINATION action. It protects against price fluctuations between quote and execution.
- Default: Maximum slippage is 100 basis points (1%)
- If actual price variance exceeds this, the trade cancels
- Any unused slippage buffer is credited back as a
MARKET_ADJUSTMENTtransaction
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
- Detection: Subscribe to
PAYMENT_CHANGES_REQUESTEDorWITHDRAWAL_CHANGES_REQUESTEDwebhook events for notifications - Investigation: Use Retrieve Status endpoint to identify required documents and their IDs
- Response: Upload documents via the Upload Document API using the provided document ID
- Resolution: Processing resumes once Bultra approves submitted documentation
Common RFI Triggers
- Large transaction amounts
- Unusual transaction patterns
- New counterparty relationships
- Cross-border transactions
- Certain high-risk jurisdictions
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