Points de terminaison
Les adresses HTTPS où Monerail envoie les événements. 10 au plus par entreprise, test et production confondus. Voir Webhooks pour vérifier les signatures.
/v1/webhook_endpointsCréer un point de terminaisonGET/v1/webhook_endpoints/{id}Consulter un point de terminaisonGET/v1/webhook_endpointsLister les points de terminaisonDELETE/v1/webhook_endpoints/{id}Supprimer un point de terminaisonL’objet point de terminaison
Attributs
Identifiant unique (UUID).
true en production, false en mode test.
Toujours webhook_endpoint.
Adresse HTTPS qui reçoit les événements.
Types d’événements suivis. * : tous ; payout.* : tous ceux des paiements.
enableddisabledSecret de signature (whsec_…). Seulement dans la réponse 201 d’origine à la création, jamais ensuite.
Date de création, ISO 8601 (UTC).
{
"id": "9a661b6d-2895-414e-b1d1-51e473582cbb",
"object": "webhook_endpoint",
"livemode": false,
"url": "https://example.com/webhooks/monerail",
"events": [
"collection.succeeded",
"payout.*"
],
"status": "enabled",
"created_at": "2026-10-30T13:47:06.394Z"
}Créer un point de terminaison
La réponse 201 contient le secret de signature. Conservez-le : il ne sera plus jamais renvoyé, pas même si la requête est rejouée avec la même Idempotency-Key. Si vous le perdez, supprimez le point de terminaison et créez-en un nouveau. Les points de terminaison de production demandent un dossier d’entreprise validé.
Rôles de la clé : Propriétaire ou Développeur
Corps
Adresse HTTPS, 500 caractères au plus, sans utilisateur:mot_de_passe@. L’hôte doit être un nom de domaine : les adresses IP sont refusées.
Types d’événements à recevoir : types exacts, prefixe.* ou *.
Retour
Renvoie le nouvel objet point de terminaison avec 201.
Erreurs à prévoir
| HTTP | Code | Description |
|---|---|---|
400 | url_ | Pas une adresse HTTPS avec un nom de domaine, ou elle contient utilisateur:mot_de_passe@. Les adresses IP sont refusées. |
400 | parameter_ | Un paramètre a un type ou une valeur incorrects. Voir param. |
400 | limit_ | Votre entreprise a déjà 10 points de terminaison (test et production confondus). |
403 | permission_ | Le créateur de la clé n’a pas le rôle requis pour cette opération. |
curl https://api.monerail.com/v1/webhook_endpoints \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/monerail",
"events": [
"collection.succeeded",
"payout.*"
]
}'const res = await fetch('https://api.monerail.com/v1/webhook_endpoints', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://example.com/webhooks/monerail',
events: ['collection.succeeded', 'payout.*'],
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/webhook_endpoints",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
json={
"url": "https://example.com/webhooks/monerail",
"events": ["collection.succeeded", "payout.*"],
},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/webhook_endpoints');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://example.com/webhooks/monerail',
'events' => ['collection.succeeded', 'payout.*'],
]),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, err := json.Marshal(map[string]any{
"url": "https://example.com/webhooks/monerail",
"events": []string{"collection.succeeded", "payout.*"},
})
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/webhook_endpoints", bytes.NewReader(payload))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
String body = """
{
"url": "https://example.com/webhooks/monerail",
"events": [
"collection.succeeded",
"payout.*"
]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/webhook_endpoints"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/webhook_endpoints")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
req["Content-Type"] = "application/json"
req.body = JSON.generate({
url: "https://example.com/webhooks/monerail",
events: ["collection.succeeded", "payout.*"],
})
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/webhook_endpoints");
request.Content = JsonContent.Create(new
{
url = "https://example.com/webhooks/monerail",
events = new[] { "collection.succeeded", "payout.*" },
});
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"id": "9a661b6d-2895-414e-b1d1-51e473582cbb",
"object": "webhook_endpoint",
"livemode": false,
"url": "https://example.com/webhooks/monerail",
"events": [
"collection.succeeded",
"payout.*"
],
"status": "enabled",
"created_at": "2026-10-30T13:47:06.394Z",
"secret": "whsec_9b89c8bdc0b89f67637e017c49f9539d68b2132ea7492041"
}Consulter un point de terminaison
Le secret n’est pas inclus.
Rôles de la clé : Propriétaire ou Développeur
Paramètres de chemin
Identifiant du point de terminaison.
Retour
Renvoie l’objet point de terminaison.
Erreurs à prévoir
| HTTP | Code | Description |
|---|---|---|
403 | permission_ | Le créateur de la clé n’a pas le rôle requis pour cette opération. |
404 | resource_ | Aucun objet avec cet identifiant dans ce mode. |
curl https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb \
-H "Authorization: Bearer $MONERAIL_KEY"const res = await fetch('https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb', {
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"id": "9a661b6d-2895-414e-b1d1-51e473582cbb",
"object": "webhook_endpoint",
"livemode": false,
"url": "https://example.com/webhooks/monerail",
"events": [
"collection.succeeded",
"payout.*"
],
"status": "enabled",
"created_at": "2026-10-30T13:47:06.394Z"
}Lister les points de terminaison
Du plus récent au plus ancien. Les points de terminaison de test et de production sont listés séparément, selon le mode de la clé.
Rôles de la clé : Propriétaire ou Développeur
Paramètres de requête
20Nombre d’objets à renvoyer, de 1 à 100.
Curseur : l’identifiant du dernier objet de la page précédente.
Retour
Renvoie un objet liste : data contient jusqu’à limit objets webhook_endpoint, et has_more indique s’il en reste.
Erreurs à prévoir
| HTTP | Code | Description |
|---|---|---|
403 | permission_ | Le créateur de la clé n’a pas le rôle requis pour cette opération. |
curl "https://api.monerail.com/v1/webhook_endpoints?limit=10" \
-H "Authorization: Bearer $MONERAIL_KEY"const res = await fetch('https://api.monerail.com/v1/webhook_endpoints?limit=10', {
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.monerail.com/v1/webhook_endpoints",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
params={"limit": 10},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/webhook_endpoints?limit=10');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://api.monerail.com/v1/webhook_endpoints?limit=10", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/webhook_endpoints?limit=10"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/webhook_endpoints?limit=10")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.monerail.com/v1/webhook_endpoints?limit=10");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"object": "list",
"url": "/v1/webhook_endpoints",
"data": [
{
"id": "9a661b6d-2895-414e-b1d1-51e473582cbb",
"object": "webhook_endpoint",
"livemode": false,
"url": "https://example.com/webhooks/monerail",
"events": [
"collection.succeeded",
"payout.*"
],
"status": "enabled",
"created_at": "2026-10-30T13:47:06.394Z"
}
],
"has_more": false
}Supprimer un point de terminaison
Arrête tout envoi vers cette adresse, nouvelles tentatives comprises.
Rôles de la clé : Propriétaire ou Développeur
Paramètres de chemin
Identifiant du point de terminaison.
Retour
Renvoie { id, object, deleted: true }.
Erreurs à prévoir
| HTTP | Code | Description |
|---|---|---|
403 | permission_ | Le créateur de la clé n’a pas le rôle requis pour cette opération. |
404 | resource_ | Aucun objet avec cet identifiant dans ce mode. |
curl -X DELETE https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb \
-H "Authorization: Bearer $MONERAIL_KEY"const res = await fetch('https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.delete(
"https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodDelete, "https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.DELETE()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Delete, "https://api.monerail.com/v1/webhook_endpoints/9a661b6d-2895-414e-b1d1-51e473582cbb");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"id": "9a661b6d-2895-414e-b1d1-51e473582cbb",
"object": "webhook_endpoint",
"deleted": true
}