Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - makepay-apps/makepay-npm-sdk: Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion. · GitHub
Skip to content

Repository files navigation

MakePay JavaScript SDK

Official JavaScript and TypeScript 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.

Public source: https://github.com/makepay-io/makepay-npm-sdk

Install

npm install @makecrypto/makepay
pnpm add @makecrypto/makepay

The SDK targets Node.js 18 or newer and uses the runtime fetch implementation.

Configure

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

import{MakePayClient}from"@makecrypto/makepay";constmakepay=newMakePayClient({keyId: process.env.MAKEPAY_KEY_ID!,keySecret: process.env.MAKEPAY_KEY_SECRET!,});

The client sends x-makecrypto-key-id and x-makecrypto-key-secret headers to the MakePay partner API.

Custom API and checkout base URLs must be origin-only HTTPS URLs. For local tests, HTTP is accepted only with the exact hosts localhost, 127.0.0.1, or [::1] (an explicit port is allowed). Userinfo, paths, query strings, fragments, lookalike hostnames, and alternate numeric IP encodings are rejected. The same policy applies to anonymous requests and every hosted, embedded, modal-script, button, and iframe URL helper. DPoP proof target URLs use the same HTTPS-or-exact-loopback transport rule while retaining their required path. Embedded-checkout parentOrigin values are independently validated as strict merchant origins before being serialized or used as the browser default.

OAuth and DPoP

Native integrations can instead supply OAuth credentials asynchronously. The host application remains responsible for encrypting tokens and the DPoP private key, serializing refreshes, and atomically persisting rotated refresh tokens.

