Events
Everything that happens on your account, the same objects that webhooks deliver. Use the list to catch up after downtime.
/v1/eventsList eventsGET/v1/events/{id}Retrieve an eventPOST/v1/events/{id}/retryRedeliver an eventThe event object
Attributes
Unique identifier (UUID).
Always event.
true for live objects, false for test objects.
When it happened, ISO 8601 (UTC).
data.object is the object concerned (collection, payout, card, transaction…), in its state when the event is read or delivered.
{
"id": "3ab70bfc-785d-45ce-99de-fd9ab67e5cd4",
"object": "event",
"type": "collection.succeeded",
"livemode": false,
"created_at": "2026-10-30T13:47:09.807Z",
"data": {
"object": {
"id": "3b8f6c1e-2a47-4d1b-9e35-7c0a9d2f4e61",
"object": "collection",
"livemode": false,
"status": "succeeded",
"amount": 5000,
"currency": "XAF",
"fee": 125,
"net": 4875,
"customer": {
"name": "Awa Ndiaye",
"phone": "237670000999",
"country": "CM"
},
"operator": "MTN",
"description": "Order 42",
"client_reference": "order_42",
"metadata": {
"order_id": "42"
},
"next_action": null,
"failure_code": null,
"failure_message": null,
"created_at": "2026-10-30T13:47:06.394Z",
"updated_at": "2026-10-30T13:47:09.807Z"
}
}
}List events
Newest first.
Key roles: Owner, Finance or Developer
Query parameters
Only this event type (exact type, no wildcard).
20Number of objects to return, 1 to 100.
Cursor: the ID of the last object of the previous page.
Returns
Returns a list object: data holds up to limit event objects, and has_more tells whether more follow.
Errors worth handling
| HTTP | Code | Description |
|---|---|---|
400 | parameter_ | A parameter has the wrong type or value. See param. |
403 | permission_ | The key’s creator does not have the role required for this operation. |
curl "https://api.monerail.com/v1/events?type=collection.succeeded&limit=10" \
-H "Authorization: Bearer $MONERAIL_KEY"const res = await fetch('https://api.monerail.com/v1/events?type=collection.succeeded&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/events",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
params={"type": "collection.succeeded", "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/events?type=collection.succeeded&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/events?type=collection.succeeded&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/events?type=collection.succeeded&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/events?type=collection.succeeded&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/events?type=collection.succeeded&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/events",
"data": [
{
"id": "3ab70bfc-785d-45ce-99de-fd9ab67e5cd4",
"object": "event",
"type": "collection.succeeded",
"livemode": false,
"created_at": "2026-10-30T13:47:09.807Z",
"data": {
"object": {
"id": "3b8f6c1e-2a47-4d1b-9e35-7c0a9d2f4e61",
"object": "collection",
"livemode": false,
"status": "succeeded",
"amount": 5000,
"currency": "XAF",
"fee": 125,
"net": 4875,
"customer": {
"name": "Awa Ndiaye",
"phone": "237670000999",
"country": "CM"
},
"operator": "MTN",
"description": "Order 42",
"client_reference": "order_42",
"metadata": {
"order_id": "42"
},
"next_action": null,
"failure_code": null,
"failure_message": null,
"created_at": "2026-10-30T13:47:06.394Z",
"updated_at": "2026-10-30T13:47:09.807Z"
}
}
}
],
"has_more": true
}Retrieve an event
Key roles: Owner, Finance or Developer
Path parameters
ID of the event.
Returns
Returns the event object.
Errors worth handling
| HTTP | Code | Description |
|---|---|---|
403 | permission_ | The key’s creator does not have the role required for this operation. |
404 | resource_ | No object with this ID in this mode. |
curl https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4 \
-H "Authorization: Bearer $MONERAIL_KEY"const res = await fetch('https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4', {
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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4",
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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4');
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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4", 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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4"))
.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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4")
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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4");
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": "3ab70bfc-785d-45ce-99de-fd9ab67e5cd4",
"object": "event",
"type": "collection.succeeded",
"livemode": false,
"created_at": "2026-10-30T13:47:09.807Z",
"data": {
"object": {
"id": "3b8f6c1e-2a47-4d1b-9e35-7c0a9d2f4e61",
"object": "collection",
"livemode": false,
"status": "succeeded",
"amount": 5000,
"currency": "XAF",
"fee": 125,
"net": 4875,
"customer": {
"name": "Awa Ndiaye",
"phone": "237670000999",
"country": "CM"
},
"operator": "MTN",
"description": "Order 42",
"client_reference": "order_42",
"metadata": {
"order_id": "42"
},
"next_action": null,
"failure_code": null,
"failure_message": null,
"created_at": "2026-10-30T13:47:06.394Z",
"updated_at": "2026-10-30T13:47:09.807Z"
}
}
}Redeliver an event
Queues a new delivery of the event to every endpoint subscribed to it. redeliveries is the number of endpoints. This is the only way to redeliver an event: the dashboard has no redeliver button. Limited to 10 calls per event per hour.
Key roles: Owner or Developer
Path parameters
ID of the event.
Returns
Returns { id, object, redeliveries }.
Errors worth handling
| HTTP | Code | Description |
|---|---|---|
403 | permission_ | The key’s creator does not have the role required for this operation. |
404 | resource_ | No object with this ID in this mode. |
429 | rate_ | A rate limit was reached. Wait for Retry-After seconds. See Rate limits. |
curl -X POST https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry \
-H "Authorization: Bearer $MONERAIL_KEY"const res = await fetch('https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry', {
method: 'POST',
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.post(
"https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry",
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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_POSTFIELDS => '',
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.MethodPost, "https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry", 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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.POST(HttpRequest.BodyPublishers.noBody())
.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/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry")
req = Net::HTTP::Post.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.Post, "https://api.monerail.com/v1/events/3ab70bfc-785d-45ce-99de-fd9ab67e5cd4/retry");
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": "3ab70bfc-785d-45ce-99de-fd9ab67e5cd4",
"object": "event",
"redeliveries": 1
}