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

# Lister les Forfaits Mobile

> Obtenir tous les forfaits de recharge mobile disponibles pour les opérateurs algériens

## Vue d'Ensemble

Retourne une liste complète de tous les forfaits de recharge mobile disponibles pour les opérateurs Mobilis, Djezzy et Ooredoo.

<Note>
  Les forfaits sont stables et changent rarement. **Vous pouvez les mettre en cache** dans votre base de données avec votre propre tarification.
</Note>

## Types de Forfaits

<Tabs>
  <Tab title="Forfaits Dynamiques">
    **Forfaits à montant variable** où vous spécifiez le montant dans une plage donnée.
    **Exemples :** Prépayé, Postpayé (Facture), International **Champs requis :** - `plan_code` - `MSSIDN` (numéro de téléphone) - `amount` (entre `min_amount` et `max_amount`)
  </Tab>

  <Tab title="Forfaits Fixes">
    **Forfaits à montant fixe** qui sont directement activés. **Exemples :** "Pixx 500",
    "Special 2000", "Data Pack 1GB" **Champs requis :** - `plan_code` - `MSSIDN`
    (numéro de téléphone) - Le montant est prédéfini (champ `amount` dans la réponse)
  </Tab>

  <Tab title="Forfaits GetMenu">
    **Forfaits spéciaux** qui récupèrent toutes les offres disponibles pour un numéro spécifique.
    **Codes :** `GETMENU_Mobilis`, `GETMENU_Ooredoo`, `GETMENU_Djezzy` Retourne les offres disponibles de l'utilisateur en fonction de son abonnement.
  </Tab>
</Tabs>

## Réponse

<ResponseField name="success" type="boolean" required>
  Indique si la requête a réussi
</ResponseField>

<ResponseField name="data" type="object" required>
  <Expandable title="properties">
    <ResponseField name="dynamicPlans" type="array" required>
      Tableau de forfaits à montant variable où vous spécifiez le montant dans une plage donnée

      <Expandable title="Dynamic plan object">
        <ResponseField name="code" type="string">
          Code de forfait unique pour les requêtes API
        </ResponseField>

        <ResponseField name="name" type="string">
          Nom de forfait convivial pour l'affichage
        </ResponseField>

        <ResponseField name="operator" type="string">
          Opérateur mobile : Mobilis, Djezzy, Ooredoo (ou GMobilis, GDjezzy, GOoredoo pour la vente en gros)
        </ResponseField>

        <ResponseField name="cost" type="number">
          Votre multiplicateur de coût (ex. : 0,96 = vous payez 960 DZD pour une recharge de 1000 DZD). Présent uniquement pour les forfaits de détail.
        </ResponseField>

        <ResponseField name="isEnabled" type="boolean">
          Indique si le forfait est actuellement disponible
        </ResponseField>

        <ResponseField name="min_amount" type="number">
          Montant minimum de recharge en DZD
        </ResponseField>

        <ResponseField name="max_amount" type="number">
          Montant maximum de recharge en DZD
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="fixedPlans" type="array" required>
      Tableau de forfaits à montant fixe directement activés

      <Expandable title="Fixed plan object">
        <ResponseField name="code" type="string">
          Code de forfait unique pour les requêtes API
        </ResponseField>

        <ResponseField name="name" type="string">
          Nom de forfait convivial pour l'affichage
        </ResponseField>

        <ResponseField name="operator" type="string">
          Opérateur mobile
        </ResponseField>

        <ResponseField name="cost" type="number">
          Votre multiplicateur de coût
        </ResponseField>

        <ResponseField name="isEnabled" type="boolean">
          Indique si le forfait est actuellement disponible
        </ResponseField>

        <ResponseField name="amount" type="number">
          Montant fixe de recharge en DZD
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta" type="object" required>
  <Expandable title="properties">
    <ResponseField name="timestamp" type="string">
      Horodatage de la réponse au format ISO 8601
    </ResponseField>
  </Expandable>
