API Reference

Payment links & anonymous API

Create API-key merchant links or no-key anonymous one-time MakePay payment links, then manage merchant links.

Routes

Use these routes to create and manage hosted MakePay payment links from MakeCrypto. The same create route also accepts anonymous one-time payment links when the request omits MakePay API key headers.

Need a no-account payment API? Start with anonymous one-time links: send a public payload with amount, settlement priorities, branding, and an optional webhook URL. No MakeCrypto workspace or API key is required.

Jump to anonymous payment API
MethodRoute
GET/api/partner/v1/companies

Auth

session

Use

List user companies

Return teams available to the signed-in MakeCrypto user for portal tooling.

POST/api/partner/v1/onboarding/company

Auth

partner onboarding secret

Use

Create company onboarding link

Create a partner-prefilled company onboarding draft and return a merchant claim URL. Include an oauth block to auto-connect a validated OAuth app after the merchant completes onboarding.

GET/api/partner/v1/makepay/payment-links

Auth

MakePay API key

Use

List payment links

Return every MakePay payment link for the API key's company.

POST/api/partner/v1/makepay/payment-links

Auth

MakePay API key or public

Use

Create payment link

Create an API-key merchant payment link, or omit API headers to create an anonymous one-time link.

POSThttps://www.makepay.io/api/public/anonymous-payment-links

Auth

public

Use

Create anonymous payment link

Public MakePay endpoint for one-time anonymous checkout links with explicit settlement priorities, branding, and optional webhooks.

POST/gateway/pay/{makepayKeyId}

Auth

public form key

Use

Submit HTML payment form

Accept browser form fields, create a hosted payment link, and redirect the customer to checkout.

GET/api/partner/v1/makepay/payment-links/{uid}

Auth

MakePay API key

Use

Get payment-link detail

Return one MakePay payment link with its latest session and timeline events.

PATCH/api/partner/v1/makepay/payment-links/{uid}

Auth

MakePay API key

Use

Update payment-link status

Set a payment link to active, paused, or archived.

POST/api/partner/v1/makepay/payment-links/{uid}/send-request-email

Auth

MakePay API key

Use

Send payment request

Send or resend the hosted payment link to a customer email address.

GET/api/partner/v1/makepay/subscriptions

Auth

MakePay API key

Use

List subscriptions

Return recurring MakePay subscription schedules.

POST/api/partner/v1/makepay/subscriptions

Auth

MakePay API key

Use

Create subscription

Create a recurring MakePay subscription and first invoice.

GET/api/partner/v1/makepay/customers

Auth

MakePay API key

Use

List customers

Return MakePay customer profiles for the API key's company.

POST/api/partner/v1/makepay/customers

Auth

MakePay API key

Use

Upsert customer

Create or update a MakePay customer by email.

POST/api/partner/v1/makepay/customers/{customerId}/portal

Auth

MakePay API key

Use

Create customer portal link

Generate a 24-hour signed MakePay customer portal URL on demand.

GET/api/partner/v1/timezones

Auth

public

Use

List timezones

Return supported IANA timezone identifiers.

GET/api/partner/v1/makepay/settings

Auth

MakePay API key

Use

Read MakePay settings

Read settlement, redirect, fee, checkout policy, and underpayment settings.

PUT/api/partner/v1/makepay/settings

Auth

MakePay API key

Use

Update MakePay settings

Update settlement asset, product status, redirects, fee policy, and checkout policy.

GET/api/partner/v1/makepay/destination-assets

Auth

MakePay API key

Use

List destination assets

Return supported settlement assets and the current default asset.

GET/api/partner/v1/makepay/webhook-requests

Auth

MakePay API key

Use

List webhook deliveries

Inspect payment and subscription webhook delivery attempts and retry state.

The create route inserts a MakePay payment link, resolves merchant branding and settlement defaults, injects runtime billing fields, and returns the public checkout URL.

