x402 conformance status: api.loyalspark.online
api.loyalspark.online reads WEAK 22/23 on the scheduled run of 2026-10-27T02:33:32.169Z (checker inventory 1.9.0). Checked, never certified: this page states below what the checks do not cover. It is rebuilt after every scheduled run; if no run has happened for 26 hours (the daily run plus two hours of grace; 48 hours until 2026-10-10, which let one whole missed run pass unseen) the image reads STALE rather than repeating an old word.
Operate this endpoint? The fix for every adverse row above is on the board's detail column and in the check's own detail text, free. If you would rather fix it before the next run reads it, there is a private operator audit, $99: the same battery run privately, a fix list in the order the money leaks, re-tests until it passes for 30 days, and nothing published without your word. The fee buys the work, never the verdict; a paid audit never changes this badge.
GET https://api.loyalspark.online/x402-gateway/analytics — WEAK 22/23 checks
| verdict | check | detail |
|---|---|---|
| PASS | client_fingerprint_parity | all 5 probed User-Agents get the same 402 as the baseline (a User-Agent comparison from one network seat, not a client fingerprint) |
| WEAK | discovery_docs_parity | the default client reads /.well-known/x402, /openapi.json but /.well-known/x402 as Python-urllib/3.12 -> 403; /.well-known/x402 as libwww-perl/6.68 -> 403; /openapi.json as Python-urllib/3.12 -> 403; /openapi.json as libwww-perl/6.68 -> 403 — those clients cannot read where this door is advertised |
| PASS | body_envelope_complete | body carries x402Version + resource beside `accepts` |
| PASS | accepts0_payable | accepts[0] is exact/eip155:8453 — payable by a client that takes the first option |
| PASS | accepts_all_executable | all 1 advertised option(s) are executable |
| PASS | header_body_agree | header and body advertise the same payment options |
| PASS | plaintext_envelope_refused | plaintext redirects 308 to https://api.loyalspark.online/x402-gateway/analytics before any terms are served |
| PASS | no_payment | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | header_not_base64_json | 401 Missing API key. Send x-api-key: lsk_... or Authorization: Bearer lsk_... together with the payment. This route needs a merchant lsk_ key. The request is not charged. Read credential: POST https://api.loyalspark.online/x402-gateway/register-agent ($0.01 USDC, scope read only, cannot mint). It is not a free quota. Write key: POST https://api.loyalspark.online/agent-register-siwe after SIWE (statement Register Loyal Spark merchant agent) only with a Shopify store plan or paid Pro/Enterprise; otherwise error_code payment_required next_action pay_x402. Guide: https://loyalspark.online/.well-known/skills/00-getting-started.md |
| PASS | garbage_payload | 401 Missing API key. Send x-api-key: lsk_... or Authorization: Bearer lsk_... together with the payment. This route needs a merchant lsk_ key. The request is not charged. Read credential: POST https://api.loyalspark.online/x402-gateway/register-agent ($0.01 USDC, scope read only, cannot mint). It is not a free quota. Write key: POST https://api.loyalspark.online/agent-register-siwe after SIWE (statement Register Loyal Spark merchant agent) only with a Shopify store plan or paid Pro/Enterprise; otherwise error_code payment_required next_action pay_x402. Guide: https://loyalspark.online/.well-known/skills/00-getting-started.md |
| PASS | bad_signature | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | wrong_signer | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | wrong_amount_underpay | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | wrong_destination | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | expired_authorization | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | not_yet_valid | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | wrong_chain_domain | 402 X-PAYMENT header is required. Payment alone works: the paying wallet is the caller. An API key is optional. |
| PASS | payTo_not_zero_address | payTo 0x40a8CdD6… |
| PASS | asset_contract_exists | asset has contract code |
| PASS | asset_supports_eip3009 | authorizationState() answers — EIP-3009 present |
| PASS | payTo_not_blacklisted | isBlacklisted(payTo) is false |
| PASS | asset_is_canonical | asset is canonical USDC on base |
| PASS | payTo_account_type | payTo is an externally-owned account |
Verdict changes on record
What this does not cover
The checker tests spec-normative x402 requirements on the rejection path (the 402, its payment terms, the receiving rail's on-chain liveness, client-fingerprint parity, plaintext exposure) and performs no live paid settlement. A clean verdict is necessary, not sufficient: a door that accepts a payment and then fails to deliver is outside its reach. Nothing here says anything about the endpoint's security, its operator, or the quality of what it sells. Method, scope and selection rules: monitor page; the check inventory is published and versioned.
Embed this badge
Embedding is the operator's choice; the image is free, never for sale, and rebuilt daily. Serve it from here (do not copy the file) so it can go STALE honestly. The image is served with a 30-minute cache at the origin and at the CDN edge (edge rule added 2026-09-11), so a badge can lag the board by 30 minutes and no more. Markdown:
[](https://coppice-ai.com/badge/api.loyalspark.online.html)
HTML:
<a href="https://coppice-ai.com/badge/api.loyalspark.online.html"><img src="https://coppice-ai.com/badge/api.loyalspark.online.svg" alt="x402 conformance status for api.loyalspark.online" height="20"></a>