Starship Rewards API
Recharge

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/:id

Authentication: 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

FieldTypeDescription
idnumberStarship recharge id
reference_numberstringOur reference — use it when contacting support
statusstringPROCESSING | SUCCESS | FAILED | REVERSED
sub_statusstringFiner detail. Diagnostic — branch on status
mobile_numberstringThe recharged number
country_codestringISO-2. IN in v1
operatorstringOperator display name. Omitted when unset
circlestringTelecom circle. Omitted when unset
is_prepaidbooleantrue = prepaid top-up, false = postpaid bill payment
facenumberThe amount that reached the operator
discountnumberYour discount applied
payablenumberWhat your wallet was debited
currencystringINR in v1
vendor_recharge_idstringThe vendor's reference. Omitted when unset
operator_txn_idstringThe operator's transaction id. Set on success
failure_reasonstringThe raw vendor message, verbatim. Omitted when there is none
client_referencestringYour own reference, echoed back
created_atstringISO 8601
updated_atstringISO 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

StatusCause
400invalid recharge id — the path segment is not a number
401Missing or invalid API credentials
404recharge 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, final
ElapsedInterval
0 – 1 minevery 5 seconds
1 – 5 minevery 15 seconds
5 – 30 minevery 60 seconds
Beyond 30 minevery 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/recharges

Authentication: 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

ParameterTypeDefaultDescription
pagenumber1Page number
limitnumber50Results per page, 1–10000. page_size is accepted as an alias
statusstringFilter by PROCESSING, SUCCESS, FAILED or REVERSED
searchstringMatches recharge id, reference_number or mobile_number, partial and case-insensitive
from_datestringYYYY-MM-DD. Inclusive lower bound on created_at
to_datestringYYYY-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

HeaderDescription
X-PageCurrent page
X-Per-PageResults per page
X-Total-CountTotal matching recharges
X-Total-PagesTotal pages
X-Has-MoreWhether 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:

  1. Retry with the same Idempotency-Key — within 24 hours this replays the original response, including the recharge id.

  2. Search by your referenceGET /api/v1/recharges?search=TOPUP-2026-0042 if you sent it as client_reference.

    search matches recharge id, reference_number and mobile_number. It does not match client_reference. To find a recharge by your own reference, search the mobile number and match client_reference in the results.

  3. Search by number and date?search=9876543210&from_date=2026-08-19, then match on face and created_at.

Only submit again once you have confirmed no matching recharge exists.

Reconciliation

  • Reconcile your ledger against payable, not face. payable is what left your wallet
  • FAILED and REVERSED recharges have been credited back — do not double-count them as spend
  • reference_number is the stable key to quote to Starship support
  • Wallet movements themselves are visible through the Transactions API