Crédits et consommation

Comment les appels de la Direct API sont facturés, régularisés et remboursés, comment obtenir un devis avant de lancer un travail, et comment lire les dépenses et le registre de votre clé.

La Direct API facture des crédits Morphic sur le solde de votre organisation, la même réserve que celle utilisée par Studio, et chaque réponse en indique le nombre.

  • Les appels de la Direct API sont facturés aux tarifs API de votre organisation, qui peuvent différer du coût du même travail dans Studio. Tous les chiffres que l’API vous fournit en tiennent déjà compte : les devis plan_media, estimated_credits, le bloc billing, les lectures de génération, les webhooks et /usage.
  • Les tarifs sont fixés par organisation et ne sont pas publiés. Votre contact Morphic peut vous transmettre votre grille tarifaire API.
  • Un changement de tarif s’applique aux générations lancées après celui-ci ; une génération en cours est régularisée au tarif en vigueur à son lancement.
  • Dans Studio, sous « Paramètres » > « Crédits », les dépenses API apparaissent sur leur propre ligne, « API », à côté de vos membres, et « Répartir l’API par clé » les détaille clé par clé. Elles sont prélevées sur les crédits de l’organisation, jamais sur l’allocation d’un membre, et les limites de crédits de chaque clé les plafonnent.

Comment une génération est facturée

  1. Au lancement, la génération est facturée à son prix de devis. La réponse de lancement l’indique dans billing.credits_charged et result.estimated_credits.
  2. Certains résultats sont facturés selon ce qui est réellement produit : la voix et la musique selon la durée produite, les rendus de timeline selon le temps de calcul. Ils portent credits_settle_on_output_duration: true ; le montant facturé au lancement est un plancher, et le montant final est régularisé à la fin de la génération.
  3. Une génération qui se termine en failed ou cancelled est intégralement remboursée, et billing.credits_refunded indique les crédits rendus. Une génération réussie peut aussi faire l’objet d’un remboursement partiel, par exemple lorsqu’un résultat régularisé est plus court que ce que couvrait le montant facturé au lancement.
  4. Une fois la génération finale, billing.credits_charged est le total net inscrit au registre (montant du lancement, plus ou moins la régularisation, moins credits_refunded) et credits_are_final vaut true. Une génération en échec ou annulée se termine avec credits_charged: 0 et un credits_refunded égal à ce qui avait été facturé.
ChampSignification
estimated_creditsle prix du devis, facturé au lancement
credits_chargedles crédits nets enregistrés pour cette génération jusqu’ici, après régularisation et remboursements
credits_refundedtous les crédits rendus pour cette génération : la totalité du montant facturé en cas de failed ou cancelled, tout remboursement partiel sur une génération réussie ; 0 s’il n’y en a aucun, jamais négatif
credits_are_finalfalse tant que la génération est en cours ou qu’une régularisation ou un remboursement reste à venir ; true une fois que plus rien ne le modifiera
credits_settle_on_output_durationtrue lorsque le montant facturé au lancement est un plancher régularisé d’après le résultat produit

Pendant qu’une génération est en cours, credits_charged est égal au montant facturé au lancement. Relisez-la une fois finale pour obtenir le montant régularisé ; un webhook n’est envoyé qu’à ce moment-là.

Facturation dans chaque réponse

Le bloc billing de la réponse à un appel indique ce que l’appel a facturé au moment où il a répondu ; Appeler un outil le détaille par type d’appel. Les remboursements interviennent plus tard : ils apparaissent donc sur la génération (GET /generations/{id} et /usage), jamais dans la réponse d’origine.

  • Un outil payant qui répond pendant l’appel et dont le travail échoue, comme analyze_video, répond avec credits_charged: 0 et credits_refunded égal au remboursement.
  • L’en-tête Morphic-Credits-Charged: <integer> porte le même nombre que billing.credits_charged, sauf lors d’une relecture idempotente, qui ne facture rien de plus et envoie 0 alors que son corps reprend le montant d’origine.

Obtenir un devis avant de dépenser

