ScanFort Proxy API Reference
Complete REST API documentation for automating your security testing workflow
Installation
Get started with ScanFort Proxy by installing the local backend service.
Windows
Run this command in PowerShell:
powershell -Command "iwr https://beta.proxy.scanfort.com/portable/run/windows -UseBasicParsing | iex"Linux
Run this command in your terminal:
curl https://beta.proxy.scanfort.com/portable/run/linux | bashmacOS
Run this command in your terminal:
curl https://beta.proxy.scanfort.com/portable/run/mac | bashAlternative: Python Installation
If you have Python installed, you can download and run the installer script manually:
- Download
install.pyfrom beta.proxy.scanfort.com/portable/run/python - Run the installer:
python install.py
What the installer does:
- ✓ Installs ScanFort Proxy locally on your machine
- ✓ Starts the proxy service on localhost:8000
- ✓ Enables communication between the web frontend and local service
Quick Start
Once installed, the ScanFort Proxy API provides programmatic access to all proxy features. All endpoints return JSON responses following a consistent format:
{
"status": "success",
"result": { /* endpoint-specific data */ },
"msg": null
}Base URL: http://localhost:8000
Authentication
All API requests must include the following HTTP header:
sf-api-auth: YOUR_API_KEYIf the header is missing or invalid, the API will return:
HTTP/1.1 401 Unauthorized
{
"detail": "Unauthorized: invalid or missing sf-api-auth header"
}Examples
cURL
curl http://localhost:8000/home/flows/paged \
-H "sf-api-auth: YOUR_API_KEY"fetch
fetch("http://localhost:8000/home/flows/paged", {
headers: {
"sf-api-auth": "YOUR_API_KEY"
}
});Home - Flow Management
Manage and inspect captured HTTP flows with filtering, interception, and replay capabilities.
/home/init-dataInitialize home page state and retrieve interception status.
Response
{
"interceptionActive": boolean,
"lastSelectedFlow": number
}/home/flows/pagedRetrieve paginated list of captured flows.
Query Parameters
offset- Starting index (default: 0)limit- Number of items to return (default: 50)
Response
{
"items": [
{
"homeFlowIndex": number,
"id": string,
"host": string,
"path": string,
"method": string,
"status_code": number,
"intercepted": boolean,
"modified": boolean,
"priority": number,
"user_label": string
}
],
"is_last": boolean
}/home/flow/getGet detailed flow data for editing and inspection.
Request Body
{
"index": number,
"beautifyRequest": boolean,
"beautifyResponse": boolean,
"saveLastSelected": boolean
}/home/flow/updateUpdate flow data with modifications.
Request Body
{
"index": number,
"changedData": {
// Modified flow data
}
}Interception Control
/home/flows/start-interceptStart intercepting flows/home/flows/resume-interceptResume all intercepted flows/home/flows/step-interceptStep through intercepted flows/home/flows/half-step-interceptHalf-step through interceptionFlow Actions
/home/flow/add-to-notesAdd flow to notes collection/home/flow/add-to-playgroundAdd flow to playground for testing/home/ws/flowsWebSocket connection for real-time flow updates.
Playground - Flow Testing
Experiment with flows in an isolated environment for testing modifications and replays.
/playground/get-initial-dataRetrieve all playground flow briefs.
Response
{
"items": [
{
"playgroundBriefIndex": number,
"homeFlowIndex": number,
"title": string,
"user_label": string
}
]
}/playground/replay-flowReplay a flow from the playground.
Request Body
{
"index": number
}Filter - Advanced Search
Powerful filtering capabilities with regex support and custom filter sessions.
/filter/start-basicStart a basic regex-based filter session.
Request Body
{
"searchRegex": string
}Response
{
"sessionId": number
}/filter/start-customCreate a custom filter session with advanced criteria.
Request Body
{
"data": [
{
// Custom filter criteria
}
],
"inScope": boolean
}/filter/flows/pagedGet paginated results from a filter session.
Request Body
{
"sessionId": number,
"offset": number,
"limit": number
}Notes - Documentation
Manage persistent notes and build a knowledge base of interesting flows and vulnerabilities.
/notes/get-initial-dataGet all notes metadata and available flow keys.
/notes/create-new-noteCreate a new note document.
Request Body
{
"title": string
}/notes/get-file-by-name/{file_name}Retrieve note content by filename.
/notes/set-dataSave note document data.
Request Body
{
"fileName": string,
"docData": Array<any>
}/notes/delete-file-by-name/{file_name}Delete a note by filename.
Recon - Intelligence Gathering
Smart parameter tracking and reconnaissance features for discovering patterns.
/recon/searchSmart search with context-based ranking.
Request Body
{
"context": {
// Search context
},
"return_type": "records",
"limit": 10
}/recon/latest-valuesGet latest parameter values per user.
Request Body
{
"host": string,
"path": string,
"key": string,
"json_path": string
}Settings - Configuration
Configure proxy behavior, scopes, header modifications, and browser integration.
Scope Management
/settings/set-in-scopesConfigure scope rules/settings/get-in-scopesRetrieve current scopesHeader Modification
/settings/set-header-modifiersConfigure header modifications/settings/get-header-modifiersGet active header modifiers/settings/launch-browserLaunch a browser with proxy configuration.
Request Body
{
"browser": string,
"userLabel": string,
"url": string
}System
/settings/versionGet API version/settings/clear-dbClear database/settings/get-portsGet port mappingsError Handling
Error Response Format
{
"status": "error",
"result": null,
"msg": "Error description"
}Common HTTP Status Codes
- 200 Success
- 400 Bad Request - Invalid parameters
- 404 Not Found - Resource doesn't exist
- 500 Internal Server Error
Code Examples
Python Example
import requests
# Get paginated flows
response = requests.get(
"http://localhost:8000/home/flows/paged",
params={"offset": 0, "limit": 50}
)
data = response.json()
if data["status"] == "success":
flows = data["result"]["items"]
for flow in flows:
print(f"{flow['method']} {flow['host']}{flow['path']}")
JavaScript Example
// Start a filter session
const response = await fetch("http://localhost:8000/filter/start-basic", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
searchRegex: "api\\.example\\.com"
})
});
const data = await response.json();
if (data.status === "success") {
const sessionId = data.result.sessionId;
console.log("Filter session created:", sessionId);
}
cURL Example
# Replay a flow
curl -X POST http://localhost:8000/playground/replay-flow \
-H "Content-Type: application/json" \
-d '{"index": 42}'