Skip to main content
POST
/
virtual-accounts
Create a Virtual Account
curl --request POST \
  --url https://sandbox-api.polygon.technology/v0.10/virtual-accounts \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: <idempotency-key>' \
  --data '
{
  "accountHolder": "<string>",
  "customerId": "<string>",
  "destination": {
    "details": {
      "asset": "<string>",
      "id": "<string>",
      "network": "<string>"
    },
    "type": "walletOms",
    "amount": "<string>"
  },
  "source": {
    "asset": "<string>",
    "network": "<string>"
  },
  "type": "<string>",
  "bankMemo": "<string>",
  "label": "<string>",
  "metadata": {},
  "sponsorGas": true
}
'
import requests

url = "https://sandbox-api.polygon.technology/v0.10/virtual-accounts"

payload = {
    "accountHolder": "<string>",
    "customerId": "<string>",
    "destination": {
        "details": {
            "asset": "<string>",
            "id": "<string>",
            "network": "<string>"
        },
        "type": "walletOms",
        "amount": "<string>"
    },
    "source": {
        "asset": "<string>",
        "network": "<string>"
    },
    "type": "<string>",
    "bankMemo": "<string>",
    "label": "<string>",
    "metadata": {},
    "sponsorGas": True
}
headers = {
    "Idempotency-Key": "<idempotency-key>",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
  method: 'POST',
  headers: {
    'Idempotency-Key': '<idempotency-key>',
    Authorization: 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    accountHolder: '<string>',
    customerId: '<string>',
    destination: {
      details: {asset: '<string>', id: '<string>', network: '<string>'},
      type: 'walletOms',
      amount: '<string>'
    },
    source: {asset: '<string>', network: '<string>'},
    type: '<string>',
    bankMemo: '<string>',
    label: '<string>',
    metadata: {},
    sponsorGas: true
  })
};

fetch('https://sandbox-api.polygon.technology/v0.10/virtual-accounts', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://sandbox-api.polygon.technology/v0.10/virtual-accounts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'accountHolder' => '<string>',
    'customerId' => '<string>',
    'destination' => [
        'details' => [
                'asset' => '<string>',
                'id' => '<string>',
                'network' => '<string>'
        ],
        'type' => 'walletOms',
        'amount' => '<string>'
    ],
    'source' => [
        'asset' => '<string>',
        'network' => '<string>'
    ],
    'type' => '<string>',
    'bankMemo' => '<string>',
    'label' => '<string>',
    'metadata' => [
        
    ],
    'sponsorGas' => true
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "Content-Type: application/json",
    "Idempotency-Key: <idempotency-key>"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://sandbox-api.polygon.technology/v0.10/virtual-accounts"

	payload := strings.NewReader("{\n  \"accountHolder\": \"<string>\",\n  \"customerId\": \"<string>\",\n  \"destination\": {\n    \"details\": {\n      \"asset\": \"<string>\",\n      \"id\": \"<string>\",\n      \"network\": \"<string>\"\n    },\n    \"type\": \"walletOms\",\n    \"amount\": \"<string>\"\n  },\n  \"source\": {\n    \"asset\": \"<string>\",\n    \"network\": \"<string>\"\n  },\n  \"type\": \"<string>\",\n  \"bankMemo\": \"<string>\",\n  \"label\": \"<string>\",\n  \"metadata\": {},\n  \"sponsorGas\": true\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Idempotency-Key", "<idempotency-key>")
	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://sandbox-api.polygon.technology/v0.10/virtual-accounts")
  .header("Idempotency-Key", "<idempotency-key>")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"accountHolder\": \"<string>\",\n  \"customerId\": \"<string>\",\n  \"destination\": {\n    \"details\": {\n      \"asset\": \"<string>\",\n      \"id\": \"<string>\",\n      \"network\": \"<string>\"\n    },\n    \"type\": \"walletOms\",\n    \"amount\": \"<string>\"\n  },\n  \"source\": {\n    \"asset\": \"<string>\",\n    \"network\": \"<string>\"\n  },\n  \"type\": \"<string>\",\n  \"bankMemo\": \"<string>\",\n  \"label\": \"<string>\",\n  \"metadata\": {},\n  \"sponsorGas\": true\n}")
  .asString();
require 'uri'
require 'net/http'

