Skip to main content

Panoramica

Quando una richiesta non va a buon fine, l’API Dodo Payments restituisce un codice di stato HTTP e un corpo JSON che identifica l’errore. Usa questa pagina per scoprire cosa ha causato un errore e come risolverlo. Ogni risposta di errore include:
  • Un codice di stato HTTP che indica la categoria generale dell’errore.
  • Un code che identifica l’errore esatto, ad esempio UNSUPPORTED_COUNTRY.
  • Un message che spiega l’errore in linguaggio semplice. L’message può essere null, ad esempio per gli errori interni del server.
Basa la gestione degli errori su code, non su message. Diversi codici restituiscono più di un messaggio, a seconda della causa. Usa questi codici di errore per:
  • Eseguire il debug dei problemi di integrazione.
  • Gestire correttamente gli errori nella tua applicazione.
  • Mostrare ai clienti un feedback significativo.
  • Mantenere affidabile l’elaborazione dei pagamenti.
Questi sono errori API e di logica di business. Per i motivi dei rifiuti delle carte restituiti per un pagamento non riuscito (come INSUFFICIENT_FUNDS o CARD_DECLINED), consulta invece il riferimento Transaction Failures.

Codici di errore API standard

L’API usa questi codici di stato HTTP per gli errori:

Formato della risposta di errore

Il corpo di una risposta di errore contiene due campi, code e message:

Riferimento dei codici di errore

I codici di errore riportati di seguito sono raggruppati in base all’area dell’API a cui si riferiscono. Ogni voce elenca la condizione che attiva l’errore e il messaggio restituito dall’API. I placeholder come {id} rappresentano valori compilati dall’API.

Autenticazione e account

  • UNAUTHORIZED
    • Trigger: La richiesta non contiene una chiave API o ne contiene una non valida (HTTP 401), oppure la chiave API non dispone del ruolo richiesto dall’azione (HTTP 403)
    • Messaggio: Non sei autorizzato a eseguire questa azione
  • MERCHANT_NOT_LIVE
    • Trigger: Una richiesta in modalità live per un’azienda che non ha abilitato i pagamenti live (HTTP 403). Questo include un’azienda che ha usato solo la modalità test e un’azienda i cui pagamenti live non sono ancora abilitati perché la verifica non è completa. Le richieste in modalità test non sono interessate.
    • Messaggio: Pagamenti live non abilitati per il merchant
  • BUSINESS_ARCHIVED
    • Trigger: Qualsiasi richiesta rivolta al cliente per un’azienda archiviata (HTTP 403). Include il checkout, i link di pagamento, lo storefront, il Customer Portal e l’attivazione delle chiavi di licenza.
    • Messaggio: Questa azienda è archiviata e non accetta più richieste

