:::note[Fail-open par défaut]
Chaque exemple retourne `None` si l'API est injoignable. Laissez toujours l'utilisateur passer quand Syvel est indisponible — ne bloquez jamais une inscription à cause d'un service tiers.
:::

Aucun package Syvel requis — uniquement `httpx` ou `requests`.

## Avec httpx

```python
import os
import httpx

def check_email(email: str) -> dict | None:
    """
    Retourne le résultat Syvel, ou None si l'API est indisponible.
    Toujours fail open : retourner None et laisser passer l'utilisateur.
    """
    try:
        response = httpx.get(
            f"https://api.syvel.io/v1/check/{email}",
            headers={"Authorization": f"Bearer {os.environ['SYVEL_API_KEY']}"},
            timeout=3.0,  # 3 s max — ne jamais bloquer l'utilisateur
        )
        if not response.is_success:
            return None  # quota dépassé ou erreur serveur → fail open
        return response.json()
    except Exception:
        return None  # erreur réseau ou timeout → fail open


# Dans une vue Django / FastAPI / Flask :
result = check_email(email)

if result and result.get("is_risky"):
    raise ValidationError("Veuillez utiliser une adresse email professionnelle.")

# result est None → Syvel indisponible, laisser passer l'utilisateur
```

## Django REST Framework

```python
from rest_framework import serializers
import os
import httpx


class RegisterSerializer(serializers.Serializer):
    email = serializers.EmailField()

    def validate_email(self, value):
        try:
            res = httpx.get(
                f"https://api.syvel.io/v1/check/{value}",
                headers={"Authorization": f"Bearer {os.environ['SYVEL_API_KEY']}"},
                timeout=3.0,
            )
            if res.is_success and res.json().get("is_risky"):
                raise serializers.ValidationError(
                    "Veuillez utiliser une adresse email professionnelle."
                )
        except httpx.RequestError:
            pass  # fail open — Syvel indisponible, laisser passer
        return value
```

## FastAPI (async)

```python
from fastapi import FastAPI, HTTPException
import os
import httpx

app = FastAPI()


async def check_email(email: str) -> dict | None:
    try:
        async with httpx.AsyncClient() as client:
            res = await client.get(
                f"https://api.syvel.io/v1/check/{email}",
                headers={"Authorization": f"Bearer {os.environ['SYVEL_API_KEY']}"},
                timeout=3.0,
            )
        if not res.is_success:
            return None
        return res.json()
    except Exception:
        return None


@app.post("/register")
async def register(email: str):
    result = await check_email(email)
    if result and result.get("is_risky"):
        raise HTTPException(
            status_code=422,
            detail="Veuillez utiliser une adresse email professionnelle.",
        )
    # continuer l'inscription…
```

## Avec requests

```python
import os
import requests


def check_email(email: str) -> dict | None:
    try:
        response = requests.get(
            f"https://api.syvel.io/v1/check/{email}",
            headers={"Authorization": f"Bearer {os.environ['SYVEL_API_KEY']}"},
            timeout=3,
        )
        if not response.ok:
            return None
        return response.json()
    except Exception:
        return None
```

## Ressources

- [Référence API — Vérification email](/fr/docs/api/check)
- [Authentification](/fr/docs/guides/authentication)
- [Codes d'erreur](/fr/docs/guides/errors)
- [SDK Python](/fr/docs/integrations/python)