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 of129.99. - Dates are ISO strings. Date-only fields, such as invoice
issueDate, should useYYYY-MM-DD. - IDs are usually public
uidvalues. Bookkeeping detail endpoints accept an internal UUID or public UID. - API methods raise
MakePayErrorfor 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0bece7fa933d723c724df8b633cef9c0637e5007ff46b982cd5f055ee040d383
|
|
| MD5 |
cde873bbfbd61ca49a4cd508dd9a6e1e
|
|
| BLAKE2b-256 |
0b5e408b9a4b3f26a30252438ce133c4f9658695e480f3bbc6f1e9897020a92c
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11a16e324c1092706fd04aa82f1e4e579d77aa9eabad68b0397943f472a19d04
|
|
| MD5 |
179b85d635b58fb02dc6d451cac09f75
|
|
| BLAKE2b-256 |
02a344b1761b06fd19f7b99620d81296fc68404690e20cbca70d8cefca5acfef
|