Skip to main content

Official MakePay Python SDK for payments, invoices, bookkeeping, POS, products, Simple Shop, branding, and webhooks.

Project description

MakePay Python SDK

Official Python SDK for MakePay server-side integrations. Use it to create crypto payment links, donation pages, invoices, bookkeeping records, subscriptions, POS terminals, products, Simple Shop storefronts, customer portals, branded domains, and signed webhook handlers.

Install

pip install makepay
uv add makepay

The SDK targets Python 3.9 or newer, has no runtime dependencies, and uses Python standard library HTTP and crypto modules.

Configure

Create a MakePay API key in MakeCrypto and keep the secret on your server only.

import os

from makepay import MakePayClient

makepay = MakePayClient(
    key_id=os.environ["MAKEPAY_KEY_ID"],
    key_secret=os.environ["MAKEPAY_KEY_SECRET"],
)

The client sends X-MakeCrypto-Key-Id and X-MakeCrypto-Key-Secret headers to the MakePay partner API.

Payment Links

response = makepay.create_payment_link(
    {
        "title": "Order #1042",
        "description": "Checkout for order #1042",
        "amount": "129.99",
        "currency": "USDT",
        "orderId": "order_1042",
        "customerEmail": "buyer@example.com",
        "returnUrl": "https://merchant.example/orders/1042",
        "successUrl": "https://merchant.example/orders/1042/success",
        "failureUrl": "https://merchant.example/orders/1042/pay",
        "expirationTime": "12h",
    }
)

print(response["paymentLink"])

Read, update, and email existing links:

makepay.list_payment_links()
makepay.get_payment_link("PAYMENT_LINK_UID")
makepay.update_payment_link("PAYMENT_LINK_UID", {"status": "paused"})
makepay.send_payment_request_email("PAYMENT_LINK_UID", "buyer@example.com")

Donations

Donation pages are flexible-amount payment links with a public donation slug.

donation = makepay.create_donation_link(
    {
        "title": "Spring campaign",
        "description": "Support the 2026 spring fundraiser.",
        "defaultAmountUsd": "25",
        "minimumAmountUsd": "5",
        "donationSlug": "spring-campaign",
    }
)

print(donation["paymentLink"]["publicUrl"])

makepay.list_donation_links()
makepay.get_donation_link("DONATION_UID")
makepay.update_donation_link("DONATION_UID", {"status": "paused"})

Anonymous Payment Links

Anonymous links do not use a MakePay API key. They require an explicit settlement route because MakePay cannot read merchant wallet settings.

from makepay import create_anonymous_payment_link

response = create_anonymous_payment_link(
    {
        "amount": "25",
        "settlement": {
            "currency": "USDT",
            "priorities": [
                {
                    "chain": "ETH",
                    "address": "0xYourSettlementWallet",
                    "asset": "ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7",
                }
            ],
        },
        "title": "Invoice #1042",
        "webhookUrl": "https://merchant.example/webhooks/makepay",
    }
)

Checkout URLs And Embeds

Use hosted checkout for redirects, or the embed helpers when your frontend keeps the shopper on the merchant site.

from makepay import (
    build_makepay_embedded_checkout_url,
    build_makepay_hosted_checkout_url,
    build_makepay_iframe_html,
)

payment_uid = response["paymentLink"]["uid"]

hosted_url = build_makepay_hosted_checkout_url(payment_uid)
embed_url = build_makepay_embedded_checkout_url(
    payment_uid,
    parent_origin="https://merchant.example",
)
iframe_html = build_makepay_iframe_html(payment_uid)

Donation pages also have URL helpers:

makepay.hosted_donation_url("spring-campaign")
makepay.embedded_donation_url(
    "spring-campaign",
    parent_origin="https://merchant.example",
)

For static CMS pages, build_makepay_embed_button_html(payment_uid) returns a button snippet that loads the MakePay modal script, and build_makepay_iframe_html(payment_uid) returns an iframe snippet.

Customers And Subscriptions

makepay.upsert_customer(
    {
        "email": "buyer@example.com",
        "name": "Buyer Example",
        "clientId": "crm_123",
    }
)

makepay.create_customer_portal(
    "CUSTOMER_ID",
    {"returnUrl": "https://merchant.example/account"},
)

makepay.create_subscription(
    {
        "amountUsd": "29",
        "customerEmail": "buyer@example.com",
        "label": "Monthly plan",
        "billingIntervalUnit": "month",
        "billingIntervalCount": 1,
    }
)

POS Terminals

terminal = makepay.create_pos_terminal(
    {
        "name": "Front counter",
        "pin": "1234",
        "allowedAssets": ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],
        "emailCollectionMode": "optional_after_deposit",
        "catalogEnabled": True,
    }
)

