Create a Deposit Webhook
curl --request POST \
--url https://api.hel.io/v1/webhook/deposit/api-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"depositId": "<string>",
"targetUrl": "<string>"
}
'import requests
url = "https://api.hel.io/v1/webhook/deposit/api-key"
payload = {
"name": "<string>",
"depositId": "<string>",
"targetUrl": "<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({name: '<string>', depositId: '<string>', targetUrl: '<string>'})
};
fetch('https://api.hel.io/v1/webhook/deposit/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/webhook/deposit/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([
'name' => '<string>',
'depositId' => '<string>',
'targetUrl' => '<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/webhook/deposit/api-key"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"depositId\": \"<string>\",\n \"targetUrl\": \"<string>\"\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/webhook/deposit/api-key")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"depositId\": \"<string>\",\n \"targetUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/webhook/deposit/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 \"name\": \"<string>\",\n \"depositId\": \"<string>\",\n \"targetUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body[
{
"id": "68f65b3f8eda28e9761b84d9",
"name": "deposithooktest",
"targetUrl": "https://webhook-test-url/f5f34313-c07a-4473-a46f-3a9feb8aea1a",
"inactive": false,
"createdAt": "2025-10-20T15:54:39.374Z",
"deposit": "68f65b2b03d7f2b2a12ca41e",
"isGlobal": false,
"sharedToken": "ZtiSEjZsTNoczv8kvDgtSx5+YO017NOlM/mrqEMj2nnHXi+UfmCQvuqvZlI0eH3JJWrW1D3UDWM+GgK9sVfR0NNPIMwWNV+jcFehjDIMlVq05Ahf2/5tUT/W7qqiHWZy"
}
]{
"message": "Api key or token is invalid",
"code": 401
}Deposits
Create a Deposit Webhook
Create a webhook for a deposit.
POST
/
v1
/
webhook
/
deposit
/
api-key
Create a Deposit Webhook
curl --request POST \
--url https://api.hel.io/v1/webhook/deposit/api-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"depositId": "<string>",
"targetUrl": "<string>"
}
'import requests
url = "https://api.hel.io/v1/webhook/deposit/api-key"
payload = {
"name": "<string>",
"depositId": "<string>",
"targetUrl": "<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({name: '<string>', depositId: '<string>', targetUrl: '<string>'})
};
fetch('https://api.hel.io/v1/webhook/deposit/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/webhook/deposit/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([
'name' => '<string>',
'depositId' => '<string>',
'targetUrl' => '<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/webhook/deposit/api-key"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"depositId\": \"<string>\",\n \"targetUrl\": \"<string>\"\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/webhook/deposit/api-key")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"depositId\": \"<string>\",\n \"targetUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/webhook/deposit/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 \"name\": \"<string>\",\n \"depositId\": \"<string>\",\n \"targetUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body[
{
"id": "68f65b3f8eda28e9761b84d9",
"name": "deposithooktest",
"targetUrl": "https://webhook-test-url/f5f34313-c07a-4473-a46f-3a9feb8aea1a",
"inactive": false,
"createdAt": "2025-10-20T15:54:39.374Z",
"deposit": "68f65b2b03d7f2b2a12ca41e",
"isGlobal": false,
"sharedToken": "ZtiSEjZsTNoczv8kvDgtSx5+YO017NOlM/mrqEMj2nnHXi+UfmCQvuqvZlI0eH3JJWrW1D3UDWM+GgK9sVfR0NNPIMwWNV+jcFehjDIMlVq05Ahf2/5tUT/W7qqiHWZy"
}
]{
"message": "Api key or token is invalid",
"code": 401
}NOTE: When using Helio on mainnet, set your Base URL to https://api.hel.io and generate your API keys from moonpay.hel.io . For testnet, use https://api.dev.hel.io and generate your API keys from moonpay.dev.hel.io.
To receive deposit-customer quota alerts (80% / 90% / 100% of your daily create limit), create a global webhook by omitting
depositId. Deposit-scoped webhooks only receive transaction events. See Deposit-customer quota alerts in the webhook overview for payloads and behavior.To receive
DEPOSIT_BELOW_MINIMUM alerts when a user has sent funds below the sweep threshold, create a deposit-scoped or global webhook. Both scopes receive this event when subscribed. See Below-minimum deposit alerts in the webhook overview for payloads and delivery rules.Authorizations
Authentication using JWT token
Query Parameters
Your API key can be generated on the Helio Dashboard’s settings page.
Body
application/json
⌘I
