curl --request POST \
--url https://api.hel.io/v1/transaction/headless/prepare \
--header 'Content-Type: application/json' \
--data '
{
"paymentRequestId": "<string>",
"senderPublicKey": "<string>",
"currencyId": "<string>",
"quantity": 123,
"minimalUnitAmount": 123,
"affiliateCode": "<string>",
"btcPublicKey": "<string>",
"customerDetails": {
"email": "<string>",
"discordUser": {
"id": "<string>",
"username": "<string>"
},
"twitterUsername": "<string>",
"telegramUser": {
"id": 123,
"username": "<string>"
},
"fullName": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"street": "<string>",
"streetNumber": "<string>",
"areaCode": "<string>",
"deliveryAddress": "<string>",
"blinkAddress": "<string>",
"phoneNumber": "<string>",
"additionalJSON": "<string>",
"btcProperties": {
"ordinalsAddress": "<string>"
}
},
"productDetails": {
"name": "<string>",
"value": "<string>",
"active": true
}
}
'import requests
url = "https://api.hel.io/v1/transaction/headless/prepare"
payload = {
"paymentRequestId": "<string>",
"senderPublicKey": "<string>",
"currencyId": "<string>",
"quantity": 123,
"minimalUnitAmount": 123,
"affiliateCode": "<string>",
"btcPublicKey": "<string>",
"customerDetails": {
"email": "<string>",
"discordUser": {
"id": "<string>",
"username": "<string>"
},
"twitterUsername": "<string>",
"telegramUser": {
"id": 123,
"username": "<string>"
},
"fullName": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"street": "<string>",
"streetNumber": "<string>",
"areaCode": "<string>",
"deliveryAddress": "<string>",
"blinkAddress": "<string>",
"phoneNumber": "<string>",
"additionalJSON": "<string>",
"btcProperties": { "ordinalsAddress": "<string>" }
},
"productDetails": {
"name": "<string>",
"value": "<string>",
"active": True
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
paymentRequestId: '<string>',
senderPublicKey: '<string>',
currencyId: '<string>',
quantity: 123,
minimalUnitAmount: 123,
affiliateCode: '<string>',
btcPublicKey: '<string>',
customerDetails: {
email: '<string>',
discordUser: {id: '<string>', username: '<string>'},
twitterUsername: '<string>',
telegramUser: {id: 123, username: '<string>'},
fullName: '<string>',
country: '<string>',
state: '<string>',
city: '<string>',
street: '<string>',
streetNumber: '<string>',
areaCode: '<string>',
deliveryAddress: '<string>',
blinkAddress: '<string>',
phoneNumber: '<string>',
additionalJSON: '<string>',
btcProperties: {ordinalsAddress: '<string>'}
},
productDetails: {name: '<string>', value: '<string>', active: true}
})
};
fetch('https://api.hel.io/v1/transaction/headless/prepare', 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.hel.io/v1/transaction/headless/prepare",
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([
'paymentRequestId' => '<string>',
'senderPublicKey' => '<string>',
'currencyId' => '<string>',
'quantity' => 123,
'minimalUnitAmount' => 123,
'affiliateCode' => '<string>',
'btcPublicKey' => '<string>',
'customerDetails' => [
'email' => '<string>',
'discordUser' => [
'id' => '<string>',
'username' => '<string>'
],
'twitterUsername' => '<string>',
'telegramUser' => [
'id' => 123,
'username' => '<string>'
],
'fullName' => '<string>',
'country' => '<string>',
'state' => '<string>',
'city' => '<string>',
'street' => '<string>',
'streetNumber' => '<string>',
'areaCode' => '<string>',
'deliveryAddress' => '<string>',
'blinkAddress' => '<string>',
'phoneNumber' => '<string>',
'additionalJSON' => '<string>',
'btcProperties' => [
'ordinalsAddress' => '<string>'
]
],
'productDetails' => [
'name' => '<string>',
'value' => '<string>',
'active' => true
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.hel.io/v1/transaction/headless/prepare"
payload := strings.NewReader("{\n \"paymentRequestId\": \"<string>\",\n \"senderPublicKey\": \"<string>\",\n \"currencyId\": \"<string>\",\n \"quantity\": 123,\n \"minimalUnitAmount\": 123,\n \"affiliateCode\": \"<string>\",\n \"btcPublicKey\": \"<string>\",\n \"customerDetails\": {\n \"email\": \"<string>\",\n \"discordUser\": {\n \"id\": \"<string>\",\n \"username\": \"<string>\"\n },\n \"twitterUsername\": \"<string>\",\n \"telegramUser\": {\n \"id\": 123,\n \"username\": \"<string>\"\n },\n \"fullName\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"street\": \"<string>\",\n \"streetNumber\": \"<string>\",\n \"areaCode\": \"<string>\",\n \"deliveryAddress\": \"<string>\",\n \"blinkAddress\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"additionalJSON\": \"<string>\",\n \"btcProperties\": {\n \"ordinalsAddress\": \"<string>\"\n }\n },\n \"productDetails\": {\n \"name\": \"<string>\",\n \"value\": \"<string>\",\n \"active\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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.hel.io/v1/transaction/headless/prepare")
.header("Content-Type", "application/json")
.body("{\n \"paymentRequestId\": \"<string>\",\n \"senderPublicKey\": \"<string>\",\n \"currencyId\": \"<string>\",\n \"quantity\": 123,\n \"minimalUnitAmount\": 123,\n \"affiliateCode\": \"<string>\",\n \"btcPublicKey\": \"<string>\",\n \"customerDetails\": {\n \"email\": \"<string>\",\n \"discordUser\": {\n \"id\": \"<string>\",\n \"username\": \"<string>\"\n },\n \"twitterUsername\": \"<string>\",\n \"telegramUser\": {\n \"id\": 123,\n \"username\": \"<string>\"\n },\n \"fullName\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"street\": \"<string>\",\n \"streetNumber\": \"<string>\",\n \"areaCode\": \"<string>\",\n \"deliveryAddress\": \"<string>\",\n \"blinkAddress\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"additionalJSON\": \"<string>\",\n \"btcProperties\": {\n \"ordinalsAddress\": \"<string>\"\n }\n },\n \"productDetails\": {\n \"name\": \"<string>\",\n \"value\": \"<string>\",\n \"active\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/transaction/headless/prepare")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"paymentRequestId\": \"<string>\",\n \"senderPublicKey\": \"<string>\",\n \"currencyId\": \"<string>\",\n \"quantity\": 123,\n \"minimalUnitAmount\": 123,\n \"affiliateCode\": \"<string>\",\n \"btcPublicKey\": \"<string>\",\n \"customerDetails\": {\n \"email\": \"<string>\",\n \"discordUser\": {\n \"id\": \"<string>\",\n \"username\": \"<string>\"\n },\n \"twitterUsername\": \"<string>\",\n \"telegramUser\": {\n \"id\": 123,\n \"username\": \"<string>\"\n },\n \"fullName\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"street\": \"<string>\",\n \"streetNumber\": \"<string>\",\n \"areaCode\": \"<string>\",\n \"deliveryAddress\": \"<string>\",\n \"blinkAddress\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"additionalJSON\": \"<string>\",\n \"btcProperties\": {\n \"ordinalsAddress\": \"<string>\"\n }\n },\n \"productDetails\": {\n \"name\": \"<string>\",\n \"value\": \"<string>\",\n \"active\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"transactionToken": "string",
"transactionMessage": "string",
"serializedTransaction": "string",
"addressLookupTableAccounts": [
"string"
]
}Prepare a Headless Payment
Prepares a Solana headless transaction. Returns a payload that the payer can sign and submit.
curl --request POST \
--url https://api.hel.io/v1/transaction/headless/prepare \
--header 'Content-Type: application/json' \
--data '
{
"paymentRequestId": "<string>",
"senderPublicKey": "<string>",
"currencyId": "<string>",
"quantity": 123,
"minimalUnitAmount": 123,
"affiliateCode": "<string>",
"btcPublicKey": "<string>",
"customerDetails": {
"email": "<string>",
"discordUser": {
"id": "<string>",
"username": "<string>"
},
"twitterUsername": "<string>",
"telegramUser": {
"id": 123,
"username": "<string>"
},
"fullName": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"street": "<string>",
"streetNumber": "<string>",
"areaCode": "<string>",
"deliveryAddress": "<string>",
"blinkAddress": "<string>",
"phoneNumber": "<string>",
"additionalJSON": "<string>",
"btcProperties": {
"ordinalsAddress": "<string>"
}
},
"productDetails": {
"name": "<string>",
"value": "<string>",
"active": true
}
}
'import requests
url = "https://api.hel.io/v1/transaction/headless/prepare"
payload = {
"paymentRequestId": "<string>",
"senderPublicKey": "<string>",
"currencyId": "<string>",
"quantity": 123,
"minimalUnitAmount": 123,
"affiliateCode": "<string>",
"btcPublicKey": "<string>",
"customerDetails": {
"email": "<string>",
"discordUser": {
"id": "<string>",
"username": "<string>"
},
"twitterUsername": "<string>",
"telegramUser": {
"id": 123,
"username": "<string>"
},
"fullName": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"street": "<string>",
"streetNumber": "<string>",
"areaCode": "<string>",
"deliveryAddress": "<string>",
"blinkAddress": "<string>",
"phoneNumber": "<string>",
"additionalJSON": "<string>",
"btcProperties": { "ordinalsAddress": "<string>" }
},
"productDetails": {
"name": "<string>",
"value": "<string>",
"active": True
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
paymentRequestId: '<string>',
senderPublicKey: '<string>',
currencyId: '<string>',
quantity: 123,
minimalUnitAmount: 123,
affiliateCode: '<string>',
btcPublicKey: '<string>',
customerDetails: {
email: '<string>',
discordUser: {id: '<string>', username: '<string>'},
twitterUsername: '<string>',
telegramUser: {id: 123, username: '<string>'},
fullName: '<string>',
country: '<string>',
state: '<string>',
city: '<string>',
street: '<string>',
streetNumber: '<string>',
areaCode: '<string>',
deliveryAddress: '<string>',
blinkAddress: '<string>',
phoneNumber: '<string>',
additionalJSON: '<string>',
btcProperties: {ordinalsAddress: '<string>'}
},
productDetails: {name: '<string>', value: '<string>', active: true}
})
};
fetch('https://api.hel.io/v1/transaction/headless/prepare', 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.hel.io/v1/transaction/headless/prepare",
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([
'paymentRequestId' => '<string>',
'senderPublicKey' => '<string>',
'currencyId' => '<string>',
'quantity' => 123,
'minimalUnitAmount' => 123,
'affiliateCode' => '<string>',
'btcPublicKey' => '<string>',
'customerDetails' => [
'email' => '<string>',
'discordUser' => [
'id' => '<string>',
'username' => '<string>'
],
'twitterUsername' => '<string>',
'telegramUser' => [
'id' => 123,
'username' => '<string>'
],
'fullName' => '<string>',
'country' => '<string>',
'state' => '<string>',
'city' => '<string>',
'street' => '<string>',
'streetNumber' => '<string>',
'areaCode' => '<string>',
'deliveryAddress' => '<string>',
'blinkAddress' => '<string>',
'phoneNumber' => '<string>',
'additionalJSON' => '<string>',
'btcProperties' => [
'ordinalsAddress' => '<string>'
]
],
'productDetails' => [
'name' => '<string>',
'value' => '<string>',
'active' => true
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.hel.io/v1/transaction/headless/prepare"
payload := strings.NewReader("{\n \"paymentRequestId\": \"<string>\",\n \"senderPublicKey\": \"<string>\",\n \"currencyId\": \"<string>\",\n \"quantity\": 123,\n \"minimalUnitAmount\": 123,\n \"affiliateCode\": \"<string>\",\n \"btcPublicKey\": \"<string>\",\n \"customerDetails\": {\n \"email\": \"<string>\",\n \"discordUser\": {\n \"id\": \"<string>\",\n \"username\": \"<string>\"\n },\n \"twitterUsername\": \"<string>\",\n \"telegramUser\": {\n \"id\": 123,\n \"username\": \"<string>\"\n },\n \"fullName\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"street\": \"<string>\",\n \"streetNumber\": \"<string>\",\n \"areaCode\": \"<string>\",\n \"deliveryAddress\": \"<string>\",\n \"blinkAddress\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"additionalJSON\": \"<string>\",\n \"btcProperties\": {\n \"ordinalsAddress\": \"<string>\"\n }\n },\n \"productDetails\": {\n \"name\": \"<string>\",\n \"value\": \"<string>\",\n \"active\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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.hel.io/v1/transaction/headless/prepare")
.header("Content-Type", "application/json")
.body("{\n \"paymentRequestId\": \"<string>\",\n \"senderPublicKey\": \"<string>\",\n \"currencyId\": \"<string>\",\n \"quantity\": 123,\n \"minimalUnitAmount\": 123,\n \"affiliateCode\": \"<string>\",\n \"btcPublicKey\": \"<string>\",\n \"customerDetails\": {\n \"email\": \"<string>\",\n \"discordUser\": {\n \"id\": \"<string>\",\n \"username\": \"<string>\"\n },\n \"twitterUsername\": \"<string>\",\n \"telegramUser\": {\n \"id\": 123,\n \"username\": \"<string>\"\n },\n \"fullName\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"street\": \"<string>\",\n \"streetNumber\": \"<string>\",\n \"areaCode\": \"<string>\",\n \"deliveryAddress\": \"<string>\",\n \"blinkAddress\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"additionalJSON\": \"<string>\",\n \"btcProperties\": {\n \"ordinalsAddress\": \"<string>\"\n }\n },\n \"productDetails\": {\n \"name\": \"<string>\",\n \"value\": \"<string>\",\n \"active\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/transaction/headless/prepare")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"paymentRequestId\": \"<string>\",\n \"senderPublicKey\": \"<string>\",\n \"currencyId\": \"<string>\",\n \"quantity\": 123,\n \"minimalUnitAmount\": 123,\n \"affiliateCode\": \"<string>\",\n \"btcPublicKey\": \"<string>\",\n \"customerDetails\": {\n \"email\": \"<string>\",\n \"discordUser\": {\n \"id\": \"<string>\",\n \"username\": \"<string>\"\n },\n \"twitterUsername\": \"<string>\",\n \"telegramUser\": {\n \"id\": 123,\n \"username\": \"<string>\"\n },\n \"fullName\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"street\": \"<string>\",\n \"streetNumber\": \"<string>\",\n \"areaCode\": \"<string>\",\n \"deliveryAddress\": \"<string>\",\n \"blinkAddress\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"additionalJSON\": \"<string>\",\n \"btcProperties\": {\n \"ordinalsAddress\": \"<string>\"\n }\n },\n \"productDetails\": {\n \"name\": \"<string>\",\n \"value\": \"<string>\",\n \"active\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"transactionToken": "string",
"transactionMessage": "string",
"serializedTransaction": "string",
"addressLookupTableAccounts": [
"string"
]
}api.hel.io/v1 and generate API keys there. For the development environment, use api.dev.hel.io/v1 and generate API keys from moonpay.dev.hel.io.Body
The ID of the associated payment request.
The sender’s public key on the Solana blockchain.
The identifier of the currency being used for the transaction.
The quantity of the selected currency.
The minimal unit amount (e.g., in lamports for Solana).
Optional affiliate or referral code linked to the transaction.
Optional Bitcoin public key if BTC-related properties are included.
Details of the customer making the transaction. If the pay link is configured to require these fields, they are no longer optional.
Show child attributes
Show child attributes
Details of the product involved in the transaction.
Show child attributes
Show child attributes
Response
The transaction was prepared successfully
The ID of the associated payment request.
The sender’s public key on the Solana blockchain.
The identifier of the currency being used for the transaction.
The quantity of the selected currency.
The minimal unit amount (e.g., in lamports for Solana).
Optional affiliate or referral code linked to the transaction.
Optional Bitcoin public key if BTC-related properties are included.
Details of the customer making the transaction. If the pay link is configured to require these fields, they are no longer optional.
Show child attributes
Show child attributes
Details of the product involved in the transaction.
Show child attributes
Show child attributes
