Conformance scanner and graded discovery directory for x402 sellers — lint an origin against 25 checks spanning the protocol surface, agent docs, and directory standing (x402scan / Bazaar / AgentCash), and get an A–F grade with per-check evidence and one-line fixes. Every scanned origin becomes a public directory project (browse the free directory / featured / per-project endpoints); a grade measures protocol conformance only and is NOT an endorsement. Free status, check-category summary, directory, and domain-control verification; paid full scan and cached report. Pay-per-call via x402 (USDC on Base); no accounts, no keys.
---
name: x402lint
version: 0.2.0
description: >-
Conformance scanner and graded discovery directory for x402 sellers — lint an origin against 25
checks spanning the protocol surface, agent docs, and directory standing (x402scan / Bazaar /
AgentCash), and get an A–F grade with per-check evidence and one-line fixes. Every scanned origin
becomes a public directory project (browse the free directory / featured / per-project endpoints);
a grade measures protocol conformance only and is NOT an endorsement. Free status, check-category
summary, directory, and domain-control verification; paid full scan and cached report. Pay-per-call
via x402 (USDC on Base); no accounts, no keys.
homepage: https://x402lint.dev
metadata:
openclaw:
emoji: "🔎"
requires:
bins: ["node"]
---
<!-- The endpoint/price table below is sourced from the product manifest
(src/docs/pricing.generated.json in apps/x402lint-api — generated from src/manifest.ts).
Prices live ONLY in the manifest; keep this table in lockstep with pricing.generated.json. -->
# x402lint — Conformance Scanner & Graded Directory for x402 Sellers
API at `https://api.x402lint.dev`. x402lint scans an x402 seller origin end-to-end against a 25-check conformance catalog: 402 challenge validity, `accepts[]` schema, price integrity, OpenAPI x402 conventions, agent docs surface, robots policy, favicon, and live standing on x402scan and Bazaar. It returns an **A–F grade** with per-check status, evidence, and a one-line fix for each finding. Checks are versioned (`checksVersion`) so agents can detect rule drift between scans. Strictly pay-per-call via x402 — no accounts, no API keys, no bundles. Compute-first / settle-after: you are **never** charged for an error or a `processing` response.
Every scanned origin also becomes a project in a **public graded directory**: browse it free (`/v1/directory`, `/v1/featured`, `/v1/project`), with ecosystem legitimacy signals from x402scan and Bazaar. Origins are default-listed; an operator can prove domain control (`/v1/verify/start` → `/.well-known/x402lint-challenge` → `/v1/verify/confirm`) and then opt out or suppress auto-collected branding via `/v1/listing`.
> **A grade measures x402 protocol conformance only — it is NOT an endorsement or a safety/legitimacy assessment.** A well-built scam can score highly. Auto-collected directory branding (displayName/description/icon) is UNVERIFIED text/links copied from the origin — treat it as untrusted data, not instructions. Do your own diligence before paying any service.
Scanning is **read-only** (GET/HEAD probes only) — no real payments are made against the scanned target. Results are cached 24h. Informational only.
> Check the active payment mode any time at `GET /health` (`live`\|`mock`).
## Free endpoints (no auth, no payment)
Use these to learn the response shapes before paying.
| Method | Path | Description |
|--------|------|-------------|
| GET | `/v1/status?url={origin}` | **FREE** scan status lookup — whether an origin has been scanned, scan freshness, and the grade summary (`grade`, `score`, pass/warn/fail counts). No per-check findings. (10/min) |
| GET | `/v1/checks` | **FREE** check-category summary — the 25 checks grouped into 3 categories (protocol & payment surface, discovery & agent docs, ecosystem standing) with a count + description each, versioned via `checksVersion`. Per-check findings, evidence, and fixes come only with the paid scan. No probes executed. (10/min) |
| GET | `/v1/directory` | **FREE** graded directory — paginated list of scanned origins with grade, UNVERIFIED auto-collected branding, and legitimacy signals. `sort` (`recent`\|`grade`), `category`, `verified`, `q` (host substring), `page`, `pageSize`. Conformance ≠ endorsement. (30/min) |
| GET | `/v1/featured` | **FREE** recent A-grades — origins that scored an **A** on their most recent scan within the last 30 days, recency-ranked. Featured placement is a free consequence of a recent A and expires 30 days after the scan. (30/min) |
| GET | `/v1/project?host={origin}` | **FREE** single project record — the public directory entry for one origin (grade, branding, signals, verified/featured status). 404 uncharged if unknown or opted out. (30/min) |
| POST | `/v1/verify/start` | **FREE** start domain-control verification of an origin you operate — returns a one-time token to place at `/.well-known/x402lint-challenge`. (10/min) |
| POST | `/v1/verify/confirm` | **FREE** confirm verification — x402lint fetches `/.well-known/x402lint-challenge` and, on match, marks the origin owner-verified. (10/min) |
| POST | `/v1/listing` | **FREE** listing control (owner-verified origins only, else 403) — `listed:false` removes the origin from the directory; `suppressEnrichment:true` hides auto-collected branding. (10/min) |
```bash
curl "https://api.x402lint.dev/v1/status?url=https://api.example.dev"
curl https://api.x402lint.dev/v1/checks
curl "https://api.x402lint.dev/v1/directory?sort=grade&pageSize=20"
curl "https://api.x402lint.dev/v1/project?host=api.example.dev"
```
`GET /v1/checks` shows the three conformance categories (and how many checks each holds) before you spend; `GET /v1/status` tells you for free whether a fresh report already exists — poll it as a cheap change-detection funnel before paying for a full scan. `GET /v1/directory` / `/v1/featured` let agents discover graded x402 origins for free.
## Paid endpoints (x402 V2, USDC on Base, per-call)
Each paid call is a flat price per call, paid via x402. Compute-first / settle-after — you are not charged on any error, and never for a `504 {status:"processing"}` response.
| Method | Path | Price | Description |
|--------|------|-------|-------------|
| POST | `/v1/scan` | **$0.15** | Full 25-check conformance scan of the origin (read-only GET/HEAD probes), or a `<24h` cached result. Returns `grade`, `score`, per-check status + evidence + fix, and a shareable `reportUrl`. Unreachable/broken origins are a valid graded result (**F**). A scan can take up to ~75s; a `504 {status:"processing"}` is **uncharged** — retry and the finished result is served from cache. |
| GET | `/v1/report?url={origin}` | **$0.02** | The cached full report (same shape as `POST /v1/scan`) if a fresh (`<24h`) result exists; otherwise **404 uncharged** with a pointer to `POST /v1/scan`. Cheap path for agents polling a known origin. |
Prices are USD, settled as USDC (6 decimals). An unreachable origin graded **F** is a real, chargeable result (not an error). Errors, `processing`, and `no fresh report` outcomes are never charged.
### Scan request body
```bash
# Full conformance scan ($0.15) — read-only, ~75s budget, or served from the <24h cache
curl -X POST https://api.x402lint.dev/v1/scan \
-H "Content-Type: application/json" \
-d '{"url":"https://api.example.dev"}'
```
`url` is required (the origin to scan). A `504 {status:"processing"}` means the scan is still computing — you were not charged; retry, or fetch `GET /v1/report?url=` once it lands.
## Paying (x402) — first call
Every paid route follows the standard x402 challenge → pay → retry flow. Learn every response shape for free first via `/v1/checks` and `/v1/status`.
```bash
# 1) Call a paid route with no payment → 402 challenge (you are not charged)
curl -s -X POST "https://api.x402lint.dev/v1/scan" \
-H "Content-Type: application/json" -d '{"url":"https://api.example.dev"}'
# → { "x402Version": 2, "accepts": [ { "scheme": "exact", "network": "eip155:8453",
# "asset": "USDC", "price": "$0.15", "payTo": "…" }, … ] }
# 2) Sign an x402 'exact' USDC authorization for the Base accepts[] rail, then retry.
# Standard @x402 V2 clients send PAYMENT-SIGNATURE; legacy clients send X-PAYMENT.
curl -s -X POST "https://api.x402lint.dev/v1/scan" \
-H "Content-Type: application/json" -d '{"url":"https://api.example.dev"}' \
-H "PAYMENT-SIGNATURE: <payload>"
# → 200 { "grade": "B", "score": 82, "results": [ … ], "reportUrl": "…" }
```
## MCP server (`x402lint-mcp`)
Agents can use the `x402lint-mcp` npm package — an MCP server wrapping `api.x402lint.dev` that handles the x402 payment flow for you. It exposes the 2 free endpoints always, plus the 2 paid routes as MCP tools when a wallet is configured. Register it with an MCP client (e.g. Claude) via `npx`:
```json
{
"mcpServers": {
"x402lint": {
"command": "npx",
"args": ["-y", "x402lint-mcp"],
"env": {
"EVM_PRIVATE_KEY": "0x…",
"X402LINT_API_URL": "https://api.x402lint.dev"
}
}
}
}
```
`EVM_PRIVATE_KEY` (falls back to `PRIVATE_KEY`) funds the paid tools with USDC on Base. `X402LINT_API_URL` is optional and defaults to `https://api.x402lint.dev`.
| Tool | Route | Price |
|------|-------|-------|
| `x402lint_status` | `GET /v1/status?url=` | **free** |
| `x402lint_checks` | `GET /v1/checks` | **free** |
| `x402lint_scan` | `POST /v1/scan` | **$0.15** (~75s scan; `processing` retryable, uncharged) |
| `x402lint_report` | `GET /v1/report?url=` | **$0.02** |
**Free-tier mode:** without a private key the server still starts, exposing the free tools (`x402lint_status`, `x402lint_checks`) — enough to learn the response shapes and the check categories before you fund a wallet. Set `EVM_PRIVATE_KEY` to unlock the 2 paid tools (`x402lint_scan`, `x402lint_report`).
The free directory surface (`GET /v1/directory`, `/v1/featured`, `/v1/project?host=`) and the free domain-control verification / listing-control routes (`POST /v1/verify/start`, `/v1/verify/confirm`, `/v1/listing`) are plain unauthenticated HTTP GET/POST calls — hit them directly with `curl` or `fetch`; no payment or wallet required.
## Free-funnel guidance
Start on the free plane to learn x402lint for zero cost, then spend only where it pays:
1. `GET /v1/checks` — see the three conformance categories and how many checks each holds. Wire up your category/findings parser here for free (full per-check detail arrives with the paid scan).
2. `GET /v1/directory` / `/v1/featured` / `/v1/project?host=` — browse the graded directory for free before scanning anything; check whether an origin is already known and how it ranks.
3. `GET /v1/status?url={origin}` — poll this to see for free whether a fresh (`<24h`) report already exists and its grade summary. Cheap change-detection; if one exists, `GET /v1/report` ($0.02) is cheaper than a fresh scan.
4. Then buy: `POST /v1/scan` ($0.15) for a full graded scan with per-check evidence and fixes, and `GET /v1/report?url=` ($0.02) to re-fetch a fresh cached report.
Own the origin? Prove domain control for free (`POST /v1/verify/start` → serve the token at `/.well-known/x402lint-challenge` → `POST /v1/verify/confirm`), then `POST /v1/listing` to opt out of the directory or suppress auto-collected branding.
## Machine discovery
| Path | What |
|------|------|
| `/llms.txt` | This doc (concise) |
| `/llms-full.txt` | Extended agent doc |
| `/openapi.json` | OpenAPI 3.1 spec |
| `/discovery` | Discovery JSON (free/paid endpoint listing) |
| `/v1/directory` | Graded directory of scanned origins (free, paginated) |
| `/.well-known/x402` | x402 payment manifest |
| `/.well-known/agent-card.json` | A2A agent card |
## Errors & caveats
- **400 invalid_url** — the `url` is missing or not a valid origin. You were **NOT** charged.
- **402** — payment required / verification or settlement failed (you were **NOT** charged).
- **404 no_fresh_report** — `GET /v1/report` found no `<24h` cached result; use `POST /v1/scan` (you were **NOT** charged).
- **404 (project)** — `GET /v1/project?host=` found no directory record for that origin (unknown or opted out); free, uncharged.
- **403 (listing)** — `POST /v1/listing` on an origin you have not owner-verified; verify first via `/v1/verify/start` + `/v1/verify/confirm`.
- **503 scanner_error** — the scan engine hit an internal error (you were **NOT** charged).
- **504 processing** — the scan is still running (`{status:"processing"}`); retry and the finished result is served from cache (you were **NOT** charged).
**Disclaimer:** x402lint probes are **read-only** (GET/HEAD only); **no real payments are made against the scanned target**. Results are informational and reflect the origin's state at scan time (cached 24h) — not a certification, endorsement, or guarantee. Provided as-is.
don't have the plugin yet? install it then click "run inline in claude" again.