api-discovery
Skill1 starsChanged 11 days agoMITView on GitHub
Discover and map API surface: Swagger/OpenAPI spec detection, common API path probing, and GraphQL introspection. Use after web-crawling and js-analysis have produced endpoint candidates, to confirm and fully enumerate the API attack surface before vuln hunting. Do NOT use for exploiting discovered endpoints (auth bypass, IDOR, injection) — that's hunt phase work; this skill only maps what exists and what it accepts.
- Sends data out
2 other projects use a version of this.
Adopted by
Most recently taken up by
- AxlZero21/Skillstheir own version, first seen Nov 8, 2026
- ethanhammett0/siemens_openbbtheir own version, first seen Apr 16, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- AxlZero21/Skills★ 1same name
- ethanhammett0/siemens_openbb★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository124 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- ai-agent-reconSkill
- ai-supply-chainSkill
- exfiltration-via-aiSkill
- indirect-injectionSkill
- llm-fuzzingSkill
- prompt-injectionSkill
- rag-poisoningSkill
- tool-abuseSkill
- chain-analysisSkill
- chain-auth-to-takeoverSkill
- chain-customSkill
- chain-graph-walkSkill
- chain-idor-to-mass-dataSkill
- chain-info-to-exploitSkill
- chain-multi-appSkill
- chain-ssrf-to-cloudSkill
- chain-web-to-rceSkill
- chain-xss-to-account-takeoverSkill
- email-securitySkill
- engagement-flowSkill
- finding-disciplineSkill
- http-headers-securitySkill
- oob-interactionsSkill
- opsec-disciplineSkill
- research-firstSkill
- scope-disciplineSkill
- scope-importSkill
- session-contextSkill
- 2fa-bypassSkill
- api-abuseSkill
- auth-bypassSkill
- broken-access-controlSkill
- business-logicSkill
- cache-poisoningSkill
- clickjackingSkill
- corsSkill
- credential-testingSkill
- crlf-injectionSkill
- cryptographic-oracleSkill
- csrfSkill
- css-injectionSkill
- data-exfiltration-testSkill
- deserializationSkill
- email-injectionSkill
- file-uploadSkill
- fuzzingSkill
- graphqlSkill
- grpcSkill
- host-headerSkill
- http-smugglingSkill
- idorSkill
- info-disclosureSkill
- jwtSkill
- lateral-movementSkill
- lfi-rfiSkill
- mass-assignmentSkill
- oauthSkill
- open-redirectSkill
- parameter-pollutionSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 37
If a spec is found, pull it and enumerate every defined route + parameter — this is the single highest-value API recon step when available:
- Distinctive: line 65
If introspection is disabled, try common endpoint variants and check for verbose errors that leak schema hints:
- Very specific: line 72
Check for API versioning differences — an older/deprecated version (/v1/ vs /v2/) may lack protections added later:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Signals
- Endpoint candidates from
web-crawling/js-analysisinclude/api/,/v1/,.jsonpaths. - Target is a known SPA/mobile-backed app (these almost always have a REST or GraphQL API).
- Need to confirm whether a Swagger/OpenAPI doc or GraphQL endpoint is exposed.
Prerequisites
likely-api-endpoints.txtfromweb-crawling, plus any endpoints fromjs-analysis.
Methodology
- Probe common Swagger/OpenAPI documentation paths directly:
for p in swagger.json swagger.yaml openapi.json openapi.yaml api-docs swagger-ui.html \ api/swagger.json v1/swagger.json .well-known/openapi.json; do code=$(curl -s -o /dev/null -w "%{http_code}" "https://example.com/$p") echo "$code /$p" done - If a spec is found, pull it and enumerate every defined route + parameter — this is the
single highest-value API recon step when available:
curl -s https://example.com/api/swagger.json -o swagger.json jq '.paths | keys' swagger.json # or load into Postman/Insomnia for interactive exploration - Probe common REST path/verb patterns where no spec is published:
ffuf -u "https://example.com/api/FUZZ" -w /usr/share/seclists/Discovery/Web-Content/api/api-endpoints.txt \ -mc 200,201,204,301,302,401,403 -o ffuf-api.json -of json - kiterunner for API-route brute force using realistic route wordlists derived from common
framework patterns and known API specs (notably effective against REST APIs with
predictable CRUD routes):
kr scan https://example.com -w routes-large.kite -x 10 -j -o kiterunner-results.json - GraphQL introspection — if a
/graphqlendpoint exists, introspection (if not disabled) dumps the entire schema including fields not used by the frontend:
Or with a dedicated tool for a cleaner schema dump and known-misconfig checks:curl -s -X POST https://example.com/graphql -H "Content-Type: application/json" \ -d '{"query":"{__schema{types{name,fields{name}}}}"}' | jq .graphql-cop -t https://example.com/graphql -o graphql-cop-results.json - If introspection is disabled, try common endpoint variants and check for verbose errors
that leak schema hints:
for p in graphql graphql/v1 api/graphql v1/graphql graphiql; do curl -s -o /dev/null -w "%{http_code} /$p\n" "https://example.com/$p" done - Check for API versioning differences — an older/deprecated version (
/v1/vs/v2/) may lack protections added later:for v in v1 v2 v3 beta internal; do curl -s -o /dev/null -w "%{http_code} /$v/users\n" "https://example.com/api/$v/users" done
Tooling
curl, ffuf -mc with API-specific wordlists (SecLists Discovery/Web-Content/api/),
kiterunner (kr scan -w), jq for spec parsing, graphql-cop, Postman/Insomnia for manual
spec-driven exploration.
Validation gate
- Any discovered spec (Swagger/OpenAPI/GraphQL schema) saved as a raw artifact, not just summarized — it's the authoritative map of attack surface for hunting.
- Every discovered route recorded with method, auth requirement observed (401/403 vs 200),
and response code — this is the MAPPED-phase inventory
engagement-flowexpects. - GraphQL introspection result (enabled/disabled) explicitly noted either way.
Gotchas
- An exposed Swagger/OpenAPI doc on a production host is itself often a legitimate finding (information disclosure) even before using it to find other bugs — don't just treat it as a recon convenience and forget to note the exposure itself.
- GraphQL introspection being disabled doesn't mean the schema is hidden — field suggestion via error messages, or a batched/aliased query, can still reveal structure; this is a hunt phase technique, not something to force through during mapping.
- Hidden/internal API versions (
/internal/,/admin/api/) found via js-analysis are frequently unauthenticated by oversight — map them here, exploit them only after confirming scope and getting any required sign-off for auth-bypass testing. - Rate limiting on brute-forced API path guessing applies just like any other fuzzing —
follow
opsec-disciplineconcurrency/delay settings, not ffuf's aggressive defaults. - SPA fallback false positives: Many SPAs (Next.js, React Router, Vue Router)
return 200 + their
index.htmlfor ANY path, including/graphql,/api/anything, etc. A 200 alone does NOT confirm the endpoint exists. Always checkContent-Type: if it'stext/htmlon a path that should return JSON/GraphQL, it's the SPA catch-all, not a real API endpoint. Verify with:
A 405 (Method Not Allowed) is actually a stronger signal than 200 — it means the path exists but the method is wrong (try POST for GraphQL).ct=$(curl -sk -o /dev/null -w '%{content_type}' "https://{host}/graphql") echo "$ct" # text/html → SPA fallback, application/json → real endpoint
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

