Developer API
Reference
Integrate compute token trading and USDC payments directly into your applications. Built on Solana — near-zero fees, sub-second settlement.
Quick Start
Three calls to your first USDC payment. No SDK needed — plain HTTP.
Create a payment request
POST to /api/payments/solana/create with an amount. You'll get back a reference key and a url you can encode as a QR code.
curl -X POST https://computevaultos.polsia.app/api/payments/solana/create \ -H "Content-Type: application/json" \ -d '{"amount": 9.99, "label": "H100 × 4hrs", "message": "Compute token purchase"}'
User pays with any Solana wallet
Display the url as a QR code or deep-link. Phantom, Solflare, and any Solana Pay–compatible wallet will parse it automatically. The user approves in <5 seconds.
{ "success": true, "payment": { "paymentId": "pay_a1b2c3d4", "reference": "3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs", "url": "solana:... ← encode as QR", "amount": 9.99, "status": "pending" } }
Verify on-chain and fulfill
Poll /api/payments/solana/:reference every 2 seconds. Once status is confirmed, the payment is finalized and you can release compute.
curl https://computevaultos.polsia.app/api/payments/solana/3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs
Base URL
All endpoints are HTTPS. No versioning prefix — breaking changes are additive only.
Token Prices
Live spot prices for tokenized GPU compute, denominated in USDC per GPU-hour.
| Asset | Symbol | Price / hr | Description |
|---|---|---|---|
| NVIDIA H100 SXM5 | H100 | $2.50 | 80GB HBM3, highest throughput |
| NVIDIA A100 | A100 | $1.20 | 40GB / 80GB HBM2e |
| NVIDIA V100 | V100 | $0.45 | 16GB / 32GB HBM2 |
| NVIDIA RTX 4090 | RTX4090 | $0.85 | 24GB GDDR6X, consumer |
| AMD EPYC 9654 | EPYC | $0.15 | 96-core CPU, 384GB RAM |
Payments API
USDC payments on Solana via the Solana Pay protocol. Wallets scan a QR or deep-link and approve in their native app.
Creates a new USDC payment request. Returns a Solana Pay URL and a reference key you use to track status. Single payments are capped at 10,000 USDC.
| Field | Type | Required | Description |
|---|---|---|---|
| amount | number | required | USDC amount. Must be positive. Max 10,000. |
| label | string | optional | Short label shown in the wallet UI (e.g. "H100 × 4hrs"). |
| message | string | optional | Human-readable description of the payment. |
| memo | string | optional | On-chain memo string. Max 32 characters. |
| userId | string | optional | Your internal user ID — stored for reconciliation. |
| metadata | object | optional | Arbitrary JSON. Useful for order IDs, product SKUs, etc. |
curl -X POST https://computevaultos.polsia.app/api/payments/solana/create \ -H "Content-Type: application/json" \ -d '{ "amount": 25.00, "label": "H100 × 10hrs", "message": "Compute token purchase", "memo": "order_8827", "userId": "usr_abc123", "metadata": { "asset": "H100", "hours": 10 } }'
const response = await fetch('https://computevaultos.polsia.app/api/payments/solana/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ amount: 25.00, label: 'H100 × 10hrs', message: 'Compute token purchase', memo: 'order_8827', userId: 'usr_abc123', metadata: { asset: 'H100', hours: 10 } }) }); const { payment } = await response.json(); console.log(payment.reference); // base58 key to track this payment console.log(payment.url); // encode as QR or use as deep-link
import requests resp = requests.post( "https://computevaultos.polsia.app/api/payments/solana/create", json={ "amount": 25.00, "label": "H100 × 10hrs", "message": "Compute token purchase", "memo": "order_8827", "userId": "usr_abc123", "metadata": {"asset": "H100", "hours": 10} } ) payment = resp.json()["payment"] print(payment["reference"]) # base58 key print(payment["url"]) # Solana Pay URL
{ "success": true, "payment": { "paymentId": "pay_a1b2c3d4e5f6", "reference": "3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs", "url": "solana:9xKXF...?amount=25&spl-token=Gh9Z...&reference=3FZb...&label=H100+%C3%974hrs", "amount": 25.00, "status": "pending", "expiresAt": "2026-04-03T01:34:34Z", "createdAt": "2026-04-03T01:04:34Z" } }
Queries the Solana blockchain for a transaction matching this payment's reference. Validates amount, recipient, and token. Updates payment status in the database. Call this once the user reports they've sent payment, or on a short poll.
| Field | Type | Required | Description |
|---|---|---|---|
| reference | string | required | Base58 reference key from the /create response. |
| Status | Meaning |
|---|---|
| pending | Transaction not yet found on-chain. Keep polling. |
| confirmed | Transfer validated — amount, recipient, and token all match. Safe to release compute. |
| expired | Payment window elapsed without a matching transaction. |
| failed | Transaction found but validation failed (wrong amount, wrong token, etc.). |
curl -X POST https://computevaultos.polsia.app/api/payments/solana/verify \ -H "Content-Type: application/json" \ -d '{"reference": "3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs"}'
// Poll until confirmed or expired async function waitForPayment(reference) { let attempts = 0; while (attempts < 60) { const res = await fetch( `https://computevaultos.polsia.app/api/payments/solana/${reference}` ); const { payment } = await res.json(); if (payment.status === 'confirmed') return payment; if (payment.status === 'expired') throw new Error('Payment expired'); await new Promise(r => setTimeout(r, 2000)); // wait 2s attempts++; } throw new Error('Timed out waiting for payment'); }
import requests, time def verify_payment(reference): resp = requests.post( "https://computevaultos.polsia.app/api/payments/solana/verify", json={"reference": reference} ) return resp.json()["payment"] # Poll until confirmed for _ in range(60): payment = verify_payment(reference) if payment["status"] == "confirmed": print("✓ Payment confirmed!", payment["transactionSignature"]) break print(f"Status: {payment['status']}") time.sleep(2)
{ "success": true, "payment": { "paymentId": "pay_a1b2c3d4e5f6", "reference": "3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs", "status": "confirmed", "transactionSignature": "5KtPn1LGuxhFiwjxErkxTbfC...", "amount": 25.00, "confirmedAt": "2026-04-03T01:06:01Z" } }
Returns the current status of a payment from the database — does not re-query the blockchain. Use this for fast client-side polling. Use /verify to trigger an on-chain check.
| Parameter | Type | Description |
|---|---|---|
| reference | string | Base58 reference key from the /create response. |
curl https://computevaultos.polsia.app/api/payments/solana/3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs
const ref = '3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs'; const res = await fetch(`https://computevaultos.polsia.app/api/payments/solana/${ref}`); const { payment } = await res.json(); console.log(payment.status); // "pending" | "confirmed" | "expired" | "failed"
import requests ref = "3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs" resp = requests.get( f"https://computevaultos.polsia.app/api/payments/solana/{ref}" ) print(resp.json()["payment"]["status"])
{ "success": true, "payment": { "paymentId": "pay_a1b2c3d4e5f6", "reference": "3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5ms1Vt3Nwhs", "status": "confirmed", "amount": 25.00, "createdAt": "2026-04-03T01:04:34Z", "confirmedAt": "2026-04-03T01:06:01Z" } }
Error Codes
All errors return success: false with a human-readable message.
| HTTP Status | When it occurs | Example message |
|---|---|---|
| 400 | Invalid request params (missing amount, bad reference format, memo too long) | "amount is required and must be a positive number" |
| 404 | Payment reference not found in the database | "Payment not found" |
| 503 | Payment service not configured (missing SOLANA_RECIPIENT env var) | "Payment service not configured. Contact support." |
| 500 | Unexpected server error | "Failed to create payment request" |