Create invoice
curl --request POST \
--url https://api.reclack.com/v1/invoices \
--header 'Api-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_id": "cus_7Fh2PqX9",
"amount": "120.00",
"due_at": "2026-11-10T23:59:59Z",
"networks": [
"base",
"ethereum"
],
"network": "base",
"memo": "October retainer and platform seats",
"footer": "Thanks for working with us.",
"tax_id": "GB123456789",
"line_items": [
{
"description": "Platform seats",
"quantity": 4,
"unit_amount": "20.00"
}
],
"custom_fields": [
{
"name": "Purchase order",
"value": "PO-4821"
}
]
}
'import requests
url = "https://api.reclack.com/v1/invoices"
payload = {
"customer_id": "cus_7Fh2PqX9",
"amount": "120.00",
"due_at": "2026-11-10T23:59:59Z",
"networks": ["base", "ethereum"],
"network": "base",
"memo": "October retainer and platform seats",
"footer": "Thanks for working with us.",
"tax_id": "GB123456789",
"line_items": [
{
"description": "Platform seats",
"quantity": 4,
"unit_amount": "20.00"
}
],
"custom_fields": [
{
"name": "Purchase order",
"value": "PO-4821"
}
]
}
headers = {
"Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_id: 'cus_7Fh2PqX9',
amount: '120.00',
due_at: '2026-11-10T23:59:59Z',
networks: ['base', 'ethereum'],
network: 'base',
memo: 'October retainer and platform seats',
footer: 'Thanks for working with us.',
tax_id: 'GB123456789',
line_items: [{description: 'Platform seats', quantity: 4, unit_amount: '20.00'}],
custom_fields: [{name: 'Purchase order', value: 'PO-4821'}]
})
};
fetch('https://api.reclack.com/v1/invoices', 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.reclack.com/v1/invoices",
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([
'customer_id' => 'cus_7Fh2PqX9',
'amount' => '120.00',
'due_at' => '2026-11-10T23:59:59Z',
'networks' => [
'base',
'ethereum'
],
'network' => 'base',
'memo' => 'October retainer and platform seats',
'footer' => 'Thanks for working with us.',
'tax_id' => 'GB123456789',
'line_items' => [
[
'description' => 'Platform seats',
'quantity' => 4,
'unit_amount' => '20.00'
]
],
'custom_fields' => [
[
'name' => 'Purchase order',
'value' => 'PO-4821'
]
]
]),
CURLOPT_HTTPHEADER => [
"Api-Key: <api-key>",
"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.reclack.com/v1/invoices"
payload := strings.NewReader("{\n \"customer_id\": \"cus_7Fh2PqX9\",\n \"amount\": \"120.00\",\n \"due_at\": \"2026-11-10T23:59:59Z\",\n \"networks\": [\n \"base\",\n \"ethereum\"\n ],\n \"network\": \"base\",\n \"memo\": \"October retainer and platform seats\",\n \"footer\": \"Thanks for working with us.\",\n \"tax_id\": \"GB123456789\",\n \"line_items\": [\n {\n \"description\": \"Platform seats\",\n \"quantity\": 4,\n \"unit_amount\": \"20.00\"\n }\n ],\n \"custom_fields\": [\n {\n \"name\": \"Purchase order\",\n \"value\": \"PO-4821\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Key", "<api-key>")
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.reclack.com/v1/invoices")
.header("Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"cus_7Fh2PqX9\",\n \"amount\": \"120.00\",\n \"due_at\": \"2026-11-10T23:59:59Z\",\n \"networks\": [\n \"base\",\n \"ethereum\"\n ],\n \"network\": \"base\",\n \"memo\": \"October retainer and platform seats\",\n \"footer\": \"Thanks for working with us.\",\n \"tax_id\": \"GB123456789\",\n \"line_items\": [\n {\n \"description\": \"Platform seats\",\n \"quantity\": 4,\n \"unit_amount\": \"20.00\"\n }\n ],\n \"custom_fields\": [\n {\n \"name\": \"Purchase order\",\n \"value\": \"PO-4821\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reclack.com/v1/invoices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"cus_7Fh2PqX9\",\n \"amount\": \"120.00\",\n \"due_at\": \"2026-11-10T23:59:59Z\",\n \"networks\": [\n \"base\",\n \"ethereum\"\n ],\n \"network\": \"base\",\n \"memo\": \"October retainer and platform seats\",\n \"footer\": \"Thanks for working with us.\",\n \"tax_id\": \"GB123456789\",\n \"line_items\": [\n {\n \"description\": \"Platform seats\",\n \"quantity\": 4,\n \"unit_amount\": \"20.00\"\n }\n ],\n \"custom_fields\": [\n {\n \"name\": \"Purchase order\",\n \"value\": \"PO-4821\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "in_0182",
"code": "INV-00182",
"reference": "in_0182",
"status": "open",
"amount": "120.00",
"amount_atomic": "120000000",
"fee_atomic": "1200000",
"currency": "USDC",
"network": "base",
"chain_id": 8453,
"period_start": "2026-10-18T22:07:41Z",
"period_end": "2026-10-18T22:07:41Z",
"attempt_count": 0,
"next_attempt_at": "2026-10-18T22:07:41Z",
"paid_at": "2026-10-18T22:07:41Z",
"sent_at": "2026-10-18T22:07:41Z",
"reminders_enabled": true,
"last_reminder_at": "2026-10-18T22:07:41Z",
"failure_code": "insufficient_allowance",
"failure_message": "The authorization no longer covers this amount",
"metadata": {},
"created_at": "2026-10-18T22:07:41Z",
"updated_at": "2026-10-18T22:07:41Z"
}
}{
"error": {
"type": "invalid_request_error",
"code": "price_not_found",
"message": "No price was found for that id"
}
}{
"error": {
"type": "invalid_request_error",
"code": "price_not_found",
"message": "No price was found for that id"
}
}{
"error": {
"type": "invalid_request_error",
"code": "price_not_found",
"message": "No price was found for that id"
}
}Invoices
Create Invoice
Create a draft invoice.
POST
/
v1
/
invoices
Create invoice
curl --request POST \
--url https://api.reclack.com/v1/invoices \
--header 'Api-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_id": "cus_7Fh2PqX9",
"amount": "120.00",
"due_at": "2026-11-10T23:59:59Z",
"networks": [
"base",
"ethereum"
],
"network": "base",
"memo": "October retainer and platform seats",
"footer": "Thanks for working with us.",
"tax_id": "GB123456789",
"line_items": [
{
"description": "Platform seats",
"quantity": 4,
"unit_amount": "20.00"
}
],
"custom_fields": [
{
"name": "Purchase order",
"value": "PO-4821"
}
]
}
'import requests
url = "https://api.reclack.com/v1/invoices"
payload = {
"customer_id": "cus_7Fh2PqX9",
"amount": "120.00",
"due_at": "2026-11-10T23:59:59Z",
"networks": ["base", "ethereum"],
"network": "base",
"memo": "October retainer and platform seats",
"footer": "Thanks for working with us.",
"tax_id": "GB123456789",
"line_items": [
{
"description": "Platform seats",
"quantity": 4,
"unit_amount": "20.00"
}
],
"custom_fields": [
{
"name": "Purchase order",
"value": "PO-4821"
}
]
}
headers = {
"Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_id: 'cus_7Fh2PqX9',
amount: '120.00',
due_at: '2026-11-10T23:59:59Z',
networks: ['base', 'ethereum'],
network: 'base',
memo: 'October retainer and platform seats',
footer: 'Thanks for working with us.',
tax_id: 'GB123456789',
line_items: [{description: 'Platform seats', quantity: 4, unit_amount: '20.00'}],
custom_fields: [{name: 'Purchase order', value: 'PO-4821'}]
})
};
fetch('https://api.reclack.com/v1/invoices', 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.reclack.com/v1/invoices",
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([
'customer_id' => 'cus_7Fh2PqX9',
'amount' => '120.00',
'due_at' => '2026-11-10T23:59:59Z',
'networks' => [
'base',
'ethereum'
],
'network' => 'base',
'memo' => 'October retainer and platform seats',
'footer' => 'Thanks for working with us.',
'tax_id' => 'GB123456789',
'line_items' => [
[
'description' => 'Platform seats',
'quantity' => 4,
'unit_amount' => '20.00'
]
],
'custom_fields' => [
[
'name' => 'Purchase order',
'value' => 'PO-4821'
]
]
]),
CURLOPT_HTTPHEADER => [
"Api-Key: <api-key>",
"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.reclack.com/v1/invoices"
payload := strings.NewReader("{\n \"customer_id\": \"cus_7Fh2PqX9\",\n \"amount\": \"120.00\",\n \"due_at\": \"2026-11-10T23:59:59Z\",\n \"networks\": [\n \"base\",\n \"ethereum\"\n ],\n \"network\": \"base\",\n \"memo\": \"October retainer and platform seats\",\n \"footer\": \"Thanks for working with us.\",\n \"tax_id\": \"GB123456789\",\n \"line_items\": [\n {\n \"description\": \"Platform seats\",\n \"quantity\": 4,\n \"unit_amount\": \"20.00\"\n }\n ],\n \"custom_fields\": [\n {\n \"name\": \"Purchase order\",\n \"value\": \"PO-4821\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Key", "<api-key>")
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.reclack.com/v1/invoices")
.header("Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"cus_7Fh2PqX9\",\n \"amount\": \"120.00\",\n \"due_at\": \"2026-11-10T23:59:59Z\",\n \"networks\": [\n \"base\",\n \"ethereum\"\n ],\n \"network\": \"base\",\n \"memo\": \"October retainer and platform seats\",\n \"footer\": \"Thanks for working with us.\",\n \"tax_id\": \"GB123456789\",\n \"line_items\": [\n {\n \"description\": \"Platform seats\",\n \"quantity\": 4,\n \"unit_amount\": \"20.00\"\n }\n ],\n \"custom_fields\": [\n {\n \"name\": \"Purchase order\",\n \"value\": \"PO-4821\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reclack.com/v1/invoices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"cus_7Fh2PqX9\",\n \"amount\": \"120.00\",\n \"due_at\": \"2026-11-10T23:59:59Z\",\n \"networks\": [\n \"base\",\n \"ethereum\"\n ],\n \"network\": \"base\",\n \"memo\": \"October retainer and platform seats\",\n \"footer\": \"Thanks for working with us.\",\n \"tax_id\": \"GB123456789\",\n \"line_items\": [\n {\n \"description\": \"Platform seats\",\n \"quantity\": 4,\n \"unit_amount\": \"20.00\"\n }\n ],\n \"custom_fields\": [\n {\n \"name\": \"Purchase order\",\n \"value\": \"PO-4821\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "in_0182",
"code": "INV-00182",
"reference": "in_0182",
"status": "open",
"amount": "120.00",
"amount_atomic": "120000000",
"fee_atomic": "1200000",
"currency": "USDC",
"network": "base",
"chain_id": 8453,
"period_start": "2026-10-18T22:07:41Z",
"period_end": "2026-10-18T22:07:41Z",
"attempt_count": 0,
"next_attempt_at": "2026-10-18T22:07:41Z",
"paid_at": "2026-10-18T22:07:41Z",
"sent_at": "2026-10-18T22:07:41Z",
"reminders_enabled": true,
"last_reminder_at": "2026-10-18T22:07:41Z",
"failure_code": "insufficient_allowance",
"failure_message": "The authorization no longer covers this amount",
"metadata": {},
"created_at": "2026-10-18T22:07:41Z",
"updated_at": "2026-10-18T22:07:41Z"
}
}{
"error": {
"type": "invalid_request_error",
"code": "price_not_found",
"message": "No price was found for that id"
}
}{
"error": {
"type": "invalid_request_error",
"code": "price_not_found",
"message": "No price was found for that id"
}
}{
"error": {
"type": "invalid_request_error",
"code": "price_not_found",
"message": "No price was found for that id"
}
}Overview
Create an invoice. It starts as a draft, which can be edited freely. Sending it finalises the document, so the customer never sees the bill move after they received it.Authorizations
Your Reclack API key. The prefix decides the environment: rk_sandbox_ for test chains, rk_live_ for production.
Body
application/json
Example:
"cus_7Fh2PqX9"
Example:
"120.00"
Example:
"2026-11-10T23:59:59Z"
Networks the customer may pay on.
Example:
["base", "ethereum"]
A single network.
Example:
"base"
Example:
"October retainer and platform seats"
Example:
"Thanks for working with us."
Example:
"GB123456789"
Available options:
merchant, customer Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
Created
Show child attributes
Show child attributes

