68trust / 100
Guard
by Pay Guard in Security & trust
x402 APIPassing, checked 6 h ago
Pay Guard: pre-payment allow/warn/block check for x402. Send your planned purchase (domain, max_price_usd, asset/network) plus the 402 challenge (payTo, amount, asset, network, resource). Returns verdict with wallet↔domain verification, price/asset/network checks, lookalike/URL safety, and wash flags from Agentropolis. Deterministic, no LLM.
POST https://seenly-pay-guard.vercel.app/api/guard
Last 30 days
All checks passedSome failedAll failedNot checked
- Uptime
- 100%
- Response time
- 921 ms typical, 921 ms slowest 5%
- Last check
- 6 h ago
- Next check
- any minute now
How to call it
# See the payment challenge (nothing is charged)
curl -i -X POST "https://seenly-pay-guard.vercel.app/api/guard" \
-H "content-type: application/json" \
-d '{"asset":"USDC","challenge":{"amount":"30000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","payTo":"0xeE6239F3E17bEBe5e89F21F29D74D68CAa0d78CE","resource":"https://seenly-payload-check.vercel.app/api/check"},"domain":"seenly-payload-check.vercel.app","max_price_usd":0.05,"network":"eip155:8453"}'import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client().register(
"eip155:8453",
new ExactEvmScheme(privateKeyToAccount(process.env.AGENT_KEY)),
);
const pay = wrapFetchWithPayment(fetch, client);
// Not sure it's safe to pay? Preflight it first for $0.005:
// GET https://toolvet.app/api/v1/check?url=https%3A%2F%2Fseenly-pay-guard.vercel.app%2Fapi%2Fguard
const res = await pay("https://seenly-pay-guard.vercel.app/api/guard", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({"asset":"USDC","challenge":{"amount":"30000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","payTo":"0xeE6239F3E17bEBe5e89F21F29D74D68CAa0d78CE","resource":"https://seenly-payload-check.vercel.app/api/check"},"domain":"seenly-payload-check.vercel.app","max_price_usd":0.05,"network":"eip155:8453"}),
});
console.log(await res.json());Example input
{
"asset": "USDC",
"challenge": {
"amount": "30000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"network": "eip155:8453",
"payTo": "0xeE6239F3E17bEBe5e89F21F29D74D68CAa0d78CE",
"resource": "https://seenly-payload-check.vercel.app/api/check"
},
"domain": "seenly-payload-check.vercel.app",
"max_price_usd": 0.05,
"network": "eip155:8453"
}Example output
{
"advice": "Safe to sign this 402 challenge under the stated plan.",
"check_version": "pay-guard-0.1.0",
"checks": {
"asset_network": {
"id": "asset_network",
"status": "pass",
"summary": "Asset/network OK (USDC on eip155:8453)."
},
"listed_price": {
"id": "listed_price",
"status": "pass",
"summary": "Challenge price within listed range."
},
"lookalike": {
"id": "lookalike",
"status": "pass",
"summary": "Resource host matches planned domain."
},
"price": {
"id": "price",
"status": "pass",
"summary": "Challenge price $0.03 ≤ max $0.05."
},
"url_safety": {
"id": "url_safety",
"status": "pass",
"summary": "Resource URL is https, no credentials, no IP literal."
},
"wallet_domain": {
"id": "wallet_domain",
"status": "pass",
"summary": "payTo matches the domain’s verified Agentropolis wallet."
},
"wash": {
"id": "wash",
"status": "pass",
"summary": "No wash flags; payment evidence present."
}
},
"coverage": {
"agentropolis": "full",
"notes": []
},
"kit": "seenly.pay-guard",
"reasons": [],
"verdict": "allow"
}Security scan
- No findings. We scan names, descriptions and tool definitions for hidden instructions and other prompt-injection patterns.
Recent checks
| When | Result | HTTP | Time | Price |
|---|---|---|---|---|
| 6 h ago | Passed | 402 | 921 ms | $0.01 |