Everything you need to integrate cryptocurrency payments into your application.
The DESTROY.WTF API is a RESTful JSON API that lets you create cryptocurrency payment orders, check their status, and manage payments programmatically. All responses are JSON-encoded.
Create a $25 BTC payment order with a single command:
curl "https://destroy.wtf/api/order/create?api_key=YOUR_API_KEY&amount_usd=25.00&crypto_type=BTC"
All merchant API requests are authenticated using an API key. Generate your key from the Dashboard after creating an account. Pass the key as the api_key parameter in the request body (POST) or query string (GET).
// GET /api/order/create?api_key=550e8400-...&amount_usd=25.00&crypto_type=BTC { "api_key": "550e8400-e29b-41d4-a716-446655440000", "amount_usd": 25.00, "crypto_type": "BTC" }
Follow these steps to accept a cryptocurrency payment from start to finish.
Call POST /api/order/create with the USD amount, crypto type, and your API key. You'll receive a payment address and a hosted payment page URL.
Redirect the customer to the payment_gateway_url returned in the response, or display the payment address and amount directly in your own UI.
Call GET /api/order/status periodically to check when the payment is confirmed. Status progresses from PENDING to CONFIRMING to COMPLETED.
Once confirmed, funds are automatically forwarded to the payout address configured on your API key. The merchant_txid field will contain the payout transaction ID.
/api/order/status to detect payment completion. The return_url parameter is a client-side link shown on the payment page for the customer to navigate back to your site.Creates a new cryptocurrency payment order. Also accepts GET with query parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Required | Your API key (UUID v4 format) |
| amount_usd | float | Required | Invoice amount in USD. Min 0.50, max 2000 |
| crypto_type | string | Optional | Cryptocurrency to accept. Default: LTC |
| return_url | string | Optional | URL displayed on the payment page for the customer to return to your site after paying |
// curl "https://destroy.wtf/api/order/create?api_key=YOUR_API_KEY&amount_usd=50.00&crypto_type=BTC" { "success": true, "order_id": "550e8400-e29b-41d4-a716-446655440000", "crypto_type": "BTC", "amount_usd": 50.00, "crypto_amount": "0.0005123400", "crypto_price": 97591.23, "crypto_address": "bc1q...example", "payment_gateway_url": "https://destroy.wtf/pay/550e8400-...", "created_at": "2026-02-17T12:00:00.000000+00:00", "expire_time": "2026-02-17T14:00:00.000000+00:00", "return_url": "https://your.shop/thankyou", "destination_tag": 123456 // XRP only }
| Field | Type | Description |
|---|---|---|
| order_id | string | Unique order identifier (UUID v4) |
| crypto_amount | string | Amount the customer must send, formatted to 10 decimal places |
| crypto_price | float | USD price of the crypto at order creation |
| crypto_address | string | Blockchain address to send payment to |
| payment_gateway_url | string | Hosted payment page URL — redirect customers here |
| expire_time | string | ISO-8601 UTC timestamp, 2 hours after creation |
| destination_tag | int | XRP only. Customer must include this tag in their payment |
Retrieves the current status and details of an order. No authentication required. Also accepts POST with JSON body.
| Parameter | Type | Required | Description |
|---|---|---|---|
| order_id | string | Required | The order UUID to look up |
// curl "https://destroy.wtf/api/order/status?order_id=ORDER_ID" { "success": true, "order_id": "550e8400-e29b-41d4-a716-446655440000", "crypto_type": "BTC", "amount_usd": 50.00, "crypto_amount": "0.0005123400", "crypto_price": 97591.23, "crypto_address": "bc1q...example", "paid": false, "tx_id": "N/A", "created_at": "2026-02-17T12:00:00.000000+00:00", "expire_time": "2026-02-17T14:00:00.000000+00:00", "status": "PENDING", "withdrawn": false, "merchant_txid": null, "return_url": "https://your.shop/thankyou", "paid_usd": 0.00, "destination_tag": 123456 // XRP only }
| Field | Type | Description |
|---|---|---|
| paid | bool | Whether the order has been fully paid |
| tx_id | string | Incoming transaction IDs (comma-separated), or "N/A" |
| status | string | Current order status (see Order Statuses) |
| withdrawn | bool | Whether payout to merchant has been sent |
| merchant_txid | string|null | Payout transaction ID once funds are sent |
| paid_usd | float | Actual USD value received based on crypto received |
Changes the cryptocurrency type for an existing unpaid order. A new payment address is generated and the crypto amount is recalculated at the current price. The USD amount remains unchanged.
| Parameter | Type | Required | Description |
|---|---|---|---|
| order_id | string | Required | The order UUID to update |
| crypto_type | string | Required | New cryptocurrency type to switch to |
| api_key | string | Optional | Your API key. If provided, must match the order's key |
// curl "https://destroy.wtf/api/order/update?order_id=ORDER_ID&crypto_type=ETH&api_key=YOUR_API_KEY" { "success": true, "message": "Order updated successfully", "order_id": "550e8400-...", "crypto_type": "ETH", "crypto_amount": "0.0152340000", "crypto_price": 3282.45, "crypto_address": "0xabc...example", // ... full order fields }
paid_usd > 0) cannot be updated. The old payment address is replaced — any funds sent to the previous address after the update will still be detected but the order now expects the new crypto type.Cancels a pending order. Only works if no payment has been received yet. Also accepts GET with query parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| order_id | string | Required | The order UUID to cancel |
| api_key | string | Required | Your API key (must own the order) |
// curl "https://destroy.wtf/api/order/cancel?api_key=YOUR_API_KEY&order_id=ORDER_ID" { "success": true, "message": "Order cancelled successfully", "order_id": "550e8400-...", "status": "CANCELED", // ... full order fields }
Returns all supported cryptocurrencies with their current USD prices. Optionally filter by API key to see which cryptos are available for that key.
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Optional | If provided, filters to only cryptos configured for this API key |
// curl "https://destroy.wtf/api/crypto" { "success": true, "supported": { "BTC": 97591.23, "ETH": 3282.45, "LTC": 128.45, "SOL": 195.67, // ... all configured cryptos } }
An order progresses through these statuses during its lifecycle. A payment is considered sufficient when it reaches at least 94% of the expected crypto amount.
| Status | Description |
|---|---|
PENDING |
Order created, awaiting payment from the customer |
PARTIAL PAYMENT |
Payment received but below the 94% threshold of the expected amount |
CONFIRMING |
Payment at or above the threshold detected, awaiting blockchain confirmation |
COMPLETED |
Payment fully confirmed. Payout to merchant will be processed automatically |
CANCELED |
Order was cancelled via API or admin action. Only possible before payment |
COMPLETED, the gateway automatically processes payouts. Check the withdrawn and merchant_txid fields to confirm the payout was sent.All error responses follow a consistent format. The HTTP status code will be 200 for business-logic errors (invalid parameters, not found) or 429 for rate limiting.
{
"success": false,
"error": "Human-readable error message"
}
| Error | Cause |
|---|---|
| "No api_key" | The api_key parameter is missing or empty |
| "Invalid api_key" | API key format is invalid or the key does not exist |
| "Invalid order ID" | The order_id is not a valid UUID v4 |
| "Order not found" | No order exists with the given ID |
| "Unsupported cryptocurrency" | The requested crypto_type is not recognized |
| "Unauthorized: api_key does not own this order" | The API key provided does not match the order's key |
| "Amount must be between 0.5 and 2000 USD" | The amount_usd is outside the allowed range |
| "Crypto price not available" | Price data has not been fetched yet for this crypto |
| "Rate limit exceeded" | Too many requests — HTTP 429 (see Rate Limits) |
The API enforces rate limits per IP address to protect against abuse.
CF-Connecting-IP header. Implement exponential backoff in your polling logic to stay within limits.Complete examples to create an order and poll for payment status.
import requests, time API_KEY = "your-api-key" BASE_URL = "https://destroy.wtf" # 1. Create an order resp = requests.post(f"{BASE_URL}/api/order/create", json={ "api_key": API_KEY, "amount_usd": 25.00, "crypto_type": "BTC", "return_url": "https://your.shop/success" }).json() order_id = resp["order_id"] print(f"Pay: {resp['payment_gateway_url']}") # 2. Poll until completed while True: status = requests.get( f"{BASE_URL}/api/order/status", params={"order_id": order_id} ).json() print(f"Status: {status['status']}") if status["status"] == "COMPLETED": print(f"Paid! TX: {status['tx_id']}") break if status["status"] == "CANCELED": print("Order was cancelled.") break time.sleep(15)
# Create an order curl -X POST https://destroy.wtf/api/order/create \ -H "Content-Type: application/json" \ -d '{ "api_key": "your-api-key", "amount_usd": 25.00, "crypto_type": "BTC" }' # Check order status curl "https://destroy.wtf/api/order/status?order_id=ORDER_ID_HERE" # Cancel an order curl -X POST https://destroy.wtf/api/order/cancel \ -H "Content-Type: application/json" \ -d '{ "api_key": "your-api-key", "order_id": "ORDER_ID_HERE" }'
const BASE_URL = "https://destroy.wtf"; const API_KEY = "your-api-key"; // Create an order const res = await fetch(`${BASE_URL}/api/order/create`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ api_key: API_KEY, amount_usd: 25.00, crypto_type: "BTC", return_url: "https://your.shop/success" }) }); const order = await res.json(); console.log("Payment URL:", order.payment_gateway_url); // Poll for status const check = await fetch( `${BASE_URL}/api/order/status?order_id=${order.order_id}` ); const status = await check.json(); console.log("Status:", status.status);