Get Recharge API
Read a single recharge by id — the endpoint you poll after a 202, and how often to poll it
Get Recharge API
Returns one of your recharges. This is the endpoint you poll after a 202 PROCESSING from submit, and the one to quote from when raising a support ticket.
Endpoint
GET /api/v1/recharges/{id}Authentication: API Key + Secret required
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | number | Yes | The id returned by submit |
Request Headers
X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke
X-API-Secret: your-secret-hereResponse
Success Response
Status Code: 200 OK
{
"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"
}The response shape is identical to one element of List Recharges — see that page for the full field table.
Optional fields are absent from the JSON rather than null. A PROCESSING recharge has no operator_txn_id, no failure_reason and often no vendor_recharge_id key at all. Read defensively.
Polling cadence
A 202 PROCESSING means Starship holds the recharge and is waiting on the vendor. Two things can settle it:
- The vendor pushes a status update. This is the fast path and can arrive within seconds or minutes.
- A background job polls the vendor's status API. Following the vendor's own timing rule, the first check happens roughly 15 minutes after the recharge was placed, then roughly every 30 minutes after that.
Because of that second mechanism, a recharge that has not been pushed cannot change before the ~15-minute mark. Polling it every second in the first minute produces fifteen minutes of identical responses and spends your rate-limit budget for nothing.
Recommended schedule
| Window since submit | Poll every | Why |
|---|---|---|
| 0–5 minutes | 60 seconds | Catches a fast vendor push |
| 5–30 minutes | 5 minutes | The first background status check lands around 15 minutes |
| 30–60 minutes | 15 minutes | Later checks run roughly every 30 minutes |
| Beyond 60 minutes | Stop polling | Escalate — see below |
That schedule costs about 20 requests per recharge in the worst case, against a budget of 1,000 per hour shared with every other endpoint. Multiply by your concurrency before deciding to poll more aggressively.
Never resubmit because polling is slow. A recharge sitting in PROCESSING has already debited your wallet and may already have credited the phone. Submitting again does not cancel it — it places a second, independent recharge. If a recharge worries you, escalate it with its reference_number; do not send another.
When it stops changing
A recharge is flagged sub_status: "NEEDS_REVIEW" while remaining PROCESSING when it has been unresolved longer than the review threshold (30 minutes by default), or when background polling gives up after roughly 20 attempts. Starship staff are alerted at that point.
NEEDS_REVIEW does not mean the recharge has stopped: it can still settle automatically. Keep polling at the slow cadence and raise it with Starship, quoting the reference_number.
Reading the outcome
status | What it means | Wallet | Your move |
|---|---|---|---|
PROCESSING | Still unresolved | Debited | Keep polling on the schedule above |
SUCCESS | The operator credited the number | Debited | Done — operator_txn_id is your proof |
FAILED | Vendor-confirmed failure | Credited back | Safe to retry the recharge |
REVERSED | The debit was returned after the fact | Credited back | Treat as not delivered |
Branch on status only. sub_status is diagnostic detail whose values may be extended, and failure_reason is a vendor string passed through verbatim — useful to display and log, never safe to match on.
Errors
| Status | Code | Message | Cause |
|---|---|---|---|
400 | E_VALIDATION_FAILURE | invalid recharge id | The path segment is not a positive integer |
401 | E_UNAUTHORIZED_ACCESS | — | Missing, invalid or non-whitelisted credentials |
404 | NOT_FOUND | recharge not found | No such recharge, or it belongs to another client |
500 | INTERNAL_SERVER_ERROR | Failed to retrieve recharge | Lookup failed |
A recharge belonging to another client returns 404, not 403. The two cases are deliberately indistinguishable from outside: a 403 would confirm that an id exists, which is enough to enumerate other clients' recharge volumes. Do not read a 404 as proof that an id was never issued — only that it is not yours.
Examples
# Read one recharge
curl -X GET "{{host}}/api/v1/recharges/84213" \
-H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
-H "X-API-Secret: your-secret-here"
# Just the status
curl -s -X GET "{{host}}/api/v1/recharges/84213" \
-H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
-H "X-API-Secret: your-secret-here" \
| jq '{id, status, sub_status, operator_txn_id, failure_reason}'Polling until the status settles, with the recommended backoff:
RECHARGE_ID=84213
for delay in 60 60 60 60 60 300 300 300 300 300 900 900; do
status=$(curl -s -X GET "{{host}}/api/v1/recharges/${RECHARGE_ID}" \
-H "X-API-Key: sk_7Fq2XmR9vTb4NcZ1yWd6Ke" \
-H "X-API-Secret: your-secret-here" | jq -r '.status')
echo "status: ${status}"
[ "$status" != "PROCESSING" ] && break
sleep "$delay"
doneIf the loop exits still PROCESSING, escalate with the reference_number — do not submit again.
Next steps
- List Recharges — find a recharge when you do not have its id
- Submit a Recharge — the three outcomes explained