Subscription #
Every account has one subscription, created as a Journal trial the first time it calls the API. The subscription belongs to the account that owns the books: other users of the same entity are metered against it and can read it, but only the owner can change it.
Plans #
| Plan | Price (USD / KES per month) | Trial | Transactions per month | API calls per month |
|---|---|---|---|---|
journal | 4.99 / 649 | 30 days | 50 (hard cap) | 500 |
ledger | 9.99 / 1,299 | 60 days | 300, then 0.10 / 0.13 each | Unlimited |
books | 29.99 / 3,899 | 90 days | 3,000, then 0.05 / 0.07 each | Unlimited |
After the renewal date there is a 14-day grace period. Once it ends, writes return 402 until the subscription is renewed. Reads always stay open. During grace, responses carry X-Subscription-Status: grace and X-Subscription-Grace-Ends.
Endpoints #
| Method and path | Purpose |
|---|---|
GET /subscription | The subscription, its card and this month’s usage |
POST /subscription | Change plan, billing_email or currency (USD or KES). Owner only |
POST /subscription/card-setup | Start a hosted card setup. Body: currency, callback_url, optional email. Returns the gateway’s authorization_url. Owner only |
POST /subscription/card/refresh | Re-read the stored card after the customer returns from the gateway |
DELETE /subscription/card | Remove the stored card. Owner only |
GET /subscription/invoices | Invoices, newest first |
{
"plan": "ledger",
"plan_name": "Ledger",
"status": "active",
"on_trial": false,
"trial_ends_at": "2026-08-01",
"renewal_date": "2026-11-01",
"grace_ends_at": "2026-11-15",
"currency": "USD",
"billing_email": "accounts@example.com",
"price_subunits": 999,
"card": { "on_file": true, "brand": "visa", "last4": "4242", "exp_month": 12, "exp_year": 2028 },
"usage": {
"period": "2026-10", "transactions": 120, "transactions_cap": 300,
"api_calls": 4210, "api_calls_cap": null, "overage_count": 0, "overage_amount_subunits": 0
}
}
Different envelope
The subscription endpoints return the subscription itself rather than a{"status": ..., "resource": ...}envelope, because theirstatusfield is the subscription’s own:active,graceorexpired. Errors use the standard error envelope.
Card endpoints refuse dry runs, because the payment gateway call cannot be rolled back.
When your account is deleted, the subscription is cancelled at once and the stored card is removed; see Privacy.