Create a crypto balance top-up
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"amount": 5000,
"currency": "usd",
"successUrl": "https://orbit.devotel.io/billing?topup=success",
"cancelUrl": "https://orbit.devotel.io/billing?topup=cancelled"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto"
payload = {
"amount": 5000,
"currency": "usd",
"successUrl": "https://orbit.devotel.io/billing?topup=success",
"cancelUrl": "https://orbit.devotel.io/billing?topup=cancelled"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 5000,
currency: 'usd',
successUrl: 'https://orbit.devotel.io/billing?topup=success',
cancelUrl: 'https://orbit.devotel.io/billing?topup=cancelled'
})
};
fetch('https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto', 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/balance/top-up-crypto",
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([
'amount' => 5000,
'currency' => 'usd',
'successUrl' => 'https://orbit.devotel.io/billing?topup=success',
'cancelUrl' => 'https://orbit.devotel.io/billing?topup=cancelled'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/balance/top-up-crypto"
payload := strings.NewReader("{\n \"amount\": 5000,\n \"currency\": \"usd\",\n \"successUrl\": \"https://orbit.devotel.io/billing?topup=success\",\n \"cancelUrl\": \"https://orbit.devotel.io/billing?topup=cancelled\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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/balance/top-up-crypto")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 5000,\n \"currency\": \"usd\",\n \"successUrl\": \"https://orbit.devotel.io/billing?topup=success\",\n \"cancelUrl\": \"https://orbit.devotel.io/billing?topup=cancelled\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 5000,\n \"currency\": \"usd\",\n \"successUrl\": \"https://orbit.devotel.io/billing?topup=success\",\n \"cancelUrl\": \"https://orbit.devotel.io/billing?topup=cancelled\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"checkoutUrl": "https://payments.example.com/invoice/4522625843",
"intentId": "cryptoIntent_01H8XGJ",
"paymentMethod": "crypto_nowpayments",
"feeCents": 0,
"feePaidByUser": false
},
"meta": {
"request_id": "req_01H8XGJ",
"timestamp": "2026-08-02T12:00:00.000Z"
}
}Billing
Create a crypto balance top-up
Mints a hosted crypto-payment invoice to top up the prepaid wallet and returns the checkoutUrl to open plus the intentId to poll for status. Send the amount in USD cents along with trusted successUrl and cancelUrl redirects, and a stable Idempotency-Key header (8–255 chars) so retries return the same invoice instead of minting a new one. Balance is credited asynchronously once the payment confirms on-chain.
POST
/
api
/
v1
/
billing
/
balance
/
top-up-crypto
Create a crypto balance top-up
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"amount": 5000,
"currency": "usd",
"successUrl": "https://orbit.devotel.io/billing?topup=success",
"cancelUrl": "https://orbit.devotel.io/billing?topup=cancelled"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto"
payload = {
"amount": 5000,
"currency": "usd",
"successUrl": "https://orbit.devotel.io/billing?topup=success",
"cancelUrl": "https://orbit.devotel.io/billing?topup=cancelled"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 5000,
currency: 'usd',
successUrl: 'https://orbit.devotel.io/billing?topup=success',
cancelUrl: 'https://orbit.devotel.io/billing?topup=cancelled'
})
};
fetch('https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto', 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/balance/top-up-crypto",
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([
'amount' => 5000,
'currency' => 'usd',
'successUrl' => 'https://orbit.devotel.io/billing?topup=success',
'cancelUrl' => 'https://orbit.devotel.io/billing?topup=cancelled'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/balance/top-up-crypto"
payload := strings.NewReader("{\n \"amount\": 5000,\n \"currency\": \"usd\",\n \"successUrl\": \"https://orbit.devotel.io/billing?topup=success\",\n \"cancelUrl\": \"https://orbit.devotel.io/billing?topup=cancelled\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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/balance/top-up-crypto")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 5000,\n \"currency\": \"usd\",\n \"successUrl\": \"https://orbit.devotel.io/billing?topup=success\",\n \"cancelUrl\": \"https://orbit.devotel.io/billing?topup=cancelled\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/billing/balance/top-up-crypto")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 5000,\n \"currency\": \"usd\",\n \"successUrl\": \"https://orbit.devotel.io/billing?topup=success\",\n \"cancelUrl\": \"https://orbit.devotel.io/billing?topup=cancelled\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"checkoutUrl": "https://payments.example.com/invoice/4522625843",
"intentId": "cryptoIntent_01H8XGJ",
"paymentMethod": "crypto_nowpayments",
"feeCents": 0,
"feePaidByUser": false
},
"meta": {
"request_id": "req_01H8XGJ",
"timestamp": "2026-08-02T12:00:00.000Z"
}
}Authorizations
BearerApiKey
Dashboard JWT token from Clerk
Headers
Stable client-generated key so retries reuse the same invoice.
Required string length:
8 - 255Body
application/json
Top-up amount in USD cents (minimum 100 = $1.00).
Required range:
x >= 100Trusted Orbit URL the payment provider redirects to on confirmation.
Trusted Orbit URL the payment provider redirects to on close.
Wallet currency; only USD is supported today.
Available options:
usd ⌘I