with one click
api-discovery-endpoint-inventory
// Aggregate, normalize, and deduplicate API endpoints from multiple discovery sources into a unified inventory with diffing support.
// Aggregate, normalize, and deduplicate API endpoints from multiple discovery sources into a unified inventory with diffing support.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | api-discovery-endpoint-inventory |
| description | Aggregate, normalize, and deduplicate API endpoints from multiple discovery sources into a unified inventory with diffing support. |
| tech_stack | ["web"] |
| capability | ["api-design"] |
| version | OpenAPI 3.0 |
| collected_at | "2025-07-16T00:00:00.000Z" |
Source: https://swagger.io/docs/specification/v3_0/paths-and-operations/
Build a unified, deduplicated API endpoint inventory by aggregating raw endpoint data from heterogeneous discovery sources — Swagger/OpenAPI schemas, GraphQL introspection, browser network captures, and path fuzzing results — into a single canonical listing of METHOD + PATH combinations with their metadata.
Apply these canonicalization rules to every raw method + path pair before inserting into inventory:
| Rule | Example |
|---|---|
| Lowercase method | GET, not Get |
| Strip trailing slash | /users/ → /users |
Collapse path parameters to {param} | /users/123 → /users/{id} |
| Collapse version prefixes to unified notation | /v1/users, /v2/users → note both versions |
| Sort query params alphabetically | ?b=2&a=1 → ?a=1&b=2 |
| Remove default ports | :80 / :443 |
Deduplicate on METHOD PATH (no query) | GET /users is unique; query params are metadata |
Markdown table (human-readable):
| Method | Path | Source | Parameters | Auth | Deprecated |
|--------|------|--------|------------|------|------------|
| GET | /users/{id} | swagger | id (path) | Bearer | no |
| POST | /users | network-capture | body: User | Bearer | no |
| GET | /admin/debug | fuzzing | — | none | — |
JSON schema (machine-readable):
{
"endpoints": [
{
"method": "GET",
"path": "/users/{id}",
"sources": ["swagger", "network-capture"],
"parameters": [{"name": "id", "in": "path", "required": true}],
"auth_required": true,
"deprecated": false,
"first_seen": "2025-07-16",
"last_seen": "2025-07-16"
}
]
}
Compare two inventory snapshots to detect:
METHOD PATH but different parameters, auth, or deprecation statusUse operationId from OpenAPI specs as the stable identifier when available; fall back to METHOD PATH hash.
| Operation | Input | Output |
|---|---|---|
| Canonicalize path | /USERS/{ID}/ | /users/{id} |
| Extract path params | /users/5/orders/42 | {user_id: 5, order_id: 42} |
| Collapse to template | /users/5/orders/42 | /users/{userId}/orders/{orderId} |
| Version-aware grouping | /v1/users, /v2/users | Group under /users with versions: [v1, v2] |
| Merge duplicate | Two sources report GET /users | Single entry, sources: [swagger, fuzzing] |
Paths are defined in the global paths section. Each path supports operations (get, post, put, patch, delete, head, options, trace). A unique operation is PATH + HTTP METHOD — parameters do not affect uniqueness. Paths use {curly} braces for templated parameters.
GET /users?role=admin and GET /users?role=user are the same endpoint. Query params are metadata on the GET /users entry.server_url as metadata.api-discovery-swagger-openapi-probing (parsed OpenAPI paths), api-discovery-graphql-introspection (generated query/mutation templates), api-discovery-network-tab-capture (captured XHR/Fetch traffic), api-discovery-endpoint-fuzzing (ffuf/wfuzz output)api-discovery-mobile-mitmproxy to add mobile-only endpoints that don't appear in browser captures