Skip to main content
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

type
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.
currency
string
required
Currency code for the invoice amount (e.g. "USD", "KES"). See all codes
items
array
required
Line items (at least one required)
payer_email
string
Customer’s email address. Omit or pass null for walk-in customers.
payer_name
string
Customer’s display name (optional)
payer_country
string
Two-letter country code of the payer (optional)
tax_rate
number
Tax percentage (e.g. 16 for 16%). Defaults to 0.
store_item_ids
array
Optional array of store item objects to link catalogue items to this invoice.
asset
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.
redirect_url
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.
invoice_number
string
Unique invoice identifier (e.g. "INV-2026-a1b2c3d4")
payment_url
string
Encrypted URL the customer opens to complete payment
status
string
"pending" on creation
currency
string
Invoice currency code
tax_rate
number
Tax percentage applied
expires_at
string
ISO 8601 datetime after which the invoice expires
amount
null
Deferred. Set to null until the payer initiates payment.
asset
string | null
Payment asset, null until chosen by the payer
redirect_url
string | null
The redirect URL you supplied, or null if none was set
from_store
boolean | 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.
transaction_items
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"
}