autocURL
Back to docs

Supported Frameworks

Frameworks autocurl extracts API routes from: Express, NestJS, FastAPI, Flask, Django, Gin, Echo, Fiber, and Go net/http, and what each extractor reads.

autocurl generates requests by reading your route declarations, not by running your app or reading an OpenAPI spec. This page lists the frameworks it can extract routes from and the kinds of declarations each extractor understands.

At a glance

LanguageFrameworkWhat autocurl reads
JavaScript / TypeScriptExpressapp.get(), router.post() and other method calls, .route() chains, .all(), and routers mounted with app.use() via CommonJS require()
TypeScriptNestJS@Controller() classes with @Get(), @Post(), @Put(), @Patch(), @Delete() and similar decorators, global prefixes, RouterModule, and URI versioning
PythonFastAPI@app.get()-style decorators, APIRouter prefixes, include_router(), and api_route()
PythonFlask@app.route() with methods=, and Blueprint routes registered with register_blueprint()
PythonDjangopath() and re_path() entries in urls.py, include(), and Django REST Framework routers (DefaultRouter, SimpleRouter)
GoGinr.GET()-style methods, Handle(), and Group() prefixes
GoEchoe.GET()-style methods, Add(), and Group() prefixes
GoFiberapp.Get()-style methods, Add(), and Group() prefixes
Gonet/httphttp.HandleFunc(), Handle(), and ServeMux registrations

Each generated request includes a # @source file:line comment pointing at the declaration it came from, so you can always trace a request back to the code.

Statically declared routes

Extraction is AST-based: autocurl parses your source files and follows route declarations it can resolve without executing code. Routes built at runtime, for example paths assembled from configuration, loops over a route table, or decorators applied dynamically, may not be resolvable this way. autocurl skips what it cannot resolve rather than guessing.

// Extracted: the method and path are visible in the source.
router.get("/users/:id", getUser);

// May not be extracted: the path only exists at runtime.
for (const r of routes) router[r.method](r.path, r.handler);

When the AST pass leaves routes unresolved, you can opt into AI-assisted analysis with --ai=auto. It uses your own Gemini API key, and suggested routes are validated against source evidence before they are accepted. See AI-assisted discovery, and how route discovery works for the full picture.

Detection is not the same as extraction

autocurl first identifies which framework a project uses, then runs the matching extractor. It can recognise some frameworks it does not yet extract routes from. In that case you will see the framework named in the output, but no routes for it. Only the frameworks in the table above have route extractors today.

Scoping to part of a project

You do not have to scan an entire monorepo. Point autocurl at a module directory or a single source file and it generates requests only for routes in that scope, while keeping project context such as router mounts and prefixes:

autocurl ./my-api/src/modules/users
autocurl ./my-api/src/routes/users.js

Supported source file extensions are .js, .ts, .py, and .go.

Requirements for Python projects

The FastAPI, Flask, and Django extractors use Python's built-in ast module, so a python3 interpreter must be available on your PATH when scanning Python code. JavaScript, TypeScript, and Go extraction is built into the autocurl binary.

Missing your framework?

Open an issue on GitHub with a small example of how routes are declared. Real-world snippets help most when adding or improving an extractor.

Next: Install autocurl and generate your first file →

On this page