makepay.list_pos_terminals()
makepay.get_pos_terminal(str(terminal["terminal"]["uid"]))

Products And Simple Shop

makepay.create_product(
    {
        "name": "Digital guide",
        "productType": "digital",
        "basePriceUsd": "19",
        "shopSlug": "digital-guide",
        "images": [{"url": "https://merchant.example/guide.png", "alt": "Guide cover"}],
        "variants": [{"name": "PDF", "priceUsd": "19"}],
    }
)

makepay.create_product_download(
    "PRODUCT_UID",
    {
        "fileName": "guide.pdf",
        "contentType": "application/pdf",
        "url": "https://merchant.example/downloads/guide.pdf",
    },
)

makepay.update_shop(
    {
        "slug": "merchant-shop",
        "displayCurrency": "USD",
        "checkoutMode": "hosted",
        "branding": {"accentColor": "#14b8a6"},
    }
)

makepay.update_shop_domain("shop.merchant.example")
makepay.refresh_shop_domain()
makepay.create_shop_coupon(
    {
        "code": "SPRING10",
        "discountType": "percent",
        "value": "10",
    }
)
makepay.list_shop_orders({"status": "paid", "limit": 25})

Invoices And Bookkeeping

Bookkeeping APIs manage merchant invoices, expenses, supporting documents, OCR, and reconciliation links.

created = makepay.create_bookkeeping_invoice(
    {
        "title": "Invoice #1042",
        "currency": "USD",
        "issueDate": "2026-05-15",
        "dueDate": "2026-05-30",
        "counterparty": {
            "name": "Buyer Example",
            "email": "buyer@example.com",
            "clientId": "crm_123",
        },
        "lineItems": [
            {
                "description": "Implementation services",
                "quantity": "1",
                "unitAmount": "500",
                "taxAmount": "0",
            }
        ],
        "metadata": {"orderId": "order_1042"},
    }
)

makepay.create_bookkeeping_invoice_payment_link(
    "INVOICE_UID",
    {"sendPaymentRequestEmail": True},
)

makepay.list_bookkeeping_invoices()
makepay.get_bookkeeping_invoice("INVOICE_UID")
makepay.update_bookkeeping_invoice("INVOICE_UID", {"status": "open"})

Expenses can be created manually or from wallet activity, then linked back to payments, transfers, invoices, or uploaded receipts.

makepay.create_bookkeeping_expense(
    {
        "title": "Hosting",
        "amount": "49",
        "currency": "USD",
        "incurredOn": "2026-05-15",
        "category": "Infrastructure",
        "counterparty": {"name": "Vendor Example", "type": "vendor"},
    }
)

makepay.create_bookkeeping_expense_from_activity(
    {
        "walletActivityEventKey": "CHAIN_EVENT_KEY",
        "category": "Settlement",
    }
)

makepay.create_bookkeeping_reconciliation(
    {
        "invoiceId": "INVOICE_UID",
        "paymentSessionId": "PAYMENT_SESSION_ID",
        "linkType": "payment",
    }
)

Document uploads use multipart form data. Pass bytes, a file path, or a readable file object.

with open("receipt.pdf", "rb") as receipt:
    makepay.upload_bookkeeping_document(
        {
            "file": receipt,
            "fileName": "receipt.pdf",
            "documentType": "receipt",
            "expenseId": "EXPENSE_UID",
        }
    )

makepay.list_bookkeeping_documents()
makepay.get_bookkeeping_document_download_url("DOCUMENT_UID")
makepay.run_bookkeeping_document_ocr("DOCUMENT_UID")
makepay.get_bookkeeping_summary()

Branding And Domains

makepay.update_branding(
    {
        "brandName": "Merchant",
        "supportEmail": "support@merchant.example",
        "brandingBrandColor": "#111827",
        "brandingAccentColor": "#14b8a6",
        "paymentLinkTheme": "system",
        "paymentLinkDomain": "pay.merchant.example",
        "emailSendingDomain": "mail.merchant.example",
    }
)

makepay.refresh_branding_domains("all")

Settings And Operational APIs

makepay.get_settings()
makepay.update_settings(
    {
        "callbackUrl": "https://merchant.example/webhooks/makepay",
    }
)

makepay.list_destination_assets()
makepay.list_webhook_requests({"limit": 25})

Webhook Verification

Read the exact raw body before parsing JSON.

import os

from makepay import parse_makepay_webhook


def handle_makepay_webhook(raw_body: bytes, headers: dict[str, str]):
    event = parse_makepay_webhook(
        raw_body,
        headers.get("x-makepay-signature"),
        os.environ["MAKEPAY_WEBHOOK_SECRET"],
    )

    if event.get("event", {}).get("type") == "status_changed":
        # Update your local order status.
        pass

    return "ok", 200

