Create Payment Link
curl --request POST \
--url https://api.hopnow.io/v1/accounts/{account_id}/payment-requests \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.hopnow.io/v1/accounts/{account_id}/payment-requests"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.hopnow.io/v1/accounts/{account_id}/payment-requests', 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}/payment-requests",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.hopnow.io/v1/accounts/{account_id}/payment-requests"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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}/payment-requests")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hopnow.io/v1/accounts/{account_id}/payment-requests")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyPayment Links
Create Payment Link
Create a hosted checkout after the account’s payment link wallet is ready
POST
/
v1
/
accounts
/
{account_id}
/
payment-requests
Create Payment Link
curl --request POST \
--url https://api.hopnow.io/v1/accounts/{account_id}/payment-requests \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.hopnow.io/v1/accounts/{account_id}/payment-requests"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.hopnow.io/v1/accounts/{account_id}/payment-requests', 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}/payment-requests",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.hopnow.io/v1/accounts/{account_id}/payment-requests"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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}/payment-requests")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hopnow.io/v1/accounts/{account_id}/payment-requests")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyCreates a hosted checkout for one token on one network. Funds settle into the account’s payment link wallet for that currency, so set up the wallet first and wait for
Hop selects the prepared wallet from the account and currency; do not pass a wallet ID. The network must be in the wallet’s latest
Direct the payer to
ready.
Requires payins:write and a UUID in the Idempotency-Key header.
Request
{
"currency": "USDT",
"network": "ethereum",
"amount": "2.1",
"expiry_minutes": 30,
"reference": "order-123",
"payer": {
"entity_type": "INDIVIDUAL",
"relationship_type": "THIRD_PARTY",
"country_code": "GB",
"first_name": "Alex",
"last_name": "Example",
"date_of_birth": "1990-01-01"
}
}
available_networks. amount is positive with up to six decimal places and must meet the applicable payment minimum. expiry_minutes defaults to 30 and accepts 1–2880. Optional return_url must use HTTPS; reference accepts up to 255 characters.
Use the payer’s actual identity. Individuals require first_name, last_name and date_of_birth; companies use entity_type: COMPANY with legal_name and registration_number. relationship_type accepts SELF_OWNED or THIRD_PARTY.
Response
HTTP201 returns a new payment_request with an ID beginning preq_. An idempotent replay returns HTTP 200 with the original request.
{
"object": "payment_request",
"id": "preq_4k2m9x7v1q8n3r6t0p5cahbz",
"account_id": "acct_y7mxdf48446z91cqfdx6vym3",
"currency": "USDT",
"network": "ethereum",
"amount": "2.1",
"reference": "order-123",
"status": "pending",
"redirect_url": "https://checkout.example.com/pay/4k2m9x7v",
"expires_at": "2026-10-21T06:30:00Z",
"instructions": {
"address": "0x0954d452b7c0e5917059bcfff6695b42330d2b5c",
"tag": null,
"network": "ETHEREUM",
"protocol": "ERC20",
"uri": "ethereum:0x0954d452b7c0e5917059bcfff6695b42330d2b5c",
"alternatives": []
},
"received_amount": null,
"settled_amount": null,
"payin_id": null,
"created": "2026-10-21T06:00:00Z",
"updated": "2026-10-21T06:00:00Z",
"created_by": "ak_9admlg0248ynbfm2ci1qicry",
"updated_by": "ak_9admlg0248ynbfm2ci1qicry"
}
redirect_url, or have them send only the requested token on the specified network to the address in instructions, before expires_at. instructions mirrors the checkout provider’s deposit details for that token and network.
If the wallet is missing or not ready, the request returns 409 PAYMENT_LINK_WALLET_NOT_READY (details.payment_link_wallet_id names a pending wallet). Finish setup, then retry with the same body and idempotency key. Creating a payment request never provisions its wallet implicitly, and an existing checkout replay stays readable without repeating setup.
Track receipt and settlement with Get Payment Link. payin.received and the account balances confirm the customer credit.