POST /api/partner/v1/makepay/payment-links
json
{
  "status": "active",
  "sendPaymentRequestEmail": false,
  "payload": {
    "title": "Website order #1042",
    "description": "Checkout for order #1042",
    "amount": "129.99",
    "fiatCurrency": "USD",
    "currency": "USDT",
    "feePaidBy": "merchant",
    "skipQuoteAcceptance": true,
    "lineItems": [
      {
        "id": "plan",
        "name": "Starter package",
        "unitAmount": "119.99",
        "quantity": 1
      }
    ],
    "extraCharges": [
      {
        "id": "shipping",
        "name": "Shipping",
        "kind": "shipping",
        "unitAmount": "10.00",
        "quantity": 1
      }
    ],
    "optionalItems": [
      {
        "id": "priority_setup",
        "name": "Priority setup",
        "unitAmount": "19.99",
        "quantity": 1,
        "adjustableQuantity": {
          "enabled": true,
          "minimum": 1,
          "maximum": 3
        }
      }
    ],
    "orderId": "order_1042",
    "customerEmail": "buyer@example.com",
    "invoicePdfUrl": "https://merchant.example/invoices/1042.pdf",
    "returnUrl": "https://merchant.example/orders/1042",
    "successUrl": "https://merchant.example/orders/1042/success",
    "failureUrl": "https://merchant.example/orders/1042/failure",
    "expirationTime": "12h",
    "metadata": {
      "cartId": "cart_7M2V",
      "source": "api"
    }
  }
}

For a no-code or low-code browser checkout button, see Form submit payment. It accepts a plain HTML POST, creates the same kind of hosted payment link, and redirects the shopper to MakePay checkout.

Required setup

The company must have a MakePay default destination asset. If settlement is not configured, the route returns 409 with errorCode: "onboarding_required".

Amount and asset fields

Use payload.amount for the customer-facing amount. Pass either payload.asset for an exact destination asset or payload.currency when the company's default destination asset can resolve the chain. If a currency is enabled on multiple chains and no matching company default exists, pass payload.asset explicitly.

Fee payer override

Merchant settings define the default fee payer for new MakePay checkouts. Add payload.feePaidBy to override that default for a single payment link. Use "client" when the payer should cover MakePay fees at checkout, or "merchant" when the merchant should absorb the fees and keep the customer-facing amount unchanged.

{
  "payload": {
    "amount": "129.99",
    "currency": "USDT",
    "feePaidBy": "merchant"
  }
}

Checkout quote review override

Merchant settings define whether MakePay skips the payer-facing quote Review step by default. Add payload.skipQuoteAcceptance to force a behavior for one payment link. Use true to accept the first valid quote and go directly to Transfer after the payer completes Contact, Method, and any Refund Address step. Use false to require the Review step. Omit the field to inherit the merchant default. payload.skip_quote_acceptance is accepted as an input alias; API responses use skipQuoteAcceptance.

To clear an existing per-link override, send skipQuoteAcceptance: null in the payment-link PATCH payload.

{
  "payload": {
    "amount": "129.99",
    "currency": "USDT",
    "skipQuoteAcceptance": false
  }
}

Itemized checkout fields

For one-time links, you can replace or verify payload.amount with itemized checkout fields:

  • payload.lineItems for required product or service rows.
  • payload.extraCharges for shipping, customs, tax, handling, or other order charges.
  • payload.optionalItems for payer-selectable add-ons.
  • payload.discounts for order-level discounts.

Each item supports id, name, description, kind, sku, productCode, productUid, variantUid, unitAmount, quantity, taxAmount, discountAmount, metadata, and adjustableQuantity. When line items are present and payload.amount is omitted, MakePay derives the base total. When both are present, payload.amount must match the base total. Optional items and adjustable quantities are validated and priced again when the payer requests a quote, so clients cannot send arbitrary final totals.