url = URI("https://sandbox-api.polygon.technology/v0.10/virtual-accounts")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"accountHolder\": \"<string>\",\n  \"customerId\": \"<string>\",\n  \"destination\": {\n    \"details\": {\n      \"asset\": \"<string>\",\n      \"id\": \"<string>\",\n      \"network\": \"<string>\"\n    },\n    \"type\": \"walletOms\",\n    \"amount\": \"<string>\"\n  },\n  \"source\": {\n    \"asset\": \"<string>\",\n    \"network\": \"<string>\"\n  },\n  \"type\": \"<string>\",\n  \"bankMemo\": \"<string>\",\n  \"label\": \"<string>\",\n  \"metadata\": {},\n  \"sponsorGas\": true\n}"

response = http.request(request)
puts response.read_body
{
  "bankDetails": {
    "domestic": {
      "accountNumber": "<string>",
      "accountType": "<string>",
      "bankAddress": "<string>",
      "bankName": "<string>",
      "beneficiary": {
        "address": {
          "city": "<string>",
          "country": "<string>",
          "postalCode": "<string>",
          "streetAddress": "<string>",
          "countryArea": "<string>"
        },
        "name": "<string>"
      },
      "network": [],
      "routingNumber": "<string>"
    },
    "swift": {
      "accountNumber": "<string>",
      "bankAddress": "<string>",
      "bankName": "<string>",
      "beneficiary": {
        "address": {
          "city": "<string>",
          "country": "<string>",
          "postalCode": "<string>",
          "streetAddress": "<string>",
          "countryArea": "<string>"
        },
        "name": "<string>"
      },
      "bic": "<string>",
      "memo": "<string>"
    }
  },
  "bankMemo": "<string>",
  "createdAt": "2023-11-07T05:31:56Z",
  "customerId": "<string>",
  "deletionRequestedAt": "2023-11-07T05:31:56Z",
  "deletionRequestedBy": "<string>",
  "destination": {
    "category": "crypto",
    "details": {
      "asset": "<string>",
      "blockchainAddress": "<string>",
      "blockchainAsset": {
        "chainId": "<string>",
        "tokenId": "<string>"
      },
      "id": "<string>",
      "network": "<string>",
      "txHash": "<string>"
    },
    "type": "walletOms",
    "party": {
      "customerId": "<string>",
      "relationship": "customer"
    }
  },
  "finalBalance": {
    "currency": "<string>",
    "display": "<string>",
    "value": "<string>"
  },
  "id": "<string>",
  "label": "<string>",
  "metadata": {},
  "object": "virtualAccount",
  "source": {
    "asset": "<string>",
    "network": "<string>"
  },
  "statusReason": "<string>",
  "updatedAt": "2023-11-07T05:31:56Z"
}

Authorizations

Authorization
string
header
required

Token from POST /auth/token

Headers

Idempotency-Key
string
required

Required on POST and PUT requests. Use a unique value per logical mutation attempt, for example a UUID.

Body

application/json
accountHolder
string
required

Must be "customer".

customerId
string
required

Owning customer (cus_… or legacy public id).

destination
object
required

Side-shaped destination: walletOms (OMS wallet) or walletExternal (registered ExternalAccount). The server validates asset/network against the resolved EA.

source
object
required
type
string
required

Must be "bankUs".

bankMemo
string

Optional wire/ACH memo the customer can include.

label
string

Partner display label.

metadata
object
sponsorGas
boolean
default:true

When true, OMS absorbs the on-chain gas cost for the destination delivery. Only true is currently supported.

Response

201 - application/json

The request has succeeded and a new resource has been created as a result.

bankDetails
object

Null until the underlying deposit account is provisioned.

bankMemo
string
createdAt
string<date-time>
customerId
string
deletionRequestedAt
string<date-time>

Set when DELETE has been requested but the close webhook has not yet finalized.

deletionRequestedBy
string

Identity (JWT subject claim) of the caller who invoked DELETE.

destination
object

Unified side shape.

failureReason
enum<string>

Set when status = failed; closed enum identifying the failure category.

Available options:
provisioningTimeout,
systemError,
ereborRejected,
deletePendingTimeout
finalBalance
object

DDA balance snapshot at the moment the VA flipped to deleted.

id
string
label
string
metadata
object
object
enum<string>
Available options:
virtualAccount
source
object
status
enum<string>
Available options:
pending,
active,
frozen,
closed,
deleted,
failed,
inactiveActionRequired
statusReason
string
updatedAt
string<date-time>