> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oneclickdz.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Polling Strategies

> Efficient status polling patterns for asynchronous operations

## Overview

Best practices for polling API endpoints to track order status efficiently.

## Basic Polling Pattern

<CodeGroup>
  ```javascript Node.js theme={null}
  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,
  });
  ```

  ```python Python theme={null}
  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 PHP theme={null}
  <?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);
  ?>
  ```
</CodeGroup>

## Service-Specific Polling

### Mobile Top-Ups (5 minutes max)

<CodeGroup>
  ```javascript Node.js theme={null}
  async function pollMobileTopup(topupId) {
    return await pollStatus(() => checkMobileStatus(topupId), {
      maxAttempts: 60,
      interval: 5000,
      finalStates: ["FULFILLED", "REFUNDED", "UNKNOWN_ERROR"],
    });
  }
  ```

  ```python Python theme={null}
  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 PHP theme={null}
  <?php
  function pollMobileTopup($topupId) {
      return pollStatus(
          fn() => checkMobileStatus($topupId),
          60,
          5,
          ['FULFILLED', 'REFUNDED', 'UNKNOWN_ERROR']
      );
  }
  ?>
  ```
</CodeGroup>

### Internet Top-Ups (5 minutes max)

<CodeGroup>
  ```javascript Node.js theme={null}
  async function pollInternetTopup(topupId) {
    return await pollStatus(() => checkInternetStatus(topupId), {
      maxAttempts: 60,
      interval: 5000,
      finalStates: ["FULFILLED", "REFUNDED", "QUEUED"],
    });
  }
  ```

  ```python Python theme={null}
  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 PHP theme={null}
  <?php
  function pollInternetTopup($topupId) {
      return pollStatus(
          fn() => checkInternetStatus($topupId),
          60,
          5,
          ['FULFILLED', 'REFUNDED', 'QUEUED']
      );
  }
  ?>
  ```
</CodeGroup>

### Gift Cards (10 minutes max)

<CodeGroup>
  ```javascript Node.js theme={null}
  async function pollGiftCardOrder(orderId) {
    return await pollStatus(() => checkGiftCardOrder(orderId), {
      maxAttempts: 120,
      interval: 5000,
      finalStates: ["FULFILLED", "PARTIALLY_FILLED", "REFUNDED"],
    });
  }
  ```

  ```python Python theme={null}
  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 PHP theme={null}
  <?php
  function pollGiftCardOrder($orderId) {
      return pollStatus(
          fn() => checkGiftCardOrder($orderId),
          120,
          5,
          ['FULFILLED', 'PARTIALLY_FILLED', 'REFUNDED']
      );
  }
  ?>
  ```
</CodeGroup>

## Best Practices

<CardGroup cols={2}>
  <Card title="Set Timeouts" icon="clock">
    Always set maximum polling duration
  </Card>

  <Card title="Handle Errors" icon="triangle-exclamation">
    Catch and handle polling timeouts
  </Card>

  <Card title="Log Progress" icon="list-check">
    Track polling attempts for debugging
  </Card>

  <Card title="Final States" icon="flag-checkered">
    Define clear terminal states
  </Card>
</CardGroup>

## 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

<CardGroup cols={2}>
  <Card title="Mobile Top-Up Guide" href="/en/mobile-topup-guides/overview">
    Complete mobile integration workflow
  </Card>

  <Card title="Error Handling" href="/en/api-reference/error-handling">
    Handle errors properly
  </Card>

  <Card title="Webhooks" href="/en/webhooks">
    Real-time status notifications
  </Card>

  <Card title="Best Practices" href="/en/security-best-practices">
    Security best practices
  </Card>
</CardGroup>
