Overview
Best practices for polling API endpoints to track order status efficiently.Basic Polling Pattern
async function pollStatus(checkFunction, options = {}) {
const {
maxAttempts = 60,
interval = 5000,
finalStates = ["FULFILLED", "REFUNDED"],
} = options;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
const result = await checkFunction();
if (finalStates.includes(result.status)) {
return result;
}
if (attempt < maxAttempts) {
await new Promise((resolve) => setTimeout(resolve, interval));
}
}
throw new Error("Polling timeout");
}
// Usage
const result = await pollStatus(() => checkTopupStatus(topupId), {
maxAttempts: 60,
interval: 5000,
});
import time
def poll_status(check_function, max_attempts=60, interval=5, final_states=None):
if final_states is None:
final_states = ["FULFILLED", "REFUNDED"]
for attempt in range(1, max_attempts + 1):
result = check_function()
if result['status'] in final_states:
return result
if attempt < max_attempts:
time.sleep(interval)
raise Exception("Polling timeout")
# Usage
result = poll_status(lambda: check_topup_status(topup_id), max_attempts=60, interval=5)
<?php
function pollStatus($checkFunction, $maxAttempts = 60, $interval = 5, $finalStates = null) {
if ($finalStates === null) {
$finalStates = ['FULFILLED', 'REFUNDED'];
}
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
$result = $checkFunction();
if (in_array($result['status'], $finalStates)) {
return $result;
}
if ($attempt < $maxAttempts) {
sleep($interval);
}
}
throw new Exception('Polling timeout');
}
// Usage
$result = pollStatus(fn() => checkTopupStatus($topupId), 60, 5);
?>
Service-Specific Polling
Mobile Top-Ups (5 minutes max)
async function pollMobileTopup(topupId) {
return await pollStatus(() => checkMobileStatus(topupId), {
maxAttempts: 60,
interval: 5000,
finalStates: ["FULFILLED", "REFUNDED", "UNKNOWN_ERROR"],
});
}
def poll_mobile_topup(topup_id):
return poll_status(
lambda: check_mobile_status(topup_id),
max_attempts=60,
interval=5,
final_states=['FULFILLED', 'REFUNDED', 'UNKNOWN_ERROR']
)
<?php
function pollMobileTopup($topupId) {
return pollStatus(
fn() => checkMobileStatus($topupId),
60,
5,
['FULFILLED', 'REFUNDED', 'UNKNOWN_ERROR']
);
}
?>
Internet Top-Ups (5 minutes max)
async function pollInternetTopup(topupId) {
return await pollStatus(() => checkInternetStatus(topupId), {
maxAttempts: 60,
interval: 5000,
finalStates: ["FULFILLED", "REFUNDED", "QUEUED"],
});
}
def poll_internet_topup(topup_id):
return poll_status(
lambda: check_internet_status(topup_id),
max_attempts=60,
interval=5,
final_states=['FULFILLED', 'REFUNDED', 'QUEUED']
)
<?php
function pollInternetTopup($topupId) {
return pollStatus(
fn() => checkInternetStatus($topupId),
60,
5,
['FULFILLED', 'REFUNDED', 'QUEUED']
);
}
?>
Gift Cards (10 minutes max)
async function pollGiftCardOrder(orderId) {
return await pollStatus(() => checkGiftCardOrder(orderId), {
maxAttempts: 120,
interval: 5000,
finalStates: ["FULFILLED", "PARTIALLY_FILLED", "REFUNDED"],
});
}
def poll_gift_card_order(order_id):
return poll_status(
lambda: check_gift_card_order(order_id),
max_attempts=120,
interval=5,
final_states=['FULFILLED', 'PARTIALLY_FILLED', 'REFUNDED']
)
<?php
function pollGiftCardOrder($orderId) {
return pollStatus(
fn() => checkGiftCardOrder($orderId),
120,
5,
['FULFILLED', 'PARTIALLY_FILLED', 'REFUNDED']
);
}
?>
Best Practices
Set Timeouts
Always set maximum polling duration
Handle Errors
Catch and handle polling timeouts
Log Progress
Track polling attempts for debugging
Final States
Define clear terminal states
Recommended Settings
| Service | Interval | Max Duration | Final States |
|---|---|---|---|
| Mobile | 5s | 5 min | FULFILLED, REFUNDED, UNKNOWN_ERROR |
| Internet | 5s | 5 min | FULFILLED, REFUNDED, QUEUED |
| Gift Cards | 5s | 10 min | FULFILLED, PARTIALLY_FILLED, REFUNDED |
Related
Mobile Top-Up Guide
Complete mobile integration workflow
Error Handling
Handle errors properly
Webhooks
Real-time status notifications
Best Practices
Security best practices