Pagamenti e checkout

  • CHECKOUT_SESSION_CONSUMED
    • Trigger: La sessione di checkout ha già generato un pagamento (HTTP 403). Crea invece una nuova sessione di checkout.
    • Messaggio: È già stato generato un pagamento con la sessione di checkout indicata.
  • MANUAL_RETRY_ALREADY_PAID
    • Trigger: Nuovo tentativo manuale di una fattura di rinnovo per la quale un pagamento è già riuscito. Un nuovo invio addebiterebbe due volte il cliente.
    • Messaggio: Un pagamento per questa fattura è già riuscito
  • MANUAL_RETRY_HARD_DECLINE
    • Trigger: Nuovo tentativo manuale quando l’ultimo errore sulla fattura è un rifiuto definitivo o non contiene un codice di errore classificato. Un altro addebito sulla stessa carta non può riuscire, quindi aggiorna il metodo di pagamento.
    • Messaggio: L’ultimo pagamento di questa fattura è stato rifiutato definitivamente, quindi il nuovo tentativo non può riuscire (oppure) L’ultimo errore di questa fattura non può essere classificato, quindi non è possibile ripetere il tentativo
  • MANUAL_RETRY_IN_FLIGHT
    • Trigger: Nuovo tentativo manuale mentre un pagamento sulla fattura è processing o non ha ancora uno stato registrato. Attendi l’esito di quel pagamento invece di inviarlo nuovamente.
    • Messaggio: Un pagamento per questa fattura è ancora in corso
  • MANUAL_RETRY_LIMIT_REACHED
    • Trigger: Nuovo tentativo manuale dopo aver esaurito tutti e 3 gli invii della fattura o prima che sia trascorso il periodo di attesa (HTTP 429). Il secondo invio attende 1 ora dopo il primo e il terzo attende 3 ore dopo il secondo. Il corpo contiene solo code e message. Per sapere quando è consentito il prossimo invio, leggi retry_available_at da GET /payments/{payment_id}/retry.
    • Messaggio: Sono stati utilizzati tutti i tentativi manuali per questa fattura (oppure) Riprova ora non è ancora disponibile per questa fattura
  • NO_ELIGIBLE_PAYMENT_METHODS
    • Trigger: Dopo il filtraggio non è disponibile alcun metodo di pagamento per il pagamento (HTTP 422)
    • Messaggio: Non sono stati trovati metodi di pagamento idonei
  • PAYMENT_NOT_PERMITTED
    • Trigger: Un checkout o un tentativo di pagamento effettuato da un cliente presente nella blocklist del merchant (HTTP 403). Il codice e il messaggio non indicano volutamente alcuna causa.
    • Messaggio: Questo pagamento non può essere elaborato.
  • PAYMENT_NOT_RETRYABLE
    • Trigger: Nuovo tentativo manuale di un pagamento non coperto dai nuovi tentativi manuali. Il pagamento non ha una fattura, la fattura non è un rinnovo di abbonamento aperto, nessun pagamento sulla fattura è ancora fallito, l’abbonamento non ha una fatturazione ricorrente configurata (ad esempio, un abbonamento on-demand) oppure il cliente è nella blocklist.
    • Messaggio: Varia in base al motivo, ad esempio: È possibile ripetere il tentativo solo per i pagamenti dei rinnovi di abbonamento
  • PAYMENT_NOT_SUCCEEDED
    • Trigger: Un tentativo di rimborsare o elaborare un pagamento che non è riuscito
    • Messaggio: Il pagamento fornito non è riuscito
  • PREVIOUS_PAYMENT_PENDING
    • Trigger: Un tentativo di creare un addebito mentre il pagamento precedente si trova in uno stato non terminale. Restituito anche per un nuovo tentativo manuale quando il pagamento più recente sulla fattura non è né failed né in corso, ad esempio requires_customer_action o cancelled.
    • Messaggio: Impossibile creare un nuovo addebito perché il pagamento precedente non è ancora riuscito (oppure) Il pagamento più recente su questa fattura non è fallito
  • UNSUCCESSFUL_PAYMENT_ID
    • Trigger: L’ID del pagamento fa riferimento a un pagamento che non è riuscito
    • Messaggio: L’ID del pagamento ha uno stato non riuscito.

Connettori e BYOP

Questi errori riguardano i connettori di pagamento di proprietà del merchant (Bring Your Own Processor o BYOP).
  • BYOP_CONNECTOR_DISABLED
    • Trigger: Aggiornamento del metodo di pagamento di un abbonamento instradato tramite un connettore BYOP disabilitato. Dodo Payments non utilizza i propri connettori come fallback, quindi riabilita prima il connettore.
    • Messaggio: L’abbonamento è instradato tramite il connettore del merchant (BYOP), attualmente disabilitato
  • BYOP_CUSTOM_INVOICE_ADDRESS_MISSING
    • Trigger: Un pagamento instradato tramite il connettore del merchant (BYOP) non ha un indirizzo di fatturazione personalizzato
    • Messaggio: L’indirizzo di fatturazione personalizzato BYOP è obbligatorio quando un pagamento è instradato tramite il connettore del merchant
  • CONNECTOR_LABEL_ALREADY_EXISTS
    • Trigger: Creazione di un connettore con un’etichetta già esistente
    • Messaggio: Esiste già un connettore con questa etichetta. Scegli un’etichetta diversa.

