api

An API security review guide for finding endpoints, request methods, parameters, and data fields that an application exposes but its front end does not use. An API is the interface through which software exchanges requests and data.

In plain words
What is it for?
Use it to review REST or JSON APIs for undocumented routes, old versions, unsafe request binding, protected fields such as admin status or account balance, and user input copied into internal requests.
Why use it?
It helps reveal hidden or outdated operations and fields that users may be able to control directly. This can expose actions or properties that the user interface was meant to keep unavailable.

Skill for Claude CodeCodex

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/emre-guler/websec/api
Any agent
npx skills add emre-guler/websec --skill api
Clone the repo
git clone --depth 1 https://github.com/emre-guler/websec

Made for: Claude Code, Codex.

Per session 92 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 5,750 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00092 $0.05750
Opus 5 $0.00046 $0.02875
Sonnet 5 $0.00018 $0.01150
Haiku 4.5 $0.00009 $0.00575

Measured 2d ago against content hash 3ff3f5d29c59, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

api scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

| Node / Express, Nest, Mongoose, Prisma | `Object.assign(user, req.body)`, `new User(req.body)`, `Model.create(req.body)`, `findByIdAndUpdate(id, req.body)`, `prisma.user.update({ data: req.body })`, spread `{ ...req.bo
skills/api/SKILL.md · 169 lines

How it starts

The opening of the file, as written. The whole thing — 169 lines — stays where its author put it; the contents beside it link to each section on GitHub.

API Surface Detection

Overview

Every dynamic application is built on an API, and the API almost always accepts more than the front end sends: endpoints nobody links to, versions nobody retired, HTTP methods nobody intended, parameters nobody documented, and object properties the framework binds because it binds everything. Separately, when a public handler builds a request to an internal service by pasting user input into a URL, a path segment, or a JSON body, the caller can inject or override parameters in that internal request. Both sit in the same place in the lifecycle — after routing, at the point where the application decides which fields of the request it will honour and how it forwards them onward. The attacker is anyone who can reach the endpoint, usually an authenticated low-privilege user who interacts with the API directly rather than through the UI. What they gain is a property they should not be able to set, an operation the documented surface never offered, or control over a parameter in a request made on their behalf by a component they cannot reach. This skill finds such exposure by locating every binding site, unguarded surface, and internal-request assembly point, checking each one in parallel, and merging the results into <output_dir>/api-results.md.

What it is NOT

This skill's boundary with /websec:access-control is the one that matters most, so state it in every finding.

  • Object-level and function-level authorization (/websec:access-control): "may this caller touch this object or invoke this function". Discriminating test — if the fix is an ownership or role check on a field and an operation that were both intended to exist, it belongs there. This skill owns property-level and surface-level exposure: "does this property bind, does this endpoint or version exist, does this parameter reach an internal request at all". If the fix is removing the field from the binding set, retiring or guarding a route or version, constraining the methods, or encoding input before it is embedded, it belongs here. A body that sets owner_id to another user's id is judged here as a binding failure and cross-referenced there for the authorization consequence.
  • Server-side request forgery (/websec:ssrf): the attacker chooses the destination of the outbound request. In parameter pollution the destination is fixed and the attacker steers parameters within the request the application already makes. They chain; classify by which one the code actually permits.
  • Prototype pollution (/websec:prototype-pollution): unrelated despite the similar name — that is object-prototype corruption in the runtime, not parameters in a request.
  • Path traversal (/websec:path-traversal): traversal that resolves against the filesystem belongs there. Encoded traversal injected into an internal REST path, resolving to a different API resource, is judged here.
  • GraphQL (/websec:graphql): a GraphQL endpoint's schema, resolvers, and operation limits belong there.
  • Injection classes (/websec:sql-injection, /websec:nosql-injection, /websec:xxe): reached through an API but owned by their own skills. A content-type branch that routes a body into an XML parser is a candidate here; the parser's entity configuration is /websec:xxe.
  • Model-driven endpoints (/websec:llm): an endpoint whose request or response passes through a language model, or that exposes a tool the model can call, is judged there — the binding set is decided by a tool definition rather than a serialiser. Test: does a model choose what this endpoint receives or does with the input?
  • Domain rules on a bindable field (/websec:business-logic): this skill owns fields that should not be bindable at all — the binding set is too wide and the fix is to remove the property from it. A field the caller is legitimately allowed to send, carrying a value that violates a rule (a negative quantity, a discount past its cap, a backdated effective date), is theirs. Test: should this property bind at all, or does it bind correctly and simply go unvalidated?
  • Information disclosure (/websec:information-disclosure): verbose errors that hand back the shape of a valid request are noted, not classified here.
  • Surface decided outside this tree: which paths, versions, and methods are actually exposed can be a gateway's route table rather than this repository's router. Read the "Enforced where" column and the trust-boundary section of architecture.md before reporting a stale version or an internal handler as exposed surface — a version tree the edge does not publish is reachable only from inside. Judge that configuration where it is readable; where it is not, the label is NEEDS MANUAL REVIEW naming it. What is judged here: whether the handler is safe when reached directly, since a route unreachable only by convention is reachable to anything already inside the boundary. Binding is different — a body bound onto an entity is a sink in this code, and no external layer changes that.
  • Not a finding: an extra field in a response that is not bindable on any write path; an endpoint that is merely unlinked but properly authorized; a deprecated version that is documented but not routed; a scanner-style "input was transformed" lead with no traced path.

Read the full file on GitHub · 169 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 169 lines · 92 tokens per session scan A 3ff3f5d29c59

Subscribe to this mod's changes

api is a skill published in the GitHub repository emre-guler/websec (2 stars, last pushed 5d ago), licensed MIT. It adds 92 tokens to every session and 5,750 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

vantage

Autonomous, artifact-driven SAST (Static Application Security Testing) for web AND mobile app repositories, plus optional code-level remediation. Use whenever the user asks to security-review, pentest, audit, or scan a codebase for vulnerabilities — web (SQLi, XSS, IDOR/BOLA, auth bypass, SSRF, XXE, hardcoded secrets…

tinoimammp/vantage-security-agent · 230 tokens

prowler-ui

Prowler UI-specific patterns. For generic patterns, see: typescript, react-19, nextjs-16, tailwind-4. Trigger: When working inside ui/ on Prowler-specific conventions (shadcn, folder placement, actions/adapters, shared types/hooks/lib).

prowler-cloud/prowler · 64 tokens

prowler-test-api

Testing patterns for Prowler API: JSON:API, Celery tasks, RLS isolation, RBAC. Trigger: When writing tests for api/ (JSON:API requests/assertions, cross-tenant isolation, RBAC, Celery tasks, viewsets/serializers).

prowler-cloud/prowler · 62 tokens

prowler-pr

Creates Pull Requests for Prowler following the project template and conventions. Trigger: When working on pull request requirements or creation (PR template sections, PR title Conventional Commits check, changelog gate/no-changelog label), or when inspecting PR-related GitHub workflows like conventional-commit.yml…

prowler-cloud/prowler · 84 tokens

tailwind-4

Tailwind CSS 4 patterns and best practices. Trigger: When styling with Tailwind (className, variants, cn()), especially when dynamic styling or CSS variables are involved (no var() in className).

prowler-cloud/prowler · 47 tokens

prowler-docs

Prowler documentation style guide and writing standards. Trigger: When writing documentation for Prowler features, tutorials, or guides.

prowler-cloud/prowler · 31 tokens