{
  "payload": {
    "title": "Order #1042",
    "fiatCurrency": "USD",
    "currency": "USDT",
    "lineItems": [
      {
        "id": "seats",
        "name": "Additional seats",
        "unitAmount": "25.00",
        "quantity": 2,
        "adjustableQuantity": {
          "enabled": true,
          "minimum": 1,
          "maximum": 10
        }
      }
    ],
    "extraCharges": [
      {
        "id": "shipping",
        "name": "Shipping",
        "kind": "shipping",
        "unitAmount": "10.00",
        "quantity": 1
      }
    ],
    "optionalItems": [
      {
        "id": "setup",
        "name": "Priority setup",
        "unitAmount": "100.00",
        "quantity": 1
      }
    ]
  }
}

Embedded or custom checkout clients send the payer's allowed selection when requesting a quote. MakePay recalculates the amount from the stored payment-link payload; do not send a client-computed total.

POST https://www.makepay.io/api/public/payment-links/{uid}/quote-payin
{
  "sellAsset": "ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
  "receiptEmail": "buyer@example.com",
  "lineItemSelection": {
    "quantities": {
      "seats": 4
    },
    "optional": [
      {
        "id": "setup",
        "quantity": 1
      }
    ]
  }
}

Expiration

payload.expirationTime accepts 15m, 1h, 12h, 24h, 72h, or never. The API stores the resolved expires_at timestamp on the payment link.

Invoice PDF evidence

Pass payload.invoicePdfUrl when the payment already has an external invoice PDF. Merchant payment-link details show an Invoice button for that URL. When a payment link is generated from a MakeCrypto bookkeeping invoice, the detail view uses the private bookkeeping invoice PDF automatically.

Create response

json
{
  "ok": true,
  "paymentRequestEmailSent": false,
  "paymentRequestEmailError": null,
  "paymentLink": {
    "id": "8d15bb78-d0f8-45ef-88d7-2a1f1f79644b",
    "uid": "01hzy4k6p4w9y2x7e2z7n8a2xm",
    "status": "active",
    "expires_at": "2026-04-19T12:00:00.000Z",
    "created_at": "2026-04-19T00:00:00.000Z",
    "updated_at": "2026-04-19T00:00:00.000Z",
    "publicUrl": "https://makepay.io/payment/01hzy4k6p4w9y2x7e2z7n8a2xm",
    "payload": {
      "title": "Website order #1042",
      "description": "Checkout for order #1042",
      "amount": "129.99",
      "fiatCurrency": "USD",
      "currency": "USDT",
      "feePaidBy": "merchant",
      "skipQuoteAcceptance": true,
      "lineItems": [
        {
          "id": "plan",
          "name": "Starter package",
          "unitAmount": "119.99",
          "quantity": 1
        }
      ],
      "extraCharges": [
        {
          "id": "shipping",
          "name": "Shipping",
          "kind": "shipping",
          "unitAmount": "10.00",
          "quantity": 1
        }
      ],
      "optionalItems": [
        {
          "id": "priority_setup",
          "name": "Priority setup",
          "unitAmount": "19.99",
          "quantity": 1,
          "adjustableQuantity": {
            "enabled": true,
            "minimum": 1,
            "maximum": 3
          }
        }
      ],
      "orderId": "order_1042",
      "customerEmail": "buyer@example.com",
      "invoicePdfUrl": "https://merchant.example/invoices/1042.pdf",
      "returnUrl": "https://merchant.example/orders/1042",
      "successUrl": "https://merchant.example/orders/1042/success",
      "failureUrl": "https://merchant.example/orders/1042/failure",
      "expirationTime": "12h",
      "metadata": {
        "cartId": "cart_7M2V",
        "source": "api"
      },
      "asset": "ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
      "runtimeMode": "merchant_target_net_v2",
      "billingVersion": "v2",
      "merchantName": "Merchant Co",
      "merchantPaymentLinkTheme": "system"
    }
  }
}