Rimborsi

  • EXISTING_REFUND_REQUEST_PROCESSING
    • Trigger: Una richiesta di rimborso precedente è ancora in fase di elaborazione
    • Messaggio: È ancora in fase di elaborazione una richiesta di rimborso con stato “Pending”
  • LINE_ITEM_FULLY_REFUNDED
    • Trigger: Un tentativo di rimborsare una voce già completamente rimborsata
    • Messaggio: La voce {id} è stata completamente rimborsata e non può essere rimborsata ulteriormente.
  • LINE_ITEM_NOT_FOUND
    • Trigger: L’ID dell’articolo non fa parte del pagamento indicato
    • Messaggio: Voce {id} non trovata nel pagamento
  • LINE_ITEM_PRORATED
    • Trigger: Un rimborso o aggiornamento tentato su una voce con importo ripartito
    • Messaggio: La voce {id} non può essere rimborsata perché il suo importo è ripartito
  • LINE_ITEM_REFUND_AMOUNT_TOO_HIGH
    • Trigger: L’importo del rimborso, incluse le imposte, è superiore all’importo pagato
    • Messaggio: L’importo del rimborso richiesto per la voce {id}, incluse le imposte, è {amount}, superiore all’importo pagato {amount}
  • LINE_ITEM_REFUND_AMOUNT_TOO_LOW
    • Trigger: L’importo del rimborso è inferiore alla soglia minima
    • Messaggio: L’importo del rimborso richiesto per la voce {id} è {amount}, un valore troppo basso
  • NOTHING_TO_REFUND
    • Trigger: Non rimane alcun importo rimborsabile perché tutte le voci positive sono già state completamente rimborsate
    • Messaggio: Non rimane alcun importo rimborsabile. Tutte le voci positive sono state completamente rimborsate.
  • PARTIAL_REFUND_NOT_ALLOWED
    • Trigger: Un rimborso parziale tentato con un metodo di pagamento che supporta solo rimborsi completi
    • Messaggio: I rimborsi parziali non sono consentiti per questo metodo di pagamento
  • PAYMENT_ALREADY_REFUNDED
    • Trigger: Un rimborso duplicato
    • Messaggio: Questo pagamento è già stato rimborsato
  • PAYMENT_HAS_BEEN_REFUNDED
    • Trigger: Il pagamento è stato completamente rimborsato
    • Messaggio: L’ID del pagamento è stato completamente rimborsato.
  • REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT
    • Trigger: L’importo totale del rimborso è superiore all’importo pagato
    • Messaggio: L’importo del rimborso calcolato è superiore all’importo pagato
  • REFUND_WINDOW_EXPIRED
    • Trigger: Il rimborso viene richiesto oltre il periodo consentito
    • Messaggio: Non è possibile avviare rimborsi {days} giorni dopo la creazione del pagamento. Contatta support@dodopayments.com.
  • ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED
    • Trigger: Un tentativo di rimborsare un pagamento di importo zero
    • Messaggio: Impossibile rimborsare un pagamento con importo monetario pari a zero

