Naar hoofdinhoud
GoCardless API · invalid_api_usage · 429

GoCardless 429 rate_limit_exceeded: te veel verzoeken per minuut

GoCardless beperkt het aantal verzoeken dat het per minuut accepteert. Wie dat overschrijdt krijgt een 429 met de reason rate_limit_exceeded en een header die aangeeft wanneer je weer verder mag. De connector laat je dit niet meteen zien: hij wacht de tijd die GoCardless vraagt en herhaalt het verzoek één keer. Pas als je opnieuw tegen de limiet aanloopt, zie je de fout in Odoo.

FlexigoTech · Verantwoordelijk: Víctor Gómez · Bijgewerkt op 6 november 2026

In het kort

Versies
Odoo 17, 18, 19 en 20
Gecontroleerd
in de broncode van de connector, versie 17.0, 18.0, 19.0 en 20.0 · in de bronnen onderaan
Leestijd
4 min

Wat GoCardless zegt

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

De limietpagina van GoCardless geeft het getal: 1.600 verzoeken per minuut bij een standaardintegratie en 1.600 per minuut en per handelaar bij een partnerintegratie. Bij overschrijding geeft de API de 429, en GoCardless merkt op dat die verzoeken zonder problemen opnieuw kunnen worden verstuurd: "These requests are safe to retry.". Om te weten wanneer, verwijst het naar de headers van het antwoord: ratelimit-limit, ratelimit-remaining en ratelimit-reset.

Kaart van de fout rate_limit_exceeded van GoCardless
De reason, de HTTP-code 429, de header ratelimit-reset en de limiet van 1.600 verzoeken per minuut die GoCardless publiceert.

Waar al die verzoeken vandaan komen

De limiet telt alle verzoeken aan de API, niet alleen die welke incasso's aanmaken. Met de connector is elke incasso met een opgeslagen mandaat één verzoek, of die nu komt van een abonnement dat wordt verlengd of van een betaling die met de betaalmethode van de klant wordt geregistreerd. Elke gebeurtenis van een betaling die in Odoo binnenkomt is nog een verzoek, omdat de connector niet alleen op de melding afgaat: hij vraagt die betaling op bij GoCardless en past de status toe die hij terugkrijgt. Een grote batch op hetzelfde moment, zoals veel verlengingen tegelijk terwijl de gebeurtenissen van eerdere incasso's binnenkomen, telt beide mee.

GoCardless rangschikt deze reason onder de fouten invalid_api_usage, die voortkomen uit de manier waarop het verzoek wordt gedaan, en vraagt daarvoor om het technische team te waarschuwen ("alert your dev team"). Eén losse 429 hoeft niet gemeld te worden; een die elke dag terugkomt wel.

Wat de connector doet

  1. Leest de header ratelimit-reset en berekent hoeveel tijd er nog nodig is: het tijdstip min dat van de server van Odoo.
  2. Wacht die tijd, minimaal 1 seconde en maximaal 65. Ontbreekt de header of kan hij niet worden gelezen, dan wacht hij 1 seconde. De bovengrens is er zodat een verkeerd ingestelde klok het wachtende Odoo-proces niet vastzet.
  3. Herhaalt het verzoek maar één keer.
  4. Krijgt de herhaling opnieuw een 429, dan wacht hij niet langer en behandelt hij het als elke andere afwijzing door de API.

De connector telt zijn verzoeken niet en remt ze niet vooraf af. Hij leest ratelimit-remaining niet: hij wacht alleen wanneer GoCardless al met 429 heeft geantwoord.

Schema: wat GoCardless met een 429 antwoordt en wat Odoo met de connector doet
Schema op basis van de code van de module (17.0, 18.0, 19.0 en 20.0) en de documentatie van GoCardless.

Als de tweede poging ook vastloopt

