Vai al contenuto principale
GoCardless API · invalid_api_usage · 429

GoCardless 429 rate_limit_exceeded: troppe richieste al minuto

GoCardless limita il numero di richieste che accetta al minuto. Chi supera il limite riceve un 429 con il reason rate_limit_exceeded e un'intestazione che indica quando può riprovare. Il connettore non te lo mostra al primo colpo: attende il tempo indicato da GoCardless e ripete la richiesta una volta. Solo se incontra di nuovo il limite vedrai l'errore in Odoo.

FlexigoTech · Responsabile: Víctor Gómez · Aggiornato il 6 novembre 2026

In breve

Versioni
Odoo 17, 18, 19 e 20
Verificato
nel codice del connettore, versione 17.0, 18.0, 19.0 e 20.0 · nelle fonti collegate in fondo
Lettura
4 min

Cosa dice GoCardless

ReasonTipoHTTPTesto di GoCardless
rate_limit_exceededinvalid_api_usage429Rate limit reached. Check headers for reset time.

La pagina dei limiti di GoCardless indica la cifra: 1.600 richieste al minuto in un'integrazione standard e 1.600 al minuto per merchant in un'integrazione partner. Quando il limite viene superato, l'API restituisce il 429, e GoCardless precisa che queste richieste si possono ripetere senza problemi: «These requests are safe to retry.». Per sapere quando, rimanda alle intestazioni della risposta: ratelimit-limit, ratelimit-remaining e ratelimit-reset.

Scheda dell'errore rate_limit_exceeded di GoCardless
Il reason, il codice HTTP 429, l'intestazione ratelimit-reset e il limite di 1.600 richieste al minuto pubblicato da GoCardless.

Da dove arrivano tante richieste

Il limite conta tutte le richieste all'API, non solo quelle che creano addebiti. Con il connettore, ogni addebito con un mandato salvato è una richiesta, che provenga da un abbonamento che si rinnova o da un pagamento registrato con il metodo di pagamento del cliente. Ogni evento di un pagamento che arriva in Odoo è un'altra richiesta, perché il connettore non si fida solo della notifica: chiede a GoCardless quel pagamento e applica lo stato che gli restituisce. Un lotto grande nello stesso momento, come molti rinnovi insieme mentre arrivano gli eventi degli addebiti precedenti, somma entrambe le cose.

GoCardless classifica questo reason tra gli errori invalid_api_usage, quelli che dipendono da come viene fatta la richiesta, e per questi chiede di avvisare il team tecnico («alert your dev team»). Un 429 isolato non lo richiede; uno che si ripete ogni giorno, sì.

Cosa fa il connettore

  1. Legge l'intestazione ratelimit-reset e calcola quanto manca: l'ora indicata meno quella del server di Odoo.
  2. Attende quel tempo, come minimo 1 secondo e come massimo 65. Se l'intestazione manca o non si può leggere, attende 1 secondo. Il limite serve a evitare che un orologio sbagliato blocchi il processo di Odoo che aspetta.
  3. Ripete la richiesta una sola volta.
  4. Se la ripetizione riceve di nuovo un 429, non attende oltre: lo tratta come qualsiasi altro rifiuto dell'API.

Il connettore non conta le proprie richieste né le frena in anticipo. Non legge ratelimit-remaining: attende solo quando GoCardless ha già risposto 429.

Schema: cosa risponde GoCardless con un 429 e cosa fa Odoo con il connettore
Schema realizzato a partire dal codice del connettore (17.0, 18.0, 19.0 e 20.0) e dalla documentazione di GoCardless.

Se anche il secondo tentativo incontra il limite

Dipende da cosa stava facendo Odoo in quel momento.

  • Se era un addebito, la transazione passa a «Errore» con «GoCardless rejected the request.» e, sotto, il messaggio di GoCardless con rate_limit_exceeded e il request_id tra parentesi quadre. La fattura resta in attesa di incasso.
  • Se stava applicando un evento di GoCardless, il webhook risponde 500 affinché GoCardless rinvii la notifica, e gli eventi già applicati non vengono applicati due volte. Anche il recupero orario non lascia indietro un evento fallito: lo richiede di nuovo nel passaggio successivo.

Un 429 non equivale a un addebito senza risposta. Senza risposta, il connettore non sa se GoCardless ha creato l'addebito, quindi lo lascia in sospeso e lo rinvia, con la stessa chiave, entro un'ora. Con un 429 c'è una risposta: GoCardless non ha accettato la richiesta, e per questo la transazione finisce in errore.

