Aller au contenu principal

Solde et recharges automatiques

Mis à jour le 29 juillet 2026

Surveiller et automatiser les recharges

La combinaison du suivi du solde prépayé et des analytics d’utilisation permet de mettre en place un système de recharges intelligentes. Plutôt que de recharger manuellement, vous pouvez automatiser le processus en fonction de seuils et de prévisions de consommation.

Consulter le solde en détail

L’endpoint renvoie deux choses qu’il ne faut pas confondre : le solde instantané et l’historique des transactions. Le premier répond à « puis-je encore appeler l’API ? », le second à « à quelle vitesse est-ce que je consomme ? ». C’est le second qui permet d’anticiper, et donc le seul sur lequel on peut fonder une automatisation.

curl "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/prepaid/balance" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY"

La réponse contient le solde actuel et l’historique des transactions (achats et consommations).

Système de recharge automatique

Une recharge automatique bien réglée tient sur deux chiffres, et l’un des deux est souvent oublié. Le seuil de déclenchement doit couvrir votre consommation pendant le délai de réaction : si vous vérifiez une fois par jour, il faut au moins un jour de crédit d’avance, sinon l’automatisation se déclenchera après la coupure. Le plafond mensuel est le garde-fou qui manque le plus souvent — sans lui, une boucle défectueuse dans votre application peut déclencher rechargement sur rechargement, et les crédits xAI ne sont pas remboursables.

Ces deux valeurs ne se règlent pas au jugé : la section suivante montre comment les calculer sur votre consommation réelle.

import requests
from datetime import datetime, timedelta

MANAGEMENT_API = "https://management-api.x.ai"
MGMT_KEY = "xai-mgmt-..."
TEAM_ID = "team-..."

# Configuration
MIN_BALANCE = 50.00      # Seuil de recharge
TOP_UP_AMOUNT = 200.00   # Montant de recharge
MAX_MONTHLY = 1000.00    # Plafond mensuel

def get_balance():
    """Récupère le solde prépayé actuel."""
    resp = requests.get(
        f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/balance",
        headers={"Authorization": f"Bearer {MGMT_KEY}"}
    )
    return resp.json().get("balance", 0)

def get_monthly_top_ups():
    """Calcule le total des recharges du mois en cours."""
    resp = requests.get(
        f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/balance",
        headers={"Authorization": f"Bearer {MGMT_KEY}"}
    )
    # Filtrer les transactions du mois courant
    transactions = resp.json().get("transactions", [])
    current_month = datetime.now().strftime("%Y-%m")
    monthly_total = sum(
        t.get("amount", 0)
        for t in transactions
        if t.get("type") == "top-up" and t.get("date", "").startswith(current_month)
    )
    return monthly_total

def top_up(amount):
    """Effectue une recharge."""
    resp = requests.post(
        f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/top-up",
        headers={
            "Authorization": f"Bearer {MGMT_KEY}",
            "Content-Type": "application/json"
        },
        json={"amount": amount}
    )
    return resp.status_code == 200

# Logique de recharge
balance = get_balance()
monthly_spent = get_monthly_top_ups()

if balance < MIN_BALANCE:
    remaining_budget = MAX_MONTHLY - monthly_spent
    if remaining_budget >= TOP_UP_AMOUNT:
        if top_up(TOP_UP_AMOUNT):
            print(f"Rechargé de ${TOP_UP_AMOUNT:.2f}. Nouveau solde estimé : ${balance + TOP_UP_AMOUNT:.2f}")
        else:
            print("Erreur lors de la recharge")
    else:
        print(f"Plafond mensuel atteint (${monthly_spent:.2f} / ${MAX_MONTHLY:.2f})")
else:
    print(f"Solde suffisant : ${balance:.2f}")

Prévision de consommation

La prévision transforme la surveillance en anticipation. Une moyenne sur les sept derniers jours suffit pour la plupart des usages ; elle vous donne une date d’épuisement, donc un délai pour agir. Méfiez-vous simplement de la saisonnalité de votre propre trafic — une moyenne calculée sur une semaine creuse promet une autonomie qui fondra dès la reprise.

import requests
from datetime import datetime, timedelta

MANAGEMENT_API = "https://management-api.x.ai"
MGMT_KEY = "xai-mgmt-..."
TEAM_ID = "team-..."

# Consommation des 7 derniers jours
end = datetime.now()
start = end - timedelta(days=7)

usage_resp = requests.post(
    f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/usage",
    headers={
        "Authorization": f"Bearer {MGMT_KEY}",
        "Content-Type": "application/json"
    },
    json={
        "analyticsRequest": {
            "timeRange": {
                "startTime": start.strftime("%Y-%m-%d %H:%M:%S"),
                "endTime": end.strftime("%Y-%m-%d %H:%M:%S"),
                "timezone": "Europe/Paris"
            },
            "timeUnit": "DAY",
            "values": [{"name": "cost", "aggregation": "SUM"}]
        }
    }
)

# Calculer la moyenne quotidienne
data_points = usage_resp.json().get("dataPoints", [])
daily_costs = [p.get("value", 0) for p in data_points]
avg_daily_cost = sum(daily_costs) / len(daily_costs) if daily_costs else 0

# Estimer les jours restants
balance_resp = requests.get(
    f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/balance",
    headers={"Authorization": f"Bearer {MGMT_KEY}"}
)
current_balance = balance_resp.json().get("balance", 0)

if avg_daily_cost > 0:
    days_remaining = current_balance / avg_daily_cost
    exhaustion_date = datetime.now() + timedelta(days=days_remaining)
    print(f"Consommation moyenne : ${avg_daily_cost:.2f}/jour")
    print(f"Solde actuel : ${current_balance:.2f}")
    print(f"Épuisement estimé : {exhaustion_date.strftime('%d/%m/%Y')} ({days_remaining:.0f} jours)")

Dashboard de suivi intégré

Le tableau de bord réunit ce que trois endpoints différents savent de vos coûts : le solde prépayé, les charges à la facturation mensuelle et les limites configurées. Séparés, chacun raconte une histoire incomplète — un solde confortable ne dit rien d’une consommation postpaid qui file en parallèle. C’est le rapprochement qui donne le vrai coût du mois en cours.

#!/bin/bash
echo "=== Dashboard xAI - $(date '+%d/%m/%Y %H:%M') ==="

# Solde prépayé
BALANCE=$(curl -s "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/prepaid/balance" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('balance', 'N/A'))")
echo "Solde prépayé : $BALANCE $"

# Charges postpaid
POSTPAID=$(curl -s "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/postpaid/invoice/preview" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('totalAmount', 'N/A'))")
echo "Charges postpaid : $POSTPAID $"

# Limite de dépenses
LIMIT=$(curl -s "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/postpaid/spending-limits" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('monthlyLimit', 'N/A'))")
echo "Limite mensuelle : $LIMIT $"

Points clés à retenir

  • Automatisez les recharges avec un seuil minimum et un plafond mensuel
  • Utilisez les analytics pour prévoir la date d’épuisement des crédits
  • Combinez solde prépayé, charges postpaid et limites dans un dashboard unifié
  • Les crédits ne sont pas remboursables — calibrez les recharges automatiques avec prudence
  • Intégrez ces scripts dans votre cron ou votre pipeline CI/CD