Facturation et mesure de l'utilisation
Attribution des coûts par capacité, estimations CO₂ et rapports de rétrofacturation — disponibles pour les administrateurs d'organisation via client.billing.*
Chaque appel à une capacité IA — complétion LLM, transcription vocale, embedding, synthèse TTS, OCR, génération d'images, analyse vidéo — produit un événement d'utilisation mesuré. L'API billing.* permet aux administrateurs d'organisation d'interroger les coûts, les tokens, les exécutions et les estimations CO₂ selon toute combinaison d'espace de travail, d'équipe, d'utilisateur, de capacité, de fournisseur, de modèle ou de région.
La mesure de facturation est en lecture seule. Un échec d'écriture de facturation ne bloque jamais l'appel de capacité. Les chiffres étiquetés CO₂ sont des estimations modélisées, pas des relevés de compteur d'énergie — voir Méthodologie carbone ci-dessous.
Aperçu de l'API
Toutes les méthodes billing.* sont disponibles sur le client admin Better Auth (getAdminClient()) depuis @scrydon/multi-tenancy/auth/client.
| Méthode | Authentification requise | Ce qu'elle retourne |
|---|---|---|
billing.log(...) | M2M interne (billing:admin) | Enregistre un événement d'utilisation. Appelé par le runtime de capacité — pas directement par le code produit. |
billing.summary(...) | Session administrateur d'org | Totaux + ventilation groupée optionnelle |
billing.timeseries(...) | Session administrateur d'org | Série jour par jour |
billing.topN(...) | Session administrateur d'org | Top N clés par métrique |
billing.chargeback(...) | Session administrateur d'org | Coût + part du total org par clé |
billing.carbonFactors(...) | Session administrateur d'org | Table complète des facteurs carbone (pour les auditeurs) |
Champs des événements d'utilisation
Chaque événement mesuré capture :
| Champ | Type | Description |
|---|---|---|
organizationId | string | Organisation propriétaire de l'événement |
occurredAt | string (ISO) | Moment où l'appel de capacité s'est terminé |
workspaceId | string | null | Espace de travail à l'origine de l'appel, si connu |
teamId | string | null | Équipe à l'origine de l'appel, si connue |
userId | string | null | Utilisateur ayant déclenché l'appel, si connu |
source | "workflow" | "copilot" | "chat" | "wand" | "kb_ingest" | "api" | Surface produit |
capability | "llm" | "stt" | "embedding" | "tts" | "ocr" | "video" | "image" | Catégorie de capacité |
vendor | string | Slug du fournisseur (ex. openai, anthropic) |
model | string | Identifiant du modèle (ex. gpt-4o, whisper-1) |
region | string | null | Région d'hébergement utilisée pour l'estimation carbone |
tokensIn | number | Tokens d'entrée consommés |
tokensOut | number | Tokens de sortie produits |
units | number | null | Utilisation non-token (secondes audio, pages, images, secondes vidéo) |
durationMs | number | Durée réelle de l'appel de capacité |
success | boolean | Si l'appel a réussi |
costUsd | number | Coût figé au moment de l'écriture (USD) |
co2Grams | number | Estimation CO₂ figée au moment de l'écriture (grammes CO₂e) |
pricingVersion | string | Version du catalogue de tarification utilisée pour calculer costUsd |
carbonVersion | string | Version de la table des facteurs carbone utilisée pour calculer co2Grams |
executionId | string | null | Exécution de workflow ayant déclenché l'appel, le cas échéant |
workflowId | string | null | Définition de workflow ayant déclenché l'appel, le cas échéant |
Résumé
Retourne les totaux agrégés pour l'organisation sur une plage de dates, avec une ventilation optionnelle par dimension.
const { data, error } = await getAdminClient().billing.summary({
organizationId: "org_abc123",
range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
groupBy: "workspace", // optionnel
filters: { capability: "llm" }, // filtre de dimension optionnel
})Requête
| Champ | Type | Requis | Description |
|---|---|---|---|
organizationId | string | Oui | Organisation à interroger |
range.from | string (ISO) | Oui | Début de la plage (inclusif) |
range.to | string (ISO) | Oui | Fin de la plage (exclusif) |
groupBy | UsageDimension | Non | Regrouper la ventilation par cette dimension |
filters | Partial<Record<UsageDimension, string>> | Non | Restreindre les résultats à une seule valeur de dimension |
UsageDimension est l'une des valeurs suivantes : workspace, team, user, source, capability, vendor, model, region.
Réponse (UsageSummary)
{
costUsd: number, // coût total sur la plage
co2Grams: number, // estimation CO₂ totale (grammes CO₂e)
tokensIn: number,
tokensOut: number,
runs: number, // total des appels de capacité
successes: number,
groups: Array<{
key: string, // valeur de la dimension (ex. id d'espace de travail)
costUsd: number,
co2Grams: number,
tokens: number,
runs: number,
}>,
}Série temporelle
Retourne une série jour par jour pour visualiser la consommation dans le temps.
const { data, error } = await getAdminClient().billing.timeseries({
organizationId: "org_abc123",
range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
granularity: "day",
groupBy: "capability", // optionnel
})Requête
| Champ | Type | Requis | Description |
|---|---|---|---|
organizationId | string | Oui | Organisation à interroger |
range.from | string (ISO) | Oui | Début (inclusif) |
range.to | string (ISO) | Oui | Fin (exclusif) |
granularity | "day" | Oui | Seule la granularité journalière est supportée en v1 |
groupBy | UsageDimension | Non | Clé de regroupement supplémentaire par bucket |
Réponse
{
points: Array<{
bucket: string, // jour ISO (YYYY-MM-DD)
costUsd: number,
co2Grams: number,
tokens: number,
runs: number,
}>,
}Top-N
Retourne les N premières clés selon une métrique choisie sur une plage de dates — utile pour identifier les espaces de travail, modèles ou fournisseurs les plus coûteux.
const { data, error } = await getAdminClient().billing.topN({
organizationId: "org_abc123",
range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
dimension: "model",
metric: "cost_usd",
limit: 10,
})Requête
| Champ | Type | Requis | Description |
|---|---|---|---|
organizationId | string | Oui | Organisation à interroger |
range | UsageRange | Oui | Plage de dates |
dimension | UsageDimension | Oui | Ce qu'il faut classer |
metric | UsageMetric | Oui | Selon quoi classer : cost_usd, co2_grams, tokens, runs |
limit | number (1–100) | Oui | Nombre de lignes à retourner |
Réponse
{
rows: Array<{
key: string, // valeur de la dimension
value: number, // total de la métrique
}>,
}Rétrofacturation
Retourne les totaux de coût, CO₂, tokens et exécutions par clé, ainsi que la part du total de l'organisation pour chaque clé. Utilisez ceci pour l'allocation interne des coûts.
const { data, error } = await getAdminClient().billing.chargeback({
organizationId: "org_abc123",
range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
dimension: "workspace",
})Réponse (ChargebackRow[])
Array<{
key: string, // valeur de la dimension (ex. id d'espace de travail)
costUsd: number,
co2Grams: number,
tokens: number,
runs: number,
share: number, // 0..1 — fraction du coût total de l'org
}>Les valeurs de share sur toutes les lignes totalisent approximativement 1. Les événements sans valeur pour la dimension choisie sont regroupés sous "(unattributed)".
Facteurs carbone
Retourne la table complète des facteurs carbone utilisée pour calculer co2Grams sur chaque événement. Destiné aux auditeurs et aux rapports ESG.
const { data, error } = await getAdminClient().billing.carbonFactors({
organizationId: "org_abc123",
})Réponse
{
version: string, // ex. "2026.06.0" — correspond à usage_event.carbon_version
regionFallback: string, // région utilisée quand la région du fournisseur est inconnue
gridGco2PerKwh: Record<string, number>, // gCO₂e par kWh par région
energyWhPer1k: Record<string, number>, // Wh pour 1k tokens/unités par classe de modèle
pue: number, // multiplicateur d'efficacité de l'utilisation de l'énergie
citation: string, // chaîne de provenance pour l'audit
}Méthodologie carbone
Les chiffres CO₂ sont des estimations modélisées, pas des relevés de compteur d'énergie. Présentez-les comme des estimations dans tout rapport externe.
Scrydon estime l'empreinte carbone des capacités IA à l'aide d'un modèle à trois facteurs :
CO₂ (g) = energy_per_1k_units_Wh × (total_tokens_or_units / 1000) × PUE × (grid_gco2_per_kwh / 1000)- Énergie par 1k tokens (Wh) : Regroupée par classe de modèle (
llm_large,llm_small,embedding,stt, etc.) en utilisant des estimations d'énergie par token publiées. Les classes non-token (STT, OCR, image, vidéo) utilisent des dénominateurs par seconde audio, par page ou par image. - PUE (Power-Usage Effectiveness) : Un multiplicateur fixe de 1,12 — une valeur médiane dans la fourchette 1,1–1,2 publiée par les grands hyperscalers.
- Intensité carbone du réseau électrique (gCO₂e/kWh) : Valeurs spécifiques à la région issues de bases de données publiques d'intensité carbone du réseau électrique. Les requêtes sans région d'hébergement connue utilisent la moyenne mondiale en repli (436 gCO₂e/kWh).
La table des facteurs est versionnée (carbon_version). Chaque ligne usage_event enregistre la version en vigueur au moment de l'écriture, de sorte que les totaux historiques restent reproductibles après les mises à jour des facteurs. Récupérez la table courante et sa chaîne de provenance via billing.carbonFactors(...).
Rôle requis
Tous les appels billing.summary, billing.timeseries, billing.topN, billing.chargeback et billing.carbonFactors nécessitent une session administrateur d'organisation pour l'organizationId interrogé. Un membre non-administrateur reçoit une réponse 403 Forbidden.
billing.log est un endpoint M2M interne protégé par la capacité billing:admin. Il est appelé par le runtime de capacité — pas par le code produit ni par les consommateurs du SDK.
Voir aussi
- Administrateurs de plateforme et usurpation d'identité — comment confirmer votre rôle d'administrateur d'org.
- Intégrations — connexion des fournisseurs dont l'utilisation est mesurée ici.
- Conformité — comment la mesure d'utilisation s'applique à l'article 13 de l'EU AI Act et aux exigences d'attestation ESG.