Abbonamenti e componenti aggiuntivi

  • ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: Un tentativo di aggiungere componenti aggiuntivi a un abbonamento con fatturazione basata sull’utilizzo
    • Messaggio: I componenti aggiuntivi negli abbonamenti non sono supportati per la fatturazione basata sull’utilizzo
  • ADDONS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: Un tentativo di aggiungere componenti aggiuntivi a un abbonamento on-demand
    • Messaggio: I componenti aggiuntivi non sono consentiti per gli abbonamenti on-demand
  • CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Il Customer Portal tenta di annullare una modifica di piano programmata mentre l’azienda ha disabilitato questa azione
    • Messaggio: L’annullamento della modifica di piano programmata è disabilitato per il Customer Portal.
  • CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: Un tentativo di addebitare un abbonamento programmato per l’annullamento
    • Messaggio: Abbonamento programmato per l’annullamento
  • CUSTOMER_HAS_EXISTING_SUBSCRIPTION
    • Trigger: Creazione di un abbonamento per un cliente che ne possiede già uno, quando l’azienda non consente più abbonamenti per cliente
    • Messaggio: Il cliente {id} ha già un abbonamento. Per consentire più abbonamenti per cliente, modifica le impostazioni dell’azienda
  • DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL
    • Trigger: La modalità di ripartizione do_not_bill viene usata in una modifica di piano del Customer Portal
    • Messaggio: La modalità di ripartizione do_not_bill non è consentita nel Customer Portal
  • DUPLICATE_ADDON_IDS_IN_REQUEST
    • Trigger: Lo stesso addon_id compare più di una volta nella richiesta
    • Messaggio: Non sono consentiti ID di componenti aggiuntivi duplicati
  • INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: Una modifica di piano su un abbonamento inattivo
    • Messaggio: La modifica dei piani non è supportata per gli abbonamenti inattivi
  • INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE
    • Trigger: Una modalità di ripartizione diversa da full_immediately usata con effective_at: next_billing_date
    • Messaggio: Con effective_at: next_billing_date è consentita solo la modalità di ripartizione full_immediately
  • MISSING_ADDON_IDS
    • Trigger: L’elenco addon_id è vuoto o contiene ID sconosciuti
    • Messaggio: Uno o più ID prodotto non esistono: {id}
  • ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: Una modifica di piano su un abbonamento on-demand
    • Messaggio: La modifica dei piani non è supportata per gli abbonamenti on-demand
  • ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: Un tentativo di usare un abbonamento on-demand con la fatturazione basata sull’utilizzo
    • Messaggio: Gli abbonamenti on-demand non sono supportati per la fatturazione basata sull’utilizzo
  • ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: Un prodotto una tantum aggiunto a un abbonamento on-demand
    • Messaggio: I prodotti una tantum non sono consentiti per gli abbonamenti on-demand
  • PENDING_PLAN_CHANGE_EXISTS
    • Trigger: Una nuova modifica di piano richiesta mentre una precedente è ancora in attesa del pagamento
    • Messaggio: Esiste già una modifica di piano in sospeso per questo abbonamento. Attendi il completamento del pagamento corrente.
  • PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Una modifica di piano tramite il Customer Portal mentre l’azienda l’ha disabilitata
    • Messaggio: La modifica del piano dell’abbonamento per il Customer Portal è disabilitata.
  • PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: Una modifica di piano su un abbonamento programmato per l’annullamento
    • Messaggio: Abbonamento programmato per l’annullamento
  • SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Programmazione di una modifica di piano tramite il Customer Portal mentre l’azienda l’ha disabilitata
    • Messaggio: La programmazione delle modifiche di piano è disabilitata per questa azienda.
  • SCHEDULED_PLAN_CHANGE_EXISTS
    • Trigger: Creazione di una modifica di piano programmata quando ne esiste già una
    • Messaggio: Esiste già una modifica di piano programmata per questo abbonamento. Annulla la modifica programmata esistente prima di crearne una nuova.
  • SCHEDULED_PLAN_CHANGE_NOT_FOUND
    • Trigger: Riferimento o annullamento di una modifica di piano programmata che non esiste
    • Messaggio: Nessuna modifica di piano programmata trovata per questo abbonamento.
  • SUBSCRIPTION_EXPIRED
    • Trigger: Fatturazione di un abbonamento dopo la relativa data expires_at
    • Messaggio: Abbonamento scaduto, impossibile creare nuovi addebiti
  • SUBSCRIPTION_HAS_NO_PAYMENT_METHOD
    • Trigger: Nuovo tentativo manuale di un abbonamento che non dispone di un metodo di pagamento salvato da addebitare off-session
    • Messaggio: Questo abbonamento non dispone di un metodo di pagamento salvato da addebitare
  • SUBSCRIPTION_INACTIVE
    • Trigger: Lo stato dell’abbonamento non è active
    • Messaggio: L’abbonamento non è attivo (oppure) Questo abbonamento non è live, quindi non è possibile programmare un annullamento
  • SUBSCRIPTION_NOT_ON_DEMAND
    • Trigger: Un’azione on-demand su un abbonamento con fatturazione a intervallo fisso
    • Messaggio: L’abbonamento non è più on-demand
  • SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED
    • Trigger: I tentativi di pagamento dell’abbonamento hanno superato il numero massimo di tentativi
    • Messaggio: È stato superato il limite massimo di 10 tentativi per questo abbonamento

Clienti e blocklist

  • CUSTOMER_ALREADY_BLOCKED
    • Trigger: Blocco di un cliente già presente nella blocklist e che non ha più abbonamenti live da annullare (HTTP 409)
    • Messaggio: Questo cliente è già nella blocklist
  • PORTAL_ACTION_NOT_PERMITTED
    • Trigger: Un cliente bloccato chiama una route di scrittura del Customer Portal: annullamento, pausa, ripresa, modifica del piano o aggiornamento del metodo di pagamento (HTTP 403). Le route di lettura restano aperte. Il codice e il messaggio non indicano volutamente alcuna causa.
    • Messaggio: Questa azione non è disponibile.

