Get-or-create a permanent deposit address
curl --request POST \
--url https://api.pawpayments.com/api/v2/permanent \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"user_id": "<string>",
"asset": "<string>",
"notify_url": "<string>",
"metadata": {}
}
'import requests
url = "https://api.pawpayments.com/api/v2/permanent"
payload = {
"user_id": "<string>",
"asset": "<string>",
"notify_url": "<string>",
"metadata": {}
}
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({user_id: '<string>', asset: '<string>', notify_url: '<string>', metadata: {}})
};
fetch('https://api.pawpayments.com/api/v2/permanent', 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.pawpayments.com/api/v2/permanent",
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([
'user_id' => '<string>',
'asset' => '<string>',
'notify_url' => '<string>',
'metadata' => [
]
]),
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.pawpayments.com/api/v2/permanent"
payload := strings.NewReader("{\n \"user_id\": \"<string>\",\n \"asset\": \"<string>\",\n \"notify_url\": \"<string>\",\n \"metadata\": {}\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.pawpayments.com/api/v2/permanent")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_id\": \"<string>\",\n \"asset\": \"<string>\",\n \"notify_url\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pawpayments.com/api/v2/permanent")
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 \"user_id\": \"<string>\",\n \"asset\": \"<string>\",\n \"notify_url\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"result": {
"active": true,
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"created_at": 1763398900,
"deactivated_at": null,
"family": "evm",
"id": "65f1c3a4e8b1c2d3a4b5c6f0",
"metadata": {
"label": "main wallet"
},
"notify_url": "https://shop.example.com/webhook/paw",
"user_id": "u_42"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "amount",
"message": "Field required"
}
],
"message": "Validation failed"
},
"ok": false
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "amount",
"message": "Field required"
}
],
"message": "Validation failed"
},
"ok": false
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "amount",
"message": "Field required"
}
],
"message": "Validation failed"
},
"ok": false
}Permanent addresses
Get-or-create a permanent deposit address
Returns the existing active address for (user_id, family) or creates a new one. One EVM address covers all EVM chains.
POST
/
api
/
v2
/
permanent
Get-or-create a permanent deposit address
curl --request POST \
--url https://api.pawpayments.com/api/v2/permanent \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"user_id": "<string>",
"asset": "<string>",
"notify_url": "<string>",
"metadata": {}
}
'import requests
url = "https://api.pawpayments.com/api/v2/permanent"
payload = {
"user_id": "<string>",
"asset": "<string>",
"notify_url": "<string>",
"metadata": {}
}
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({user_id: '<string>', asset: '<string>', notify_url: '<string>', metadata: {}})
};
fetch('https://api.pawpayments.com/api/v2/permanent', 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.pawpayments.com/api/v2/permanent",
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([
'user_id' => '<string>',
'asset' => '<string>',
'notify_url' => '<string>',
'metadata' => [
]
]),
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.pawpayments.com/api/v2/permanent"
payload := strings.NewReader("{\n \"user_id\": \"<string>\",\n \"asset\": \"<string>\",\n \"notify_url\": \"<string>\",\n \"metadata\": {}\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.pawpayments.com/api/v2/permanent")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_id\": \"<string>\",\n \"asset\": \"<string>\",\n \"notify_url\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pawpayments.com/api/v2/permanent")
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 \"user_id\": \"<string>\",\n \"asset\": \"<string>\",\n \"notify_url\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"result": {
"active": true,
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"created_at": 1763398900,
"deactivated_at": null,
"family": "evm",
"id": "65f1c3a4e8b1c2d3a4b5c6f0",
"metadata": {
"label": "main wallet"
},
"notify_url": "https://shop.example.com/webhook/paw",
"user_id": "u_42"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "amount",
"message": "Field required"
}
],
"message": "Validation failed"
},
"ok": false
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "amount",
"message": "Field required"
}
],
"message": "Validation failed"
},
"ok": false
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "amount",
"message": "Field required"
}
],
"message": "Validation failed"
},
"ok": false
}Authorizations
Body
application/json
Required string length:
1 - 128Available options:
evm, bitcoin, litecoin, bitcoincash, tron, solana, xrp, ton Asset ticker (e.g. usdt_trc20). Used to infer family when family is omitted.
Maximum string length:
500Response
Created
Public shape of a permanent deposit address.
Deliberately omits the internal bookkeeping fields carried by addresses the
Telegram userbot creates (label, label_key, stats_excluded,
created_via, created_by_tg_id). _serialize whitelists by the fields
declared here, so leaving them out keeps them out of both the JSON response
and the published OpenAPI spec.
Show child attributes
Show child attributes
Example:
{ "active": true, "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb", "created_at": 1763398900, "deactivated_at": null, "family": "evm", "id": "65f1c3a4e8b1c2d3a4b5c6f0", "metadata": { "label": "main wallet" }, "notify_url": "https://shop.example.com/webhook/paw", "user_id": "u_42" }

