List & Get Recharges
Poll a PROCESSING recharge to its final status, and reconcile your recharge history
List & Get Recharges
Two read endpoints. GET /api/v1/recharges/:id is what you poll after a 202 PROCESSING; GET /api/v1/recharges is what you use for reconciliation and support lookups.
Both are scoped to your own account. Neither is cached — a cached response would hide the very transition you are waiting for.
Get a recharge
GET /api/v1/recharges/:idAuthentication: API Key + Secret required
Request
curl -X GET https://api.starshiprewards.com/api/v1/recharges/84213 \
-H "X-API-Key: <your-api-key>" \
-H "X-API-Secret: <your-api-secret>"Response
200 OK
{
"id": 84213,
"reference_number": "RCH-84213-2X9F",
"status": "SUCCESS",
"sub_status": "OPERATOR_CONFIRMED",
"mobile_number": "9876543210",
"country_code": "IN",
"operator": "Airtel",
"circle": "Delhi NCR",
"is_prepaid": true,
"face": 199.00,
"discount": 4.98,
"payable": 194.02,
"currency": "INR",
"vendor_recharge_id": "JRI-77120043",
"operator_txn_id": "AIRTEL8891203344",
"client_reference": "TOPUP-2026-0042",
"created_at": "2026-08-19T09:14:22Z",
"updated_at": "2026-08-19T09:14:51Z"
}Fields
| Field | Type | Description |
|---|---|---|
id | number | Starship recharge id |
reference_number | string | Our reference — use it when contacting support |
status | string | PROCESSING | SUCCESS | FAILED | REVERSED |
sub_status | string | Finer detail. Diagnostic — branch on status |
mobile_number | string | The recharged number |
country_code | string | ISO-2. IN in v1 |
operator | string | Operator display name. Omitted when unset |
circle | string | Telecom circle. Omitted when unset |
is_prepaid | boolean | true = prepaid top-up, false = postpaid bill payment |
face | number | The amount that reached the operator |
discount | number | Your discount applied |
payable | number | What your wallet was debited |
currency | string | INR in v1 |
vendor_recharge_id | string | The vendor's reference. Omitted when unset |
operator_txn_id | string | The operator's transaction id. Set on success |
failure_reason | string | The raw vendor message, verbatim. Omitted when there is none |
client_reference | string | Your own reference, echoed back |
created_at | string | ISO 8601 |
updated_at | string | ISO 8601. Omitted until the recharge changes |
Optional string fields are omitted from the JSON when unset, not returned as null. operator, circle, vendor_recharge_id, operator_txn_id, failure_reason and client_reference can all be absent. Read them defensively.
The detail response returns operator as a display name, while submit takes operator_id as a number. They are different fields — do not feed operator back into a submit call.
Errors
| Status | Cause |
|---|---|
400 | invalid recharge id — the path segment is not a number |
401 | Missing or invalid API credentials |
404 | recharge not found |
A recharge belonging to another client also returns 404, not 403. A 403 would confirm the id exists and let callers enumerate other clients' recharges. Not-found and not-yours are deliberately indistinguishable from outside.
Polling a PROCESSING recharge
This is the endpoint's main job. After a 202, poll until status leaves PROCESSING.
POST /api/v1/recharges → 202 status=PROCESSING
│
▼
GET /api/v1/recharges/84213 (every few seconds)
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
SUCCESS FAILED REVERSED
wallet debited wallet credited wallet credited
final back, final back, finalRecommended cadence
| Elapsed | Interval |
|---|---|
| 0 – 1 min | every 5 seconds |
| 1 – 5 min | every 15 seconds |
| 5 – 30 min | every 60 seconds |
| Beyond 30 min | every 5 minutes, then escalate to support |
The general /api/v1/ rate limit is 1000 requests/hour per API key and recharge has no dedicated allowance, so a tight poll loop will exhaust your budget for every other endpoint too. Back off.
Never resolve a long PROCESSING by resubmitting. A resubmit is a second real recharge on a real phone. If a recharge is still PROCESSING after 30 minutes, contact support with the reference_number.
Because recharge emits no webhooks, polling is the only mechanism available for resolving PROCESSING today.
List recharges
GET /api/v1/rechargesAuthentication: API Key + Secret required
Returns your recharges, newest first. Scoped to your account — the client is taken from your authenticated credentials and can never be supplied as a parameter.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | number | 1 | Page number |
limit | number | 50 | Results per page, 1–10000. page_size is accepted as an alias |
status | string | — | Filter by PROCESSING, SUCCESS, FAILED or REVERSED |
search | string | — | Matches recharge id, reference_number or mobile_number, partial and case-insensitive |
from_date | string | — | YYYY-MM-DD. Inclusive lower bound on created_at |
to_date | string | — | YYYY-MM-DD. Inclusive end of day upper bound |
Ordering is fixed at newest-first. This endpoint always sorts by id descending; sort, sort_by and sort_dir are accepted by the shared query parser but have no effect here. Do not build on them.
The status filter takes the canonical value and transparently matches legacy stored values too, so ?status=SUCCESS also returns older rows recorded as DELIVERED or RECHARGED.
Request
curl -X GET "https://api.starshiprewards.com/api/v1/recharges?status=PROCESSING&limit=25" \
-H "X-API-Key: <your-api-key>" \
-H "X-API-Secret: <your-api-secret>"Response
200 OK — a bare JSON array of the same objects returned by the detail endpoint. Pagination lives in the response headers, not in the body.
[
{
"id": 84214,
"reference_number": "RCH-84214-B7KQ",
"status": "SUCCESS",
"sub_status": "OPERATOR_CONFIRMED",
"mobile_number": "9876543210",
"country_code": "IN",
"operator": "Airtel",
"is_prepaid": true,
"face": 199.00,
"discount": 4.98,
"payable": 194.02,
"currency": "INR",
"created_at": "2026-08-19T09:15:02Z"
}
]An empty result is [], not an error.
Pagination headers
| Header | Description |
|---|---|
X-Page | Current page |
X-Per-Page | Results per page |
X-Total-Count | Total matching recharges |
X-Total-Pages | Total pages |
X-Has-More | Whether another page exists |
Finding a recharge after a timeout
If a submit timed out and you do not know whether it landed, do not resubmit. In order of preference:
-
Retry with the same
Idempotency-Key— within 24 hours this replays the original response, including the recharge id. -
Search by your reference —
GET /api/v1/recharges?search=TOPUP-2026-0042if you sent it asclient_reference.searchmatches recharge id,reference_numberandmobile_number. It does not matchclient_reference. To find a recharge by your own reference, search the mobile number and matchclient_referencein the results. -
Search by number and date —
?search=9876543210&from_date=2026-08-19, then match onfaceandcreated_at.
Only submit again once you have confirmed no matching recharge exists.
Reconciliation
- Reconcile your ledger against
payable, notface.payableis what left your wallet FAILEDandREVERSEDrecharges have been credited back — do not double-count them as spendreference_numberis the stable key to quote to Starship support- Wallet movements themselves are visible through the Transactions API