Prodotti, carrello e brand

  • BRAND_ALREADY_ARCHIVED
    • Trigger: Archiviazione di un brand già archiviato
    • Messaggio: Il brand è già archiviato
  • BRAND_ARCHIVED
    • Trigger: Aggiornamento di un brand archiviato, invio per la verifica o associazione di un nuovo prodotto, raccolta di prodotti o abbonamento
    • Messaggio: Il brand è archiviato (oppure) Il brand è archiviato e non può essere aggiornato (oppure) Il brand è archiviato e non può essere inviato per la verifica
  • BRAND_ARCHIVE_TARGET_REQUIRED
    • Trigger: Archiviazione di un brand che contiene ancora prodotti, abbonamenti live o raccolte di prodotti senza una destinazione move_products_to
    • Messaggio: Il brand contiene {count} prodotto/i. Imposta move_products_to su un brand di destinazione per associarli nuovamente. Il messaggio indica invece gli abbonamenti live o le raccolte di prodotti quando sono questi a impedire l’archiviazione.
  • BRAND_MISMATCH
    • Trigger: Gli articoli del carrello appartengono a brand diversi
    • Messaggio: Tutti gli articoli nel carrello dei prodotti devono appartenere allo stesso brand
  • BRAND_NOT_ENABLED
    • Trigger: Il brand è disabilitato o non attivo
    • Messaggio: Il brand fornito non è abilitato
  • BRAND_SUBMISSION_NOT_ENABLED
    • Trigger: La funzionalità di reinvio della verifica del brand non è abilitata
    • Messaggio: Brand verificatin resubmission is not enabled (scritto esattamente come restituito dall’API)
  • CANNOT_ARCHIVE_PRIMARY_BRAND
    • Trigger: Archiviazione del brand principale, il cui ID brand corrisponde all’ID dell’azienda
    • Messaggio: Il brand principale non può essere archiviato
  • FILE_IN_USE
    • Trigger: Eliminazione di un file di prodotto digitale a cui fanno ancora riferimento concessioni attive
    • Messaggio: Il file digitale è referenziato da concessioni attive
  • INVALID_BRAND_ARCHIVE_TARGET
    • Trigger: move_products_to indica il brand da archiviare, un brand archiviato o un brand di un’altra azienda
    • Messaggio: move_products_to deve essere un brand di questa azienda non archiviato (oppure) move_products_to non può essere il brand che stai archiviando
  • INVALID_SUGGESTED_PRICE
    • Trigger: Un prezzo suggerito Pay What You Want è inferiore al prezzo minimo
    • Messaggio: Il prezzo suggerito non può essere inferiore al prezzo minimo. Nel caso Pay What You Want, il prezzo è considerato l’importo minimo accettato
  • LOCALIZED_PRICE_ALREADY_EXISTS
    • Trigger: Esiste già un prezzo localizzato per questo prodotto e paese o valuta
    • Messaggio: Esiste già un prezzo localizzato per questo prodotto e paese/valuta
  • LOCALIZED_PRICE_DUPLICATES_BASE
    • Trigger: Il prezzo localizzato è uguale alla valuta o al paese di base del prodotto
    • Messaggio: Il prezzo localizzato duplica la valuta/il paese di base del prodotto
  • LOCALIZED_PRICE_SHAPE_MISMATCH
    • Trigger: La struttura del prezzo localizzato non corrisponde a pricing_mode del prodotto
    • Messaggio: La struttura del prezzo localizzato non corrisponde a pricing_mode del prodotto
  • MISSING_PRODUCT_INFORMATION
    • Trigger: Il prodotto esiste, ma mancano informazioni obbligatorie
    • Messaggio: Il prodotto {id} esiste, ma mancano altre informazioni obbligatorie o non sono valide
  • PAY_AS_YOU_WANT_AMOUNT_REQUIRED
    • Trigger: Manca l’importo per un prodotto Pay What You Want
    • Messaggio: L’importo è obbligatorio per un prodotto pay as you want
  • PRODUCT_CART_EMTPY
    • Trigger: Viene inviato un carrello di prodotti vuoto
    • Messaggio: product_cart è vuoto (il codice di errore è scritto intenzionalmente EMTPY per corrispondere al valore esatto restituito dall’API)
  • PRODUCT_COLLECTION_IS_DELETED
    • Trigger: Operazione su una raccolta di prodotti che è stata eliminata
    • Messaggio: Nessun messaggio
  • PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS
    • Trigger: Rimozione dell’ultimo prodotto o dell’ultimo gruppo con prodotti da una raccolta
    • Messaggio: Impossibile eliminare l’ultimo prodotto di una raccolta. Archivia invece la raccolta. (oppure) Impossibile eliminare l’ultimo gruppo con prodotti. Archivia invece la raccolta.
  • PRODUCT_IS_DELETED
    • Trigger: Il prodotto è stato eliminato
    • Messaggio: Nessun messaggio
  • PRODUCT_PRICING_MODE_REQUIRED
    • Trigger: Aggiunta di prezzi localizzati prima che sia impostato pricing_mode del prodotto
    • Messaggio: pricing_mode del prodotto deve essere impostato prima di aggiungere prezzi localizzati
  • SLUG_ALREADY_TAKEN
    • Trigger: Lo slug o l’URL breve del prodotto richiesto è già in uso
    • Messaggio: Lo slug è già utilizzato
  • UNABLE_TO_EDIT_PRIMARY_BRAND
    • Trigger: Un tentativo di aggiornare il brand principale tramite la normale API dei brand
    • Messaggio: Il brand principale non può essere aggiornato tramite questo endpoint API.

