Developers
Two calls to your first payment
Create a payment, redirect the customer, listen for the webhook. That is the whole integration for most shops. The rest of this page is for when you want more control.
Quickstart
Create a payment
Authenticate with your secret key, post an amount and a reference, and redirect the customer to the checkout URL in the response. Use the sandbox key while you build; it behaves exactly like production and pays with test coins.
{
"id": "pay_7F3K92QX",
"status": "awaiting_payment",
"checkout_url": "https://pay.plutuscrypto.com/c/7F3K92QX",
"amount": { "value": "189.00", "currency": "EUR" },
"expires_at": "2026-09-09T14:37:08Z",
"quotes": [
{ "asset": "BTC", "network": "bitcoin", "amount": "0.00323519",
"address": "bc1q…" },
{ "asset": "USDT", "network": "tron", "amount": "205.43",
"address": "T…" }
]
}
pk_test / sk_test and pk_live / sk_live. The secret key goes in the Authorization header as Basic auth and never in a browser. Scope keys to payments, payouts or read only from the dashboard.Reference
Endpoints
Base URL https://api.plutuscrypto.com. JSON in, JSON out, amounts as strings to keep decimals exact. Every mutating call accepts an Idempotency-Key header so a retry never creates a second payment.
Webhooks
Signed, retried, replayable
Register a URL and we post every event to it as JSON. Each delivery carries a timestamp and an HMAC signature over the raw body, so you can reject anything we did not send. Failed deliveries retry with backoff for 24 hours, and you can replay any event from the dashboard or the events endpoint.
const crypto = require("crypto");
function verify(rawBody, headers, secret) {
const ts = headers["plutus-timestamp"];
const sig = headers["plutus-signature"];
const mac = crypto.createHmac("sha256", secret)
.update(ts + "." + rawBody)
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - ts) < 300;
return fresh && crypto.timingSafeEqual(
Buffer.from(mac), Buffer.from(sig));
}
Errors
When something is wrong
Errors come back with a status, a stable code you can branch on, and a message written for a human. Validation errors name the field.
{
"error": {
"code": "below_minimum",
"message": "Amount 0.40 EUR is below the
minimum of 1.00 EUR for USDT on tron.",
"field": "amount",
"request_id": "req_9c1e2b"
}
}
SDKs and plugins
Or write nothing at all
Official SDKs
Thin wrappers over the REST API that handle auth, retries and idempotency keys for you.
npm install @plutuscrypto/node
pip install plutuscrypto
composer require plutuscrypto/sdk
gem install plutuscrypto
go get github.com/plutuscrypto/goShop plugins
Install, paste two keys, done. Each plugin adds crypto as a payment method next to the ones you have and writes the status back to the order.
Get a sandbox key
Request access and you will have keys the same day. Bring a question and a real engineer answers it.