Agent skill

Hunt Spa API

by elementalsouls in elementalsouls/Claude-BugHunter

Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication.

MITAuto-check: notesBackend & APIs

Install Hunt Spa API

skills CLI
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install elementalsouls/Claude-BugHunter hunt-spa-api --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/hunt-spa-api .claude/skills/hunt-spa-api && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
hunt-spa-api
GitHub stars
4.8k
Token cost
~2.2k tokens
SKILL.md length
804 words
Files
1
Skills in repo
17
Repo updated
First seen
Licence
MIT

At a glance

Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication.

  • Works in 5 steps: Pull the shell + enumerate the bundles → Harvest API hosts, routes, and secrets… → Establish a CONTROL — find an endpoint… → …
  • A target serves a JS-heavy SPA (React/Vue/Angular/Next)
  • SKILL.md covers When to use this skill, The play (5 steps), What "the API behind the SSO… and Anti-patterns, plus 1 more section
  • Calls curl

What it does

Hunt Spa API is an agent skill from elementalsouls/Claude-BugHunter. Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication. One of the highest-yield web plays in modern recon — SPAs ship their entire backend route map to the browser, and the API behind them is frequently missing the auth middleware the login page implies. Built from an authorized engagement where this play found an unauthenticated financial API that an ASM scan reporting hundreds of "Criticals" completely missed. Use…

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering Authorization and RBAC and Authentication. It works with Angular, React, Vue.js and Git. The repository describes itself as: A Claude Code skill bundle for bug hunting and external red-team work - 82 skills, 15 slash commands, 681 disclosed-report patterns curated across 24 core vulnerability classes… The licence is MIT.

When your agent uses it

  • A target serves a JS-heavy SPA (React/Vue/Angular/Next)
  • An app/console/dashboard/portal subdomain
  • Any api host shows up in recon

Example prompts

  • “Criticals”
  • “console”
  • “dashboard”
  • “/hunt-spa-api”

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Pull the shell + enumerate the bundles
  2. Harvest API hosts, routes, and secrets from the bundles
  3. Establish a CONTROL — find an endpoint that IS gated
  4. Test each route family UNAUTHENTICATED, both methods
  5. Pivot & prove (minimally)

What it can do on your machine

Read from SKILL.md and the folder at commit b0957e6. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Hunt Spa API loads about 2.2k tokens when it runs. Until then it costs about 243 tokens; SKILL.md has 804 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~243
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:3
    n. Leaked build artifacts (source maps / .env / .git / asset-manifest) are owned by hunt-source-leak; API version-invent

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from elementalsouls/Claude-BugHunter at commit b0957e6, republished under its MIT licence (© elementalsouls). 804 words, ~2,233 tokens.