</ResponseField>

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.oneclickdz.com/v3/mobile/plans \
    -H "X-Access-Token: YOUR_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const response = await fetch("https://api.oneclickdz.com/v3/mobile/plans", {
    headers: { "X-Access-Token": "YOUR_API_KEY" },
  });
  const { data } = await response.json();
  console.log(data.dynamicPlans, data.fixedPlans);
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://api.oneclickdz.com/v3/mobile/plans',
      headers={'X-Access-Token': 'YOUR_API_KEY'}
  )
  data = response.json()['data']
  dynamic_plans = data['dynamicPlans']
  fixed_plans = data['fixedPlans']
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.oneclickdz.com/v3/mobile/plans');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: YOUR_API_KEY']);
  $response = json_decode(curl_exec($ch), true);
  $dynamicPlans = $response['data']['dynamicPlans'];
  $fixedPlans = $response['data']['fixedPlans'];
  ?>
  ```
</CodeGroup>

### Exemple de Réponse

```json theme={null}
{
  "success": true,
  "data": {
    "dynamicPlans": [
      {
        "code": "GROS_MOBILIS",
        "name": "📱 GROS MOBILIS | جملة",
        "operator": "GMobilis",
        "isEnabled": true,
        "min_amount": 5000,
        "max_amount": 300000
      },
      {
        "code": "PREPAID_DJEZZY",
        "name": "📱 PREPAID | عادي",
        "operator": "Djezzy",
        "cost": 0.9925,
        "isEnabled": true,
        "min_amount": 100,
        "max_amount": 10000
      }
    ],
    "fixedPlans": [
      {
        "code": "MIX50_DJEZZY",
        "name": "📱🌐 Auto | MIX 50",
        "operator": "Djezzy",
        "isEnabled": true,
        "cost": 0.9925,
        "amount": 50
      },
      {
        "code": "MIX1000_OOREDOO",
        "name": "📱🌐 AUTO | MIX 1000",
        "operator": "Ooredoo",
        "isEnabled": true,
        "cost": 0.99,
        "amount": 1000
      }
    ]
  },
  "meta": {
    "timestamp": "2025-10-29T00:35:59.220Z"
  }
}
```

## Explication des Propriétés des Forfaits

<AccordionGroup>
  <Accordion title="Comprendre le Coût">
    Le champ `cost` est votre multiplicateur de prix de gros :

    * `0.98` = Vous payez 98% de la valeur nominale
    * Pour une recharge de 1000 DZD : votre coût = 1000 × 0,98 = 980 DZD
    * Votre marge bénéficiaire : 1000 - 980 = 20 DZD (2%)

    **Important :** Supprimez `cost` des réponses aux utilisateurs finaux. Appliquez votre propre majoration.
  </Accordion>

  {" "}

  <Accordion title="Plages de Montant">
    **Les forfaits dynamiques** ont `min_amount` et `max_amount` : - Les utilisateurs peuvent choisir n'importe quel
    montant dans cette plage - Plage courante : 50 - 5000 DZD - Certains opérateurs permettent
    jusqu'à 10 000 DZD **Les forfaits fixes** ont un seul `amount` : - Pas de sélection de montant
    nécessaire - Active directement le service - Courant pour les offres spéciales et les packs de données
  </Accordion>

  <Accordion title="Disponibilité des Forfaits">
    Le champ `isEnabled` indique :

    * `true` : Forfait disponible pour utilisation
    * `false` : Temporairement désactivé (maintenance, problèmes d'opérateur)

    Vérifiez toujours ce champ avant de permettre aux utilisateurs de sélectionner un forfait.
  </Accordion>
</AccordionGroup>

## Stratégie d'Intégration

<Steps>
  <Step title="Chargement Initial">
    Appelez cet endpoint une fois au démarrage de votre application ou lors de la configuration
  </Step>

  <Step title="Stocker les Forfaits">
    Sauvegardez les forfaits dans votre base de données avec votre propre tarification

    ```sql theme={null}
    CREATE TABLE mobile_plans (
      code VARCHAR PRIMARY KEY,
      name VARCHAR,
      operator VARCHAR,
      our_cost DECIMAL,
      sell_price DECIMAL,
      min_amount INT,
      max_amount INT,
      amount INT,
      is_enabled BOOLEAN,
      updated_at TIMESTAMP
    );
    ```
  </Step>

  <Step title="Appliquer la Majoration">
    Calculez votre prix de vente :

    ```javascript theme={null}
    const ourCost = faceValue * plan.cost;
    const markup = 0.05; // 5% profit
    const sellPrice = ourCost * (1 + markup);
    ```
  </Step>

  <Step title="Servir aux Utilisateurs">
    Affichez les forfaits avec votre tarification aux utilisateurs finaux

    ```javascript theme={null}
    {
      code: plan.code,
      name: plan.name,
      operator: plan.operator,
      price: sellPrice, // Your price, not wholesale cost
      minAmount: plan.min_amount,
      maxAmount: plan.max_amount
    }
    ```
  </Step>

  <Step title="Synchronisation Périodique">
    Synchronisez les forfaits quotidiennement ou lors de notifications de changements

    ```javascript theme={null}
    // Daily sync at midnight
    cron.schedule('0 0 * * *', syncPlans);
    ```
  </Step>
</Steps>

## Filtrage des Forfaits

<CodeGroup>
  ```javascript By Operator theme={null}
  const mobilisPlans = [
    ...data.dynamicPlans.filter((p) => p.operator === "Mobilis"),
    ...data.fixedPlans.filter((p) => p.operator === "Mobilis")
  ];
  const djezzyPlans = [
    ...data.dynamicPlans.filter((p) => p.operator === "Djezzy"),
    ...data.fixedPlans.filter((p) => p.operator === "Djezzy")
  ];
  ```

  ```javascript By Type theme={null}
  const dynamicPlans = data.dynamicPlans;
  const fixedPlans = data.fixedPlans;
  const allPlans = [...data.dynamicPlans, ...data.fixedPlans];
  ```

  ```javascript Enabled Only theme={null}
  const availableDynamic = data.dynamicPlans.filter((p) => p.isEnabled);
  const availableFixed = data.fixedPlans.filter((p) => p.isEnabled);
  ```
</CodeGroup>

## Bonnes Pratiques

<CardGroup cols={2}>
  <Card title="Mettre en Cache les Forfaits" icon="database">
    Stockez les forfaits dans votre base de données pour réduire les appels API et améliorer les performances
  </Card>

  <Card title="Supprimer le Coût" icon="eye-slash">
    N'exposez jamais le `cost` de gros aux utilisateurs finaux. Affichez uniquement vos prix de détail
  </Card>

  <Card title="Vérifier isEnabled" icon="circle-check">
    Vérifiez toujours `isEnabled` avant d'afficher les forfaits aux utilisateurs
  </Card>

  <Card title="Synchroniser Régulièrement" icon="arrows-rotate">
    Implémentez une synchronisation quotidienne ou un listener de webhook pour les mises à jour de forfaits
  </Card>
</CardGroup>

## Endpoints Associés

<CardGroup cols={2}>
  <Card title="Envoyer une Recharge" icon="paper-plane" href="/fr/api-reference/mobile/send-topup">
    Envoyer une recharge mobile avec un code de forfait
  </Card>

  <Card title="Vérifier le Statut" icon="magnifying-glass" href="/fr/api-reference/mobile/check-by-ref">
    Suivre le statut de la recharge
  </Card>
</CardGroup>
