Skip to main content

SumUp Python SDK

pypi Documentation CI Status pypi download License

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)

Source distribution for sumup 0.3.5
File Size Uploaded Provenance
sumup-0.3.5.tar.gz 80.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sumup 0.3.5
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

0.3.5 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page