Salta al contingut principal
GoCardless API · invalid_api_usage · 429

GoCardless 429 rate_limit_exceeded: massa peticions per minut

GoCardless limita les peticions que accepta per minut. Qui se'n passa rep un 429 amb el reason rate_limit_exceeded i una capçalera que indica quan pot continuar. El connector no t'ho mostra a la primera: espera el que demana GoCardless i repeteix la petició una vegada. Només si torna a topar amb el límit veuràs l'error a Odoo.

FlexigoTech · Responsable: Víctor Gómez · Actualitzat el 6 de novembre de 2026

L'essencial

Versions
Odoo 17, 18, 19 i 20
Comprovat
al codi del connector, versió 17.0, 18.0, 19.0 i 20.0 · a les fonts enllaçades al final
Lectura
4 min

Què diu GoCardless

ReasonTipusHTTPText de GoCardless
rate_limit_exceededinvalid_api_usage429Rate limit reached. Check headers for reset time.

La pàgina de límits de GoCardless indica la xifra: 1.600 peticions per minut en una integració estàndard i 1.600 per minut i comerç en una integració de partner. En superar-les, l'API retorna el 429, i GoCardless aclareix que aquestes peticions es poden repetir sense problema: «These requests are safe to retry.». Per saber quan, remet a les capçaleres de la resposta: ratelimit-limit, ratelimit-remaining i ratelimit-reset.

Targeta de l'error rate_limit_exceeded de GoCardless
El reason, el codi HTTP 429, la capçalera ratelimit-reset i el límit de 1.600 peticions per minut que publica GoCardless.

D'on surten tantes peticions

El límit compta totes les peticions a l'API, no només les que creen cobraments. Amb el connector, cada cobrament amb un mandat guardat és una petició, vingui d'una subscripció que es renova o d'un pagament registrat amb el mètode de pagament del client. Cada esdeveniment d'un pagament que arriba a Odoo n'és una altra, perquè el connector no es fia només de l'avís: demana aquell pagament a GoCardless i aplica l'estat que li retorna. Una tanda gran al mateix moment, com moltes renovacions alhora mentre arriben els esdeveniments dels cobraments anteriors, suma les dues coses.

GoCardless classifica aquest reason entre els errors invalid_api_usage, els que vénen de com es fa la petició, i per a aquests demana avisar l'equip tècnic («alert your dev team»). Un 429 suelt no ho necessita; un que es repeteix cada dia, sí.

El que fa el connector

  1. Llegeix la capçalera ratelimit-reset i calcula quant falta: l'hora que porta menys la del servidor d'Odoo.
  2. Espera aquest temps, com a mínim 1 segon i com a màxim 65. Si la capçalera falta o no es pot llegir, espera 1 segon. El topall hi és perquè un rellotge mal posat no deixi penjat el procés d'Odoo que espera.
  3. Repeteix la petició només una vegada.
  4. Si la repetició torna a rebre un 429, ja no espera més: ho tracta com qualsevol altre rebuig de l'API.

El connector no compta les seves peticions ni les frena per endavant. No llegeix ratelimit-remaining: només espera quan GoCardless ja ha respost 429.

Esquema: què respon GoCardless amb un 429 i què fa Odoo amb el connector
Esquema fet a partir del codi del connector (17.0, 18.0, 19.0 i 20.0) i de la documentació de GoCardless.

Si el segon intent també topa

Depèn del que estava fent Odoo en aquell moment.

  • Si era un cobrament, la transacció passa a «Error» amb «GoCardless rejected the request.» i, a sota, el missatge de GoCardless amb rate_limit_exceeded i el request_id entre claudàtors. La factura continua pendent de cobrament.
  • Si estava aplicant un esdeveniment de GoCardless, el webhook contesta 500 perquè GoCardless torni a enviar l'enviament, i els esdeveniments que ja es van aplicar no s'apliquen dues vegades. La recuperació de cada hora tampoc deixa enrere un esdeveniment que va fallar: el torna a demanar en la passada següent.

Un 429 no és el mateix que un cobrament sense resposta. Sense resposta, el connector no sap si GoCardless va crear el cobrament, així que el deixa pendent i el torna a enviar, amb la mateixa clau, en menys d'una hora. Amb un 429 sí hi ha resposta: GoCardless no va acceptar la petició, i per això la transacció queda en error.

