UPP Docs
Funding

Apply for a virtual account

POST
/customers/{customerId}/virtual-accounts

The customer's profile of the purpose the bank requires (profile_purpose from GET /virtual-account-banks) must be approved. A customer can have only one application that is not rejected per bank. The application is returned as submitting and then submitted to the bank; status changes (under_review, opened, rejected and so on) are sent with the virtual_account.status_changed webhook. Once opened, accounts holds the deposit instructions per currency; customer payments are credited to the merchant's cash account when received.

Authorization

merchantApiKeymerchantTimestampmerchantNoncemerchantSignature
headerX-API-KEY<token>

Merchant API key (starts with upk_, also accepts api-key); signing headers are also required

headerX-Timestamp<token>

Unix timestamp in seconds, within 300 seconds of server time

headerX-Nonce<token>

Unique per request; cannot be reused with the same credential during the timestamp validity window

headerX-Signature<token>

Hex HMAC-SHA256 signature (either letter case) of the method, full path, timestamp, nonce and body digest

Path Parameters

customerId*string

Customer ID (starts with cus_)

Request Body

application/json
  1. body
bank_id*string

Bank ID from GET /virtual-account-banks

currencies*array<string>

Currencies the account receives; must be supported by the bank

Items1 <= items

Response Body

Application created

application/json
  1. response
id*string

Virtual bank account ID (starts with vba_)

customer_id*string
bank_id*string

Bank ID, same as id in GET /virtual-account-banks

bank_name*string
currencies*array<string>

Currencies applied for

status*VirtualAccountStatus
  • submitting: created, waiting to be submitted to the bank
  • submit_uncertain: submission result uncertain, being checked by UPP
  • under_review: in review at the bank
  • opened: opened (final)
  • rejected: rejected (final); you can apply again
Value in"submitting""submit_uncertain""under_review""opened""rejected"
reject_reason*|

Reason when rejected

accounts*array<>

Deposit instructions per currency once opened; empty before that

opened_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X POST 'https://sandbox.getupp.net/api/v1/customers/string/virtual-accounts' \  -H 'Content-Type: application/json' \  -d '{  "bank_id": "sgb",  "currencies": [    "USD",    "EUR"  ]}'
Example Response
{  "id": "string",  "customer_id": "string",  "bank_id": "string",  "bank_name": "string",  "currencies": [    "string"  ],  "status": "submitting",  "reject_reason": "string",  "accounts": [    {      "currency": "string",      "deposit_instrument_id": "string",      "details": {        "account_name": "string",        "account_address": "string",        "account_number": "string",        "iban": "string",        "bank_name": "string",        "bank_country": "string",        "bank_address": "string",        "swift_code": "string",        "intermediary_bank_name": "string",        "intermediary_swift_code": "string",        "intermediary_bank_address": "string",        "routing": [          {            "type": "string",            "code_type": "string",            "code": "string"          }        ]      }    }  ],  "opened_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}