Starship Rewards API
Recharges

List Recharges API

Page through your recharge history with status, search and date filtering — the endpoint for reconciliation and support lookups

List Recharges API

Returns your recharges, newest first. This is the endpoint for reconciliation, support lookups, and confirming whether a submit you are unsure about actually landed.

Endpoint

GET /api/v1/recharges

Authentication: API Key + Secret required

Results are always scoped to your own client. The client is taken from your authenticated credentials and can never be supplied as a parameter, so there is no way to read another client's recharges.

Request Headers

X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke
X-API-Secret: your-secret-here

Query Parameters

ParameterTypeDefaultDescription
pagenumber1Page number
limitnumber50Items per page. Range 1–10000.
page_sizenumber50Alias for limit. limit wins when both are sent.
statusstring—Filter by status — see below
searchstring—Match against recharge id, reference number or mobile number
from_datestring—YYYY-MM-DD. Recharges created on or after this date.
to_datestring—YYYY-MM-DD. Recharges created on or before this date, inclusive of the whole day.

Sort parameters are ignored on this endpoint. Results are always ordered newest first (descending id). Sending sort, sort_by or sort_order has no effect (a sort value that is not valid JSON is rejected with 400) — do not build a UI that offers to reorder the list server-side.

Parameters that other list endpoints accept — currency, type, wallet_id, name — are parsed but not applied here. They will not narrow your results.

Status filter

status takes one of the four client-facing values:

ValueMatches
PROCESSINGPROCESSING and legacy PENDING rows
SUCCESSSUCCESS and legacy DELIVERED / RECHARGED rows
FAILEDFAILED and legacy CANCELLED rows
REVERSEDREVERSED

You filter in the canonical vocabulary and Starship expands it to cover historical rows written before the client API existed. ?status=SUCCESS therefore returns everything that actually succeeded, whichever era it was written in.

An unrecognised value is passed through unchanged rather than silently widened, so a typo returns an empty page instead of your whole history.

search matches a recharge if any of these contain the term:

  • the recharge id
  • the reference_number
  • the mobile_number

Matching is case-insensitive and substring-based, so ?search=9876543210 finds every recharge for that number and ?search=9f2c41ab finds a recharge from a partial reference.

Date range

from_date and to_date filter on creation time and take plain dates, not timestamps.

to_date is inclusive of the entire day — to_date=2026-08-25 includes a recharge created at 2026-08-25T23:59:59Z. You do not need to pass the following day to capture the last one.

Response

Success Response

Status Code: 200 OK

Response Headers:

X-Page: 1
X-Per-Page: 50
X-Page-Size: 2
X-Total-Count: 184
X-Total-Pages: 4
X-Has-More: true
HeaderMeaning
X-PageThe page you requested
X-Per-PagePage size in effect
X-Page-SizeNumber of rows actually in this response
X-Total-CountTotal matching recharges across all pages
X-Total-PagesTotal pages at the current page size
X-Has-Moretrue when a further page exists

Page through on X-Has-More rather than on an empty array — it is one request cheaper and unambiguous.

Response Body:

The body is a bare JSON array. There is no envelope object; pagination lives entirely in the headers.

[
  {
    "id": 84215,
    "reference_number": "c8e14f2b90a742d3ae51b7c93f60d2aa",
    "status": "FAILED",
    "sub_status": "REVERSED",
    "mobile_number": "9876543210",
    "country_code": "IN",
    "operator": "Airtel",
    "circle": "Karnataka",
    "is_prepaid": true,
    "face": 199.00,
    "discount": 4.98,
    "payable": 194.02,
    "currency": "INR",
    "failure_reason": "Invalid recharge amount for this plan",
    "client_reference": "TOPUP-2026-000414",
    "created_at": "2026-08-25T10:32:40Z",
    "updated_at": "2026-08-25T10:32:44Z"
  },
  {
    "id": 84213,
    "reference_number": "9f2c41ab7de4489bb1c0a6f2e8d35471",
    "status": "SUCCESS",
    "sub_status": "OPERATOR_CONFIRMED",
    "mobile_number": "9876543210",
    "country_code": "IN",
    "operator": "Airtel",
    "circle": "Karnataka",
    "is_prepaid": true,
    "face": 199.00,
    "discount": 4.98,
    "payable": 194.02,
    "currency": "INR",
    "vendor_recharge_id": "VR-88213904",
    "operator_txn_id": "AIRTEL-772391884",
    "client_reference": "TOPUP-2026-000412",
    "created_at": "2026-08-25T10:30:00Z",
    "updated_at": "2026-08-25T10:30:07Z"
  }
]