POST /v1/direct/tools/plan_media valide un plan de 20 étapes au plus et chiffre les étapes qu’il peut chiffrer, sans rien lancer ni facturer.

curl -s https://mcp.morphic.com/v1/direct/tools/plan_media \
  -H "Authorization: Bearer $MORPHIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "input": {
          "steps": [
            { "id": "still", "tool_name": "generate_image", "arguments_json": "{\"prompt\":\"A red vintage bicycle\",\"aspect_ratio\":\"16:9\"}" },
            { "id": "clip", "tool_name": "generate_video", "arguments_json": "{\"prompt\":\"The bicycle rolls away\",\"duration_seconds\":8}", "depends_on": ["still"] }
          ]
        }
      }'
  • Omettez les champs d’asset dont les résultats n’existent pas encore, et indiquez dans depends_on l’étape dont ils proviennent.
  • Chaque étape reçoit sa validation, son quote_status et ses estimated_credits.
  • Le résultat fournit aussi execution_order, known_estimated_credits, unquoted_step_ids et complete_estimate. Lorsque complete_estimate vaut false, la somme est un minimum, pas un budget.

Clé et solde

GET /v1/direct/me renvoie la clé appelante, ses limites et ses dépenses, ainsi que le solde de l’organisation. Toutes les clés peuvent l’appeler.

curl -s https://mcp.morphic.com/v1/direct/me \
  -H "Authorization: Bearer $MORPHIC_API_KEY"
{
  "api_key": {
    "id": "01928e00-…",
    "name": "Order pipeline (prod)",
    "scopes": ["assets:read", "assets:write", "generations:write", "projects:read"],
    "expires_at": null,
    "credit_limits": {
      "total":   { "limit": 500000, "used": 182340, "remaining": 317660 },
      "monthly": { "limit": 100000, "used": 41200,  "remaining": 58800, "resets_at": "2026-11-01T00:00:00.000Z" },
      "daily":   { "limit": null,   "used": 2310,   "remaining": null,  "resets_at": "2026-10-26T00:00:00.000Z" }
    }
  },
  "organization": {
    "id": "01928d00-…",
    "plan": "enterprise",
    "remaining_credits": 1240000,
    "unlimited": false
  }
}

Registre de consommation

GET /v1/direct/usage (autorisation assets:read) renvoie chaque écriture du registre causée par la clé, pour le rapprochement avec vos propres données.

ParamètreSignification
from, tobornes ISO 8601 sur created_at ; par défaut les 30 derniers jours, 92 jours au plus
generation_iduniquement les écritures d’une génération
limitde 1 à 200, 50 par défaut
cursorle next_cursor de la page précédente
curl -s "https://mcp.morphic.com/v1/direct/usage?from=2026-10-01T00:00:00Z&limit=200" \
  -H "Authorization: Bearer $MORPHIC_API_KEY"
{
  "usage": [
    { "id": "0192a7b3-…", "created_at": "2026-10-25T09:14:03.500Z", "kind": "charge",     "credits": 120, "generation_id": "0192a7b3-a1c4-…", "tool": "generate_video", "model_id": "mdl_7rk2pq9vxa4m", "metadata": { "order_id": "4411" } },
    { "id": "0192a7b4-…", "created_at": "2026-10-25T09:15:41.950Z", "kind": "settlement", "credits": -24, "generation_id": "0192a7b3-a1c4-…", "tool": "generate_video", "model_id": "mdl_7rk2pq9vxa4m", "metadata": { "order_id": "4411" } }
  ],
  "totals": { "charged": 120, "settled": -24, "refunded": 0, "net": 96 },
  "next_cursor": null
}
  • kind vaut charge, settlement ou refund ; une valeur credits négative rend des crédits.
  • totals couvre toute la plage filtrée, pas seulement la page.
  • Un outil qui répond pendant l’appel (analyze_video, analyze_audio, filmlab_edit) ne lance aucune génération : ses écritures portent donc generation_id: null et se distinguent par tool.

Si vous rencontrez le moindre problème ou si vous avez des questions, n’hésitez pas à nous contacter. Nous serons ravis de vous aider. Écrivez-nous à support@morphic.com.

Sur cette page