IMPORTANT: This SDK is under development. We might still introduce minor breaking changes before reaching v1.
The Python SDK for the SumUp API.
Installation
Install the latest version of the SumUp SDK:
pip install sumup
# or
uv add sumup
Usage
Synchronous Client
import os
from sumup import Sumup
client = Sumup(api_key="sup_sk_MvxmLOl0...")
merchant = client.merchants.get(merchant_code=os.environ["SUMUP_MERCHANT_CODE"])
print(f"Merchant: {merchant.merchant_code}")
Async Client
import asyncio
import os
from sumup import AsyncSumup
async def main():
client = AsyncSumup(api_key="sup_sk_MvxmLOl0...")
merchant = await client.merchants.get(merchant_code=os.environ["SUMUP_MERCHANT_CODE"])
print(f"Merchant: {merchant.merchant_code}")
asyncio.run(main())
Client Cleanup
Use clients directly as shown above, or use a context manager to close connections automatically when the block exits:
with Sumup(api_key="sup_sk_MvxmLOl0...") as client:
merchant = client.merchants.get(merchant_code=os.environ["SUMUP_MERCHANT_CODE"])
For async code, use async with:
async def main():
async with AsyncSumup(api_key="sup_sk_MvxmLOl0...") as client:
merchant = await client.merchants.get(merchant_code=os.environ["SUMUP_MERCHANT_CODE"])
For long-running applications, reuse a client across requests and call client.close()
or await client.aclose() during shutdown, after outstanding work finishes.
A closed client cannot be reused.
Creating a Checkout
import os
import uuid
from sumup import Sumup
client = Sumup(api_key="sup_sk_MvxmLOl0...")
merchant_code = os.environ["SUMUP_MERCHANT_CODE"]
# Create a checkout
checkout = client.checkouts.create(
amount=10.00,
currency="EUR",
checkout_reference=str(uuid.uuid4()),
merchant_code=merchant_code,
description="Test payment",
redirect_url="https://example.com/success",
return_url="https://example.com/webhook",
)
print(f"Checkout ID: {checkout.id}")
print(f"Checkout Reference: {checkout.checkout_reference}")
Creating a Reader Checkout
from sumup import Sumup
client = Sumup(api_key="sup_sk_MvxmLOl0...")
# Create a reader checkout
reader_checkout = client.readers.create_checkout(
reader_id="your-reader-id",
merchant_code="your-merchant-code",
total_amount={
"value": 1000, # 10.00 EUR (amount in cents)
"currency": "EUR",
"minor_unit": 2,
},
description="Coffee purchase",
return_url="https://example.com/webhook",
)
print(f"Reader checkout created: {reader_checkout}")
Handling Events
Create a handler with your event signing secret and register typed callbacks:
import os
from sumup import Sumup
from sumup.events import EventNotification, ReaderCreatedEvent
client = Sumup(api_key=os.environ["SUMUP_API_KEY"])
def fallback(event: EventNotification) -> None:
print(f"Received {event.type}")
events = client.events_handler(os.environ["SUMUP_EVENT_SECRET"], fallback)
@events.on_reader_created
def reader_created(event: ReaderCreatedEvent) -> None:
reader = event.fetch_object()
print(f"Reader paired: {reader.id}")
# In your HTTP route, pass the unchanged body and the complete
# X-SumUp-Webhook-Signature header value:
events.handle(raw_body, signature)
You can also register an existing function with events.on_reader_created(callback).
Send a 2xx response after handling succeeds. Reject EventSignatureError and EventPayloadError with 400; return 500 for EventCallbackError so processing can be retried. Make callbacks idempotent and configure body limits in your server.
Use AsyncSumup with async callbacks, await events.handle(...), and await event.fetch_object_async() for async servers. For parsing without callbacks, use client.parse_event_notification(body, signature, secret).
See the runnable Flask and FastAPI examples for complete HTTP routes and error handling.
Version Support Policy
sumup-py maintains compatibility with Python versions that have not passed end-of-life. As of June 8, 2026, that means Python 3.10 through 3.14. See Status of Python versions.
Metadata
Release files for sumup 0.3.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sumup-0.3.5.tar.gz | 80.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sumup-0.3.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 164.1 kB
Release files / sumup-0.3.5.tar.gz
| Download URL | sumup-0.3.5.tar.gz |
|---|---|
| Size | 80.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4d95b86107fdbc6d55c025ec006c6ade598a5f4c110806c5f0cc986007e44b98
|
|
BLAKE2b-256 checksum How to use checksums |
12147c17f16aad538261449ec1b5c18ba2a42fd31c9ce62f343d096c51494bf5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sumup-0.3.5-py3-none-any.whl
| Download URL | sumup-0.3.5-py3-none-any.whl |
|---|---|
| Size | 83.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c4365640ff3e17f9066574bf210e512f97ffd52e3936ecd4a2411554b7c322ae
|
|
BLAKE2b-256 checksum How to use checksums |
d26d93fc9dd66f76af5a04fd431a369f14506955a2679bec7848c7518bf3fe0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for sumup 0.3.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.