Download SKILL.mdSave it as .claude/skills/hunt-spa-api/SKILL.md (or your agent's skills folder).
name
hunt-spa-api
description
Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication. One of the highest-yield web plays in modern recon — SPAs ship their entire backend route map to the browser, and the API behind them is frequently missing the auth middleware the login page implies. Built from an authorized engagement where this play found an unauthenticated financial API that an ASM scan reporting hundreds of "Criticals" completely missed. Use whenever a target serves a JS-heavy SPA (React/Vue/Angular/Next), an "app"/"console"/"dashboard"/"portal" subdomain, or any `*api*` host shows up in recon. Leaked build artifacts (source maps / .env / .git / asset-manifest) are owned by hunt-source-leak; API version-inventory and behavioral diffing by hunt-shadow-api; this skill owns mapping a live SPA's backend routes from its JS bundle and testing them for broken access control / missing auth.
sources
authorized-engagement
report_count
1

When to use this skill

Trigger when:

  • A target host returns a tiny HTML shell + big /static/js/*.js or /_next/static/* bundles (React/Vue/Angular/Next/Svelte SPA)
  • You see a subdomain named console, app, dashboard, portal, admin, panel, manage, internal
  • Recon surfaces any *api*, *-api*, api.* host
  • A login page is OAuth/SSO-gated (the frontend auth tells you nothing about whether the API enforces auth)

The core insight: a SPA is a client to a backend API, and it ships the full map of that API — hosts, routes, sometimes keys — to anyone who views source. The login page being protected says nothing about whether the API behind it checks tokens. Auth is frequently enforced on the gateway/login and missing on a route group of the API.

DO NOT skip this because "the app needs login" — that's exactly when this pays off.


The play (5 steps)

1. Pull the shell + enumerate the bundles
bash
curl -s https://console.target.com/ -o index.html
# React/CRA:
grep -oE '/static/js/[^"]+\.js' index.html
# Next.js:
grep -oE '/_next/static/[^"]+\.js' index.html
# generic:
grep -oiE 'src="[^"]+\.js[^"]*"' index.html

Download every bundle (they can be multi-MB — that's fine, it's all route data):

bash
mkdir bundles
for j in $(grep -oE '/static/js/[^"]+\.js' index.html | sort -u); do
  curl -s "https://console.target.com$j" -o "bundles/$(echo "$j"|tr '/' '_')"
done
2. Harvest API hosts, routes, and secrets from the bundles
bash
B=bundles/*.js
# Backend API hosts (incl. dev/beta/staging variants — often weaker auth)
grep -ohiE 'https://[a-z0-9.-]*(api|console|backend|service)[a-z0-9.-]*\.target\.com[a-z0-9/_-]*' $B | sort -u
# Versioned API base paths
grep -ohiE '/api/v[0-9]+/?' $B | sort -u
# Route literals — minified bundles store routes as STRING segments, not full URLs.
# Grep for quoted "resource/action" strings:
grep -ohiE '"[a-z0-9_-]+/[a-z0-9_/-]+"' $B | tr -d '"' \
  | grep -iE '(login|user|account|order|billing|invoice|payment|deal|report|token|otp|password|reset|admin|profile|auth|upload|export|role|permission|dashboard|wallet|finance|sales)' | sort -u
# Secrets (validate before trusting — most AIza keys are Maps/analytics, not Auth)
grep -ohiE '(AIza[0-9A-Za-z_-]{35}|AKIA[0-9A-Z]{16}|sk_live_[0-9A-Za-z]+|eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}|apiKey["'"'"']?\s*[:=]\s*["'"'"'][^"'"'"']+)' $B | sort -u

Note: minifiers store routes as concatenated string segments (e.g. "account/payment/list"), NOT full /api/v2/... URLs — so a naive /api/v* grep returns nothing. Grep for the resource-word route strings and prepend the base yourself.

Lazy-loaded (async) chunks — don't stop at HTML-referenced bundles. CRA/webpack SPAs reference only runtime+main+vendor in index.html; numbered async route chunks are named inside main.js's chunk map and loaded at runtime, so grepping only /static/js/*.js from the shell truncates route coverage to eager chunks.

bash
grep -oE '[0-9]+:"[a-f0-9]+"' bundles/*main*.js        # {chunkId:"hash"} pairs
# reconstruct /static/js/<id>.<hash>.chunk.js, download each, re-run route/host/secret harvest
# asset-manifest.json (if present) lists them all -> hunt-source-leak
3. Establish a CONTROL — find an endpoint that IS gated

Before declaring anything vulnerable, send an unauthenticated request to an endpoint you expect to be protected, and capture what correct rejection looks like:

bash
curl -s -X POST https://api.target.com/api/users -H 'Content-Type: application/json' -d '{}'
# secure → {"error":"Missing or invalid authorization header"} or HTTP 401

This is your differential. A sibling API (e.g. a second API host, or a different route group on the same host) is the ideal control — same stack, so a different response = real authz gap, not a quirk.

4. Test each route family UNAUTHENTICATED, both methods

For every discovered route, send it with no Authorization header and compare to the control:

bash
for r in <routes>; do
  curl -s -o /tmp/r -w "[%{http_code}] $r\n" -X POST -H 'Content-Type: application/json' -d '{}' "https://api.target.com/api/v2/$r"
done

Interpret:

  • 401/"Missing authorization" → gated (correct). Move on.
  • 200 with data → unauthenticated data exposure. Finding.
  • 400 "field X is mandatory" → the route processed your request and reached business-logic validation without an auth check → auth bypass; supply the field minimally to confirm.
  • 200 + verbose DB/stack error (e.g. PROCEDURE db_x.sp_y does not exist) → reached the data layer unauthenticated; also a SQLi-surface signal.
  • Mandatory fields named like is_admin / is_internal / requested_by / role_id / account_type → authorization derived from client-supplied parameters — set the privilege flag and you self-elevate. Critical-class.
5. Pivot & prove (minimally)
  • IDs returned by one endpoint (account_id, order_id, deal_id) are the keys the other endpoints consume — they prove the whole router is reachable, not just one route.
  • Test dev-/beta-/staging- API variants — they frequently have weaker/disabled auth.
  • Check the response headers: Access-Control-Allow-Origin: * compounds the issue (any web origin reads it from a victim's browser).
  • STOP at minimum-necessary proof. A handful of records (or a totalCount) confirms the missing check. Do NOT enumerate the table — see redteam-mindset data-minimization boundary. The finding is the absent auth, not the data volume.

Show full SKILL.md (297 more words)Show less

What "the API behind the SSO login" really means

A common, dangerous architecture:

  • console.target.com (the SPA) → login is Entra/Okta/Google OAuth (looks airtight).
  • api.target.com (the backend) → some route groups enforce the bearer token, some route groups forgot the middleware.

The frontend login is theatre if the API doesn't independently validate the token on every route. Always test the API directly, bare, regardless of how locked-down the login UI is.


Anti-patterns

  • "The app requires login, so the API must be protected." No — test the API directly, unauthenticated. The whole point.
  • "Minified bundle, can't read it." You don't need to read it — grep it for hosts/routes/secrets. 5 minutes.
  • "/api/v1/foo returned 404, so no API here." Wrong base or wrong method. Try /api/, /api/v2/, POST not GET, and the exact route strings from the bundle (Express's 404 echoes the path — use it to calibrate).
  • "AIza key found → critical secret." Validate first — most are Maps/analytics keys (CONFIGURATION_NOT_FOUND on identitytoolkit = not Auth-enabled). Don't over-claim.
  • Dumping the whole dataset once you get a 200. Stop at PoC. (redteam-mindset.)
  • Account-creation / write endpoints as "proof". Read endpoints prove the auth gap without creating state. Never POST a create/signup/upload to "demonstrate" — that's a destructive write needing explicit per-action authorization.

  • hunt-api-misconfig — once the API is mapped, run the broader misconfig matrix (method tampering, mass assignment, JWT alg confusion) per route.
  • hunt-idor — the account_id/order_id pivots feed straight into IDOR testing across discovered routes.
  • hunt-source-leak — sourcemaps (*.js.map) reconstruct original source for deeper route/secret extraction; same harvesting muscle.
  • hunt-nextjs — for Next.js targets, layer the middleware-bypass (x-middleware-subrequest) and /_next/data route tests on top of this.
  • redteam-mindset — the data-minimization boundary governs step 5: prove the missing check, don't exfiltrate the table.
  • recon-scope-triage — verify the API host actually belongs to the target before testing (don't pop a same-named third party's API).

© elementalsouls, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/hunt-spa-api of elementalsouls/Claude-BugHunter.

Open the folder on GitHubat commit b0957e6

Compare with similar skills

Hunt Spa API next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Hunt Spa API compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Hunt Spa API this skillelementalsouls/Claude-BugHunter4.8k—~2.2kAutomated safety check: NotesMIT
Modern Web GuidanceJetBrains/skills3633 repos~1.4kAutomated safety check: PassApache-2.0
Passport Developmenttrypostit/trypost676—~1.9kAutomated safety check: PassMIT
Experience UI Bundle Features Generateforcedotcom/sf-skills1.1k—~2.9kAutomated safety check: PassApache-2.0
Auth Access Controlzhaji2333/CkSKILLS112—~1.3kAutomated safety check: PassMIT
Olore Tanstack Query 4olorehq/olore103—~583Automated safety check: PassMIT

Similar skills

  • Modern Web Guidance

    JetBrains/skills

    Official

    Search tool for modern web development best practices. An agent skill from JetBrains/skills.

    363 GitHub starsUsed in 3 repos~1.4k tokens
    DevOps & CloudAuto-check passed
  • Passport Development

    trypostit/trypost

    Develops OAuth2 API authentication with Laravel Passport. An agent skill from trypostit/trypost.

    676 GitHub stars~1.9k tokensUpdated today
    Backend & APIsAuto-check passed
  • MUST activate when the project contains a uiBundles//src/ directory (React or Angular) and the user wants to add a pre-built feature — such as authentication (login, logout, protected routes…

    1.1k GitHub stars~2.9k tokensUpdated 5 days ago
    Backend & APIsAuto-check passed
  • Auth Access Control

    zhaji2333/CkSKILLS

    当出现注册/登录/找回密码/验证码/绑定手机/实名认证/OAuth/SSO/2FA/JWT等认证功能,前后端分离应用出现路由守卫/前端鉴权绕过,或发现ID可替换、角色参数可控、租户ID可控、接口存在越权迹象时调用。负责认证绕过、前端鉴权绕过、会话安全、验证码安全、水平/垂直越权、多租户隔离、密码重置、加密与随机性弱点分析。

    112 GitHub stars~1.3k tokensUpdated 22 days ago
    Backend & APIsAuto-check passed
  • Local TanStack Query documentation reference (v4). An agent skill from olorehq/olore.

    103 GitHub stars~583 tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Lunora Realtime

    anolilab/lunora

    Wires Lunora's live data into a client. An agent skill from anolilab/lunora.

    283 GitHub stars~2.4k tokensUpdated today
    MobileAuto-check passed

More from elementalsouls/Claude-BugHunter

All 17 skills in this repo
  • Hunt API Misconfig

    elementalsouls/Claude-BugHunter

    Hunt API security misconfiguration — mass assignment, prototype pollution, HTTP verb tampering.

    4.8k GitHub stars~4.5k tokensUpdated yesterday
    Auto-check passed
  • Hunt Ato

    elementalsouls/Claude-BugHunter

    Hunt account takeover taxonomy — 9 distinct paths to ATO, plus chains.

    4.8k GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Hunt Fintech Graphql

    elementalsouls/Claude-BugHunter

    Hunt fintech-specific GraphQL vulnerabilities: money-movement mutations (transfers, redemptions, withdrawals, card top-ups), ledger/balance/portfolio query IDOR, decimal-precision and rounding…

    4.8k GitHub stars~3.5k tokensUpdated yesterday
    Auto-check passed
  • Hunt HTTP Smuggling

    elementalsouls/Claude-BugHunter

    Hunt HTTP request smuggling (CL.TE, TE.CL, H2.CL, H2.TE). An agent skill from elementalsouls/Claude-BugHunter.

    4.8k GitHub stars~1.8k tokensUpdated yesterday
    Auto-check passed
  • Hunt JWT Crypto

    elementalsouls/Claude-BugHunter

    Hunt JWT cryptographic failures — alg:none signature-stripping and RS256→HS256 key-confusion that let an attacker forge a token for any identity (e.g.

    4.8k GitHub stars~2.3k tokensUpdated yesterday
    Auto-check passed
  • Hunt RAG Vector

    elementalsouls/Claude-BugHunter

    Hunt vector-store / embedding-layer weaknesses in RAG pipelines (OWASP LLM08 Vector and Embedding Weaknesses) — persistent corpus poisoning that survives across sessions and users (distinct from…

    4.8k GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Hunt Spa API

What does Hunt Spa API do?

Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication. Hunt Spa API is an agent skill from elementalsouls/Claude-BugHunter. Discover a single-page-app's hidden backend API from its public JS bundle, then test that API for broken access control / missing authentication.

When should I use Hunt Spa API?

Hunt Spa API fits situations like: A target serves a JS-heavy SPA (React/Vue/Angular/Next); an app/console/dashboard/portal subdomain; any api host shows up in recon.

How do I install Hunt Spa API in Claude Code?

Run `npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a claude-code`. Or copy the skill folder (skills/hunt-spa-api in elementalsouls/Claude-BugHunter) into .claude/skills/hunt-spa-api in your project. Claude Code loads it when a task matches its description.

How do I install Hunt Spa API in Codex?

Run `npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a codex`. Or copy the skill folder (skills/hunt-spa-api in elementalsouls/Claude-BugHunter) into .agents/skills/hunt-spa-api in your project. Codex loads it when a task matches its description.

Can I use Hunt Spa API in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add elementalsouls/Claude-BugHunter --skill hunt-spa-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hunt-spa-api, .gemini/skills/hunt-spa-api, .github/skills/hunt-spa-api and .opencode/skills/hunt-spa-api in your project.

What does Hunt Spa API need to run?

Going by SKILL.md and its folder, Hunt Spa API needs the command-line tools its instructions call (curl).

Does Hunt Spa API access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Hunt Spa API safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Hunt Spa API use?

Hunt Spa API is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Hunt Spa API use?

About 2.2k tokens (SKILL.md is roughly 8.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Hunt Spa API?

Skills that share tags, products or a category with Hunt Spa API: Modern Web Guidance (JetBrains/skills, 363 stars), Passport Development (trypostit/trypost, 676 stars), Experience UI Bundle Features Generate (forcedotcom/sf-skills, 1.1k stars) and Auth Access Control (zhaji2333/CkSKILLS, 112 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Hunt Spa API?

elementalsouls (a GitHub user) maintains it in elementalsouls/Claude-BugHunter, which has 4,783 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 6, 2026.

Source: elementalsouls/Claude-BugHunter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.