Plutus Crypto

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.

14endpoints
12webhook events
5official SDKs
1:1sandbox to production

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.

Response
{
  "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…" }
  ]
}
Keys. Two pairs per account, 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.

MethodPathWhat it does

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.

Delivery: payment.confirmed
Verify the signature, Node
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));
}
EventFires when

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.

StatusCodeMeaning
Error body
{
  "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/go

Shop 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.

WooCommerceMagento 2 PrestaShopOpenCart Drupal CommerceShopware Hosted page for anything else
Sandbox. The live demo is the same checkout your sandbox key will produce. Test coins are free from the dashboard faucet, and sandbox webhooks fire exactly like production ones.

Get a sandbox key

Request access and you will have keys the same day. Bring a question and a real engineer answers it.