Anonymous links are for one-off hosted checkout pages that are not attached to a MakeCrypto merchant workspace. Send the same create request without x-makecrypto-key-id or x-makecrypto-key-secret; if credential headers are present and invalid, the API treats the request as an authenticated attempt and returns 401.

POST /api/partner/v1/makepay/payment-links
json
{
  "amount": "129.99",
  "fiatCurrency": "USD",
  "title": "Anonymous order #1042",
  "description": "One-time hosted MakePay checkout",
  "customerEmail": "buyer@example.com",
  "settlement": {
    "currency": "USDT",
    "priorities": [
      {
        "chain": "TRON",
        "address": "TMerchantSettlementAddress"
      },
      {
        "chain": "ETH",
        "address": "0xMerchantSettlementAddress"
      }
    ]
  },
  "returnUrl": "https://merchant.example/orders/1042",
  "successUrl": "https://merchant.example/orders/1042/success",
  "failureUrl": "https://merchant.example/orders/1042/failure",
  "expirationTime": "24h",
  "webhookUrl": "https://merchant.example/webhooks/makepay",
  "branding": {
    "name": "Merchant Co",
    "logoUrl": "https://merchant.example/logo.png",
    "brandColor": "#0f766e",
    "accentColor": "#111827",
    "theme": "system"
  },
  "metadata": {
    "cartId": "cart_7M2V",
    "source": "anonymous-api"
  }
}

You can also call the MakePay public proxy from MakePay-hosted pages:

POST https://www.makepay.io/api/public/anonymous-payment-links

Anonymous setup

Anonymous one-time links require either amount or itemized checkout rows, plus a settlement block with currency and at least one settlement priority. Each priority contains the chain and the merchant-controlled settlement address for completed payments. The checkout collects the payer refund address when the payer selects a pay-in network, so do not send source-chain refund addresses in the create request.

Display currency and settlement

Use fiatCurrency or displayCurrency for the customer-facing display currency. Use settlement.currency for the asset family you want to receive, such as USDT, USDC, or BTC. If a settlement symbol is available on several chains, order settlement.priorities by preferred chain so MakePay can resolve the default destination asset and fallback routes.

Anonymous webhooks

Pass webhookUrl to receive MakePay webhook events for the anonymous payment link. When a webhook URL is present, the create response returns paymentLink.webhook.secret once; store it immediately and use it to verify future webhook signatures.

Anonymous links are intentionally limited: they are not returned by merchant list APIs, cannot be paused or archived later, and are subject to public creation rate limits.

curl
curl -X POST "https://www.makecrypto.io/api/partner/v1/makepay/payment-links" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": "129.99",
  "fiatCurrency": "USD",
  "title": "Anonymous order #1042",
  "description": "One-time hosted MakePay checkout",
  "customerEmail": "buyer@example.com",
  "settlement": {
    "currency": "USDT",
    "priorities": [
      {
        "chain": "TRON",
        "address": "TMerchantSettlementAddress"
      },
      {
        "chain": "ETH",
        "address": "0xMerchantSettlementAddress"
      }
    ]
  },
  "returnUrl": "https://merchant.example/orders/1042",
  "successUrl": "https://merchant.example/orders/1042/success",
  "failureUrl": "https://merchant.example/orders/1042/failure",
  "expirationTime": "24h",
  "webhookUrl": "https://merchant.example/webhooks/makepay",
  "branding": {
    "name": "Merchant Co",
    "logoUrl": "https://merchant.example/logo.png",
    "brandColor": "#0f766e",
    "accentColor": "#111827",
    "theme": "system"
  },
  "metadata": {
    "cartId": "cart_7M2V",
    "source": "anonymous-api"
  }
}'

Anonymous create response

