api-endpoint-probe — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited api-endpoint-probe (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.
Purpose: Quick reconnaissance of API endpoint parameters before implementation — find what actually works (filters, pagination, limits, auth) via minimal test requests. When: Integrating with a new endpoint where unknown: which params it accepts, pagination type, whether it works without mandatory filters, actual response limit. Output: Table of "works / doesn't work" + recommended call pattern for implementation.
Ask user (if not in request):
GET /v1/trades?market={id})Form minimal set of 3–5 test requests:
| # | Goal | Params | Expected result |
|---|---|---|---|
| 1 | Base call, no filters | — | Does it work at all, response format |
| 2 | Page limit | limit=1 / size=1 | Whether param exists, what it's called |
| 3 | Cursor pagination | cursor= / next= / after= | Pagination type |
| 4 | Time-based filter | startTs= / after= / since= | Whether timestamp filter works |
| 5 | Entity filter | market=X / user=Y | Is filter required or optional |
Show plan to user — wait for "да" before executing.
For each request in plan:
requests (Python) or curl — depending on environment# Python probe template
import requests, json
BASE = "https://api.example.com"
HEADERS = {"Authorization": "Bearer TOKEN"} # if auth needed
def probe(path, params=None):
r = requests.get(BASE + path, headers=HEADERS, params=params)
print(f"{r.status_code} | {len(r.content)}b | {path}?{r.request.path_url.split('?',1)[-1]}")
try:
data = r.json()
if isinstance(data, list) and data:
print(json.dumps(data[0], indent=2)[:300])
elif isinstance(data, dict):
print(json.dumps({k: type(v).__name__ for k, v in data.items()}))
except:
print(r.text[:200])
return rAfter all requests, output summary table:
── Probe results: [endpoint] ────────────────────────
| Parameter | Works? | How to use |
|-----------------|--------|-----------------------------|
| no filters | ✅/❌ | [observation] |
| limit/size | ✅/❌ | limit=N or size=N |
| cursor paging | ✅/❌ | next_cursor field in response|
| startTs filter | ✅/❌ | startTs=unix_ms |
| user filter | ✅/❌ | required / optional |
Recommended call for implementation:
GET [path]?[param1=val]&[param2=val]
Pagination: [cursor / offset / timestamp / none]
Limit: [actual page limit]
Notes: [what doesn't work or is unexpected]If project has CLAUDE.md:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.