import{MakePayClient,createMakePayDpopProof,typeMakePayAuthProvider,}from"@makecrypto/makepay";constauthProvider: MakePayAuthProvider={asyncgetAuthorization({ method, url }){constcredentials=awaittokenStore.load();return{accessToken: credentials.accessToken,tokenType: "DPoP",dpopProof: createMakePayDpopProof({accessToken: credentials.accessToken,
method,privateKey: credentials.dpopPrivateKeyPem,
url,}),};},asyncrefreshAuthorization(){// Refresh once under your application's lock and persist both rotated// tokens before this promise resolves.awaittokenStore.refresh();},};constmakepay=newMakePayClient({ authProvider });

On a 401, the SDK invokes refreshAuthorization at most once and rebuilds authorization (including a fresh DPoP proof) before one retry. It never owns or persists OAuth tokens. generateMakePayDpopKeyPair, calculateMakePayDpopJwkThumbprint, and createMakePayDpopProof are available for native authorization-code integrations.

Payment Links

constresponse=awaitmakepay.createPaymentLink({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",},{// Reuse this value while reconciling an ambiguous network outcome.idempotencyKey: "order_1042:payment-link:v1",},);console.log(response.paymentLink);

createPaymentLink, updatePaymentLink, and the current webhook-subscription mutations accept an idempotencyKey. Reuse the same key only for an identical mutation; MakePay rejects reuse with a different method, path, or body.

Read, update, and email existing links:

awaitmakepay.listPaymentLinks();awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{status: "paused"});awaitmakepay.updatePaymentLink("PAYMENT_LINK_UID",{metadata: {medusaOrderId: "order_01J...",medusaOrderDisplayId: "1042",medusaAdminUrl: "https://merchant.example/app/orders/order_01J...",medusaInstallationId: "installation_01J...",},});awaitmakepay.sendPaymentRequestEmail("PAYMENT_LINK_UID","buyer@example.com");

Donations

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

constdonation=awaitmakepay.createDonationLink({title: "Spring campaign",description: "Support the 2026 spring fundraiser.",defaultAmountUsd: "25",minimumAmountUsd: "5",donationSlug: "spring-campaign",});console.log(donation.paymentLink.publicUrl);awaitmakepay.listDonationLinks();awaitmakepay.getDonationLink("DONATION_UID");awaitmakepay.updateDonationLink("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.

import{createAnonymousPaymentLink}from"@makecrypto/makepay";constresponse=awaitcreateAnonymousPaymentLink({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.

import{buildMakePayEmbeddedCheckoutUrl,buildMakePayHostedCheckoutUrl,mountMakePayCheckout,openMakePayCheckout,}from"@makecrypto/makepay";constpaymentUid=response.paymentLink.uid;consthostedUrl=buildMakePayHostedCheckoutUrl(paymentUid);constembedUrl=buildMakePayEmbeddedCheckoutUrl(paymentUid,{parentOrigin: "https://merchant.example",viewType: "minimal",});awaitopenMakePayCheckout({
paymentUid,viewType: "minimal",onEvent(event){if(event.type==="makepay.payment.redirect_requested"){window.location.assign(String(event.payload?.redirectUrl||hostedUrl));}},});constmounted=mountMakePayCheckout({container: "#makepay-checkout",
paymentUid,viewType: "minimal",});

Embedded checkout supports viewType: "full" | "minimal". The default "full" view matches the hosted payment page layout. Use "minimal" when the checkout is already inside your own page or modal and should show only the compact payment form. The mounted helper accepts checkout events only when both the configured MakePay origin and the mounted iframe window match.

Donation pages also have URL helpers:

makepay.hostedDonationUrl("spring-campaign");makepay.embeddedDonationUrl("spring-campaign",{parentOrigin: "https://merchant.example",viewType: "minimal",});

For static CMS pages, buildMakePayEmbedButtonHtml(paymentUid) returns a button snippet that loads the MakePay modal script, and buildMakePayIframeHtml returns an iframe snippet. Pass { viewType: "minimal" } to either helper to request the compact embed.

Customers And Subscriptions

awaitmakepay.upsertCustomer({email: "buyer@example.com",name: "Buyer Example",clientId: "crm_123",});awaitmakepay.createCustomerPortal("CUSTOMER_ID",{returnUrl: "https://merchant.example/account",});awaitmakepay.createSubscription({amountUsd: "29",customerEmail: "buyer@example.com",label: "Monthly plan",billingIntervalUnit: "month",billingIntervalCount: 1,});

POS Terminals

constterminal=awaitmakepay.createPosTerminal({name: "Front counter",pin: "1234",allowedAssets: ["ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"],emailCollectionMode: "optional_after_deposit",catalogEnabled: true,});awaitmakepay.listPosTerminals();awaitmakepay.getPosTerminal(String(terminal.terminal.uid));

Products And Simple Shop

awaitmakepay.createProduct({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"}],});awaitmakepay.createProductDownload("PRODUCT_UID",{fileName: "guide.pdf",contentType: "application/pdf",url: "https://merchant.example/downloads/guide.pdf",});awaitmakepay.updateShop({slug: "merchant-shop",displayCurrency: "USD",checkoutMode: "hosted",branding: {accentColor: "#14b8a6"},});awaitmakepay.updateShopDomain("shop.merchant.example");awaitmakepay.refreshShopDomain();awaitmakepay.createShopCoupon({code: "SPRING10",discountType: "percent",value: "10",});awaitmakepay.listShopOrders({status: "paid",limit: 25});

Invoices And Bookkeeping

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

constcreated=awaitmakepay.createBookkeepingInvoice({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"},});awaitmakepay.createBookkeepingInvoicePaymentLink("INVOICE_UID",{sendPaymentRequestEmail: true,});awaitmakepay.listBookkeepingInvoices();awaitmakepay.getBookkeepingInvoice("INVOICE_UID");awaitmakepay.updateBookkeepingInvoice("INVOICE_UID",{status: "open"});

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

awaitmakepay.createBookkeepingExpense({title: "Hosting",amount: "49",currency: "USD",incurredOn: "2026-05-15",category: "Infrastructure",counterparty: {name: "Vendor Example",type: "vendor"},});awaitmakepay.createBookkeepingExpenseFromActivity({walletActivityEventKey: "CHAIN_EVENT_KEY",category: "Settlement",});awaitmakepay.createBookkeepingReconciliation({invoiceId: "INVOICE_UID",paymentSessionId: "PAYMENT_SESSION_ID",linkType: "payment",});

Document uploads use multipart form data through Blob or File.

awaitmakepay.uploadBookkeepingDocument({file: newBlob([receiptBytes],{type: "application/pdf"}),fileName: "receipt.pdf",documentType: "receipt",expenseId: "EXPENSE_UID",});awaitmakepay.listBookkeepingDocuments();awaitmakepay.getBookkeepingDocumentDownloadUrl("DOCUMENT_UID");awaitmakepay.runBookkeepingDocumentOcr("DOCUMENT_UID");awaitmakepay.getBookkeepingSummary();

Branding And Domains

awaitmakepay.updateBranding({brandName: "Merchant",supportEmail: "support@merchant.example",brandingBrandColor: "#111827",brandingAccentColor: "#14b8a6",paymentLinkTheme: "system",paymentLinkDomain: "pay.merchant.example",emailSendingDomain: "mail.merchant.example",});awaitmakepay.refreshBrandingDomains("all");

Settings And Operational APIs

awaitmakepay.getSettings();awaitmakepay.updateSettings({callbackUrl: "https://merchant.example/webhooks/makepay",});awaitmakepay.listDestinationAssets();awaitmakepay.listWebhookRequests({limit: 25});

OAuth integrations should use a grant-scoped webhook subscription rather than changing a company-global callback URL. The signing secret is returned only on creation or explicit rotation, so persist it immediately. PUT and DELETE require an idempotency key.

constcreated=awaitmakepay.upsertCurrentWebhookSubscription({url: "https://merchant.example/webhooks/makepay",events: ["makepay.payment.status_changed"],},{idempotencyKey: "installation_123:webhook:v1"},);awaitmakepay.getCurrentWebhookSubscription();awaitmakepay.deleteCurrentWebhookSubscription({idempotencyKey: "installation_123:webhook-delete:v1",});

Webhook Verification

Read the exact raw body before parsing JSON.

import{parseMakePayWebhook}from"@makecrypto/makepay";exportasyncfunctionPOST(request: Request){constrawBody=awaitrequest.text();constevent=parseMakePayWebhook(rawBody,request.headers.get("x-makepay-signature"),process.env.MAKEPAY_WEBHOOK_SECRET!,);if(event.event?.type==="status_changed"){// Update your local order status.}returnnewResponse("ok");}

Use verifyMakePayWebhook when you only need a boolean result. Webhook timestamps use a 300-second freshness window by default. A custom toleranceSeconds must be finite and greater than zero; zero, negative, NaN, and infinite values fail verification.

Method Coverage

AreaSDK methods
Payment linkscreatePaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail
DonationscreateDonationLink, listDonationLinks, getDonationLink, updateDonationLink
Anonymous linkscreateAnonymousPaymentLink
Checkouthosted, embedded, modal, button, and iframe helpers
CustomerslistCustomers, upsertCustomer, createCustomerPortal
SubscriptionslistSubscriptions, createSubscription
POS terminalslistPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal
ProductslistProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload
Simple ShopgetShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupons, orders
Bookkeepingsummary, invoice, expense, document upload/OCR, and reconciliation methods
BrandinggetBranding, updateBranding, refreshBrandingDomains
OperationsgetSettings, updateSettings, listDestinationAssets, listWebhookRequests, current webhook subscription CRUD
WebhooksverifyMakePayWebhook, parseMakePayWebhook

TypeScript, Data Models, And Response Models

@makecrypto/makepay is written in TypeScript and ships declaration files in the same npm package. You do not need @types/makecrypto__makepay or a secondary SDK package.

importtype{MakePayAnonymousPaymentLinkResponse,MakePayBookkeepingInvoicePayload,MakePayBookkeepingSummaryResponse,MakePayAuthProvider,MakePayDonationLinksResponse,MakePayPaymentLinkPayload,MakePayPaymentLinkResponse,MakePayPaymentRequestEmailResponse,MakePayWebhookSubscriptionResponse,}from"@makecrypto/makepay";

Model conventions:

  • SDK payloads use camelCase. Some API routes also accept snake_case for compatibility, but new integrations should send camelCase.
  • 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.
  • Authenticated partner-v1 payment links retain the original values under paymentLink.payload and also expose normalized amount, fiatCurrency, metadata, correlation fields, latest session, and timeline fields directly on paymentLink.
  • API methods throw MakePayError for non-2xx responses. Successful responses are typed envelopes with index signatures, so production can add fields without breaking TypeScript consumers.

Accepted Payload Models

ModelUsed byRequired fieldsCommon optional fields
MakePayPaymentLinkPayloadcreatePaymentLinkamounttitle, description, currency, asset, orderId, customerEmail, clientId, returnUrl, successUrl, metadata
MakePayPaymentLinkUpdateupdatePaymentLinkat least one update fieldstatus/expiry controls or allowlisted Medusa order-correlation metadata
MakePayDonationLinkPayloadcreateDonationLinknonedefaultAmountUsd, minimumAmountUsd, donationSlug, payment-link display and redirect fields
MakePayAnonymousPaymentLinkPayloadcreateAnonymousPaymentLinkamount, settlement.currency, settlement.prioritiestitle, customerEmail, orderId, metadata, branding, webhookUrl, checkout redirect URLs
MakePayCustomerPayloadupsertCustomerone of email, customerEmail, name, clientIdmetadata
MakePaySubscriptionPayloadcreateSubscriptionplan amount/customer fields for your billing flowamountUsd, customerEmail, label, billingIntervalUnit, billingIntervalCount, startAt, sendPaymentRequestEmail
MakePayPosTerminalPayloadcreatePosTerminal, updatePosTerminalnamepin, status, allowedAssets, emailCollectionMode, catalogEnabled, displaySettings, metadata
MakePayProductPayloadcreateProduct, updateProductnamedescription, sku, status, productType, basePriceUsd, shopSlug, images, variants, taxRates, metadata
MakePayShopPayloadupdateShopnoneslug, status, displayCurrency, checkoutMode, billingDetailsRequired, shipping fields, links, SEO, tracking, branding
MakePayBrandingPayloadupdateBrandingnonebrand name, support email, website URL, theme colors, paymentLinkDomain, emailSendingDomain
MakePayBookkeepingInvoicePayloadcreateBookkeepingInvoice, updateBookkeepingInvoicenone; blank invoices are allowed as draftsinvoiceNumber, status, paymentStatus, currency, issueDate, dueDate, counterparty, lineItems, documentIds
MakePayBookkeepingExpensePayloadcreateBookkeepingExpense, createBookkeepingExpenseFromActivity, updateBookkeepingExpensenone; amount defaults to zero if no activity is usedamount, currency, category, incurredOn, walletActivityEventId, walletActivityEventKey, counterparty, metadata
MakePayBookkeepingDocumentUploaduploadBookkeepingDocumentfilefileName, documentType, invoiceId, expenseId
MakePayBookkeepingReconciliationPayloadcreateBookkeepingReconciliationone target and one sourcetarget: invoiceId or expenseId; source: payment link/session, subscription cycle, or wallet activity; amount, assetSymbol
Record<string, unknown>product downloads, shop builder, coupons, settings, customer portalroute-specificthese advanced surfaces stay open-ended while their server schemas evolve

Response Models By Function

FunctionsResolves toKey fields
createPaymentLink, getPaymentLink, updatePaymentLink, donation create/detail/updateMakePayPaymentLinkResponserequired companyId; normalized paymentLink plus retained paymentLink.payload
listPaymentLinksMakePayPaymentLinksResponserequired companyId; paymentLinks[] uses the same canonical partner-v1 link shape
listDonationLinksMakePayDonationLinksResponserequired companyId, donations
sendPaymentRequestEmailMakePayPaymentRequestEmailResponseok, email, and the updated payment-link email payload
createAnonymousPaymentLinkMakePayAnonymousPaymentLinkResponseanonymous, requestId, public paymentLink, and optional one-time webhook secret
listCustomers, upsertCustomer, createCustomerPortalMakePayCustomersResponse or MakePayCustomerResponsecustomers, customer, portalUrl or url
listSubscriptions, createSubscriptionMakePaySubscriptionsResponse or MakePaySubscriptionResponsesubscriptions, subscription
listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminalMakePayPosTerminalsResponse or MakePayPosTerminalResponseterminals/posTerminals, terminal/posTerminal
listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownloadproduct and download response typesproducts, product, downloads
getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomainshop, builder, and domain response typesshop, blocks, builder, domain, status, verification
listShopCoupons, createShopCoupon, updateShopCoupon, archiveShopCoupon, listShopOrderscoupon and order response typescoupons, coupon, orders
getBranding, updateBranding, refreshBrandingDomains, getSettings, updateSettingsMakePayBrandingResponse, MakePaySettingsResponse, or MakePaySettingsUpdateResponsecompany, settings, ok
listDestinationAssets, listWebhookRequests, current webhook subscription methodsoperational response typesassets, webhook request logs, subscription metadata, and one-time signingSecret
getBookkeepingSummary, invoice, expense, document, OCR, and reconciliation methodsbookkeeping response typessummary, invoices, invoice, expenses, expense, documents, url, reconciliationLinks, stats
verifyMakePayWebhook, parseMakePayWebhookboolean or parsed eventparseMakePayWebhook<T>() returns your supplied event type after signature verification

Bookkeeping mutation methods return a fresh MakePayBookkeepingSummaryResponse, so dashboards can update invoice, expense, document, reconciliation, and stat views from a single response.

Errors

API calls throw MakePayError with a numeric HTTP status. Remote error bodies are intentionally not attached or reflected in the message, so the error is safe to pass through normal application logging boundaries. The deprecated responseBody property remains for source compatibility but is always undefined.

import{MakePayError}from"@makecrypto/makepay";try{awaitmakepay.getPaymentLink("PAYMENT_LINK_UID");}catch(error){if(errorinstanceofMakePayError){console.error(error.status,error.message);}}

About

Official MakePay JavaScript and TypeScript SDK. Cryptocurrency payment gateway for direct self-custody merchant-wallet settlement, decentralized swaps, and 70+ coin/20+ chain auto-conversion.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages