paid is counted over every paid charge of the subscription, not over the page. Only this id's charges are listed: a customer who came back holds a new subscription, and the payments of the one it replaced stay under that one's id.Limit: 1,000 calls a minute per API key.Guide: List its payments.
The version of this contract the call is written against. Without it, the call is served as the first version, 2026-10-02. Any other value is refused with 400 unsupported_version.
One of2026-10-02
The subscription's id, as POST /v1/subscriptions answered it.
Example:cmg1x0abc0001
How many items to answer.
Default:20
Limits:1 to 100
Example:20
The id of the last attempt of the previous page. The next page starts after it.
Example:cmg9x1b7a0003
One page of charges, and the total paid.
The version the answer is written in: the one asked for, or 2026-10-02 when the call named none, or one this API does not serve.
One of2026-10-02
The id Mesub gave this request, on every answer, errors included, and in request_id on an error body. Quote it to Mesub support to find the request in our logs. Written by Mesub on each request: one sent with the request is ignored.
The calls this route allows the API key in a minute, or the IP of a call without a valid key. Sent on every answer the rate limit counted.
Limits:at least 1
What is left of them in the current minute.
Limits:at least 0
Seconds until the count starts again.
Limits:at least 0
Newest first. Maybe empty.
When it was tried.
skipped: nothing was sent because the chain said it could not work. rejected: refused for a reason that is the customer's, by the program or by the check made before sending (then signature is null). blocked: not tried, and never the customer's doing.
One ofpaidskippedrejectedblocked
Why it did not pay, null on a paid one. Short and stable, in snake case, and an open family rather than a closed list: Mesub adds reasons, so keep a default branch. Among them: insufficient_balance (the wallet held less than the period costs), approval_revoked, authority_closed (the wallet's subscription authority closed for good), token_account_frozen, plan_ended, plan_removed, plan_replaced, closed_elsewhere (the subscription account closed outside Mesub), cancelled (cancelled, and past the end of the period paid for), and, on a blocked one, the plan's setup (puller_not_allowed, receiver_not_allowed, receiver_account_missing, receiver_account_frozen, receiver_account_needs_memo, receiver_account_confidential_only, mint_gone, mint_paused, mint_transfer_hook). A refusal Mesub does not name is program_<N> (the program's or the token program's error code N) or solana_<N> (Solana's own). late_reason on the subscription is the reading of it a program should branch on.
In the token's smallest unit, as a string. What a paid one moved, what any other asked for.
On a paid one, what the receiving wallet got of amount, in the token's smallest unit, as a string: amount less the fee a Token-2022 token withholds on every transfer, which goes to the token's issuer. The same as amount on a token without a transfer fee. Null on any other outcome, and on a payment Mesub recorded before it kept this figure.
amount in US dollars, as a decimal string, at the token's price at the instant of the charge. Written once. Null until Mesub has priced it, and for good when it found no price.
The transaction. Null when nothing was sent.
Whether the subscription had already failed on this period.
Which retry of the plan's it was: 1 is the first after the missed charge. Null on a first try.
Out of how many, as recorded when it ran.
The start of the period it was for.
Whether another page follows.
Counted over every paid charge since the subscription began, not over the page.
The sum, in the token's smallest unit, as a string.
Bearer <API key>. The project's API key, which starts with SUB_. Keep it on your server. Where to get it.
curl "https://api.mesub.io/v1/subscriptions/cmg1x0abc0001/attempts" \ -H "Authorization: Bearer $MESUB_API_KEY"
{ "data": [ { "id": "cmg9x4k2c0007", "attempted_at": "2026-02-02T00:01:04.512Z", "outcome": "paid", "reason": null, "amount": "9990000", "amount_received": "9990000", "amount_usd": "9.99", "signature": "5wHu1qwD4kLDLoREEPBpKvGvhbxWFxFFfr5nQq7dxAsRRDXvHRqpNvfsCvC1qzjWQhqmPtBb8LnZjKmvpehJqSWk", "retry": true, "retry_number": 2, "retries_allowed": 3, "period_start": "2026-01-31T00:00:00.000Z" }, { "id": "cmg9x1b7a0003", "attempted_at": "2026-01-31T00:00:02.000Z", "outcome": "skipped", "reason": "insufficient-balance", "amount": "9990000", "amount_received": null, "amount_usd": "9.99", "signature": null, "retry": false, "retry_number": null, "retries_allowed": null, "period_start": "2026-01-31T00:00:00.000Z" } ], "has_more": false, "paid": { "count": 2, "amount": "19980000" } }