Response Fields

FieldTypeDescription
idnumberRecharge identifier
reference_numberstringStarship's reference, 32 alphanumeric characters
statusstringPROCESSING · SUCCESS · FAILED · REVERSED. Historical rows may return legacy PENDING / DELIVERED / RECHARGED / CANCELLED.
sub_statusstringFiner detail — diagnostic only, do not branch on it
mobile_numberstringThe number that was recharged
country_codestringISO 3166-1 alpha-2. IN in v1.
operatorstringOperator display name. Omitted when unset.
circlestringTelecom circle as sent to the vendor. Omitted when the operator needs none.
is_prepaidbooleantrue for a prepaid top-up, false for a postpaid bill payment
facenumberWhat reached (or was intended for) the phone
discountnumberClient discount applied
payablenumberWhat your wallet was debited
currencystringINR in v1
vendor_recharge_idstringThe vendor's reference. Omitted when none.
operator_txn_idstringThe operator's transaction id. Present on success.
failure_reasonstringThe vendor's failure string, verbatim. Present on failures.
client_referencestringYour reference from submit. Omitted when you sent none.
created_atstringISO 8601 UTC
updated_atstringISO 8601 UTC. Omitted until the row is first updated.

Optional fields are absent from the JSON rather than null. A PROCESSING recharge has no operator_txn_id key at all.

Note the shape difference from submit: the read shape carries country_code, operator, circle, is_prepaid, currency and updated_at, but reports the operator as a display name rather than the numeric operator_id the submit response echoes.

Errors

StatusCodeCause
400E_VALIDATION_FAILURElimit outside 1–10000, or an unparseable query parameter
401E_UNAUTHORIZED_ACCESSMissing, invalid or non-whitelisted credentials
500INTERNAL_SERVER_ERRORQuery failed

Reconciliation pattern

The most valuable use of this endpoint is settling the ambiguity after a failed or timed-out submit. If you pass a distinct client_reference on every submit, you can answer "did that one land?" without guessing:

# Did my submit for TOPUP-2026-000412 actually land?
curl -s -X GET "{{host}}/api/v1/recharges?search=9876543210&from_date=2026-08-25" \
  -H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
  -H "X-API-Secret: your-secret-here" \
  | jq '.[] | select(.client_reference == "TOPUP-2026-000412")'

An empty result means nothing was created and it is safe to submit again. Any result — including a PROCESSING one — means the recharge exists and resubmitting would duplicate it.

Examples

# Most recent 50
curl -X GET "{{host}}/api/v1/recharges" \
  -H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
  -H "X-API-Secret: your-secret-here"

# Everything still in flight
curl -X GET "{{host}}/api/v1/recharges?status=PROCESSING" \
  -H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
  -H "X-API-Secret: your-secret-here"

# One number's full history
curl -X GET "{{host}}/api/v1/recharges?search=9876543210&limit=100" \
  -H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
  -H "X-API-Secret: your-secret-here"

# A calendar month of successful recharges, second page
curl -X GET "{{host}}/api/v1/recharges?status=SUCCESS&from_date=2026-08-01&to_date=2026-08-31&page=2&limit=100" \
  -H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
  -H "X-API-Secret: your-secret-here"

Next steps