1. Project Overview & Quickstart (projectdiscovery/httpx)
httpx is a fast and multi-purpose HTTP toolkit that allows running multiple probes using the retryablehttp library. It is designed to maintain result reliability with an increased number of threads.
Features
- Simple and modular code base making it easy to contribute.
- Fast And fully configurable flags to probe multiple elements.
- Supports multiple HTTP based probings.
- Smart auto fallback from https to http by default.
- Supports hosts, URLs and CIDR as input.
- Handles edge cases doing retries, backoffs etc for handling WAFs.
Supported probes
| Probes | Default check | Probes | Default check |
|---|---|---|---|
| URL | true | IP | true |
| Title | true | CNAME | true |
| Status Code | true | Raw HTTP | false |
| Content Length | true | HTTP2 | false |
| TLS Certificate | true | HTTP Pipeline | false |
| CSP Header | true | Virtual host | false |
| Line Count | true | Word Count | true |
| Location Header | true | CDN | false |
| Web Server | true | Paths | false |
| Web Socket | true | Ports | false |
| Response Time | true | Request Method | true |
| Favicon Hash | false | Probe Status | false |
| Body Hash | true | Header Hash | true |
| Redirect chain | false | URL Scheme | true |
| JARM Hash | false | ASN | false |
Installation Instructions
httpx requires go >=1.25.0 to install successfully. Run the following command to get the repo:
go install -v github.com/projectdiscovery/httpx/cmd/httpx@latestTo learn more about installing httpx, see https://docs.projectdiscovery.io/tools/httpx/install.
| :exclamation: Disclaimer |
|---|
| This project is in active development. Expect breaking changes with releases. Review the changelog before updating. |
| This project was primarily built to be used as a standalone CLI tool. Running it as a service may pose security risks. It's recommended to use with caution and additional security measures. |
Usage
httpx -hThis will display help for the tool. Here are all the switches it supports.
/* Detailed source-code truncated for AI context efficiency. */Running httpx
For details about running httpx, see https://docs.projectdiscovery.io/tools/httpx/running.
Using `httpx` as a library
httpx can be used as a library by creating an instance of the Option struct and populating it with the same options that would be specified via CLI. Once validated, the struct should be passed to a runner instance (to be closed at the end of the program) and the RunEnumeration method should be called. A minimal example of how to do it is in the examples folder.
Common Recipes
Below are practical one-liners for common use cases leveraging httpx's composable primitives. These recipes are validated in runner/wellknown_recipes_test.go.
Use -mdc with DSL helpers such as contains(content_type, ...) and contains(body, ...) to match response metadata and body content. (-mr/-ms match the full raw response; use -mdc for structured field matching.)
Well-known files
security.txt
Probe for a valid RFC 9116 security.txt file at the standard paths (/.well-known/security.txt, /security.txt):
echo target.com | httpx -path '/.well-known/security.txt,/security.txt' -mc 200 -mdc 'contains(content_type, "text/plain") && contains(body, "Contact:") && contains_any(body, "mailto:", "https://")'-pathtests custom path(s)-mc 200matches HTTP 200-mdcmatches using DSL expressions on response fields such ascontent_typeandbody
robots.txt
echo target.com | httpx -path '/robots.txt' -mc 200 -mdc 'contains(content_type, "text/plain")'sitemap.xml
echo target.com | httpx -path '/sitemap.xml' -mc 200 -mdc 'contains_any(content_type, "application/xml", "text/xml") && contains(body, "<urlset")'humans.txt
echo target.com | httpx -path '/humans.txt' -mc 200 -mdc 'contains(content_type, "text/plain")'ads.txt
echo target.com | httpx -path '/ads.txt' -mc 200 -mdc 'contains(content_type, "text/plain") && contains(body, "google.com")'Well-known URIs
OpenID Connect discovery (spec)
echo target.com | httpx -path '/.well-known/openid-configuration' -mc 200 -mdc 'contains(content_type, "application/json") && contains(body, "\"issuer\"")'Apple Universal Links
echo target.com | httpx -path '/.well-known/apple-app-site-association,/.well-known/apple-app-site-association.json' -mc 200 -mdc 'contains(content_type, "application/json") && contains(body, "\"applinks\"")'Android App Links
echo target.com | httpx -path '/.well-known/assetlinks.json' -mc 200 -mdc 'contains(content_type, "application/json") && contains(body, "\"android_app\"")'crossdomain.xml (legacy Flash policy file)
echo target.com | httpx -path '/crossdomain.xml' -mc 200 -mdc 'contains_any(content_type, "application/xml", "text/xml") && contains(body, "cross-domain-policy")'Other well-known URIs (IANA registry):
echo target.com | httpx -path '/.well-known/security.txt,/.well-known/change-password,/.well-known/openid-configuration' -mc 200Notes
- As default,
httpxprobe with HTTPS scheme and fall-back to HTTP only if HTTPS is not reachable. - Burp Suite XML exports can be used as input with
-l burp-export.xml -im burp - The
-no-fallbackflag can be used to probe and display both HTTP and HTTPS result. - Custom scheme for ports can be defined, for example
-ports http:443,http:80,https:8443 - Custom resolver supports multiple protocol (doh|tcp|udp) in form of
protocol:resolver:port(e.g.udp:127.0.0.1:53) - Secret files can be used for domain-based authentication via
-sf secrets.yaml. Supported auth types:BasicAuth,BearerToken,Header,Cookie,Query. Example:yamlid: example-auth info: name: Example Auth Config static: - type: Header domains: - api.example.com headers: - key: X-API-Key value: secret-key-here - type: BasicAuth domains-regex: - ".*\\.internal\\.com$" username: admin password: secret - The following flags should be used for specific use cases instead of running them as default with other probes:
-ports-path-vhost-screenshot-csp-probe-tls-probe-favicon-http2-pipeline-tls-impersonate
Acknowledgement
Probing feature is inspired by @tomnomnom/httprobe work โค๏ธ
2. Official Technical Reference & Guides (projectdiscovery/docs)
File: README.md
ProjectDiscovery Documentation
This is the source code for the ProjectDiscovery documentation located at https://docs.projectdiscovery.io
Development
- Checkout this repository
- Install mintlify with
npm i mintlify@latest - Run
mintlify dev
Deploying
To build the final product, we have a couple of additional steps:
- Build the JS Protocol Docs
npm install jsdoc-to-markdown./bin/jsdocs.sh
- Build the PDCP API reference documentation
- Either download the latest
openapi.yamlmanually or run./bin/download-api.sh - Run
./bin/generate-api.shto generate any new API files - OR run
./bin/generate-filtered-api.shto generate API docs without internal/admin endpoints
- Deployment
After those, Mintlify handles the deployment automatically.
File: bin/README-auto-grouped-api.md
Auto-Grouped API Documentation Generator
This script automatically generates and maintains API documentation with logical grouping based on OpenAPI tags. It combines the best of both worlds: auto-generation (no missing endpoints) and logical organization.
Usage
# Use default source file (Downloads directory)
./bin/generate-auto-grouped-api.sh
# Use custom source file
./bin/generate-auto-grouped-api.sh /path/to/your/openapi.yamlWhat it does
๐ค **Auto-Generation**
- Reads OpenAPI specification
- Filters out admin and internal APIs
- Generates MDX files for all public endpoints
- Never misses endpoints - everything is included automatically
๐ **Logical Grouping**
The script organizes endpoints into logical groups based on OpenAPI tags:
- Assets โ
assets+enumerationstags - Templates โ
templates+template/v2tags - Scans โ
scanstag - Results โ
results+reteststags - Configurations โ
configurationstag - Users โ
users+usertags - Logs โ
elog+scan_logtags - Export โ
exporttag - Automations โ
automationstag - Integration โ
oauthtag - Utilities โ
chaos,vulns,leaks,billing,usagetags
๐ **Auto-Updates Navigation**
- Automatically updates
mint.jsonwith new structure - Maintains logical grouping
- Sorts endpoints alphabetically within groups
- Handles new endpoints automatically
Benefits
โ
No Manual Maintenance - Add new endpoints to OpenAPI spec and they appear automatically
โ
Never Miss Endpoints - All public endpoints are included
โ
Logical Organization - Grouped by functionality, not alphabetically
โ
Consistent Naming - Uses OpenAPI summaries and operation IDs
โ
Future-Proof - Works with any OpenAPI specification changes
Output Structure
After running, your mint.json will have clean navigation like:
{
"group": "API Reference",
"pages": [
"api-reference/introduction",
{
"group": "Assets",
"pages": [
"api-reference/assets/get-asset-list",
"api-reference/assets/upload-asset",
"api-reference/enumerations/create-enumeration",
"..."
]
},
{
"group": "Templates",
"pages": [
"api-reference/templates/create-template",
"api-reference/templates/get-template-list",
"..."
]
}
]
}Comparison with Manual Approach
| Feature | Manual (generate-filtered-api.sh) |
Auto-Grouped (generate-auto-grouped-api.sh) |
|---|---|---|
| Missing Endpoints | โ Requires manual addition to mint.json |
โ Never - all endpoints auto-included |
| Logical Grouping | โ Full manual control | โ Smart tag-based grouping |
| Maintenance | โ High - update mint.json for new endpoints |
โ Zero - fully automated |
| Consistency | โ Depends on manual updates | โ Always consistent |
| New API Versions | โ Manual review and updates needed | โ Automatically handles changes |
When to Use
Use Auto-Grouped when:
- You want zero maintenance overhead
- You frequently add/remove API endpoints
- You have a team that might forget to update navigation
- You want consistent organization based on API design
Use Manual when:
- You need very specific custom grouping that doesn't match tags
- You want to exclude certain public endpoints from docs
- You have complex navigation requirements
Next Steps
After running this script:
- Preview:
mintlify dev - Deploy: Your CI/CD can run this script automatically when OpenAPI changes
- Customize: Modify the
logicalGroupsmapping in the script if needed
File: bin/README-filtered-api.md
Filtered API Documentation Generator
This script generates API documentation from an OpenAPI specification while excluding internal and admin endpoints.
Usage
# Use default source file (Downloads directory)
./bin/generate-filtered-api.sh
# Use custom source file
./bin/generate-filtered-api.sh /path/to/your/openapi.yamlNote: The script will create a filtered openapi.yaml file in the current directory for Mintlify to use.
What gets filtered out
The script automatically excludes:
Admin APIs: All paths starting with
/v1/admin/- Examples:
/v1/admin/user/search,/v1/admin/team/change_owner
- Examples:
Internal APIs: Endpoints tagged with
internal- Any endpoint with
"internal"in its tags array
- Any endpoint with
Output
- Creates filtered API documentation in the
api-reference/directory - Removes existing
internal/andadmin/folders before regenerating - Uses Mintlify scraping to generate MDX files for each endpoint
- Provides detailed console output showing what was filtered
Requirements
- Node.js and npm/npx
- Internet connection (to download @mintlify/scraping package)
- Valid OpenAPI 3.x specification file
Integration with existing workflow
You can replace the existing ./bin/generate-api.sh call in your build process with:
# Old way (includes internal/admin APIs)
./bin/generate-api.sh
# New way (excludes internal/admin APIs)
./bin/generate-filtered-api.shTroubleshooting
If you encounter errors:
- "OpenAPI source file not found": Ensure the file path is correct
- "Node.js is required": Install Node.js from https://nodejs.org
- Network errors: Check internet connection for npm package downloads
- Permission errors: Ensure the script is executable (
chmod +x bin/generate-filtered-api.sh)