All notable changes to this project will be documented in this file.
[2.0.0] โ 2026-05-24
๐ด Breaking bug fixes
Resource.update/5now uses HTTP POST (was incorrectly using HTTP PUT). GoCardless does not support PUT โ all update operations require POST to the resource endpoint. This was a silent runtime failure: allupdate/4calls across every resource were returning405 Method Not Allowedfrom the API.Action endpoints now wrap params in the resource key (was wrapping in
"data"). The GoCardless API requires%{"billing_requests" => params}, not%{"data" => params}. Everycancel,retry,fulfil,pause,resume,approve, and other action calls were failing with validation errors.Fixed
GoCardless-Versionheader name (wasGoCardlessClient-Version). The API was silently receiving no valid version header on every request.
๐ New modules
GoCardlessClient.Resources.BillingRequestWithActionsโ single-call API combining billing request creation + actions (POST /billing_requests_with_actions)GoCardlessClient.Resources.OutboundPaymentImportsโ bulk outbound payment import batches (POST /outbound_payment_imports,GET, list)GoCardlessClient.Resources.OutboundPaymentImportEntriesโ entries within an outbound payment import batch
๐ New functions on existing modules
OutboundPayments.withdrawal/3โPOST /outbound_payments/withdrawalOutboundPayments.statistics/2โGET /outbound_payments/statisticsBlocks.block_by_reference/3โPOST /blocks/block_by_referenceInstitutions.list_for_billing_request/4โGET /billing_requests/:id/institutionsScenarioSimulators.run/4โPOST /scenario_simulators/:type/actions/run(previously referenced in docs but never defined โ causedUndefinedFunctionError)RedirectFlows.list/3andstream/3InstalmentSchedules.create_with_dates/3andcreate_with_schedule/3(replaces ambiguouscreate/3with clearly named wrappers)
๐ New webhook event type helpers
Added to GoCardlessClient.Webhooks:
instalment_schedule_event?/1outbound_payment_event?/1creditor_event?/1customer_event?/1export_event?/1payment_account_transaction_event?/1scheme_identifier_event?/1
๐๏ธ Removed
GoCardlessClient.Resources.Transfersโ this module referenced a/transfersendpoint that does not exist in the GoCardless API. All calls would have returned404. Removed entirely.
๐งน Phantom function cleanup
Removed create/3 and update/4 from read-only resources where these
operations don't exist in the API:
Balancesโ read-only; removed phantomcreate/3,update/4CurrencyExchangeRatesโ read-only; removed phantomcreate/3,update/4Eventsโ read-only; removed phantomcreate/3,update/4Exportsโ read-only; removed phantomcreate/3,update/4NegativeBalanceLimitsโ read-only; removed phantomcreate/3,update/4PayoutItemsโ list-only; removed phantomcreate/3,get/3,update/4PaymentAccountsโ read-only; removed phantomcreate/3,update/4PaymentAccountTransactionsโ read-only; removed phantomcreate/3,update/4Payoutsโ read-only except metadata; removed phantomcreate/3TaxRatesโ read-only; removed phantomcreate/3,update/4TransferredMandatesโ get-only; removed phantomcreate/3,list/3,update/4Institutionsโ removed phantomcreate/3,update/4Logosโ write-only; removed phantomget/3,list/3,update/4MandatePDFsโ write-only; removed phantomget/3,list/3FundsAvailabilitiesโ renamedcreate/3โcheck/3; removed phantomget/3,list/3CustomerNotificationsโ removed phantomcreate/3,get/3,list/3,update/4; kepthandle/4BankDetailsLookupsโ renamedcreate/3โlookup/3; removed phantomget/3,list/3BankAccountDetailsโ removed phantomcreate/3,update/4; keptget/3MandateImportsโ removed phantomlist/3(the API has no list endpoint for this resource)
๐งช Tests
Fixed
GoCardlessClient.TestCaseโ Bypass server URL was opened but never wired to the client; every HTTP test was silently hitting the real GoCardless sandbox (or failing with connection errors). The client now receives a_base_url_overridepointing at the local Bypass server.Added Bypass-wired tests for 15 resource modules (from 2):
CustomersTestโ create, get, list, update (POST not PUT), remove (DELETE), header assertionsPaymentsTestโ create, cancel (action key), retry, list, update (POST not PUT)MandatesTestโ create, cancel (action key), reinstateBillingRequestsTestโ create, all action endpoints (verifies resource key wrapping)SubscriptionsTestโ create, pause, resume, cancelScenarioSimulatorsTestโ run/4 path, mandate scenario, invalid scenario guardBlocksTestโ create, block_by_reference, disable/enable actionsOutboundPaymentsTestโ create, withdrawal, statistics, cancel, approveInstalmentSchedulesTestโ create_with_dates, create_with_schedule, cancelBillingRequestWithActionsTestโ full single-call flowRedirectFlowsTestโ create, complete, listPayoutsTestโ list, update (POST), PayoutItems.listWebhooksResourceTestโ list, retryEventsTestโ list with filters, getMiscResourcesTestโ BankDetailsLookups, FundsAvailabilities, MandatePDFs, Institutions, Balances, CustomerNotificationsPaginatorTestโ single-page, multi-page cursor following, error propagationWebhooksHelpersTestโ all 7 new event type helpers, payload size guard
Upgrade guide
Update all create/3 calls for renamed functions:
# Before (returns 404)
GoCardlessClient.Resources.FundsAvailabilities.create(client, params)
GoCardlessClient.Resources.BankDetailsLookups.create(client, params)
# After
GoCardlessClient.Resources.FundsAvailabilities.check(client, params)
GoCardlessClient.Resources.BankDetailsLookups.lookup(client, params)Replace ambiguous InstalmentSchedules.create/3:
# Before
GoCardlessClient.Resources.InstalmentSchedules.create(client, %{instalments: [...]})
# After (explicit)
GoCardlessClient.Resources.InstalmentSchedules.create_with_dates(client, %{instalments: [...]})
GoCardlessClient.Resources.InstalmentSchedules.create_with_schedule(client, %{interval_unit: "monthly", ...})Remove any direct Transfers module usage:
# Before (returns 404 โ endpoint doesn't exist)
GoCardlessClient.Resources.Transfers.create(client, params)
# Use TransferredMandates for post-switch mandate data:
GoCardlessClient.Resources.TransferredMandates.get(client, mandate_id)