json
{
  "ok": true,
  "anonymous": true,
  "paymentRequestEmailSent": false,
  "paymentRequestEmailError": null,
  "paymentLink": {
    "id": "8d15bb78-d0f8-45ef-88d7-2a1f1f79644b",
    "uid": "01hzy4k6p4w9y2x7e2z7n8a2xm",
    "status": "active",
    "link_type": "one_time",
    "publicUrl": "https://makepay.io/payment/01hzy4k6p4w9y2x7e2z7n8a2xm",
    "expiresAt": "2026-04-20T00:00:00.000Z",
    "expires_at": "2026-04-20T00:00:00.000Z",
    "created_at": "2026-04-19T00:00:00.000Z",
    "updated_at": "2026-04-19T00:00:00.000Z",
    "payload": {
      "amount": "129.99",
      "type": "one_time",
      "fiatCurrency": "USD",
      "displayCurrency": "USD",
      "currency": "USDT",
      "asset": "TRON.USDT",
      "runtimeMode": "merchant_target_net_v2",
      "billingVersion": "v2",
      "merchantName": "Merchant Co",
      "merchantPaymentLinkTheme": "system"
    },
    "settlement": {
      "currency": "USDT",
      "defaultDestinationAsset": "TRON.USDT",
      "priorities": [
        {
          "chain": "TRON",
          "assetIdentifier": "TRON.USDT",
          "address": "TMerchantSettlementAddress"
        },
        {
          "chain": "ETH",
          "assetIdentifier": "ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
          "address": "0xMerchantSettlementAddress"
        }
      ],
      "sourceAddresses": []
    },
    "branding": {
      "name": "Merchant Co",
      "logoUrl": "https://merchant.example/logo.png",
      "brandColor": "#0f766e",
      "accentColor": "#111827",
      "theme": "system"
    },
    "webhook": {
      "url": "https://merchant.example/webhooks/makepay",
      "secret": "mkwhsec_8d1f...",
      "secretLast4": "d1f0"
    }
  },
  "requestId": "5f31fb28-1a6c-4d57-b765-e32fb9b7b3e0"
}

Use the list route for back-office reconciliation, dashboards, and smoke tests.

curl
curl "https://www.makecrypto.io/api/partner/v1/makepay/payment-links" \
  -H "x-makecrypto-key-id: MAKEPAY_API_KEY_ID" \
  -H "x-makecrypto-key-secret: MAKEPAY_API_SECRET" \
  -H "Accept: application/json"

Use the detail route when you already have a payment-link UID and need the normalized link, public checkout URL, latest payment session, and timeline events.

curl
curl "https://www.makecrypto.io/api/partner/v1/makepay/payment-links/PAYMENT_LINK_UID" \
  -H "x-makecrypto-key-id: MAKEPAY_API_KEY_ID" \
  -H "x-makecrypto-key-secret: MAKEPAY_API_SECRET" \
  -H "Accept: application/json"

Use the status route to stop a link from being paid, hide it from active operations, or add/remove the invoice PDF URL shown in merchant payment details.

curl
curl -X PATCH "https://www.makecrypto.io/api/partner/v1/makepay/payment-links/PAYMENT_LINK_UID" \
  -H "x-makecrypto-key-id: MAKEPAY_API_KEY_ID" \
  -H "x-makecrypto-key-secret: MAKEPAY_API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"status":"paused"}'

status must be active, paused, or archived. To attach an invoice PDF URL to an existing payment link, send:

{
  "invoicePdfUrl": "https://merchant.example/invoices/1042.pdf"
}

Send a payment request email

MakeCrypto can send the hosted link directly to the customer email on the payment-link payload, or to an override email in the request body.

curl
curl -X POST "https://www.makecrypto.io/api/partner/v1/makepay/payment-links/PAYMENT_LINK_UID/send-request-email" \
  -H "x-makecrypto-key-id: MAKEPAY_API_KEY_ID" \
  -H "x-makecrypto-key-secret: MAKEPAY_API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"email":"buyer@example.com"}'

Only active payment links can be emailed. Completed payment links cannot be resent.

Need partner setup help?

Open the payment link details view in MakeCrypto to copy the generated snippets for a real payment UID, or return to the portal to manage merchant settings.

Open portal