Référence API

Erreurs

Chaque erreur renvoyée par l'API ACTA utilise une enveloppe JSON unique avec un code stable et lisible par machine. Branchez votre logique sur error, jamais sur message.

Enveloppe d'erreur

json
{
  "error": "machine_readable_code",
  "message": "Human readable description",
  "details": { "optional": "context" },
  "request_id": "..."
}
  • error (toujours) : code stable sur lequel brancher votre logique.
  • message (généralement) : description lisible ; la formulation peut changer entre les versions.
  • details (parfois) : contexte structuré, par exemple { "path", "method" } sur 404 not_found.
  • request_id (toujours) : identifiant de corrélation ; incluez-le dans vos demandes de support. Les réponses 5xx portent aussi un trace_id.
  • retry_after (sur 429) : secondes à attendre, reflétées dans l'en-tête Retry-After.

Les chemins inconnus renvoient 404 not_found ; les exceptions non gérées renvoient 500 internal_error sans divulguer d'informations internes.

Codes de statut HTTP

StatutSignification
200 / 201Succès (201 pour les submits et la création de clés)
400Paramètres invalides ou requête malformée
401API key manquante, invalide ou expirée
403Rôle ou propriété non autorisés, ou origine interdite
404Ressource ou route introuvable
409Conflit (existe déjà / déjà révoqué / état obsolète)
410Disparu (coffre révoqué)
413Charge utile ou champ trop volumineux
429Rate limit dépassé
500Erreur interne (porte un trace_id)
503Dépendance indisponible (par exemple rate limiter, contrat non initialisé)

Authentification et autorisation

CodeStatutSignification et quoi essayer
401 (clé manquante/invalide)401Pas d'en-tête X-ACTA-Key, clé inconnue ou clé expirée. Essayez : créez une clé (voir ) et envoyez-la sur chaque requête /contracts/*.
forbidden_origin403POST /public/api-keys appelé depuis une origine non autorisée. Essayez : créez les clés depuis la dApp.
network_mismatch400metadata.network ne correspond pas au réseau de l'URL de base. Essayez : alignez le corps sur l'hôte que vous appelez.
Violation de propriété403Sur issue, batch-issue, list-vc-ids, get-vc et push, l'owner / le fromOwner doit être égal au wallet lié à votre API key (clés admin exemptées). Essayez : utilisez la clé créée pour ce wallet.

Erreurs de validation

Renvoyées en 400 avec un code propre au champ :

CodeSignification
owner_required / owner_invalidPropriétaire de coffre manquant ou malformé (G...)
issuer_required / issuer_invalidAdresse d'émetteur manquante ou malformée
vcId_requiredIdentifiant de credential manquant (max 64 caractères)
vcData_requiredCharge utile de credential manquante (max 10 000 caractères)
userSalt_invalidLe sel doit être 32 octets en hexadécimal (64 caractères hex)
vaultContract_invalidDoit être un identifiant de contrat C... valide
limit_too_largelimit de pagination au-dessus de 200
batch_empty / batch_too_largeLe lot doit contenir de 1 à 5 credentials
vcs[i].vcId_too_long / vcs[i].vcData_too_longUne entrée du lot dépasse les plafonds de champ
payload_too_largeCorps de requête au-dessus de la limite (413)

Erreurs de DID émetteur

La famille complète (issuerDid_required, issuerDid_invalid, issuerDid_unresolvable, issuerDid_controller_mismatch, issuerDid_network_mismatch, issuerDid_deactivated, issuerDid_registry_unavailable) est documentée avec des remèdes dans , et le contexte did:stellar se trouve dans la .

Rate limiting

Les requêtes sont limitées par API key sur une fenêtre glissante de 60 secondes, avec des compartiments de lecture et d'écriture séparés selon le rôle (voir l' pour le tableau).

CodeStatutNotes
rate_limit_exceeded429Compartiment de lecture épuisé ; attendez Retry-After secondes
write_rate_limit_exceeded429Compartiment d'écriture épuisé
rate_limit_unavailable503Le backend du rate limiter est hors service ; réessayez plus tard

Surveillez les en-têtes X-RateLimit-* et X-WriteRateLimit-* pour cadencer vos clients de manière proactive.

Erreurs Prepare/Submit

CodeStatutSignification et quoi essayer
signed_xdr_invalid400Le signedXdr soumis ne peut pas être analysé. Essayez : signez exactement le xdr renvoyé par prepare, avec la passphrase réseau renvoyée.
simulation_error400La simulation Soroban a échoué pendant la préparation ; le message inclut la raison on-chain (souvent une erreur de contrat, voir ci-dessous).
tx_submit_error500La soumission au réseau a échoué. Essayez : réessayez avec la même Idempotency-Key.

Erreurs de contrat via HTTP

Lorsqu'un contrat Soroban rejette l'opération, l'API mappe Error(Contract, #N) vers un code stable et un statut HTTP approprié :

CodeStatutCause on-chain
vault_already_exists409Coffre déjà déployé pour ce propriétaire + sel
vault_revoked410Le coffre a été révoqué ; écritures bloquées
vault_not_initialized404Pas encore de coffre pour ce propriétaire
vc_not_found404Aucun credential avec ce vcId
vc_already_exists409vcId déjà utilisé dans ce coffre
vc_already_revoked409Le credential est déjà révoqué
issuer_not_authorized403L'émetteur est bloqué (denied) pour ce coffre
invalid_vault_contract400vaultContract ne correspond pas au coffre appelé
vault_full409Le coffre a atteint son maximum de credentials actifs
input_too_long413Un champ dépasse son plafond on-chain
batch_too_large / batch_empty400Taille de lot hors de la plage 1 à 5
issuer_list_too_long400La liste des émetteurs bloqués est pleine (1 000)
fee_out_of_bounds400Le total des frais du lot a débordé
contract_not_initialized503État du contrat manquant ; vérifiez le réseau
no_pending_admin404Acceptation d'admin sans nomination en attente

Pour la sémantique on-chain sous-jacente (et les échecs de frais USDC/XLM comme les trustlines manquantes), voir .

Nouvelles tentatives idempotentes

Les routes d'écriture de contrat acceptent un en-tête Idempotency-Key (jusqu'à 200 caractères). La première réponse pour une clé est mise en cache pendant 24 heures ; les nouvelles tentatives la rejouent avec l'en-tête Idempotency-Replayed: true. Utilisez-le pour sécuriser les nouvelles tentatives de submit après des timeouts ou un tx_submit_error.