Orb billing webhook
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/billing/webhooks/orb \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"id": "evt_orb_01H8XGJ",
"type": "invoice.issued"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/billing/webhooks/orb"
payload = {
"id": "evt_orb_01H8XGJ",
"type": "invoice.issued"
}
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({id: 'evt_orb_01H8XGJ', type: 'invoice.issued'})
};
fetch('https://api.orbit.devotel.io/api/v1/billing/webhooks/orb', 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.orbit.devotel.io/api/v1/billing/webhooks/orb",
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([
'id' => 'evt_orb_01H8XGJ',
'type' => 'invoice.issued'
]),
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.orbit.devotel.io/api/v1/billing/webhooks/orb"
payload := strings.NewReader("{\n \"id\": \"evt_orb_01H8XGJ\",\n \"type\": \"invoice.issued\"\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.orbit.devotel.io/api/v1/billing/webhooks/orb")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"evt_orb_01H8XGJ\",\n \"type\": \"invoice.issued\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/billing/webhooks/orb")
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 \"id\": \"evt_orb_01H8XGJ\",\n \"type\": \"invoice.issued\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"received": true,
"handled": true,
"duplicate": false
},
"meta": {
"request_id": "req_01H8XGJ",
"timestamp": "2026-08-02T12:00:00.000Z"
}
}Billing
Orb billing webhook
Receives Orb billing webhook events (invoice and subscription lifecycle). The request is authenticated by an HMAC signature header (no session), validated against the event schema, deduplicated, and dispatched to the billing engine. Configure this URL in your Orb webhook settings; it is not called directly by API clients.
POST
/
api
/
v1
/
billing
/
webhooks
/
orb
Orb billing webhook
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/billing/webhooks/orb \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"id": "evt_orb_01H8XGJ",
"type": "invoice.issued"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/billing/webhooks/orb"
payload = {
"id": "evt_orb_01H8XGJ",
"type": "invoice.issued"
}
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({id: 'evt_orb_01H8XGJ', type: 'invoice.issued'})
};
fetch('https://api.orbit.devotel.io/api/v1/billing/webhooks/orb', 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.orbit.devotel.io/api/v1/billing/webhooks/orb",
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([
'id' => 'evt_orb_01H8XGJ',
'type' => 'invoice.issued'
]),
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.orbit.devotel.io/api/v1/billing/webhooks/orb"
payload := strings.NewReader("{\n \"id\": \"evt_orb_01H8XGJ\",\n \"type\": \"invoice.issued\"\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.orbit.devotel.io/api/v1/billing/webhooks/orb")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"evt_orb_01H8XGJ\",\n \"type\": \"invoice.issued\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/billing/webhooks/orb")
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 \"id\": \"evt_orb_01H8XGJ\",\n \"type\": \"invoice.issued\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"received": true,
"handled": true,
"duplicate": false
},
"meta": {
"request_id": "req_01H8XGJ",
"timestamp": "2026-08-02T12:00:00.000Z"
}
}Authorizations
BearerApiKey
Dashboard JWT token from Clerk
Body
application/json
The Orb event object delivered by Orb.
⌘I