Dat hangt af van wat Odoo op dat moment deed.

  • Ging het om een incasso, dan krijgt de transactie de status "Fout" met "GoCardless rejected the request." en daaronder het bericht van GoCardless met rate_limit_exceeded en de request_id tussen haakjes. De factuur blijft openstaan.
  • Verwerkte Odoo een gebeurtenis van GoCardless, dan antwoordt de webhook met 500 zodat GoCardless de verzending opnieuw stuurt, en gebeurtenissen die al waren verwerkt worden niet twee keer toegepast. Ook de herstelronde van elk uur laat geen mislukte gebeurtenis liggen: hij vraagt haar opnieuw op bij de volgende ronde.

Een 429 is niet hetzelfde als een incasso zonder antwoord. Zonder antwoord weet de connector niet of GoCardless de incasso heeft aangemaakt, dus laat hij haar in behandeling en stuurt hij haar, met dezelfde sleutel, binnen minder dan een uur opnieuw. Bij een 429 is er wel antwoord: GoCardless heeft het verzoek niet aanvaard, en daarom staat de transactie op fout.

De connector is niet in het Nederlands vertaald: deze teksten verschijnen altijd in het Engels, ook in een Nederlandstalige Odoo, of een gebruiker of een geplande actie ze nu start: "GoCardless rejected the request.".

Wat je doet

  • Open de transactie vanuit de factuur met de knop "Betalingstransactie" hierboven; het transactiemenu verschijnt alleen in de ontwikkelaarsmodus en bestaat in Odoo 20 niet. Noemt het bericht rate_limit_exceeded, dan heeft GoCardless dat verzoek afgewezen vanwege de limiet, niet vanwege de klant of diens mandaat.
  • Probeer de factuur na enige tijd opnieuw te incasseren met de opgeslagen betaalmethode van de klant.
  • Komt het vaak voor, controleer dan de tijd op de server van Odoo: de wachttijd volgt uit het verschil met die van ratelimit-reset, en een vooruitgelopen klok verkort die.
  • Heb je GoCardless nodig, bewaar dan de request_id uit het bericht: hun documentatie vraagt om die bij contact met hun support te vermelden.

Verdeelt de connector de verzoeken zodat de limiet niet wordt bereikt?

Nee. Hij telt ze niet en remt ze niet vooraf af: hij reageert wanneer GoCardless met 429 antwoordt, met één wachttijd en één herhaling.

Waarom wacht hij maximaal 65 seconden?

Terwijl hij wacht, doet het Odoo-proces dat het verzoek verstuurt niets anders. De code van de connector zet die bovengrens zodat een verkeerd ingestelde klok het proces niet vastzet.

Gaat er door de limiet een gebeurtenis van GoCardless verloren?

Die wordt niet als verloren beschouwd: de webhook vraagt GoCardless de gebeurtenis opnieuw te verzenden, en de herstelronde van elk uur vraagt haar bij de volgende ronde opnieuw op.

Met onze connector

In Odoo 17, 18, 19 en 20 behandelt de connector de 429 als een pauze: hij wacht de tijd die GoCardless vraagt, herhaalt één keer en zet, als de limiet nog steeds geldt, de transactie op fout met de request_id, zodat je weet wat er is gebeurd en wat je aan GoCardless kunt geven.

Lees verder

GoCardless 409 idempotent_creation_conflict: de incasso bestond alGoCardless geeft 409 idempotent_creation_conflict als een idempotentiesleutel al iets heeft aangemaakt. Geen fout: zo voorkomt de connector dubbele incasso.GoCardless-webhook: 498 Token Invalid, 204 en de Webhook-Signature-handtekeningGoCardless vraagt 498 als de Webhook-Signature niet klopt en 204 bij een onbekend event. Wat Odoo 17, 18, 19 en 20 antwoordt en waarom het in 20 een 401 is.Fout mandate_is_inactive van GoCardless bij het aanmaken van een incasso vanuit OdooGoCardless antwoordt met mandate_is_inactive bij een betaling met een geannuleerd, mislukt of verlopen mandaat. Waarom het gebeurt en wat de connector doet.
Gecontroleerd in de broncode van de connector (versie 17.0, 18.0, 19.0 en 20.0) en in de gelinkte bronnen

Bronnen

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