Sconti

  • DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION
    • Trigger: Applicazione nuovamente di uno sconto già utilizzato per questo abbonamento
    • Messaggio: Questo sconto è già stato utilizzato per questo abbonamento
  • DISCOUNT_CODE_ALREADY_EXISTS
    • Trigger: Creazione di un codice sconto già esistente
    • Messaggio: Il codice sconto esiste già
  • DISCOUNT_CODE_EXPIRED
    • Trigger: La data expires_at del codice sconto è trascorsa
    • Messaggio: Il codice sconto è scaduto
  • DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED
    • Trigger: Il codice sconto viene utilizzato dopo il raggiungimento di usage_limit
    • Messaggio: Il limite di utilizzo non può essere inferiore a times_used (oppure) Il codice sconto ha raggiunto il limite di utilizzo
    • Nota: Terminale. Il codice è esaurito, quindi non riprovare.
  • DISCOUNT_CONCURRENT_REDEMPTION
    • Trigger: Un altro utilizzo dello stesso codice ha mantenuto troppo a lungo il blocco del limite di utilizzo (HTTP 503)
    • Messaggio: Lo sconto viene utilizzato contemporaneamente; riprova
    • Nota: Temporaneo. Il codice potrebbe avere ancora disponibilità, quindi è sicuro riprovare la richiesta. Non mostrare al cliente questo messaggio come se il codice fosse esaurito.
  • DISCOUNT_CURRENCY_OPTION_INVALID
    • Trigger: currency_options non valido durante la creazione o l’aggiornamento
    • Messaggio: Uno sconto fisso richiede almeno un’opzione di valuta con un valore predefinito risolvibile (oppure) Non sono consentite opzioni di valuta duplicate (oppure) Una sola opzione di valuta può essere contrassegnata come predefinita
  • DISCOUNT_CUSTOMER_NOT_ELIGIBLE
    • Trigger: Il cliente non soddisfa customer_eligibility del codice (first_time, existing o non è presente nell’elenco consentito di un codice specific)
    • Messaggio: Il cliente non può utilizzare questo codice sconto
  • DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET
    • Trigger: Il subtotale del carrello è inferiore a minimum_subtotal configurato per la valuta del checkout
    • Messaggio: Il subtotale del carrello è inferiore al subtotale minimo richiesto dallo sconto
  • DISCOUNT_NOT_YET_ACTIVE
    • Trigger: Il codice viene utilizzato prima della data starts_at
    • Messaggio: Il codice sconto non è ancora attivo (starts_at è nel futuro)
  • DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED
    • Trigger: Il cliente ha già utilizzato il codice per_customer_usage_limit volte
    • Messaggio: Limite di utilizzo per cliente superato per questo codice sconto
  • DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT
    • Trigger: Modifica di piano verso un prodotto a cui lo sconto esistente non si applica
    • Messaggio: Lo sconto non è applicabile al prodotto del nuovo piano
  • DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND
    • Trigger: Il codice viene applicato a un abbonamento on-demand
    • Messaggio: Il buono sconto non è disponibile per gli abbonamenti on-demand
  • DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT
    • Trigger: Il codice viene applicato a prodotti che non copre
    • Messaggio: Il buono sconto non è disponibile per questo prodotto
  • INVALID_DISCOUNT_CODE
    • Trigger: Il codice non esiste o non si applica ad alcun prodotto nel carrello
    • Messaggio: Codice sconto non valido (oppure) Il codice sconto non può essere applicato ad alcun prodotto nel carrello
  • INVALID_PERCENTAGE
    • Trigger: La percentuale è superiore al 100% (10.000 punti base)
    • Messaggio: L’importo percentuale non può essere superiore a 10000 (oppure) L’importo del codice sconto non può essere superiore al 100%
  • UNSUPPORTED_DISCOUNT_TYPE
    • Trigger: Un tipo di sconto non supportato. percentage e flat sono entrambi supportati; gli sconti con importo per unità non lo sono.
    • Messaggio: Sono supportati solo i codici sconto percentuali e fissi (oppure) Al momento sono supportati solo i codici sconto percentuali

