Create Invoice
curl --request POST \
--url https://payments.shakesco.com/invoices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "<string>",
"currency": "<string>",
"items": [
{
"description": "<string>",
"unit": 123,
"price": 123,
"image": "<string>"
}
],
"payer_email": "<string>",
"payer_name": "<string>",
"payer_country": "<string>",
"tax_rate": 123,
"store_item_ids": [
{
"id": 123,
"quantity": 123
}
],
"asset": "<string>",
"redirect_url": "<string>"
}
'import requests
url = "https://payments.shakesco.com/invoices"
payload = {
"type": "<string>",
"currency": "<string>",
"items": [
{
"description": "<string>",
"unit": 123,
"price": 123,
"image": "<string>"
}
],
"payer_email": "<string>",
"payer_name": "<string>",
"payer_country": "<string>",
"tax_rate": 123,
"store_item_ids": [
{
"id": 123,
"quantity": 123
}
],
"asset": "<string>",
"redirect_url": "<string>"
}
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({
type: '<string>',
currency: '<string>',
items: [{description: '<string>', unit: 123, price: 123, image: '<string>'}],
payer_email: '<string>',
payer_name: '<string>',
payer_country: '<string>',
tax_rate: 123,
store_item_ids: [{id: 123, quantity: 123}],
asset: '<string>',
redirect_url: '<string>'
})
};
fetch('https://payments.shakesco.com/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://payments.shakesco.com/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([
'type' => '<string>',
'currency' => '<string>',
'items' => [
[
'description' => '<string>',
'unit' => 123,
'price' => 123,
'image' => '<string>'
]
],
'payer_email' => '<string>',
'payer_name' => '<string>',
'payer_country' => '<string>',
'tax_rate' => 123,
'store_item_ids' => [
[
'id' => 123,
'quantity' => 123
]
],
'asset' => '<string>',
'redirect_url' => '<string>'
]),
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://payments.shakesco.com/invoices"
payload := strings.NewReader("{\n \"type\": \"<string>\",\n \"currency\": \"<string>\",\n \"items\": [\n {\n \"description\": \"<string>\",\n \"unit\": 123,\n \"price\": 123,\n \"image\": \"<string>\"\n }\n ],\n \"payer_email\": \"<string>\",\n \"payer_name\": \"<string>\",\n \"payer_country\": \"<string>\",\n \"tax_rate\": 123,\n \"store_item_ids\": [\n {\n \"id\": 123,\n \"quantity\": 123\n }\n ],\n \"asset\": \"<string>\",\n \"redirect_url\": \"<string>\"\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://payments.shakesco.com/invoices")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"<string>\",\n \"currency\": \"<string>\",\n \"items\": [\n {\n \"description\": \"<string>\",\n \"unit\": 123,\n \"price\": 123,\n \"image\": \"<string>\"\n }\n ],\n \"payer_email\": \"<string>\",\n \"payer_name\": \"<string>\",\n \"payer_country\": \"<string>\",\n \"tax_rate\": 123,\n \"store_item_ids\": [\n {\n \"id\": 123,\n \"quantity\": 123\n }\n ],\n \"asset\": \"<string>\",\n \"redirect_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://payments.shakesco.com/invoices")
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 \"type\": \"<string>\",\n \"currency\": \"<string>\",\n \"items\": [\n {\n \"description\": \"<string>\",\n \"unit\": 123,\n \"price\": 123,\n \"image\": \"<string>\"\n }\n ],\n \"payer_email\": \"<string>\",\n \"payer_name\": \"<string>\",\n \"payer_country\": \"<string>\",\n \"tax_rate\": 123,\n \"store_item_ids\": [\n {\n \"id\": 123,\n \"quantity\": 123\n }\n ],\n \"asset\": \"<string>\",\n \"redirect_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": 1,
"user_id": 42,
"invoice_number": "INV-2026-a1b2c3d4",
"status": "pending",
"type": "public",
"currency": "USD",
"tax_rate": "0.00",
"is_business": true,
"from_store": false,
"receiver": "business@example.com",
"receiver_country": "US",
"payer_name": "Jane Doe",
"payer_email": "customer@example.com",
"payer_country": null,
"asset": null,
"amount": null,
"rate": null,
"tx_hash_link": null,
"receipt_number": null,
"payment_url": "https://pay.shakesco.com/@business/a1b2c3...",
"redirect_url": "https://yourstore.com/order/complete",
"expires_at": "2026-05-23T10:00:00.000000Z",
"scanned_at": null,
"paid_at": null,
"store_item_ids": null,
"created_at": "2026-05-16T10:00:00.000000Z",
"updated_at": "2026-05-16T10:00:00.000000Z",
"transaction_items": [
{
"id": 1,
"crypto_transaction_id": 1,
"description": "Platform Services",
"unit": "1",
"price": "1400",
"image": null,
"created_at": "2026-05-16T10:00:00.000000Z",
"updated_at": "2026-05-16T10:00:00.000000Z"
}
]
}
{
"error": "\"items\" must contain at least 1 items"
}
Invoices
Create Invoice
Create a new invoice and return a payment URL the customer opens to pay
POST
/
invoices
Create Invoice
curl --request POST \
--url https://payments.shakesco.com/invoices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "<string>",
"currency": "<string>",
"items": [
{
"description": "<string>",
"unit": 123,
"price": 123,
"image": "<string>"
}
],
"payer_email": "<string>",
"payer_name": "<string>",
"payer_country": "<string>",
"tax_rate": 123,
"store_item_ids": [
{
"id": 123,
"quantity": 123
}
],
"asset": "<string>",
"redirect_url": "<string>"
}
'import requests
url = "https://payments.shakesco.com/invoices"
payload = {
"type": "<string>",
"currency": "<string>",
"items": [
{
"description": "<string>",
"unit": 123,
"price": 123,
"image": "<string>"
}
],
"payer_email": "<string>",
"payer_name": "<string>",
"payer_country": "<string>",
"tax_rate": 123,
"store_item_ids": [
{
"id": 123,
"quantity": 123
}
],
"asset": "<string>",
"redirect_url": "<string>"
}
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({
type: '<string>',
currency: '<string>',
items: [{description: '<string>', unit: 123, price: 123, image: '<string>'}],
payer_email: '<string>',
payer_name: '<string>',
payer_country: '<string>',
tax_rate: 123,
store_item_ids: [{id: 123, quantity: 123}],
asset: '<string>',
redirect_url: '<string>'
})
};
fetch('https://payments.shakesco.com/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://payments.shakesco.com/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([
'type' => '<string>',
'currency' => '<string>',
'items' => [
[
'description' => '<string>',
'unit' => 123,
'price' => 123,
'image' => '<string>'
]
],
'payer_email' => '<string>',
'payer_name' => '<string>',
'payer_country' => '<string>',
'tax_rate' => 123,
'store_item_ids' => [
[
'id' => 123,
'quantity' => 123
]
],
'asset' => '<string>',
'redirect_url' => '<string>'
]),
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://payments.shakesco.com/invoices"
payload := strings.NewReader("{\n \"type\": \"<string>\",\n \"currency\": \"<string>\",\n \"items\": [\n {\n \"description\": \"<string>\",\n \"unit\": 123,\n \"price\": 123,\n \"image\": \"<string>\"\n }\n ],\n \"payer_email\": \"<string>\",\n \"payer_name\": \"<string>\",\n \"payer_country\": \"<string>\",\n \"tax_rate\": 123,\n \"store_item_ids\": [\n {\n \"id\": 123,\n \"quantity\": 123\n }\n ],\n \"asset\": \"<string>\",\n \"redirect_url\": \"<string>\"\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://payments.shakesco.com/invoices")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"<string>\",\n \"currency\": \"<string>\",\n \"items\": [\n {\n \"description\": \"<string>\",\n \"unit\": 123,\n \"price\": 123,\n \"image\": \"<string>\"\n }\n ],\n \"payer_email\": \"<string>\",\n \"payer_name\": \"<string>\",\n \"payer_country\": \"<string>\",\n \"tax_rate\": 123,\n \"store_item_ids\": [\n {\n \"id\": 123,\n \"quantity\": 123\n }\n ],\n \"asset\": \"<string>\",\n \"redirect_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://payments.shakesco.com/invoices")
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 \"type\": \"<string>\",\n \"currency\": \"<string>\",\n \"items\": [\n {\n \"description\": \"<string>\",\n \"unit\": 123,\n \"price\": 123,\n \"image\": \"<string>\"\n }\n ],\n \"payer_email\": \"<string>\",\n \"payer_name\": \"<string>\",\n \"payer_country\": \"<string>\",\n \"tax_rate\": 123,\n \"store_item_ids\": [\n {\n \"id\": 123,\n \"quantity\": 123\n }\n ],\n \"asset\": \"<string>\",\n \"redirect_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": 1,
"user_id": 42,
"invoice_number": "INV-2026-a1b2c3d4",
"status": "pending",
"type": "public",
"currency": "USD",
"tax_rate": "0.00",
"is_business": true,
"from_store": false,
"receiver": "business@example.com",
"receiver_country": "US",
"payer_name": "Jane Doe",
"payer_email": "customer@example.com",
"payer_country": null,
"asset": null,
"amount": null,
"rate": null,
"tx_hash_link": null,
"receipt_number": null,
"payment_url": "https://pay.shakesco.com/@business/a1b2c3...",
"redirect_url": "https://yourstore.com/order/complete",
"expires_at": "2026-05-23T10:00:00.000000Z",
"scanned_at": null,
"paid_at": null,
"store_item_ids": null,
"created_at": "2026-05-16T10:00:00.000000Z",
"updated_at": "2026-05-16T10:00:00.000000Z",
"transaction_items": [
{
"id": 1,
"crypto_transaction_id": 1,
"description": "Platform Services",
"unit": "1",
"price": "1400",
"image": null,
"created_at": "2026-05-16T10:00:00.000000Z",
"updated_at": "2026-05-16T10:00:00.000000Z"
}
]
}
{
"error": "\"items\" must contain at least 1 items"
}
For the complete documentation index, see llms.txt.
Creates an invoice and returns the full invoice object together with a
payment_url the customer opens to complete payment.
Set up private payments before sending private invoices. To receive a
"private" invoice you must first register private payments in the Shakesco app for the specific coin you want to receive. If you create an invoice with type: "private" without that setup, the invoice is created but payment fails when the customer tries to pay.Request at least $1. Because of how private transactions settle, every invoice total should be a minimum of $1. If you need to charge less than $1, contact us first.
Request Body
string
"public" or "private". Private mode uses stealth addresses. Defaults to your account’s privacy setting.Private invoices require that you have already registered private payments for the coin you want to receive in the Shakesco app. Without that setup, a "private" invoice fails at payment time.string
required
Currency code for the invoice amount (e.g.
"USD", "KES"). See all codesarray
required
string
Customer’s email address. Omit or pass
null for walk-in customers.string
Customer’s display name (optional)
string
Two-letter country code of the payer (optional)
number
Tax percentage (e.g.
16 for 16%). Defaults to 0.array
string
Preferred payment asset:
"BTC", "ETH", "USDT", or "SATS". Can be deferred and set by the payer.We recommend receiving "USDT" or "SATS": both settle fast and cheap. For "USDT", use a private invoice where possible so your financial activity stays confidential.string
Optional URL the customer is sent to after they finish paying. Must be a valid URL. Use it to return the payer to your own confirmation or order page.
Response
Returns the full invoice object with line items.string
Unique invoice identifier (e.g.
"INV-2026-a1b2c3d4")string
Encrypted URL the customer opens to complete payment
string
"pending" on creationstring
Invoice currency code
number
Tax percentage applied
string
ISO 8601 datetime after which the invoice expires
null
Deferred. Set to
null until the payer initiates payment.string | null
Payment asset,
null until chosen by the payerstring | null
The redirect URL you supplied, or
null if none was setboolean | null
Whether the transaction originated from the Shakesco store.
true for store transactions, false for a standard invoice you created through the API, and null when it does not apply. Use this to tell store sales apart from your own invoices.array
Line items on the invoice. Each has
description, unit, price, and image.const response = await fetch("https://payments.shakesco.com/invoices", {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "public",
currency: "USD",
payer_email: "customer@example.com",
payer_name: "Jane Doe",
items: [{ description: "Platform Services", unit: 1, price: 1400 }],
}),
});
const invoice = await response.json();
{
"id": 1,
"user_id": 42,
"invoice_number": "INV-2026-a1b2c3d4",
"status": "pending",
"type": "public",
"currency": "USD",
"tax_rate": "0.00",
"is_business": true,
"from_store": false,
"receiver": "business@example.com",
"receiver_country": "US",
"payer_name": "Jane Doe",
"payer_email": "customer@example.com",
"payer_country": null,
"asset": null,
"amount": null,
"rate": null,
"tx_hash_link": null,
"receipt_number": null,
"payment_url": "https://pay.shakesco.com/@business/a1b2c3...",
"redirect_url": "https://yourstore.com/order/complete",
"expires_at": "2026-05-23T10:00:00.000000Z",
"scanned_at": null,
"paid_at": null,
"store_item_ids": null,
"created_at": "2026-05-16T10:00:00.000000Z",
"updated_at": "2026-05-16T10:00:00.000000Z",
"transaction_items": [
{
"id": 1,
"crypto_transaction_id": 1,
"description": "Platform Services",
"unit": "1",
"price": "1400",
"image": null,
"created_at": "2026-05-16T10:00:00.000000Z",
"updated_at": "2026-05-16T10:00:00.000000Z"
}
]
}
{
"error": "\"items\" must contain at least 1 items"
}
⌘I