Ce qui n'est pas facturé : codes d'erreur et règles de facturation

Une analyse détaillée des règles de facturation pour les codes d'état HTTP, les erreurs JSON-RPC et la Data API, avec les actions recommandées pour les développeurs.

BlockVectra mesure les requêtes en Compute Units (CU). Les appels JSON-RPC et Data API ne sont facturés qu'après l'obtention d'une réponse. Ce guide résume les règles de détermination de la facturation pour les codes d'état HTTP, les appels JSON-RPC et la Data API, ainsi que les actions recommandées pour les développeurs.

Codes d'état HTTP et règles de facturation

Les règles de détermination de la facturation et de traitement pour les réponses au niveau HTTP sont les suivantes :

Statut HTTPCorps de réponseScénarioFacturé ?Action recommandée
200Réponse JSON-RPC (unique ou batch)Réponse normale ; toutes les erreurs de la couche JSON-RPC (erreur d'analyse, rejet de méthode, échec en amont, erreur du nœud) sont également en 200Évalué par appelInspectez result ou error pour chaque appel ; si une erreur est renvoyée, voir le traitement des erreurs JSON-RPC ci-dessous
204VideTous les appels de la requête sont des notificationsLes notifications sont facturées normalementAucune action supplémentaire requise
400VideMessage HTTP malformé (impossible d'analyser la ligne de requête ou les en-têtes, encodage fractionné invalide), ou plus de 10 s entre deux lectures du corps de la requêteNonVérifiez la syntaxe de la requête HTTP, les en-têtes et la continuité de la transmission
402JSON, -32020Solde insuffisant, quota épuisé ; lorsque le solde est connu, error.data inclut balance_units et balance_cuNonVérifiez votre solde sur la page Facturation de la console ou via GET /v1/topup/deposit-address (MCP get_deposit_address) ; rechargez on-chain vers l'adresse dédiée de votre compte (voir le guide de recharge d'agent)
403VideMéthodes autres que POST ou OPTIONS sur /v1/{chain} ou /v1/{chain}/{api_key} (que le nom de la chaîne soit connu ou non)NonModifiez la méthode de requête HTTP en POST (ou pré-vol cross-origin OPTIONS)
401JSON, -32024 (missing_api_key ou invalid_api_key)Clé manquante sur une chaîne connue, clé inconnue ou désactivéeNonFournissez une clé API active dans l'en-tête x-api-key (les clés flambant neuves ou ayant fait l'objet d'une rotation prennent quelques secondes pour prendre effet ; patientez un instant et réessayez)
404JSON, -32600 (reason = unknown_chain)POST vers une {chain} inconnueNonVérifiez le nom de la chaîne dans l'URL par rapport aux Chaînes prises en charge (doit être le slug exact en minuscules)
404corps videChemin non reconnu (par ex. POST /v1, /v1/, POST /v1/{chain}/)NonIncluez la chaîne dans l'URL (/v1/{chain})
408VideDépassement de 35 s entre la lecture des en-têtes de requête et le renvoi de la réponsePossible : les appels déjà transmis au nœud sont facturés normalement dès que le nœud répondNe réessayez pas sans condition les appels modifiant l'état (par ex. eth_sendRawTransaction) ; une déconnexion du client n'annule pas les appels déjà transmis
413VideCorps de requête > 2 Mio (2 097 152 octets)NonMaintenez le corps de requête sous 2 Mio ; découpez les batches en requêtes plus petites
414 / 431VideURI trop long (414) ou en-têtes de requête trop volumineux (431)NonRaccourcissez l'URI de requête ou réduisez les en-têtes de requête HTTP
429JSON, -32005 ou -32022 ; inclut Retry-After pour les limites de débit (-32005) ; les limites de burst/taille de batch (-32022) ne l'incluent pasSolde du bucket épuisé → -32005 ; les CU d'une requête unique dépassent la capacité de burst → -32022 ; limite de débit d'appels du compte épuisée → -32005 ; le nombre d'appels dans une requête unique dépasse la limite → -32022NonPour -32005 avec Retry-After, attendez le nombre de secondes spécifié avant de réessayer ; pour -32022, découpez la requête ou réduisez la taille du batch (réessayer tel quel ne réussira jamais)
503JSON, -32021, avec Retry-AfterDonnées de facturation temporairement indisponibles ; le serveur rejette temporairement la requête (ce n'est pas un problème de solde, pas besoin de recharger) ; les clés nouvellement créées renvoient ceci jusqu'à ce que les données de facturation se synchronisent (généralement quelques secondes)NonCe n'est pas un problème de solde, pas besoin de recharger ; attendez le nombre de secondes spécifié dans Retry-After et réessayez

Remarque : lors d'un accès via Cloudflare, Cloudflare peut renvoyer des pages d'erreur 52x ou 1015 ; celles-ci ne sont pas générées par le service.

En-têtes de réponse pour la facturation et le solde : lors de l'envoi de x-bv-meter: 1 sur les requêtes HTTP (applicable à la fois au JSON-RPC et à la Data API), une réponse qui a facturé au moins un appel renvoie x-bv-cu-charged (les Compute Units facturées pour cette requête, ou la somme des appels facturés d'un batch) et x-bv-balance-units (les unités de solde restantes du compte immédiatement après cette imputation, négatives en cas de découvert ; omises si le solde est inconnu). Les requêtes sans x-bv-meter: 1, les réponses où rien n'a été facturé, ainsi que les réponses d'erreur 402, 403, 429 ou 503 omettent ces deux en-têtes. Ces en-têtes de réponse sont accessibles aux scripts de navigateur via CORS, tandis que WebSocket ne les utilise pas. Le solde soustrait l'utilisation totale non réglée arrondie au supérieur une fois aux unités entières ; le règlement horaire arrondit à l'inférieur, de sorte que le solde indiqué peut augmenter jusqu'à une unité après le règlement.

Codes d'erreur JSON-RPC et règles de facturation

Le même code d'erreur peut provenir de la plateforme ou du nœud, et la facturation diffère :

  • Erreurs générées par la plateforme elle-même : jamais facturées ;
  • Erreurs renvoyées par le nœud : transmises telles quelles et facturées au poids de la méthode, avec pour seules exceptions les codes d'erreur de nœud énumérés ci-dessous.

Détails des règles

  • Erreurs de nœud non facturées : les codes du nœud -32002 (expiration du délai de batch), -32003 (réponse de batch trop volumineuse) et -32600 (batch rejeté dans son ensemble) indiquent que le nœud a abandonné l'appel prématurément ; ces appels ainsi que toutes les notifications du même batch ne sont pas facturés. Les erreurs de nœud -32601 (méthode exposée non implémentée) et -32603 (défaillance interne du nœud) ne sont pas facturées sur HTTP ou WebSocket et n'affectent pas les autres appels ou notifications du batch. De plus, 4444 (bloc élagué) et -32000 (état historique en dehors de la fenêtre d'historique d'état du nœud, définie par state_window_blocks dans GET /v1/chains) ne sont pas facturés et n'affectent pas les autres appels du batch.
  • Erreurs de nœud facturées : les autres erreurs renvoyées par le nœud sont facturées au poids de la méthode lorsqu'elles rapportent le résultat de la chaîne, telles que execution reverted (-32000 ou 3 avec data), le -32602 invalid argument propre au nœud.
  • Admission de solde et synchronisation : -32020 indique un solde de compte insuffisant et nécessite une recharge ; lorsque le solde est connu, error.data.balance_units et error.data.balance_cu indiquent ce qu'il reste (cela peut être négatif). Une clé nouvellement créée peut renvoyer -32021 (503) pendant quelques secondes ; attendez Retry-After et réessayez.
  • Échecs en amont : un code -32603 généré par la plateforme en raison d'une défaillance de communication en amont ou d'une réponse malformée (upstream unavailable, no response from upstream, malformed upstream response) contient data.reason: upstream_unavailable.
  • Facturation des notifications : les notifications (204) sont facturées au poids de leur méthode.

Tableau des codes d'erreur JSON-RPC

CodeSourceHTTPMessageMotifFacturé ?Action recommandée
-32700BlockVectra200parse error-Non (coûte 1 jeton de limite de débit en CU)Corrigez la syntaxe JSON de la requête
-32600BlockVectra200invalid requestinvalid_requestNon (coûte 1 jeton de limite de débit en CU)Corrigez la syntaxe et la structure de la requête JSON-RPC
-32600BlockVectra200batch too large: max <N> callsbatch_too_large (+max)NonDécoupez le batch en appels sous la limite (la limite standard de batch est de 100)
-32600BlockVectra200invalid request: ambiguous member nameinvalid_requestNonSupprimez les noms de membres dupliqués ou ambigus dans les objets JSON
-32601BlockVectra200method not available: <method>-NonAppelez uniquement les méthodes autorisées pour cette chaîne (voir les Chaînes prises en charge)
-32600BlockVectra404unknown chainunknown_chainNonVérifiez le nom de la chaîne dans l'URL
-32602BlockVectra200eth_getLogs block range too large: max <N> blocks-NonRéduisez la plage de blocs de eth_getLogs (limite définie par chaîne, par ex. 1000 blocs)
-32602BlockVectra200tracer not allowed-NonUtilisez un traceur natif autorisé (callTracer, flatCallTracer, prestateTracer, 4byteTracer, noopTracer, ou omettez-le)
-32602BlockVectra200trace timeout not allowed-NonDéfinissez une chaîne de durée Go valide avec un délai d'expiration ≤ 30s
-32010BlockVectra200node is syncing; calls are temporarily unavailable-NonLe nœud est en cours de synchronisation, réessayez plus tard (sauf pour eth_chainId)
-32011BlockVectra200historical state is not available beyond the most recent <N> blocks-NonInterrogez un bloc plus récent (le bloc cible doit être dans la fenêtre d'état ; évitez les balises safe/finalized/earliest)
-32000BlockVectra200transaction not foundnot_foundNonVérifiez le hash de transaction (0x + 64 caractères hexadécimaux)
-32000BlockVectra200block not foundnot_foundNonVérifiez le hash ou le numéro de bloc
-32000BlockVectra200upstream response too largeresponse_too_largeNonRéduisez la portée de la requête ou découpez les requêtes
-32005BlockVectra200-overloadedNonServeur temporairement surchargé, réessayez plus tard
-32005BlockVectra429rate limit exceededkey_rate_limit / free_plan_call_limit / concurrency_limitNonRéduisez la fréquence des requêtes ; respectez Retry-After lorsqu'il est présent
-32022BlockVectra429request cost <N> CU exceeds burst capacity <M> CUrequest_exceeds_burstNonDécoupez la requête ou le batch pour que les CU d'une requête unique soient inférieurs à la capacité de burst
-32022BlockVectra429request has <N> calls, exceeding the free-plan limit of <M> calls per secondfree_plan_batch_too_large (+max)NonDécoupez le batch pour rester sous la limite par seconde, ou passez à un forfait payant
-32603BlockVectra200upstream unavailableupstream_unavailableNonÉchec de communication en amont, réessayez plus tard
-32603BlockVectra200no response from upstreamupstream_unavailableNonL'amont n'a pas répondu, réessayez plus tard
-32603BlockVectra200malformed upstream responseupstream_unavailableNonRéponse en amont malformée, réessayez plus tard
-32603BlockVectra200--NonErreur interne rare, réessayez plus tard
-32020BlockVectra402insufficient balancebalance_exhausted / free_grant_exhausted (+topup_url, et +balance_units / balance_cu quand le solde est connu)NonVérifiez votre solde sur la page Facturation de la console ou via GET /v1/topup/deposit-address (MCP get_deposit_address) ; rechargez on-chain vers l'adresse dédiée de votre compte (voir le guide de recharge d'agent)
-32021BlockVectra503billing data temporarily unavailable-NonDonnées de facturation en cours de synchronisation (ce n'est pas un problème de solde) ; attendez le nombre de secondes spécifié dans Retry-After et réessayez
4444Nœud200pruned history unavailable-NonLe bloc demandé a été élagué par le nœud ; non facturé ; n'affecte pas le batch
-32000Nœud200historical state ... is not available-NonEn dehors de la fenêtre d'historique d'état du nœud ; non facturé ; n'affecte pas le batch
-32000Nœud200old data not available due to pruning...-NonEn dehors de la fenêtre d'historique du nœud (fenêtre déterminée par state_window_blocks) ; non facturé ; n'affecte pas le batch
-32002Nœud200<message du nœud>-NonLe nœud a expiré sur le batch et a abandonné l'appel ; non facturé ; les notifications du batch ne sont pas non plus facturées
-32003Nœud200<message du nœud>-NonRéponse de batch du nœud trop volumineuse et abandonnée ; non facturé ; les notifications du batch ne sont pas non plus facturées
-32601Nœud200<message du nœud>-NonLa méthode exposée n'est pas implémentée par le nœud ; utilisez une autre méthode prise en charge
-32603Nœud200<message du nœud>-NonDéfaillance interne du nœud ; réessayez avec un délai d'attente progressif
-32600Nœud200<message du nœud>-NonBatch entier rejeté par le nœud ; non facturé ; les notifications du batch ne sont pas non plus facturées
AutreNœud200<message du nœud>-Oui (poids de la méthode)Résultat de la chaîne (par ex. execution reverted, -32602 du nœud) ; vérifiez les paramètres d'appel du contrat

Règles de facturation de la Data API

La Data API encapsule les données de chaîne en lecture seule dans des points de terminaison REST. Sa facturation et sa gestion des erreurs suivent ces règles :

Détails des règles

  • Seules les réponses 2xx réussies sont facturées.
  • Les opérations indisponibles en dehors de la couverture (telles que les chaînes non prises en charge ou les blocs hors de la couverture des traces) renvoient HTTP 422 no_coverage, qui n'est pas facturé mais compte dans les limites de débit.
  • Les réponses HTTP 401, 402, 404 et 429 ne sont pas facturées. Pour les en-têtes de réponse (x-bv-meter: 1), voir les Codes d'état HTTP et règles de facturation.

Tableau des codes d'état de la Data API

Statut HTTPCode d'erreur / ScénarioFacturé ?Action recommandée
200Réponse de données réussieOui (poids en CU de l'opération Data API)Analysez data, meta et next_cursor dans l'enveloppe de réponse
400Paramètres de requête malformés ou champs requis manquantsNonVérifiez et corrigez les paramètres d'URL ou de corps
402Solde épuisé (error.code: "insufficient_balance", inclut balance_units et balance_cu quand le solde est connu)NonVérifiez votre solde sur la page Facturation de la console ou via GET /v1/topup/deposit-address (MCP get_deposit_address) ; rechargez on-chain vers l'adresse dédiée de votre compte (voir le guide de recharge d'agent)
401Clé API manquante, inconnue ou désactivée (error.code: "missing_api_key" ou "invalid_api_key")NonTransmettez une clé API active dans l'en-tête x-api-key
404Chaîne inconnue ou non publique (error.code: "not_found"), ou l'objet demandé n'existe pasNonVérifiez le slug de la chaîne dans l'URL (doit être en minuscules exactes) et le chemin de requête
409Le bloc ou la fenêtre demandée est supérieur(e) à la hauteur actuellement indexée (error.code: "not_indexed_yet", inclut indexed_through)NonInterrogez les blocs jusqu'à indexed_through ou réessayez plus tard
422Opération spécifique à la chaîne indisponible (par ex. chaîne non prise en charge ou hors de la couverture des traces, error.code: "no_coverage")Non (compte dans les limites de débit)Vérifiez les fonctionnalités prises en charge via GET /v1/status (data_features gratuit et sans clé)
429Limite de débit dépassée (error.code: "rate_limited"), ou une requête unique coûte plus que la capacité de burst de la clé (error.code: "cost_exceeds_burst")NonRéduisez la fréquence des requêtes ; découpez les requêtes surdimensionnées (une requête dépassant le burst ne réussira jamais telle qu'envoyée)
503Service de données temporairement indisponible (error.code: "unavailable"), ou la chaîne est occupée (error.code: "gateway_overloaded")NonRéessayez plus tard et respectez Retry-After lorsqu'il est présent

Consulter le solde (GET /v1/account)

Le détenteur d'une clé API peut vérifier le solde et les détails des quotas de la clé directement sans encourir de facturation ni déduire de Compute Units (CU) :

curl -H "x-api-key: $BLOCKVECTRA_API_KEY" https://api.blockvectra.com/v1/account
  • Gratuit et non facturé : GET /v1/account est gratuit. Il n'est jamais facturé, ne déduit pas de CU, et renvoie HTTP 200 avec le solde actuel même lorsqu'il est nul ou négatif (il ne renvoie jamais 402).
  • Authentification : l'authentification par clé utilise exclusivement l'en-tête x-api-key (les clés dans le chemin et les jetons Bearer ne sont pas acceptés). L'absence d'en-tête renvoie 401 missing_api_key ; les clés invalides ou révoquées renvoient 401 invalid_api_key. (Les clés expirées renvoient 403 key_expired ; les indisponibilités temporaires de service renvoient 503 auth_unavailable ou billing_unavailable avec Retry-After.)
  • Limitation de débit : dispose d'une limite indépendante de 5 requêtes par seconde par ID de clé, indépendamment du comptage des CU et de la facturation. Le dépassement de la limite renvoie HTTP 429 rate_limited avec un en-tête Retry-After.

Champs de réponse :

  • key_id : la chaîne d'identification de la clé API.
  • plan : le type de forfait du compte (free lorsque le compte dispose d'un quota de débit d'appels de forfait gratuit ; paid dans le cas contraire).
  • balance_units : le solde restant du compte en unités (peut être nul ou négatif).
  • balance_cu : le solde restant converti en Compute Units (CU).
  • balance_as_of_age_ms : millisecondes écoulées depuis la lecture du solde à partir de sa source de données.
  • key : limites spécifiques à la clé et détails des quotas :
    • cu_per_sec : taux de recharge du token bucket en CU par seconde.
    • burst_cu : capacité de burst du token bucket en CU.
    • cu_cap : plafond total de CU pour cette clé sur sa durée de vie, ou null si non plafonné.
    • cu_cap_remaining : CU restantes sous cu_cap, ou null si non plafonné (peut être nul ou négatif).
    • expires_at : horodatage d'expiration RFC 3339, ou null si la clé n'expire jamais.

Exemple de réponse :

{
  "key_id": "<key_id>",
  "plan": "<plan>",
  "balance_units": <integer>,
  "balance_cu": <integer>,
  "balance_as_of_age_ms": <integer>,
  "key": {
    "cu_per_sec": <integer>,
    "burst_cu": <integer>,
    "cu_cap": <integer_or_null>,
    "cu_cap_remaining": <integer_or_null>,
    "expires_at": "<expires_at_or_null>"
  }
}

Tarifs et passages au forfait supérieur

Le coût spécifique de tous les appels facturés est déterminé par les pondérations en CU publiées :

  • Pour consulter les pondérations de toutes les méthodes et opérations, voir le tableau des pondérations des méthodes et les Règles de mesure des CU JSON-RPC.
  • Pour les tarifs des forfaits et les détails de règlement, voir la page Tarifs.
  • Passage à un forfait payant : effectuer une recharge payante supprime la limite d'appels par seconde du forfait gratuit ; chaque clé reste soumise aux limites de débit et de burst en CU.

Processus de recharge on-chain

Lorsque le solde de votre compte est insuffisant ou que vous avez besoin d'un débit plus élevé, rechargez on-chain dans la console en suivant ces étapes :

  1. Se connecter à la console : connectez-vous à la console BlockVectra.
  2. Accéder à la page Facturation : accédez à la page Facturation.
  3. Obtenir votre adresse dédiée : dans la carte de recharge on-chain, copiez l'adresse de recharge dédiée de votre compte ou scannez le code QR.
  4. Transférer des fonds : transférez uniquement à l'aide des réseaux et USDC / USDT / USDG pris en charge répertoriés sur la page. Les réseaux pris en charge et les montants minimaux de recharge sont affichés dans la console.
  5. Crédit automatique : une fois détectées on-chain, les transactions s'affichent comme « En cours de traitement » ; une fois créditées, les crédits sont automatiquement ajoutés à votre solde.

Remarques importantes :

  • Utilisez uniquement les réseaux et tokens explicitement répertoriés dans la console. Les transferts sur des chaînes non prises en charge ou avec des tokens incorrects ne peuvent pas être crédités automatiquement.
  • Assurez-vous que chaque transfert respecte le montant minimal de recharge indiqué dans la console.
  • Dès que votre première recharge payante est créditée, votre compte passe à un compte payant, supprimant la limite d'appels par seconde du forfait gratuit.

Les programmes d'agents ou de serveurs peuvent appeler directement les points de terminaison de recharge à l'aide d'une clé API ; voir le guide de recharge programmatique d'agent.

Facturation push des Webhooks

Le push dispose de pondérations distinctes pour les événements de données livrés, les requêtes d'historique réussies et les jours-adresses facturables. Les appels de gestion autres que l'historique des événements, les tentatives de distribution échouées, les nouvelles tentatives automatiques et les événements de contrôle sont gratuits. Chaque événement livré est facturé une seule fois ; le rejeu par le client et les événements canoniques relivrés après une réorganisation constituent de nouvelles livraisons facturées. Les frais d'adresse utilisent le nombre maximal d'adresses de chaque abonnement pendant qu'il est en ligne au cours de la journée UTC ; l'allocation d'adresses gratuites du compte est partagée entre les abonnements, les abonnements les plus anciens l'utilisant en premier. Une adresse figurant dans deux abonnements est comptée deux fois ; l'ajout de chaînes modifie les frais d'événements, pas les frais d'adresse.

Consultez le guide de la Webhook API blockchain pour la configuration, la vérification de signature et la reprise de distribution. Le guide des paiements en stablecoins couvre la validation des reçus et le rattrapage par interrogation ; les abonnements WebSocket utilisent leur propre mesure de connexion et de notification. Les erreurs de requête sont répertoriées dans la référence des erreurs. Les pondérations ci-dessous proviennent de GET /v1/plans.

UtilisationUnité de facturationCU
push.address_dayAdresse-jour facturable33
push.historyRequête d'historique réussie25
push.logÉvénement de données distribué150
push.native_transferÉvénement de données distribué150
push.token_transferÉvénement de données distribué150

Adresses gratuites par compte et par jour UTC : 1000

Quota d'adresses gratuites par compte et par jour UTC, partagé par tous les groupes d'abonnement quel que soit le forfait. Pour chaque groupe, comptabilisez son nombre maximal d'adresses en ligne au cours de cette journée ; allouez le quota par ordre croissant d'identifiant de groupe. La même adresse dans deux groupes compte deux fois ; le nombre de chaînes dans un groupe ne multiplie pas son nombre d'adresses. Un groupe hors ligne ou supprimé pendant toute la journée ne contribue en rien. Pour chaque groupe, le décompte restant après sa part du quota est multiplié par le poids en CU de `push.address_day` dans `method_weights`. Le quota configuré actuel provient de la même politique tarifaire que celle utilisée pour la facturation adresse-jour ; il ne s'agit pas d'une limite de capacité du compte ni d'un quota distinct par groupe.

Exemple : 10 événements native.transfer distribués, 2 requêtes d'historique réussies et 10 adresses-jours facturables coûtent 10 × 150 + 2 × 25 + 10 × 33 = 1880 CU. Les adresses-jours facturables sont décomptées après le quota d'adresses gratuites du compte.

Prochaines étapes

Dernière mise à jour :

Sur cette page