Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
<!-- This file is generated, please add to it using `knope document-change` in the client-library-templates repo -->
# Changelog

## 3.18.1 (2026-10-06)

### Fixes

#### Stop the generated idempotency key persisting in caller-owned state

The generated `Idempotency-Key` was written into state owned by the caller: the
headers dictionary in Python, and the request object in .NET. An application that
reused either across independent create calls — a module-level custom-header
template, or one request object in a loop — sent the first call's key every time.
The API answers each repeat with `409 idempotent_creation_conflict`, which these
clients resolve by default by returning the resource the first call created, so
later creates returned the wrong resource with no error.

The key is now generated per call without touching the caller's own objects, and
remains stable across network retries of the same call.

## 3.18.0 (2026-10-06)

### Features
Expand Down
2 changes: 1 addition & 1 deletion gocardless_pro/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

from .client import Client

__version__ = '3.18.0'
__version__ = '3.18.1'

4 changes: 2 additions & 2 deletions gocardless_pro/api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ def _default_headers(self):
'Authorization': 'Bearer {0}'.format(self.access_token),
'Content-Type': 'application/json',
'GoCardless-Client-Library': 'gocardless-pro-python',
'GoCardless-Client-Version': '3.18.0',
'GoCardless-Client-Version': '3.18.1',
'User-Agent': self._user_agent(),
'GoCardless-Version': '2015-07-06',
}
Expand All @@ -201,7 +201,7 @@ def _user_agent(self):
python_version = '.'.join(platform.python_version_tuple()[0:2])
vm_version = '{}.{}.{}-{}{}'.format(*sys.version_info)
return ' '.join([
'gocardless-pro-python/3.18.0',
'gocardless-pro-python/3.18.1',
'python/{0}'.format(python_version),
'{0}/{1}'.format(platform.python_implementation(), vm_version),
'{0}/{1}'.format(platform.system(), platform.release()),
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

setup(
name = 'gocardless_pro',
version = '3.18.0',
version = '3.18.1',
packages = find_packages(exclude=['tests']),
install_requires = ['requests>=2.34.2'],
python_requires = '>=3.6',
Expand Down
Loading