Create Wallet
curl --request POST \
--url https://api.hopnow.io/v1/accounts/{account_id}/wallets \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"currency": "<string>",
"network": "<string>",
"label": "<string>"
}
'import requests
url = "https://api.hopnow.io/v1/accounts/{account_id}/wallets"
payload = {
"currency": "<string>",
"network": "<string>",
"label": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({currency: '<string>', network: '<string>', label: '<string>'})
};
fetch('https://api.hopnow.io/v1/accounts/{account_id}/wallets', 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://api.hopnow.io/v1/accounts/{account_id}/wallets",
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([
'currency' => '<string>',
'network' => '<string>',
'label' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-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://api.hopnow.io/v1/accounts/{account_id}/wallets"
payload := strings.NewReader("{\n \"currency\": \"<string>\",\n \"network\": \"<string>\",\n \"label\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://api.hopnow.io/v1/accounts/{account_id}/wallets")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"currency\": \"<string>\",\n \"network\": \"<string>\",\n \"label\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hopnow.io/v1/accounts/{account_id}/wallets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"currency\": \"<string>\",\n \"network\": \"<string>\",\n \"label\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"account_id": "<string>",
"currency": "<string>",
"network": "<string>",
"address": "<string>",
"label": "<string>",
"status": "<string>",
"created": "<string>",
"updated": "<string>",
"created_by": "<string>",
"updated_by": "<string>"
}Wallets
Create Wallet
Create a new cryptocurrency wallet
POST
/
v1
/
accounts
/
{account_id}
/
wallets
Create Wallet
curl --request POST \
--url https://api.hopnow.io/v1/accounts/{account_id}/wallets \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"currency": "<string>",
"network": "<string>",
"label": "<string>"
}
'import requests
url = "https://api.hopnow.io/v1/accounts/{account_id}/wallets"
payload = {
"currency": "<string>",
"network": "<string>",
"label": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({currency: '<string>', network: '<string>', label: '<string>'})
};
fetch('https://api.hopnow.io/v1/accounts/{account_id}/wallets', 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://api.hopnow.io/v1/accounts/{account_id}/wallets",
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([
'currency' => '<string>',
'network' => '<string>',
'label' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-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://api.hopnow.io/v1/accounts/{account_id}/wallets"
payload := strings.NewReader("{\n \"currency\": \"<string>\",\n \"network\": \"<string>\",\n \"label\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://api.hopnow.io/v1/accounts/{account_id}/wallets")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"currency\": \"<string>\",\n \"network\": \"<string>\",\n \"label\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hopnow.io/v1/accounts/{account_id}/wallets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"currency\": \"<string>\",\n \"network\": \"<string>\",\n \"label\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"account_id": "<string>",
"currency": "<string>",
"network": "<string>",
"address": "<string>",
"label": "<string>",
"status": "<string>",
"created": "<string>",
"updated": "<string>",
"created_by": "<string>",
"updated_by": "<string>"
}Creates a deposit wallet for an account and asks the custody provider for an on-chain address. The wallet is returned with HTTP
Sandbox networks are testnets and carry no mainnet value. To credit a balance without an on-chain transfer at all, use Simulate Payin.
200.
Wallets are for crypto deposits only. For fiat, use Deposit Instructions. See the Deposit Flows guide for the full picture.
Requires an API key with write access on the accounts scope.
Path Parameters
string
required
The account’s external ID (starts with
acct_)Headers
This endpoint ignoresIdempotency-Key. A retry is a fresh create, not a replay of the first one. If an active wallet already exists for the pair on the current provider, the retry returns LIMIT_EXCEEDED. The client API has no delete endpoint. Read the wallet back with List Wallets before retrying.
Request Body
string
required
Crypto currency code, for example
USDC or USDT. The chain is not part of this value. Pass it in network.string
required
Blockchain network. Mainnets:
ethereum, solana, tron, plasma, bsc, polygon, xlm, avax, base. Testnets, non-production only: ethereum_sepolia, solana_devnet, tron_shasta.A recognized network name does not guarantee that a wallet can be provisioned. Availability depends on the enabled currency/network pairs for your organization and its custody provider.string
required
Label for the wallet, max 255 characters
Which currency and network combinations work
The combination must be one your organization is set up for. An unsupported pair returns422 WALLET_UNSUPPORTED_COMBINATION, with details.currency and details.network echoing what you sent.
The pairs available in each environment; your organization may be enabled for a different set.
- Production
- Sandbox
| Network | USDC | USDT | Notes |
|---|---|---|---|
ethereum | ✓ | ✓ | |
solana | ✓ | ✓ | |
bsc | ✓ | ✓ | BNB Smart Chain |
polygon | ✓ | ✓ | |
avax | ✓ | ✓ | Avalanche |
tron | ✓ | TRC-20 | |
xlm | ✓ | Stellar. USDT is not issued on Stellar | |
base | ✓ | Circle-issued native USDC, not the bridged USDbC. Base’s USDT is a third-party bridge Hop does not support |
| Network | USDC | USDT | Faucet |
|---|---|---|---|
ethereum_sepolia | ✓ | ✓ | USDC from the Circle faucet. Tether has no Sepolia deployment, so USDT here is Aave’s faucet-mintable test token. |
solana_devnet | ✓ | Solana Devnet faucet | |
tron_shasta | ✓ | Shasta faucet |
One wallet per pair
An account may hold one active wallet per currency and network on its current custody service. A second create for the same pair returns422 LIMIT_EXCEEDED, with details carrying resource, currency, network, current_count and max_allowed.
Response
string
Wallet identifier (starts with
wal_)string
Always returns
"wallet"string
The account that owns the wallet (starts with
acct_)string
Crypto currency code
string
Blockchain network, or
nullstring
On-chain deposit address, or
null when the custody provider has not returned one yet. Poll Get Wallet until it is populated, and never publish a wallet as a deposit target while it is null.string
The label you supplied, or
nullstring
Wallet status:
active, suspended or deactivated. A newly created wallet is always active.string
ISO 8601 timestamp when created
string
ISO 8601 timestamp when last updated, or
nullstring
Actor that created the wallet, or
null when no actor was recorded. API-key actors use an ak_ ID; Hop administrators are shown as hop_admin.string
Actor that last updated the wallet, or
null when no actor was recorded.Errors
| Status | code | When |
|---|---|---|
422 | VALIDATION_ERROR | currency, network or label is missing, not one of the values above, or over 255 characters |
422 | WALLET_UNSUPPORTED_COMBINATION | That currency is not available on that network for your organization; details carry currency and network |
422 | LIMIT_EXCEEDED | The account already has a wallet for this currency and network; details carry resource, currency, network, current_count and max_allowed |
502 | GATEWAY_ERROR | The custody provider failed to provision the wallet. No wallet is created: retry. |
Request Example
{
"currency": "USDC",
"network": "solana",
"label": "Treasury USDC"
}
Response Example
{
"id": "wal_5e2b9d7f1a4c6038b2e5d9a1",
"object": "wallet",
"account_id": "acct_9f2a7c1e6a2b4f3c9b8d2e5a",
"currency": "USDC",
"network": "solana",
"address": "C4bhocDFYFtK8fMypf31Frez7mztiim6PNvgDFbFQBLN",
"label": "Treasury USDC",
"status": "active",
"created": "2026-01-15T10:00:00Z",
"updated": "2026-01-15T10:00:00Z",
"created_by": null,
"updated_by": null
}