Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.pawpayments.com/llms.txt

Use this file to discover all available pages before exploring further.

PawPayments ships first-party SDKs for PHP, Python, and Node.js that talk to the documented /api/v2/* surface, plus plugins for popular billing and e‑commerce platforms. The PHP SDK underpins WooCommerce, WHMCS, and BillManager; Python and Node clients mirror the full Native V2 API (invoices, payouts, ledger, permanent addresses, and more). Plugins use only public endpoints — no hidden backend logic — so anything they do is reproducible from your own integration.
PluginPlatformFlowsGitHub
PHP SDKComposer packageCreate / fetch invoices, verify webhookspawpayments/php-sdk
Python SDKPyPI (pawpayments)Full Native V2 API + webhookspawpayments/python-sdk
Node.js SDKnpm (@pawpayments/sdk)Full Native V2 API + webhookspawpayments/node-sdk
WooCommerceWordPress + WooCommerce 7+Checkoutpawpayments/woocommerce-plugin
WHMCSWHMCS 8.xCheckout, Add Funds (top‑up)pawpayments/whmcs-plugin
BillManagerBillManager 6.xCheckout, top‑uppawpayments/billmgr-plugin

Common conventions

All plugins are intentionally thin wrappers around the public API and follow the same conventions, so they can coexist on a single merchant account without colliding:
  • extra carries the platform invoice / order ID for checkout flows, and the client / account ID for top‑up flows.
  • metadata.source is set to whmcs, woocommerce, or billmanager.
  • metadata.flow is checkout or topup.
  • Checkout and top‑up always use separate notify_url endpoints, so a single PawPayments callback URL setting on the merchant side is not required.
  • Currency and network selection happens entirely on the PawPayments paywall — the plugins never need to know which assets are enabled for the merchant.

Webhook handling

Every plugin verifies the X-Paw-Signature header (HMAC‑SHA256 of the raw body, keyed with the merchant’s API key). Webhooks that carry a permanent_address_id field — i.e. deposits to long‑lived addresses, not to a one‑shot invoice — are silently acknowledged with 200 OK and never produce duplicate orders or credits. Permanent‑address flows belong to your own backend integration, not to a checkout plugin.

Idempotency

Each plugin protects against double‑credit on webhook retries:
  • WooCommercepayment_complete() is natively idempotent; the order can only transition out of on-hold once.
  • WHMCS — checkout uses addInvoicePayment’s transactionId deduplication; top‑up uses a small mod_pawpayments_credits table keyed by order_id.
  • BillManager — checkout reads payment status before calling payment.setpaid; top‑up checks externalid before issuing a new payment.