curl --request POST \
--url https://api.hel.io/v1/charge/api-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"paymentRequestId": "<string>",
"requestAmount": "<string>",
"expiresAt": "<string>",
"successRedirectUrl": "<string>",
"cancelRedirectUrl": "<string>",
"prepareRequestBody": {
"customerDetails": {
"additionalJSON": "<string>"
}
}
}
'import requests
url = "https://api.hel.io/v1/charge/api-key"
payload = {
"paymentRequestId": "<string>",
"requestAmount": "<string>",
"expiresAt": "<string>",
"successRedirectUrl": "<string>",
"cancelRedirectUrl": "<string>",
"prepareRequestBody": { "customerDetails": { "additionalJSON": "<string>" } }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
paymentRequestId: '<string>',
requestAmount: '<string>',
expiresAt: '<string>',
successRedirectUrl: '<string>',
cancelRedirectUrl: '<string>',
prepareRequestBody: {customerDetails: {additionalJSON: '<string>'}}
})
};
fetch('https://api.hel.io/v1/charge/api-key', 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/charge/api-key",
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>',
'requestAmount' => '<string>',
'expiresAt' => '<string>',
'successRedirectUrl' => '<string>',
'cancelRedirectUrl' => '<string>',
'prepareRequestBody' => [
'customerDetails' => [
'additionalJSON' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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/charge/api-key"
payload := strings.NewReader("{\n \"paymentRequestId\": \"<string>\",\n \"requestAmount\": \"<string>\",\n \"expiresAt\": \"<string>\",\n \"successRedirectUrl\": \"<string>\",\n \"cancelRedirectUrl\": \"<string>\",\n \"prepareRequestBody\": {\n \"customerDetails\": {\n \"additionalJSON\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.hel.io/v1/charge/api-key")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"paymentRequestId\": \"<string>\",\n \"requestAmount\": \"<string>\",\n \"expiresAt\": \"<string>\",\n \"successRedirectUrl\": \"<string>\",\n \"cancelRedirectUrl\": \"<string>\",\n \"prepareRequestBody\": {\n \"customerDetails\": {\n \"additionalJSON\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/charge/api-key")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"paymentRequestId\": \"<string>\",\n \"requestAmount\": \"<string>\",\n \"expiresAt\": \"<string>\",\n \"successRedirectUrl\": \"<string>\",\n \"cancelRedirectUrl\": \"<string>\",\n \"prepareRequestBody\": {\n \"customerDetails\": {\n \"additionalJSON\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "68123806f923f09544c5c6a5",
"pageUrl": "https://app.hel.io/charge/2ac13665-9cfe-4466-b294-05069d57b0a2"
}{
"message": "Api key or token is invalid",
"code": 401
}Create a Charge
Creates a one-time pay link (charge) that can be used to collect a single payment from a customer.
curl --request POST \
--url https://api.hel.io/v1/charge/api-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"paymentRequestId": "<string>",
"requestAmount": "<string>",
"expiresAt": "<string>",
"successRedirectUrl": "<string>",
"cancelRedirectUrl": "<string>",
"prepareRequestBody": {
"customerDetails": {
"additionalJSON": "<string>"
}
}
}
'import requests
url = "https://api.hel.io/v1/charge/api-key"
payload = {
"paymentRequestId": "<string>",
"requestAmount": "<string>",
"expiresAt": "<string>",
"successRedirectUrl": "<string>",
"cancelRedirectUrl": "<string>",
"prepareRequestBody": { "customerDetails": { "additionalJSON": "<string>" } }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
paymentRequestId: '<string>',
requestAmount: '<string>',
expiresAt: '<string>',
successRedirectUrl: '<string>',
cancelRedirectUrl: '<string>',
prepareRequestBody: {customerDetails: {additionalJSON: '<string>'}}
})
};
fetch('https://api.hel.io/v1/charge/api-key', 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/charge/api-key",
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>',
'requestAmount' => '<string>',
'expiresAt' => '<string>',
'successRedirectUrl' => '<string>',
'cancelRedirectUrl' => '<string>',
'prepareRequestBody' => [
'customerDetails' => [
'additionalJSON' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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/charge/api-key"
payload := strings.NewReader("{\n \"paymentRequestId\": \"<string>\",\n \"requestAmount\": \"<string>\",\n \"expiresAt\": \"<string>\",\n \"successRedirectUrl\": \"<string>\",\n \"cancelRedirectUrl\": \"<string>\",\n \"prepareRequestBody\": {\n \"customerDetails\": {\n \"additionalJSON\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.hel.io/v1/charge/api-key")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"paymentRequestId\": \"<string>\",\n \"requestAmount\": \"<string>\",\n \"expiresAt\": \"<string>\",\n \"successRedirectUrl\": \"<string>\",\n \"cancelRedirectUrl\": \"<string>\",\n \"prepareRequestBody\": {\n \"customerDetails\": {\n \"additionalJSON\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/charge/api-key")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"paymentRequestId\": \"<string>\",\n \"requestAmount\": \"<string>\",\n \"expiresAt\": \"<string>\",\n \"successRedirectUrl\": \"<string>\",\n \"cancelRedirectUrl\": \"<string>\",\n \"prepareRequestBody\": {\n \"customerDetails\": {\n \"additionalJSON\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "68123806f923f09544c5c6a5",
"pageUrl": "https://app.hel.io/charge/2ac13665-9cfe-4466-b294-05069d57b0a2"
}{
"message": "Api key or token is invalid",
"code": 401
}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.Authorizations
Authentication using JWT token
Query Parameters
Your API key can be generated on the Helio Dashboard’s settings page.
Body
The unique identifier of the pay link you want to use to create a charge.
The amount to charge when using a dynamic pay link.
The expiration date and time of the charge in ISO 8601 format (e.g., 2025-09-01T14:31:44.171Z).
Redirect URL to use after a successful payment. The parent Pay Link must have a redirect URL enabled, and this value overrides the Paylink’s default success redirect URL.
Redirect URL to use after a cancelled payment. The parent Pay Link must have a redirect URL enabled, and this value overrides the Paylink’s default success redirect URL.
Optional configuration passed when preparing the charge.
Show child attributes
Show child attributes
