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

# Valider un Numéro de Téléphone

> Validez les numéros de téléphone avant de traiter une recharge internet

## Vue d'ensemble

Valide les numéros de téléphone pour les services ADSL ou 4G avant la soumission. Permet d'éviter les erreurs et de réduire les demandes de remboursement.

<Tip>
  **Validez toujours** les numéros de téléphone avant de soumettre des demandes de recharge pour minimiser les échecs.
</Tip>

## Paramètres de requête

<ParamField query="type" type="string" required>
  Type de service : `ADSL` ou `4G`
</ParamField>

<ParamField query="number" type="string" required>
  Numéro de téléphone à valider - **ADSL :** `0[0-9]{8}` (ex. `036362608`) - **4G :** `213[0-9]{9}` (ex. `213472731602`)
</ParamField>

## Réponse

### Numéro ADSL valide

```json theme={null}
{
  "success": true,
  "data": {
    "ncli": "11022*****",
    "offre": "FTTc-b_10M'",
    "type": "ADSL"
  },
  "meta": {
    "timestamp": "2025-10-29T00:36:48.823Z"
  }
}
```

### Numéro 4G valide

```json theme={null}
{
  "success": true,
  "data": {
    "ncli": "11034*****",
    "type": "4GLTE"
  },
  "meta": {
    "timestamp": "2025-10-29T00:36:49.847Z"
  }
}
```

### Numéro invalide

```json theme={null}
{
  "success": false,
  "error": {
    "code": "ERR_PHONE",
    "message": "Invalid phone number for ADSL service",
    "details": {
      "number": "123456",
      "type": "ADSL",
      "reason": "Number does not match required format"
    }
  }
}
```

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.oneclickdz.com/v3/internet/check-number?type=ADSL&number=036362608" \
    -H "X-Access-Token: YOUR_API_KEY"
  ```

  ```javascript Node.js theme={null}
  async function validateNumber(type, number) {
    const response = await fetch(
      `https://api.oneclickdz.com/v3/internet/check-number?type=${type}&number=${number}`,
      { headers: { "X-Access-Token": process.env.API_KEY } }
    );

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.error.message);
    }

    return await response.json();
  }

  // Usage
  try {
    await validateNumber("ADSL", "036362608");
    console.log("Number is valid");
  } catch (error) {
    console.error("Invalid number:", error.message);
  }
  ```

  ```python Python theme={null}
  def validate_number(type, number):
      response = requests.get(
          'https://api.oneclickdz.com/v3/internet/check-number',
          headers={'X-Access-Token': 'YOUR_API_KEY'},
          params={'type': type, 'number': number}
      )

      if response.ok:
          return True
      else:
          error = response.json()
          raise ValueError(error['error']['message'])

  # Usage
  try:
      validate_number('ADSL', '036362608')
      print('Valid number')
  except ValueError as e:
      print(f'Invalid: {e}')
  ```
</CodeGroup>

## Formats de numéros de téléphone

<Tabs>
  <Tab title="ADSL">
    **Format :** `0[0-9]{8}` **Exemples valides :** - ✅ `036362608` - ✅
    `031417237` - ✅ `021123456` **Exemples invalides :** - ❌ `36362608` (0 manquant
    au début) - ❌ `0363626081` (trop long) - ❌ `213636362608` (mauvais format)
  </Tab>

  <Tab title="4G">
    **Format :** `213[0-9]{9}` **Exemples valides :** - ✅ `213472731602` - ✅
    `213665983439` - ✅ `213778037340` **Exemples invalides :** - ❌ `0665983439`
    (mauvais format, doit inclure l'indicatif pays) - ❌ `665983439` (indicatif pays
    manquant) - ❌ `+213665983439` (ne doit pas inclure +)
  </Tab>
</Tabs>

## Exemple d'intégration

```javascript theme={null}
// Flux de validation complet
async function prepareInternetTopup(type, number, value) {
  // Étape 1 : Valider le numéro
  try {
    await validateNumber(type, number);
  } catch (error) {
    return {
      success: false,
      error: "Numéro de téléphone invalide",
      details: error.message,
    };
  }

  // Step 2: Check product availability
  const products = await getProducts(type);
  const product = products.find((p) => p.value === value && p.available);

  if (!product) {
    return {
      success: false,
      error: "Produit non disponible",
    };
  }

  // Étape 3 : Envoyer la recharge
  return await sendInternetTopup({ type, number, value });
}
```

## Pourquoi valider ?

<CardGroup cols={2}>
  <Card title="Réduire les erreurs" icon="shield-check">
    Détectez les numéros invalides avant la soumission
  </Card>

  <Card title="Meilleure UX" icon="smile">
    Affichez un retour immédiat aux utilisateurs
  </Card>

  <Card title="Moins de remboursements" icon="money-bill-wave">
    Minimisez les transactions échouées et les remboursements
  </Card>

  <Card title="Vérifier le format" icon="list-check">
    Assurez-vous que le numéro correspond au type de service
  </Card>
</CardGroup>

## Bonnes pratiques

<AccordionGroup>
  <Accordion title="Validation côté client">
    Validez le format côté client d'abord, puis confirmez avec l'API :

    ```javascript theme={null}
    function validateADSLFormat(number) {
      return /^0[0-9]{8}$/.test(number);
    }

    function validate4GFormat(number) {
      return /^213[0-9]{9}$/.test(number);
    }
    ```
  </Accordion>

  <Accordion title="Afficher des messages utiles">
    Affichez des messages clairs quand la validation échoue : - "Veuillez entrer un numéro ADSL valide (ex. 036362608)" - "Les numéros 4G doivent commencer par 213 (ex. 213665983439)" - "Format du numéro : 9 chiffres commençant par 0"
  </Accordion>

  <Accordion title="Mettre en cache les résultats de validation">
    Mettez en cache les validations réussies pendant une courte période :

    ```javascript theme={null}
    const validationCache = new Map();

    async function validateWithCache(type, number) {
      const key = `${type}:${number}`;

      if (validationCache.has(key)) {
        return validationCache.get(key);
      }

      const result = await validateNumber(type, number);
      validationCache.set(key, result);

      // Effacer après 5 minutes
      setTimeout(() => validationCache.delete(key), 5 * 60 * 1000);

      return result;
    }
    ```
  </Accordion>
</AccordionGroup>

## Endpoints liés

<CardGroup cols={2}>
  <Card title="Liste des produits" icon="list" href="/fr/api-reference/internet/list-products">
    Obtenir les cartes disponibles
  </Card>

  <Card title="Envoyer une recharge" icon="paper-plane" href="/fr/api-reference/internet/send-topup">
    Acheter une carte internet
  </Card>
</CardGroup>
