api-testing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited api-testing (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Testing an API means proving that an endpoint behaves correctly across the cases that matter: the happy path, auth boundaries, bad input, and idempotency. The goal isn't to hit every URL once — it's to encode the contract of each endpoint as checks that fail loudly when the contract breaks.
app/api/, pages/api/, route handlers, Supabase RPC functions, and any Stripe webhook handler. Ask the user for the base URL (local dev vs. the live Vercel URL) and any auth token / API key needed. Never hard-code secrets into the suite file — reference environment variables instead.
entry per case. Cover, per endpoint:
is rejected. For Supabase, this is where you catch missing RLS policies.
doesn't double-charge or double-book.
one is accepted exactly once.
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/api/run_suite.py <suite.json>Set referenced secrets in the environment first, e.g. export AUTH_TOKEN=... STRIPE_KEY=.... The runner substitutes ${VAR} in the suite at request time.
actual status and the relevant body fragment so the cause is obvious. Treat a 500 on a validation case as a real bug, not a pass.
{
"base_url": "${BASE_URL}",
"defaults": { "headers": { "Content-Type": "application/json" } },
"cases": [
{
"name": "create booking — happy path",
"method": "POST",
"path": "/api/bookings",
"headers": { "Authorization": "Bearer ${AUTH_TOKEN}" },
"body": { "listingId": "abc", "checkIn": "2026-07-01", "checkOut": "2026-07-05" },
"expect": { "status": 201, "json_has": ["id", "status"], "json_match": { "status": "pending" } }
},
{
"name": "create booking — rejects unauthenticated",
"method": "POST",
"path": "/api/bookings",
"body": { "listingId": "abc" },
"expect": { "status_in": [401, 403] }
}
]
}Supported assertions in expect: status (exact), status_in (list), json_has (keys that must exist, dot-paths allowed), json_match (exact key/value pairs), body_contains (substring), max_ms (latency ceiling).
When testing Stripe webhooks, RLS edge cases, or idempotency in depth, read references/patterns.md for worked examples specific to the Supabase + Stripe stack.
For a broad sweep ("test the whole API"), delegate to the api-test-runner agent — it discovers endpoints, drafts the suite, runs it, and returns a report, keeping the discovery file-dumps out of the main conversation.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.