{"x402Version":2,"service":"svm402-service","description":"The Solana x402 Payment Lab — discoverable paid micro-payment routes (settle-by-example ping, an anything-mirror echo, on-chain settlement receipts) plus 17 deterministic failure scenarios on the REAL x402 v2 money path: challenges, verify, settle, receipts and single-use retry credentials, all settled in integer USDC base units.","seller_wallet":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","usdc_mint":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","resources":[{"url":"https://lab-devnet.svm402.com/v1/ping","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":true,"description":"The smallest paid lab call — one request proves the WHOLE x402 v2 round trip: the 402 challenge, your signed exact-scheme USDC transfer, the facilitator verify + settle, and a 200 whose payment block carries the payer, the settled amount (integer USDC base units), the transaction hash, the explorer link, the facilitator name and fee payer, plus verify/settle timings.","scheme":"exact","amount":"1000","payTo":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","maxTimeoutSeconds":300,"extra":{"feePayer":"AnHq6oGRcsbEGNvQjWbP9ZU2zp2vcwCVwR73KxU8Sh9P"}},{"url":"https://lab-devnet.svm402.com/v1/echo","method":"POST","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":true,"description":"Paid mirror for client debugging: after your payment settles the response echoes exactly what the gateway received — HTTP method, path, the RAW query string, the parsed JSON body (≤ 16 KB; a bigger body 413s BEFORE any settle), sha256 over the raw bytes and an allowlisted headers_seen where the payment header is redacted (its decoded form rides payment.tx_facts) and authorization/cookie never appear.","scheme":"exact","amount":"1000","payTo":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","maxTimeoutSeconds":300,"extra":{"feePayer":"AnHq6oGRcsbEGNvQjWbP9ZU2zp2vcwCVwR73KxU8Sh9P"}},{"url":"https://lab-devnet.svm402.com/v1/echo","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":true,"description":"The GET twin of the paid echo: same price, same settlement, body null; the RAW query (?a=1&b=two) and the header allowlist mirror exactly like the POST.","scheme":"exact","amount":"1000","payTo":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","maxTimeoutSeconds":300,"extra":{"feePayer":"AnHq6oGRcsbEGNvQjWbP9ZU2zp2vcwCVwR73KxU8Sh9P"}},{"url":"https://lab-devnet.svm402.com/v1/scenarios","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":false,"description":"The free scenario engine manifest (#248): each walk's name, method, per-network price (integer USDC base units), whether it settles, its mainnet policy (yes / opt-in / devnet-only), its params, the expected status sequence and the live lab store metrics (issued / redeemed / expired / charged_unserved). Never charged, never settles."},{"url":"https://lab-devnet.svm402.com/v1/scenario/{name}","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":true,"description":"One #248 fault walk (17 deterministic machines: ok — a clean serve; slow — a slowed serve (the sleep is real, the decision is clock-free); verify_reject — a verify-time rejection (a fresh challenge, nothing settled); retryable_503_before_settle — a retryable 503 after verify, BEFORE settle; price_change — a rotated price on the retry challenge; feepayer_rotation — a backup fee payer on the retry challenge; replay — replay protection (the settlement is real exactly once; a second send 402s); expired_blockhash — an expired-blockhash challenge (blockhash_expired + a fresh challenge); backend_error_after_settle — a settle, then a charged-and-unserved 502 with the retry credential (opt-in x-lab-accept-fault: 1); settled_503_retry_credential — a settle, then a 503 carrying the same retry credential (opt-in x-lab-accept-fault: 1); settle_timeout_then_confirm — a settle timeout whose late confirm completes the real settle; facilitator_down — a facilitator failover (the backup's challenge paid and served); drop_connection_after_settle — a socket drop after settle (the credential redeems free at the redeem lane) (devnet-only); method_mismatch — a method-mismatch gate (a paid GET 405s with Allow: POST before verify); oversized_challenge — an oversized-payment challenge whose PAYMENT-REQUIRED header is padded to a byte target (opt-in x-lab-opt-in-scenarios: 1; devnet-only); stalled_402 — a real 402 whose JSON body is padded to a byte target (optionally trickled chunk-by-chunk); misreported_reject — a bad seller's misreported status (503/500, or the unpaid 402 loop) BEFORE any verify). Every response a WALK STEP produced carries X-Lab-Scenario '<name>; step=<n>' — progress is per client id and monotonic (the first produced step is step=1); a refusal decided BEFORE any step runs (the mainnet devnet-only 404, the mainnet fault-opt-in 400, the devnet opt-in-gate 404) carries NO X-Lab-Scenario. Charged at the SAME per-network lab amount as the ping route; the charged-but-unserved faults auto-issue a single-use X-Retry-Settlement credential.","scheme":"exact","amount":"1000","payTo":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","maxTimeoutSeconds":300,"extra":{"feePayer":"AnHq6oGRcsbEGNvQjWbP9ZU2zp2vcwCVwR73KxU8Sh9P"}},{"url":"https://lab-devnet.svm402.com/v1/scenario/{name}","method":"POST","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":true,"description":"The POST spelling of the scenario walk — the SAME 17 deterministic machines the GET twin's description enumerates (that list is generated from the manifest), the same charge and the same credential semantics; method_mismatch answers 405 to a PAID GET and rides the money path on POST.","scheme":"exact","amount":"1000","payTo":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","maxTimeoutSeconds":300,"extra":{"feePayer":"AnHq6oGRcsbEGNvQjWbP9ZU2zp2vcwCVwR73KxU8Sh9P"}},{"url":"https://lab-devnet.svm402.com/v1/scenario/redeem","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":false,"description":"The free recovery lane (#248): ?client_id= (or X-Lab-Client-Id) serves a previously settled but unserved scenario charge ONCE — binding-first (exact path + body fingerprint + payer), single-use, outcome-closed; an unknown/expired/consumed credential answers 404 with the manifest pointer, never an error."},{"url":"https://lab-devnet.svm402.com/v1/scenario/redeem","method":"POST","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":false,"description":"The redeem lane answers any method (router.all); the POST spelling behaves exactly like the GET — free, single-use, binding-first."},{"url":"https://lab-devnet.svm402.com/v1/receipt/{signature}","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":true,"description":"The paid #250 receipt: ONE getTransaction through the shared lab RPC token bucket, cached by chain finality (finalized/failed forever, not_found/confirmed/processed 10 s). The body reports the chain status, slot, block time, fee lamports, fee payer (labeled — 'own' is the facilitator fee payer THIS gateway watches, per instance on every network; the exact closed enum rides the body), the FIRST USDC transfer matching your ?pay_to=&amount=&asset= query and per-check booleans; not_found is an honest 200. A drained bucket answers 503 BEFORE any 402; an RPC failure after the settle answers 503 WITH the live retry credential — never charged-and-unserved without a way back.","scheme":"exact","amount":"1000","payTo":"BpRUbDJ5NA9P4A93Ac4cdi5mXA2hnhxyUrqS2mwGv9kQ","asset":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU","maxTimeoutSeconds":300,"extra":{"feePayer":"AnHq6oGRcsbEGNvQjWbP9ZU2zp2vcwCVwR73KxU8Sh9P"}},{"url":"https://lab-devnet.svm402.com/v1/status","method":"GET","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":false,"description":"The free #250 status: every facilitator's probe health (last_probe_at, probe_ms_p50, the 3-failure breaker), the lab's 24 h settles / charged-unserved / open credentials (timestamped SQL), the OWN fee-payer balance (a background refresher — the route never calls RPC) and the 24 h ping p95. #299: the lab bag publishes the fee-payer IDENTITY this way — own_fee_payer is the watched wallet, facilitator_fee_payers is the trusted pool ([own, then the probed facilitators]) that decides a receipt's fee_payer_label ('own' = the wallet this gateway watches; re-checkable against this pool). The running image's build provenance (#300) rides the body — the same build object /health publishes: commit, commit_short, built_at, dirty; null fields = an image built without the provenance args. lab.store (#302) carries the settle store's durability facts — kind, whether the path is durably configured/mounted, the total settlement rows and the oldest row's age — never the absolute host path. data_age_ms is the OLDEST background datum's age; anything over the freshness window (or never sampled) answers 503 — never stale-as-fresh."},{"url":"https://lab-devnet.svm402.com/v1/diagnose","method":"POST","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","paid":false,"description":"The free #249 grader: 43 offline checks (envelope ↔ challenge ↔ wire — accepted-copy mismatches including the stale fee payer, the client's ed25519 signature over the exact message bytes, transferChecked semantics, compute-budget discipline, the optional memo tail, and since #294 the challenge's resource.url graded against the request_url you passed) then 4 ledger checks on at most two RPC calls (isBlockhashValid + one getMultipleAccounts). The verdict (ok | warnings | fail) IS the answer — 200 always; a budget refusal or RPC failure reports skipped with rpc.skipped:true, never a 5xx. 32 KB raw-byte 413; 30 runs/min/IP."}],"how_to_pay":"1. Call the endpoint — the 402 response carries a base64 PAYMENT-REQUIRED header with exact-scheme USDC requirements (resource, accepts). 2. Sign the transfer with an x402 v2 client (@x402/fetch + @x402/svm, AgentCash, or any x402 v2 wallet) — the facilitator is the fee payer, so the buyer needs USDC only. 3. Retry with PAYMENT-SIGNATURE; a served response carries a PAYMENT-RESPONSE receipt (mirrored as X-PAYMENT-RESPONSE). Charged but unserved? Re-send the SAME failed request with X-Retry-Settlement: <request id> for ONE free re-serve — the credential is single-use, valid only for the failed request (same path/body), and a served-200 is never replayable. Honor the settled 502's Retry-After: a slow facilitator's late confirm may already be recorded.","llms_txt":"https://lab-devnet.svm402.com/llms.txt","openapi":"https://lab-devnet.svm402.com/openapi.json"}