Overview
The Dakota Platform uses a two-level structure for payment routing:- Recipients: Business entities or individuals that can receive payments
- Destinations: Specific accounts (crypto addresses, bank accounts) associated with recipients
Conceptual Model: The Payment Chain
Understanding the complete payment chain is crucial for successful integration:The Three-Level Hierarchy
-
Customer (Your User)
- Your application’s user who wants to send money
- Must complete KYB verification
- Can have multiple recipients
- Example: “Acme Corp” (your business customer)
-
Recipient (Payment Target Entity)
- Legal entity that will receive the payment
- Has compliance information (name, address)
- Can have multiple destinations for different asset types
- Example: “Supplier XYZ Ltd” (the business being paid)
-
Destination (Specific Account)
- The actual account where money is sent
- Can be crypto address, bank account, etc.
- Linked to exactly one recipient
- Example: “0x742d…” (USDC wallet address)
Why This Structure?
Compliance & Reporting- Recipients provide legal entity information for compliance
- Clear audit trail for who is being paid
- Supports anti-money laundering requirements
- One recipient can have multiple destinations (different currencies/networks)
- Easy to add new payment methods to existing relationships
- Supports complex business relationships
- Group related payment accounts by business relationship
- Cleaner user interfaces for managing multiple accounts
- Better record-keeping for accounting purposes
Real-World Example
Let’s say your customer “Acme Corp” wants to pay their supplier “Global Manufacturing Ltd”:- Customer ID: Who is paying (31Tgw0zSyDVo4Az66kmzUjMuwxx)
- Destination ID: Where money should go (31TgvweTHSjWNxfARrnhjmBKSem)
Complete Workflow Guide
Follow this step-by-step process to set up the complete payment chain:Step 1: Start with an Approved Customer
First, verify that your customer exists and has been KYB-approved:cURL
JavaScript
Python
Go
Rust
Java
Step 2: Create a Recipient
cURL
JavaScript
Python
Go
Rust
Java
Step 3: Add Payment Destinations
Crypto Destination
cURL
JavaScript
Python
Go
Rust
Java
Bank Destination
cURL
JavaScript
Python
Go
Rust
Java
Step 4: Create Transaction Accounts
Crypto Transaction
cURL
JavaScript
Python
Go
Rust
Java
Bank Transaction
cURL
JavaScript
Python
Go
Rust
Java
Best Practices for Payment Chain Management
Recipient Organization
- Use clear, descriptive recipient names matching legal business names
- Keep recipient addresses current for compliance
- Group destinations by recipient to maintain clear relationships
Destination Naming
- Use descriptive destination names: “Primary USDC Wallet”, “Backup Bank Account”
- Include asset type in names for clarity: “EUR Business Account”, “USDC Wallet”
- Maintain consistent naming conventions across your application
Relationship Management
- One recipient per business entity (don’t create duplicates)
- Multiple destinations per recipient for different payment methods
- Delete old destinations for security
Error Prevention
- Validate crypto addresses before creating destinations
- Test small transactions to new destinations first
- Implement approval workflows for new high-value destinations
- Monitor destination usage patterns for anomalies
Recipients
Recipients represent the entities that will receive payments. Each recipient must have a name and physical address for compliance purposes.Creating Recipients
Create a recipient for a customer.Recipient Fields
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
name | string | ✅ | Legal name of the recipient entity | "Acme Corporation" |
address | object | ✅ | Physical address for compliance | See address fields below |
external_id | string | ❌ | Your internal identifier for this recipient | "acme_recipient_001" |
Address Fields
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
street1 | string | ✅ | Street address line 1 | "123 Business Ave" |
street2 | string | ❌ | Street address line 2 | "Suite 456" |
street3 | string | ❌ | Street address line 3 | "Floor 2" |
city | string | ✅ | City name | "New York" |
region | string | ✅ | State/province/region code | "NY" |
postal_code | string | ❌ | ZIP/postal code | "10001" |
country | string | ✅ | ISO 3166-1 alpha-2 country code | "US" |
Request Example
cURL
JavaScript
Python
Go
Rust
Java
Listing Recipients
Get all recipients for a customer:cURL
JavaScript
Python
Go
Rust
Java
Destinations
Destinations are the specific accounts where funds will be sent. Each destination is associated with a recipient and specifies either a cryptocurrency address or traditional bank account details.Destination Types
Dakota Platform supports three destination types:- Crypto: Cryptocurrency addresses on supported networks
- Fiat US: US bank accounts (ACH transfers)
- Fiat IBAN: International bank accounts (SWIFT/SEPA transfers)
Creating Crypto Destinations
Add a cryptocurrency destination to a recipient.Crypto Destination Fields
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
destination_type | string | ✅ | Must be "crypto" for cryptocurrency destinations | "crypto" |
name | string | ✅ | Descriptive name for the destination | "Primary USDC Wallet" |
crypto_address | string | ✅ | Valid cryptocurrency address for the specified network | "0x742d35Cc..." |
network_id | string | ✅ | Network identifier. See supported networks below | "ethereum-mainnet" |
assets | array | ❌ | Specific assets this destination accepts (optional) | ["USDC", "USDT"] |
Supported Networks
| Network ID | Name | Supported Assets |
|---|---|---|
ethereum-mainnet | Ethereum | ETH, USDC, USDT, DAI |
polygon | Polygon | MATIC, USDC, USDT, DAI |
arbitrum | Arbitrum | ETH, USDC, USDT |
base | Base | ETH, USDC |
bitcoin | Bitcoin | BTC |
solana | Solana | SOL, USDC, USDT |
Request Example
cURL
JavaScript
Python
Go
Rust
Java
Response Example
API Reference: For complete details on crypto destination creation, see Create Crypto Destination
Creating US Bank Account Destinations
Add a US bank account destination.US Bank Account Destination Fields
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
destination_type | string | ✅ | Must be "fiat_us" for US bank accounts | "fiat_us" |
name | string | ✅ | Descriptive name for the destination | "Primary Business Account" |
aba_routing_number | string | ✅ | 9-digit ABA routing number | "123456789" |
account_number | string | ✅ | Bank account number | "9876543210" |
account_type | string | ✅ | Type of account. Must be "checking" or "savings" | "checking" |
assets | array | ❌ | Supported fiat currencies (optional) | ["USD"] |
Request Example
cURL
JavaScript
Python
Go
Rust
Java
Response Example
API Reference: For complete details on US bank account destination creation, see Create US Bank Destination
Creating IBAN Destinations
Add an IBAN destination for international transfers.IBAN Destination Fields
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
destination_type | string | ✅ | Must be "fiat_iban" for IBAN accounts | "fiat_iban" |
name | string | ✅ | Descriptive name for the destination | "European Business Account" |
iban | string | ✅ | Valid IBAN (International Bank Account Number) | "DE89370400440532013000" |
bic | string | ✅ | Bank Identifier Code (SWIFT code) | "COBADEFFXXX" |
assets | array | ❌ | Supported fiat currencies | ["EUR", "USD"] |
Request Example
cURL
JavaScript
Python
Go
Rust
Java
Response Example
API Reference: For complete details on IBAN destination creation, see Create IBAN Destination
Listing Destinations
Get all destinations for a recipient:cURL
JavaScript
Python
Go
Rust
Java
Response Example
Best Practices
Recipient Management
- Use descriptive names for recipients
- Keep address information current for compliance
- Organize recipients logically (e.g., by business relationship)
- Regular audits of recipient data
Destination Security
- Validate cryptocurrency addresses before saving
- Use test transactions for new crypto destinations
- Implement approval workflows for new destinations
- Monitor destination usage for suspicious activity
Compliance Considerations
- Maintain accurate recipient addresses for reporting
- Document the business relationship with each recipient
- Regular compliance reviews of recipient and destination data
- Implement proper access controls for destination management
Next Steps
Once you have recipients and destinations set up:- Create Transactions - Process payments to your configured destinations
- Webhook Integration - Get notified about payment status changes
- Testing - Test your integration with sandbox data