End-to-end test walkthrough
One full pass: product, checkout, payment, refund, invoice, subscription.
This walkthrough runs the complete flow with curl. It works the same on macOS, Linux and Windows (CMD or PowerShell).
Set your key first:
export SB=sk_test_… # macOS / Linux
set SB=sk_test_… # Windows CMD
1. Create a product and a price
curl https://api.southbill.com/v1/products -H "Authorization: Bearer $SB" \
-H "Content-Type: application/json" \
-d '{"name":"Test Plan","default_price":{"unit_amount":2500,"currency":"eur"}}'
2. Create a customer
curl https://api.southbill.com/v1/customers -H "Authorization: Bearer $SB" \
-H "Content-Type: application/json" \
-d '{"email":"tester@example.com","name":"Test Buyer"}'
3. Create a checkout session and pay it
curl https://api.southbill.com/v1/checkout/sessions -H "Authorization: Bearer $SB" \
-H "Content-Type: application/json" \
-d '{"amount":2500,"currency":"eur","customer_email":"tester@example.com",
"success_url":"https://example.com/ok","cancel_url":"https://example.com/no"}'
Open the returned url in a browser and pay with 4242 4242 4242 4242.
4. Check the payment
curl "https://api.southbill.com/v1/payments?limit=5" -H "Authorization: Bearer $SB"
5. Refund it
curl https://api.southbill.com/v1/refunds -H "Authorization: Bearer $SB" \
-H "Content-Type: application/json" \
-d '{"payment_intent":"pi_…","amount":1000,"reason":"requested_by_customer"}'
6. Create an invoice with installments
curl https://api.southbill.com/v1/invoices -H "Authorization: Bearer $SB" \
-H "Content-Type: application/json" \
-d '{"customer":"cus_…","currency":"eur","payment_mode":"partial",
"items":[{"description":"Consulting","quantity":1,"unit_amount":120000}],
"installments":[{"amount":60000,"due_date":"2026-10-01"},
{"amount":60000,"due_date":"2026-11-01"}]}'
Then POST /v1/invoices/{id}/send, inspect GET /v1/invoices/{id}/installments, and settle with POST /v1/invoices/{id}/mark_paid.
7. Create a subscription
curl https://api.southbill.com/v1/subscriptions -H "Authorization: Bearer $SB" \
-H "Content-Type: application/json" \
-d '{"customer":"cus_…","price":"price_…"}'
8. Read the event stream
curl "https://api.southbill.com/v1/events?limit=20" -H "Authorization: Bearer $SB"
Every object in these responses has "livemode": false. When the pass is green, swap sk_test_ for sk_live_ — nothing else changes.