Aquest missatge surt en l'idioma de qui llança el cobrament. Si el llança una tasca programada, com la renovació d'una subscripció, s'escriu sense ningú al davant. El connector no està traduït al català: aquests textos surten sempre en anglès, també en un Odoo en català, tant si els llança un usuari com una tasca programada: «GoCardless rejected the request.».

Què fer

  • Obre la transacció des de la factura, amb el botó «Transacció de pagament» de dalt; el menú de transaccions només surt en mode desenvolupador, i a Odoo 20 no existeix. Si el missatge esmenta rate_limit_exceeded, GoCardless va rebutjar aquella petició pel límit, no pel client ni pel seu mandat.
  • Passat un moment, torna a cobrar la factura amb el mètode de pagament guardat del client.
  • Si et passa sovint, comprova l'hora del servidor d'Odoo: l'espera surt de restar-la a la de ratelimit-reset, i un rellotge avançat la escurça.
  • Si necessites GoCardless, guarda el request_id del missatge: la seva documentació demana incloure'l en contactar amb el seu suport.

El connector reparteix les peticions per no arribar al límit?

No. No les compta ni les frena per endavant: reacciona quan GoCardless contesta 429, amb una espera i una sola repetició.

Per què espera com a màxim 65 segons?

Mentre espera, el procés d'Odoo que fa la petició no fa res més. El codi del connector posa aquest topall perquè un rellotge mal posat no el deixi penjat.

Es perd algun esdeveniment de GoCardless pel límit?

No es dona per perdut: el webhook demana a GoCardless que el torni a enviar, i la recuperació de cada hora el torna a demanar en la passada següent.

Amb el nostre connector

A Odoo 17, 18, 19 i 20 el connector tracta el 429 com una pausa: espera el que demana GoCardless, repeteix una vegada i, si el límit continua, deixa la transacció en error amb el request_id perquè sàpigues què va passar i què donar a GoCardless.

Continua llegint

GoCardless 409 idempotent_creation_conflict: el cobrament ja existiaGoCardless retorna 409 idempotent_creation_conflict si una clau d'idempotència ja ha creat res. Per què no és un error i com evita el connector cobrar dos cops.Webhook de GoCardless: 498 Token Invalid, 204 i la signatura Webhook-SignatureGoCardless demana 498 si la Webhook-Signature no quadra i 204 si no reconeix l'esdeveniment. Què respon Odoo 17, 18, 19 i 20 i per què a la 20 és un 401.Error mandate_is_inactive de GoCardless en crear un cobrament des d'OdooGoCardless respon mandate_is_inactive en crear un pagament amb un mandat cancel·lat, fallit o caducat. Per què passa i com ho resol el connector a Odoo.
Comprovat al codi del connector (versió 17.0, 18.0, 19.0 i 20.0) i a les fonts enllaçades

Fonts

  • docs.gocardless.com/docs/api-reference/limits
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 113 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 378 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 408 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 379 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 383 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 397 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 462 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 281 a 17.0 (d203ee6), línia 281 a 18.0 (e2ab18b), línia 281 a 19.0 (ce7f5a3) i línia 292 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 247 a 17.0 (d203ee6), línia 247 a 18.0 (e2ab18b), línia 247 a 19.0 (ce7f5a3) i línia 258 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 299 a 17.0 (d203ee6), línia 299 a 18.0 (e2ab18b), línia 299 a 19.0 (ce7f5a3) i línia 310 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 589 a 17.0 (d203ee6), línia 589 a 18.0 (e2ab18b), línia 588 a 19.0 (ce7f5a3) i línia 607 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 124 a 17.0 (d203ee6), línia 124 a 18.0 (e2ab18b), línia 124 a 19.0 (ce7f5a3) i línia 127 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 96 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/gocardless_webhook_event.py, línia 7 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 117 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 603 a 17.0 (d203ee6), línia 603 a 18.0 (e2ab18b), línia 603 a 19.0 (ce7f5a3) i línia 605 a 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/webhooks
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 521 a 17.0 (d203ee6), línia 521 a 18.0 (e2ab18b), línia 521 a 19.0 (ce7f5a3) i línia 523 a 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/ca.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
  • Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 31 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)