Chiavi di licenza

  • ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT
    • Trigger: Il nuovo limite di attivazione di una chiave di licenza è inferiore al numero attuale di istanze
    • Messaggio: Il nuovo limite di attivazione non può essere inferiore al conteggio delle istanze attuali
  • INACTIVE_LICENSE_KEY
    • Trigger: Lo stato della chiave di licenza non è active
    • Messaggio: La chiave di licenza non è attiva
  • LICENSE_KEY_LIMIT_REACHED
    • Trigger: Il numero di attivazioni ha raggiunto il limite di attivazione
    • Messaggio: Limite di attivazione della chiave di licenza raggiunto
  • LICENSE_KEY_NOT_FOUND
    • Trigger: L’ID dell’istanza o l’ID della chiave di licenza non è valido
    • Messaggio: Istanza della chiave di licenza non trovata o non appartenente a questa chiave di licenza
  • NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS
    • Trigger: Un tentativo di impostare una data di scadenza su una chiave di licenza basata su un abbonamento
    • Messaggio: Impossibile impostare una data di scadenza per una chiave di licenza basata su un abbonamento

Fatturazione basata sull’utilizzo e meter

  • DUPLICATE_METER_IDS_IN_REQUEST
    • Trigger: Lo stesso ID meter compare più di una volta nella richiesta
    • Messaggio: Non sono consentiti ID meter duplicati
  • INVALID_QUANTITY
    • Trigger: Una quantità diversa da 1 per un prodotto con prezzi basati sull’utilizzo
    • Messaggio: È consentita solo la quantità 1 nei prodotti con prezzo basato sull’utilizzo
  • METER_IS_DELETED
    • Trigger: Un tentativo di utilizzare un meter eliminato
    • Messaggio: Il meter è già stato eliminato
  • MISSING_METER_IDS
    • Trigger: L’elenco degli ID meter è vuoto o contiene ID non validi
    • Messaggio: Uno o più ID meter non esistono: {id}

Fatturazione basata sui crediti

  • CREDIT_ENTITLEMENT_IS_DELETED
    • Trigger: Operazione su un’entitlement di crediti che è stata eliminata
    • Messaggio: L’entitlement di crediti è già stata eliminata
  • CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS
    • Trigger: Creazione di un’entitlement di crediti con un nome già esistente
    • Messaggio: Esiste già un’entitlement di crediti con questo nome
  • OVERAGE_LIMIT_EXCEEDED
    • Trigger: Un utilizzo o una detrazione di crediti supererebbe il limite di overage configurato
    • Messaggio: Limite di overage superato

Wallet

  • INSUFFICIENT_WALLET_FUNDS
    • Trigger: Il saldo del wallet è inferiore all’importo del debito
    • Messaggio: Fondi insufficienti nel wallet
  • NEGATIVE_BALANCE_ADJUSTMENT
    • Trigger: Un tentativo di rendere negativo il saldo del wallet
    • Messaggio: Non è consentito rendere negativo il saldo del wallet

