Platform Accounts
How to create and manage bank-level platform accounts?
This guide explains how to create bank-level platform accounts on the Cybrid Platform. Platform accounts enable your bank to hold fiat currencies and cryptocurrencies for executing trades, transfers, and other financial operations.
Overview
Platform accounts are bank-owned accounts that exist at the bank level rather than the customer level. They serve as the foundation for your bank's operations on the Cybrid platform.
You can create four types of platform accounts:
| Account Type | Purpose | Asset Type | Uniqueness |
|---|---|---|---|
fiat | Hold fiat currencies (USD, CAD, etc.) | Fiat only | Multiple (configurable) |
trading | Hold cryptocurrencies for trading | Crypto only | One per asset |
storage | Hold cryptocurrencies on-chain | Crypto only | One per asset |
invoice_operations | Pre-fund Lightning Network operations | Crypto or Fiat | One per asset |
Compliance Restriction: Platform Accounts Are Not Pool AccountsFinancial services regulations require clear fund ownership and segregation. Platform accounts must not be used as pool accounts that service multiple customers' funds. Each platform account represents funds owned by either your bank or a single customer—never groups of customers. For pooled funds belonging to multiple customers, use customer-level accounts with peer-to-peer transfer mechanisms.
Prerequisites
Before creating platform accounts:
- Required OAuth Scope:
accounts:execute - Bank Configuration: Your bank must be configured to support the asset type you're creating
- Platform Support: The platform must support the asset in your environment (sandbox/production)
Account States
All accounts progress through these states:
| State | Description |
|---|---|
storing | The platform is storing the account details in our private store |
created | The account is fully provisioned and ready to use |
State PollingAfter calling
POST /api/accounts, poll the account using/api/accounts/{account_guid}until the state transitions tocreatedbefore proceeding with operations.
Create a Fiat Account
Fiat accounts hold traditional currencies. Create a fiat account before funding your bank or processing fiat transfers.
Request
POST /api/accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"type": "fiat",
"asset": "USD",
"name": "Primary USD Funding Account"
}{
"guid": "account_guid",
"type": "fiat",
"asset": "USD",
"name": "Primary USD Funding Account",
"bank_guid": "bank_guid",
"platform_balance": 0,
"platform_available": 0,
"state": "storing",
"labels": [],
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}Parameters
| Parameter | Required | Description |
|---|---|---|
type | Yes | Must be fiat |
asset | Yes | The fiat currency code (e.g., USD, CAD) |
name | Yes | A descriptive name for the account (1-128 characters) |
labels | No | Optional array of labels for organizing accounts |
Bank-Level AccountsOmit the
customer_guidparameter to create a bank-level account. Ifcustomer_guidis provided, the account is created for that customer instead.
Common Errors
| HTTP Status | Error Code | Cause | Resolution |
|---|---|---|---|
| 400 | missing_parameter | Required parameter missing | Include required parameters |
| 400 | invalid_parameter | Invalid parameter value | Verify type and asset are valid |
| 401 | unauthorized | Invalid or missing token | Ensure valid bearer token with accounts:execute scope |
| 403 | forbidden | Insufficient scope | Request token with accounts:execute scope |
| 409 | data_exists | Account already exists | One trading/storage account per asset |
| 422 | maximum_accounts_reached | Exceeded account limit | Contact support to increase fiat account limit |
Multiple Fiat Accounts
By default, banks can create one fiat account per currency. To create multiple fiat accounts per currency (e.g., separate accounts for different purposes), contact Cybrid Support to increase your limit.
If you attempt to create additional accounts without this configuration, you'll receive:
{
"status": 409,
"error_message": "Account(s) for asset already exists",
"message_code": "data_exists"
}
Platform Accounts Cannot Be DeletedPlatform accounts cannot be deleted once created. Creating many platform accounts for temporary purposes results in a large number of permanent accounts, which adds management overhead to your bank.
Create a Trading Account
Trading accounts hold cryptocurrencies. Create a trading account before executing crypto buy/sell trades.
Request
POST /api/accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"type": "trading",
"asset": "USDC",
"name": "USDC Trading Account"
}{
"guid": "account_guid",
"type": "trading",
"asset": "USDC",
"name": "USDC Trading Account",
"bank_guid": "bank_guid",
"platform_balance": 0,
"platform_available": 0,
"state": "storing",
"labels": null,
"created_at": "2024-01-15T10:35:00Z",
"updated_at": "2024-01-15T10:35:00Z"
}
Uniqueness ConstraintOnly one trading account per cryptocurrency can exist at the bank level. Attempting to create a duplicate will result in a 409 Conflict error.
Create a Storage Account
Storage accounts hold cryptocurrencies on-chain rather than in the trading system. Use storage accounts for long-term storage or withdrawal operations.
Request
POST /api/accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"type": "storage",
"asset": "USDC",
"name": "USDC Cold Storage Account"
}{
"guid": "account_guid",
"type": "storage",
"asset": "USDC",
"name": "USDC Cold Storage Account",
"bank_guid": "bank_guid",
"platform_balance": 0,
"platform_available": 0,
"state": "storing",
"labels": null,
"created_at": "2024-01-15T10:40:00Z",
"updated_at": "2024-01-15T10:40:00Z"
}Parameters
| Parameter | Required | Description |
|---|---|---|
type | Yes | Must be storage |
asset | Yes | The cryptocurrency code (e.g., BTC, ETH) |
name | Yes | A descriptive name for the account (1-128 characters) |
labels | No | Optional array of labels for organizing accounts |
Key Differences from Trading Accounts
- Storage accounts hold assets on-chain with actual blockchain addresses
- Trading accounts hold assets within the Cybrid trading system for faster trade execution
- Each cryptocurrency can have one trading account and one storage account
Create an Invoice Operations Account
Invoice operations accounts pre-fund Lightning Network operations for your customers.
Request
POST /api/accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"type": "invoice_operations",
"asset": "BTC",
"name": "Lightning Network Operations"
}{
"guid": "account_guid",
"type": "invoice_operations",
"asset": "BTC",
"name": "Lightning Network Operations",
"bank_guid": "bank_guid",
"platform_balance": 0,
"platform_available": 0,
"state": "storing",
"labels": null,
"created_at": "2024-01-15T10:45:00Z",
"updated_at": "2024-01-15T10:45:00Z"
}Parameters
| Parameter | Required | Description |
|---|---|---|
type | Yes | Must be invoice_operations |
asset | Yes | The asset code (crypto or fiat, e.g., BTC) |
name | Yes | A descriptive name for the account (1-128 characters) |
labels | No | Optional array of labels for organizing accounts |
Bank-Level OnlyInvoice operations accounts can only be created at the bank level (not for customers) and are specifically for Lightning Network functionality.
Best Practices
- Use descriptive names: Include asset and purpose (e.g.,
USD Primary Funding Account) - Use labels for organization: Labels help filter and organize accounts (e.g.,
["production", "primary"]) - Poll for state changes: After creation, poll until state becomes
createdbefore using the account - Create accounts early: Set up all required accounts during your bank configuration phase
Next Steps
- With a fiat account created, you can generate quotes and create funding deposits
- With a trading account created, you can execute crypto trades
Updated about 7 hours ago
