SDK Libraries
Rust SDK
Install the official MakePay Rust SDK for payments, donations, subscriptions, POS, products, bookkeeping, branding, and webhooks.
MakePay Rust SDK
Overview
The MakePay Rust SDK is an async server-side crate for MakePay integrations. It wraps API-key authentication, payment links, donations, anonymous payment links, customers, subscriptions, POS terminals, products, Simple Shop, branding, bookkeeping, settings, checkout URL helpers, and signed webhook verification.
Crate:
makepay
Installation
[dependencies]
makepay = "0.3"
The SDK uses reqwest with Rustls TLS by default and is designed for Rust
backend services, workers, and command-line tools.
Authentication
Create a MakePay API key from the MakeCrypto merchant developer area and store the key secret only on your server.
use makepay::MakePayClient;
let makepay = MakePayClient::new(
std::env::var("MAKEPAY_KEY_ID")?,
std::env::var("MAKEPAY_KEY_SECRET")?,
)?;
The SDK sends x-makecrypto-key-id and x-makecrypto-key-secret headers to
the MakePay partner API.
Create Payment Link
use makepay::{CreatePaymentLinkOptions, MakePayClient};
use serde_json::json;
let response = makepay
.create_payment_link(&json!({
"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"
}))
.await?;
println!("{}", response["paymentLink"]["publicUrl"]);
makepay
.create_payment_link_with_options(
&payload,
CreatePaymentLinkOptions {
send_payment_request_email: true,
..Default::default()
},
)
.await?;
Read, update, and email existing links:
use makepay::PaymentLinkStatus;
makepay.list_payment_links(&[]).await?;
makepay.get_payment_link("PAYMENT_LINK_UID").await?;
makepay
.update_payment_link_status("PAYMENT_LINK_UID", PaymentLinkStatus::Paused)
.await?;
makepay
.send_payment_request_email("PAYMENT_LINK_UID", Some("buyer@example.com"))
.await?;
Donations
Donation pages are flexible-amount payment links with a public donation slug.
use makepay::{build_embedded_donation_url, build_hosted_donation_url};
use serde_json::json;
let donation = makepay
.create_donation_link(&json!({
"title": "Spring campaign",
"description": "Support the 2026 spring fundraiser.",
"defaultAmountUsd": "25",
"minimumAmountUsd": "5",
"donationSlug": "spring-campaign"
}))
.await?;
println!("{}", donation["paymentLink"]["publicUrl"]);
makepay.list_donation_links().await?;
makepay.get_donation_link("DONATION_UID").await?;
makepay
.update_donation_link("DONATION_UID", &json!({ "status": "paused" }))
.await?;
let hosted = build_hosted_donation_url("spring-campaign", None)?;
let embedded = build_embedded_donation_url(
"spring-campaign",
None,
Some("https://merchant.example"),
)?;
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.
use makepay::create_anonymous_payment_link;
use serde_json::json;
let response = create_anonymous_payment_link(&json!({
"amount": "25",
"settlement": {
"currency": "USDT",
"priorities": [
{
"chain": "ETH",
"address": "0xYourSettlementWallet",
"asset": "ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"
}
]
},
"title": "Invoice #1042",
"webhookUrl": "https://merchant.example/webhooks/makepay"
}))
.await?;
Checkout URLs And Embeds
Use hosted checkout URLs for redirects, or embedded URL/snippet helpers when your frontend keeps the shopper on the merchant page.
use makepay::{
build_embed_button_html,
build_embedded_checkout_url,
build_hosted_checkout_url,
};
let payment_uid = "PAYMENT_LINK_UID";
let hosted_url = build_hosted_checkout_url(payment_uid, None)?;
let embed_url = build_embedded_checkout_url(
payment_uid,
Some("https://makepay.io"),
Some("https://merchant.example"),
)?;
let button_html = build_embed_button_html(
payment_uid,
None,
Some("Pay with crypto"),
)?;
Customers And Subscriptions
use serde_json::json;
makepay
.upsert_customer(&json!({
"email": "buyer@example.com",
"name": "Buyer Example",
"clientId": "crm_123"
}))
.await?;
makepay
.create_customer_portal_with_payload(
"CUSTOMER_ID",
&json!({ "returnUrl": "https://merchant.example/account" }),
)
.await?;
makepay
.create_subscription(&json!({
"amountUsd": "29",
"customerEmail": "buyer@example.com",
"label": "Monthly plan",
"billingIntervalUnit": "month",
"billingIntervalCount": 1
}))
.await?;
POS, Products, And Simple Shop
use serde_json::json;
let terminal = makepay
.create_pos_terminal(&json!({
"name": "Front counter",
"pin": "1234",
"catalogEnabled": true
}))
.await?;
makepay.list_pos_terminals().await?;
makepay.get_pos_terminal(terminal["terminal"]["uid"].as_str().unwrap_or("")).await?;
makepay
.create_product(&json!({
"name": "Digital guide",
"productType": "digital",
"basePriceUsd": "19",
"shopSlug": "digital-guide"
}))
.await?;
makepay
.create_product_download(
"PRODUCT_UID",
&json!({
"fileName": "guide.pdf",
"contentType": "application/pdf",
"url": "https://merchant.example/downloads/guide.pdf"
}),
)
.await?;
makepay
.update_shop(&json!({
"slug": "merchant-shop",
"displayCurrency": "USD",
"checkoutMode": "hosted"
}))
.await?;
makepay.update_shop_domain(Some("shop.merchant.example")).await?;
makepay.refresh_shop_domain(None).await?;
makepay
.create_shop_coupon(&json!({
"code": "SPRING10",
"discountType": "percent",
"value": "10"
}))
.await?;
makepay.list_shop_orders(&[("status", "paid"), ("limit", "25")]).await?;
Invoices And Bookkeeping
Bookkeeping APIs manage merchant invoices, expenses, supporting documents, OCR, and reconciliation links.
use serde_json::json;
let created = makepay
.create_bookkeeping_invoice(&json!({
"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" }
}))
.await?;
makepay
.create_bookkeeping_invoice_payment_link_with_options(
"INVOICE_UID",
&json!({ "sendPaymentRequestEmail": true }),
)
.await?;
makepay.list_bookkeeping_invoices().await?;
makepay.get_bookkeeping_invoice("INVOICE_UID").await?;
makepay
.update_bookkeeping_invoice("INVOICE_UID", &json!({ "status": "open" }))
.await?;
Expenses can be created manually or from wallet activity, then linked back to payments, transfers, invoices, or uploaded receipts.
makepay
.create_bookkeeping_expense(&json!({
"title": "Hosting",
"amount": "49",
"currency": "USD",
"incurredOn": "2026-05-15",
"category": "Infrastructure",
"counterparty": { "name": "Vendor Example", "type": "vendor" }
}))
.await?;
makepay
.create_bookkeeping_expense_from_activity(&json!({
"walletActivityEventKey": "CHAIN_EVENT_KEY",
"category": "Settlement"
}))
.await?;
makepay
.create_bookkeeping_reconciliation(&json!({
"invoiceId": "INVOICE_UID",
"paymentSessionId": "PAYMENT_SESSION_ID",
"linkType": "payment"
}))
.await?;
Document uploads use reqwest::multipart::Form.
let form = reqwest::multipart::Form::new()
.text("documentType", "receipt")
.text("expenseId", "EXPENSE_UID")
.file("file", "receipt.pdf")
.await?;
makepay.upload_bookkeeping_document(form).await?;
makepay.list_bookkeeping_documents().await?;
makepay.get_bookkeeping_document_download_url("DOCUMENT_UID").await?;
makepay.run_bookkeeping_document_ocr("DOCUMENT_UID").await?;
makepay.get_bookkeeping_summary().await?;
Branding, Settings, And Operations
use serde_json::json;
makepay
.update_branding(&json!({
"brandName": "Merchant",
"supportEmail": "support@merchant.example",
"brandingBrandColor": "#111827",
"brandingAccentColor": "#14b8a6",
"paymentLinkTheme": "system",
"paymentLinkDomain": "pay.merchant.example",
"emailSendingDomain": "mail.merchant.example"
}))
.await?;
makepay.refresh_branding_domains(Some("all")).await?;
makepay.get_settings().await?;
makepay
.update_settings(&json!({
"callbackUrl": "https://merchant.example/webhooks/makepay"
}))
.await?;
makepay.list_destination_assets().await?;
makepay.list_webhook_requests(&[("limit", "25")]).await?;
Webhook Verification
Read the exact raw body before parsing JSON.
use makepay::parse_webhook;
use serde_json::Value;
let raw_body = br#"{"event":{"type":"status_changed"}}"#;
let signature = request_headers
.get("x-makepay-signature")
.and_then(|value| value.to_str().ok());
let event: Value = parse_webhook(
raw_body,
signature,
std::env::var("MAKEPAY_WEBHOOK_SECRET")?.as_str(),
None,
)?;
Use verify_webhook when you only need a boolean result.
Error Handling
API calls return MakePayError. API errors expose the HTTP status and decoded
response body through status() and response_body().
match makepay.get_payment_link("PAYMENT_LINK_UID").await {
Ok(link) => println!("{link:#}"),
Err(error) => {
if let Some(status) = error.status() {
eprintln!("MakePay returned {status}");
}
}
}
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, and iframe helpers, plus 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, domain, coupon, and order helpers |
| 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_webhook, parse_webhook |
Source Layout
The canonical source lives in apps/plugins/rust-sdk. The published crates.io
package contains the Rust crate source, examples, README, and MIT license.
Release Notes
The package is published as makepay on
crates.io. Release publishing should use a crates.io API token through
CARGO_REGISTRY_TOKEN or CRATES_IO_TOKEN.