Valuta, imposte e area geografica

  • EXCHANGE_RATE_NOT_FOUND
    • Trigger: Non esiste alcun tasso di cambio per la coppia di valute
    • Messaggio: Tasso di cambio non trovato per la conversione da {currency} a {currency}
  • INVALID_TAX_ID
    • Trigger: La verifica di VAT, GST o TIN non è riuscita
    • Messaggio: L’ID fiscale non è valido
  • REQUEST_AMOUNT_BELOW_MINIMUM
    • Trigger: L’importo è inferiore al minimo impostato per il prodotto
    • Messaggio: L’importo non può essere inferiore all’importo minimo specificato per il prodotto
  • TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT
    • Trigger: Il totale combinato del carrello è inferiore all’importo minimo richiesto per elaborare un pagamento
    • Messaggio: È richiesto un importo minimo di {display_str} per elaborare il pagamento
  • UNSUPPORTED_BILLING_CURRENCY
    • Trigger: La valuta di fatturazione richiesta non è supportata per questo abbonamento
    • Messaggio: La valuta di fatturazione diversa da USD non è supportata per gli abbonamenti
  • UNSUPPORTED_COUNTRY
    • Trigger: Il paese non è supportato
    • Messaggio: Il paese {country_name} non è attualmente supportato
  • UNSUPPORTED_CURRENCY
    • Trigger: La valuta del prodotto o del componente aggiuntivo non è una valuta in cui Dodo Payments può effettuare addebiti. I prezzi di base possono essere impostati in qualsiasi valuta addebitabile, quindi questo errore indica solitamente che il codice valuta non è valido o non è supportato.
    • Messaggio: La valuta non è attualmente supportata (oppure) Al momento sono supportati solo prodotti in USD e INR (oppure) Per il prezzo del componente aggiuntivo sono supportati solo USD e INR (oppure) Per billing_currency è possibile richiedere solo USD o INR (oppure) Valuta non supportata (oppure) Valuta imprevista per gli abbonamenti con carta indiana
  • UNSUPPORTED_TAX_CATEGORY
    • Trigger: La categoria fiscale non è tra i valori supportati
    • Messaggio: La categoria {category} non è attualmente supportata

Convalida e richieste

  • DUPLICATE_LINE_ITEMS_IN_REQUEST
    • Trigger: Lo stesso item_id compare più di una volta in items[]
    • Messaggio: Sono stati specificati item_ids duplicati nell’array items
  • INVALID_QUERY_PARAMS
    • Trigger: Parametri di query mutuamente esclusivi o malformati
    • Messaggio: I parametri di query devono contenere solo time_frame oppure (start, end) (oppure) L’inizio dell’intervallo non può essere successivo alla fine
  • INVALID_REQUEST_BODY
    • Trigger: JSON malformato o violazione dello schema
    • Messaggio: Il corpo della richiesta non è valido. Controlla gli header della richiesta e l’oggetto.
  • INVALID_REQUEST_PARAMETERS
    • Trigger: Valori dei parametri validi nel formato ma non nel significato, ad esempio una data passata
    • Messaggio: Impossibile modificare next_billing_date a un momento passato
  • MAXIMUM_KEYS_REACHED
    • Trigger: I metadati o i campi personalizzati superano 50 coppie chiave-valore
    • Messaggio: Sono state superate 50 coppie chiave-valore

Generale e sistema

  • INTEGER_CONVERSION_FAILURE
    • Trigger: Una conversione lato server tra un intero e una stringa o un decimale non riesce, ad esempio quando il totale del carrello è troppo grande da elaborare
    • Messaggio: Errore di conversione dell’intero (oppure) Il totale del carrello è troppo grande da elaborare. Riduci la quantità o seleziona una valuta di fatturazione diversa.
  • INTERNAL_SERVER_ERROR
    • Trigger: Un errore imprevisto del server. Registra i dettagli della richiesta sul tuo lato.
    • Messaggio: Nessun messaggio pubblico (500 generico, message è solitamente null)
  • NOT_FOUND
    • Trigger: 404 generico per qualsiasi risorsa mancante
    • Messaggio: Elemento non trovato (oppure un messaggio più specifico che indica cosa manca)
  • TOO_MANY_REQUESTS
    • Trigger: È stato superato un limite di frequenza (HTTP 429)
    • Messaggio: Nessun messaggio
  • UNSUPPORTED_ACTION
    • Trigger: Un’azione non supportata dal tipo di risorsa
    • Messaggio: La modifica dei piani per gli abbonamenti con fatturazione basata sull’utilizzo non è supportata

Best practice

Segui queste pratiche quando gestisci gli errori API:
  1. Gestisci ogni risposta di errore nella tua applicazione e basa la logica su code anziché su message.
  2. Registra lo stato HTTP, code e message di ogni richiesta non riuscita.
  3. Mostra agli utenti finali un messaggio pensato per loro invece del valore message grezzo dell’API.
  4. Ripeti il tentativo solo per gli errori temporanei, come le risposte 429 e 5xx o DISCOUNT_CONCURRENT_REDEMPTION, dopo un intervallo.
  5. Contatta il supporto per gli errori che non riesci a risolvere.

Supporto

Per ulteriore assistenza sui codici di errore o sui problemi di integrazione, contatta il team di supporto all’indirizzo support@dodopayments.com.
Ultima modifica il 26 settembre 2026