Il connettore non è tradotto in italiano: questi testi compaiono sempre in inglese, anche in un Odoo in italiano, sia che li avvii un utente sia un'azione pianificata, come il rinnovo di un abbonamento: «GoCardless rejected the request.».

Cosa fare

  • Apri la transazione dalla fattura, con il pulsante «Transazione di pagamento» in alto; il menu delle transazioni compare solo in modalità sviluppatore, e in Odoo 20 non esiste. Se il messaggio cita rate_limit_exceeded, GoCardless ha rifiutato quella richiesta per il limite, non per il cliente né per il suo mandato.
  • Dopo un po', riprova a incassare la fattura con il metodo di pagamento salvato del cliente.
  • Se succede spesso, controlla l'ora del server di Odoo: l'attesa si calcola sottraendola da quella di ratelimit-reset, e un orologio in anticipo la accorcia.
  • Se ti serve GoCardless, conserva il request_id del messaggio: la loro documentazione chiede di includerlo quando si contatta il supporto.

Il connettore distribuisce le richieste per non raggiungere il limite?

No. Non le conta né le frena in anticipo: reagisce quando GoCardless risponde 429, con un'attesa e un'unica ripetizione.

Perché attende al massimo 65 secondi?

Mentre attende, il processo di Odoo che fa la richiesta non fa altro. Il codice del connettore imposta quel limite perché un orologio sbagliato non lo blocchi.

Il limite fa perdere qualche evento di GoCardless?

Non si considera perso: il webhook chiede a GoCardless di rinviarlo, e il recupero orario lo richiede di nuovo nel passaggio successivo.

Con il nostro connettore

In Odoo 17, 18, 19 e 20 il connettore tratta il 429 come una pausa: attende quanto indicato da GoCardless, ripete una volta e, se il limite persiste, lascia la transazione in errore con il request_id, così sai cosa è successo e cosa comunicare a GoCardless.

Continua a leggere

GoCardless 409 idempotent_creation_conflict: l'addebito esisteva giàGoCardless risponde 409 idempotent_creation_conflict se una chiave di idempotenza ha già creato qualcosa. Non è un errore: ecco come evita il doppio addebito.Webhook di GoCardless: 498 Token Invalid, 204 e la firma Webhook-SignatureGoCardless risponde 498 se la firma Webhook-Signature non torna e 204 se non riconosce l'evento. Cosa risponde Odoo 17, 18, 19 e 20 e perché in 20 è un 401.Errore mandate_is_inactive di GoCardless alla creazione di un incasso da OdooGoCardless risponde mandate_is_inactive se crei un pagamento con un mandato annullato, fallito o scaduto. Perché succede e come lo gestisce il connettore.
Verificato nel codice del connettore (versione 17.0, 18.0, 19.0 e 20.0) e nelle fonti collegate

Fonti

  • docs.gocardless.com/docs/api-reference/limits
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Codice del modulo: flexigo_payment_gocardless: const.py, riga 113 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 378 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 408 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 379 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 383 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 462 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 281 in 17.0 (d203ee6), riga 281 in 18.0 (e2ab18b), riga 281 in 19.0 (ce7f5a3) e riga 292 in 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 247 in 17.0 (d203ee6), riga 247 in 18.0 (e2ab18b), riga 247 in 19.0 (ce7f5a3) e riga 258 in 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 299 in 17.0 (d203ee6), riga 299 in 18.0 (e2ab18b), riga 299 in 19.0 (ce7f5a3) e riga 310 in 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 589 in 17.0 (d203ee6), riga 589 in 18.0 (e2ab18b), riga 588 in 19.0 (ce7f5a3) e riga 607 in 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: controllers/main.py, riga 124 in 17.0 (d203ee6), riga 124 in 18.0 (e2ab18b), riga 124 in 19.0 (ce7f5a3) e riga 127 in 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: controllers/main.py, riga 96 in 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/gocardless_webhook_event.py, riga 7 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: const.py, riga 117 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 603 in 17.0 (d203ee6), riga 603 in 18.0 (e2ab18b), riga 603 in 19.0 (ce7f5a3) e riga 605 in 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/webhooks
  • Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 521 in 17.0 (d203ee6), riga 521 in 18.0 (e2ab18b), riga 521 in 19.0 (ce7f5a3) e riga 523 in 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/it.po
  • github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
  • github.com/odoo/odoo/blob/17.0/odoo/http.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
  • Codice del modulo: flexigo_payment_gocardless: __manifest__.py, riga 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)