Subby meters write requests only. Reading data is never metered. This page explains exactly what counts, what doesn't, and how to keep an eye on your usage.
The short version
GETrequests are never metered. They are still subject to rate limits.POST,PATCHandDELETErequests that succeed in live count as 1 write request each.- Each plan includes a monthly allowance of write requests.
- Going over your allowance is billed, not blocked: ₦0.1 per 1,000 extra write requests, counted in blocks of 1,000.
- Nudges (SMS, WhatsApp and email reminders) are metered separately from API requests.
Monthly write allowance by plan
| Plan | Monthly fee | Included write requests | Overage |
|---|---|---|---|
| Starter | ₦5,000 | 5,000 | ₦0.1 per 1,000 |
| Growth | ₦50,000 | 50,000 | ₦0.1 per 1,000 |
| Scale | ₦200,000 | 500,000 | ₦0.1 per 1,000 |
| Enterprise | From ₦750,000 | Unlimited | None |
Full plan details are on Pricing & plans.
What counts as a write request
A request counts as 1 write request when all of these are true:
- It was sent to the live API (
https://api.mysubbyapp.com/v1). - Its method is
POST,PATCHorDELETE. - It returned a 2xx status code.
- It was not an idempotent replay of an earlier request.
Every request that meets these rules counts the same, whatever the endpoint. There are no expensive or cheap endpoints.
What never counts
| Request | Why it's free |
|---|---|
Any GET request (retrieve, list, search, usage, events) |
Reads are never metered |
| Any request to the sandbox API | Sandbox is always free |
Requests that fail with 4xx (validation, auth, not found) |
You shouldn't pay for requests that did nothing |
Requests that fail with 429 (rate limited) |
Not processed |
Requests that fail with 5xx |
Our error, not yours |
Replays with the same Idempotency-Key |
The original request was already counted |
| Webhooks Subby sends to you | Outbound from Subby, not API requests |
| Retries and reminders Subby runs automatically | Part of the subscription engine; nudges are metered separately |
| Actions you take in the Subby dashboard | Not API requests |
Examples
| Request | Counts? |
|---|---|
POST /subscriptions → 201 Created |
1 write request |
POST /subscriptions → 400 parameter_invalid |
Not counted |
POST /subscriptions with the same Idempotency-Key again → cached 201 |
Not counted |
PATCH /customers/cus_123 → 200 OK |
1 write request |
POST /subscriptions/sub_123/pause → 200 OK |
1 write request |
DELETE /webhook-endpoints/we_123 → 200 OK |
1 write request |
GET /subscriptions?status=past_due&limit=100 → 200 OK |
Not counted |
POST /nudges → 201 Created |
1 write request, plus 1 nudge |
Any request to https://sandbox-api.mysubbyapp.com/v1 |
Not counted |
How overage is calculated
At the end of each billing period:
extra_writes = max(0, write_requests_used − included_write_requests)
billed_blocks = round_up(extra_writes ÷ 1,000)
overage_charge = billed_blocks × overage_rate_per_1,000
Worked example on the Growth plan:
Example — Growth: 62,400 write requests − 50,000 included = 12,400 extra requests. Write overage: ₦1.24.
The overage appears as its own line on your Subby invoice, next to nudge overage.
Nudges are separate
A nudge is one reminder message delivered to one customer on one channel. Nudges have their own monthly allowance and overage rate, and they count whether Subby sends them automatically or you send them with POST /nudges.
| Plan | Included nudges | Extra nudge |
|---|---|---|
| Starter | 50 | ₦50 each |
| Growth | 300 | ₦35 each |
| Scale | 500 | ₦25 each |
| Enterprise | Unlimited* | Capped at ₦100,000 per month |
* Enterprise nudges are unlimited up to 5,000 per month. If you regularly send more, we'll agree a custom plan with you.
Tracking your usage
In every write response
Metered requests return headers so you can track usage without extra calls:
X-Subby-Billable: true
X-Subby-Write-Usage: 48213
X-Subby-Write-Limit: 50000
X-Subby-Usage-Period-End: 2026-09-30T23:59:59Z
| Header | Meaning |
|---|---|
X-Subby-Billable |
true if this request counted, false if it didn't |
X-Subby-Write-Usage |
Write requests counted so far this period, including this one |
X-Subby-Write-Limit |
Included write requests for your plan, or unlimited |
X-Subby-Usage-Period-End |
When the current billing period ends (UTC) |
Usage counters update in real time. The totals on your invoice are final and are reconciled at the end of the period.
With the usage endpoint
curl "https://api.mysubbyapp.com/v1/usage" \
-H "Authorization: Bearer $SUBBY_SECRET_KEY"
{
"success": true,
"data": {
"object": "usage",
"livemode": true,
"plan": "growth",
"period": { "start": "2026-09-01T00:00:00Z", "end": "2026-09-30T23:59:59Z" },
"write_requests": {
"used": 48213,
"included": 50000,
"remaining": 1787,
"overage": 0,
"overage_rate_per_1000": 10,
"projected_overage_amount": 0
},
"read_requests": { "used": 391044, "metered": false },
"nudges": {
"used": 212,
"included": 300,
"overage": 0,
"overage_rate": 3500,
"overage_amount": 0
},
"updated_at": "2026-09-17T14:02:11Z"
}
}
Money values in this response are in kobo, like everywhere else in the API. GET /usage is a read request, so checking it is free.
With alerts
Subby emails your account owners and sends a usage.threshold_reached webhook when you reach 80% and 100% of your write request or nudge allowance. Change the recipients in Dashboard → Developers → Usage → Alerts.
Reducing write requests
- Use idempotency keys on every
POST. Safe retries after network errors don't cost anything extra. - Don't poll with writes. Listen for webhooks and use
GETto fetch details. - Batch your setup. Create plans once and reuse them. Don't create a plan per customer.
- Let Subby run retries. Automatic retries are free. Only call
POST /charges/{id}/retrywhen a customer asks to pay right now.