Use verify_makepay_webhook when you only need a boolean result.

Method Coverage

Area SDK methods
Payment links create_payment_link, list_payment_links, get_payment_link, update_payment_link, send_payment_request_email
Donations create_donation_link, list_donation_links, get_donation_link, update_donation_link
Anonymous links create_anonymous_payment_link
Checkout hosted, embedded, modal, button, iframe, and donation URL helpers
Customers list_customers, upsert_customer, create_customer_portal
Subscriptions list_subscriptions, create_subscription
POS terminals list_pos_terminals, create_pos_terminal, get_pos_terminal, update_pos_terminal
Products list_products, create_product, get_product, update_product, list_product_downloads, create_product_download
Simple Shop get_shop, update_shop, get_shop_builder, update_shop_builder, get_shop_domain, update_shop_domain, refresh_shop_domain, coupons, orders
Bookkeeping summary, invoice, expense, document upload/OCR, and reconciliation methods
Branding get_branding, update_branding, refresh_branding_domains
Operations get_settings, update_settings, list_destination_assets, list_webhook_requests
Webhooks verify_makepay_webhook, parse_makepay_webhook

Data Models And Response Models

Python payloads are plain dictionaries that use the MakePay API field names. New integrations should send camelCase keys such as customerEmail, paymentLinkDomain, and billingIntervalUnit.

Model conventions:

  • Use strings for decimal money values when precision matters, for example "129.99" instead of 129.99.
  • Dates are ISO strings. Date-only fields, such as invoice issueDate, should use YYYY-MM-DD.
  • IDs are usually public uid values. Bookkeeping detail endpoints accept an internal UUID or public UID.
  • API methods raise MakePayError for non-2xx responses. Successful responses are decoded JSON dictionaries, so production can add fields without requiring a Python package update.

Accepted Payload Models

Model Used by Required fields Common optional fields
Payment link payload create_payment_link amount title, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
Donation link payload create_donation_link none defaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
Anonymous payment link payload create_anonymous_payment_link amount, settlement.currency, settlement.priorities title, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
Customer payload upsert_customer one of email, customerEmail, name, clientId metadata
Subscription payload create_subscription plan amount/customer fields for your billing flow amountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
POS terminal payload create_pos_terminal, update_pos_terminal name pin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
Product payload create_product, update_product name description, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
Shop payload update_shop none slug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
Branding payload update_branding none brand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
Bookkeeping invoice payload create_bookkeeping_invoice, update_bookkeeping_invoice none; blank invoices are allowed as drafts invoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
Bookkeeping expense payload create_bookkeeping_expense, create_bookkeeping_expense_from_activity, update_bookkeeping_expense none; amount defaults to zero if no activity is used amount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
Bookkeeping document upload upload_bookkeeping_document file fileName, documentType, invoiceId, expenseId
Bookkeeping reconciliation payload create_bookkeeping_reconciliation one target and one source target: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Dictionary payload product downloads, shop builder, coupons, settings, customer portal route-specific these advanced surfaces stay open-ended while their server schemas evolve

Errors

API calls raise MakePayError with status and response_body fields.

from makepay import MakePayError

try:
    makepay.get_payment_link("PAYMENT_LINK_UID")
except MakePayError as error:
    print(error.status, error.response_body)

Release Notes

The package is published as makepay on PyPI. Version 0.3.0 aligns the Python surface with the MakePay JavaScript SDK 0.3.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

makepay-0.3.0.tar.gz (14.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

makepay-0.3.0-py3-none-any.whl (13.7 kB view details)

Uploaded Python 3

File details

Details for the file makepay-0.3.0.tar.gz.

File metadata

  • Download URL: makepay-0.3.0.tar.gz
  • Upload date:
  • Size: 14.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for makepay-0.3.0.tar.gz
Algorithm Hash digest
SHA256 0bece7fa933d723c724df8b633cef9c0637e5007ff46b982cd5f055ee040d383
MD5 cde873bbfbd61ca49a4cd508dd9a6e1e
BLAKE2b-256 0b5e408b9a4b3f26a30252438ce133c4f9658695e480f3bbc6f1e9897020a92c

See more details on using hashes here.

File details

Details for the file makepay-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: makepay-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 13.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for makepay-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 11a16e324c1092706fd04aa82f1e4e579d77aa9eabad68b0397943f472a19d04
MD5 179b85d635b58fb02dc6d451cac09f75
BLAKE2b-256 02a344b1761b06fd19f7b99620d81296fc68404690e20cbca70d8cefca5acfef

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page