Documentation
Complete guide to setting up, configuring, and using OrchestAPI — the self-hosted API test orchestration platform with DAG-based dependencies, live streaming, infrastructure verification, and scheduled execution.
Prerequisites
- Java 21 (for running from source)
- Node.js 18+ with npm (for frontend development)
- PostgreSQL 14+ (or Docker to run it)
- Docker (recommended for production deployment)
Quick Start
1. Start PostgreSQL
Using Docker:
docker run -d \
--name orchestapi-db \
-e POSTGRES_USER=orchestapi \
-e POSTGRES_PASSWORD=your_password \
-e POSTGRES_DB=orchestapi \
-p 5432:5432 \
postgres:17
Or use any existing PostgreSQL instance.
2. Start the Backend
cd backend
# Set your database credentials
export DB_URL=jdbc:postgresql://localhost:5432/orchestapi
export DB_USERNAME=orchestapi
export DB_PASSWORD=your_password
# Run
./mvnw spring-boot:run
The backend starts on http://localhost:8080. Database schema and tables are created automatically via Flyway on first startup.
3. Start the Frontend
cd frontend
npm install
npm run dev
The frontend starts on http://localhost:3000 and proxies API calls to the backend.
Docker Deployment
The recommended way to deploy OrchestAPI in production is via Docker. The image bundles both frontend and backend into a single container.
Using Docker Compose (recommended)
# Clone the repository
git clone https://github.com/santhoshkumr96/orchestapi.git
cd orchestapi
# Start everything (PostgreSQL + OrchestAPI)
docker compose up -d
# Open http://localhost:8080
DB_PASSWORD in a .env file next to docker-compose.yml for security.
Using Docker directly
# Pull the image
docker pull santhoshkumr96/orchestapi:latest
# Run with your own PostgreSQL
docker run -d \
--name orchestapi \
-p 8080:8080 \
-e DB_URL=jdbc:postgresql://your-host:5432/orchestapi \
-e DB_USERNAME=orchestapi \
-e DB_PASSWORD=your_password \
santhoshkumr96/orchestapi:latest
Building the image locally
docker build -t santhoshkumr96/orchestapi:latest .
Environments
Environments hold all the configuration for a target system — variables, headers, infrastructure connectors, and files. Each test suite has a default environment, which can be overridden at run time.
Go to Environments in the sidebar, click New Environment, then configure the sections below.
Variables
Key-value pairs available to all steps via ${VAR_NAME} syntax.
| Field | Description |
|---|---|
| Key | Variable name (unique per environment) |
| Value | Variable value |
| Value Type | STATIC (use as-is), UUID (auto-generate per request), ISO_TIMESTAMP (auto-generate current UTC time) |
| Secret | Toggle on to mask the value in API responses and UI |
Common variables: BASE_URL, API_KEY, AUTH_TOKEN, TENANT_ID.
Default Headers
Headers automatically added to every API step that uses this environment. Step-level headers override these if the same key is used.
| Field | Description |
|---|---|
| Header Key | Header name (e.g., Authorization, Content-Type) |
| Value Type | How the value is generated |
| Header Value | The value or variable reference |
Value Types
| Type | Behavior | Example |
|---|---|---|
STATIC | Use the value as-is | application/json |
VARIABLE | Look up an environment variable by name | api_token → resolves to the variable's value |
UUID | Auto-generate a new UUID v4 per request | 550e8400-e29b-41d4-... |
ISO_TIMESTAMP | Auto-generate current UTC timestamp | 2026-02-26T10:30:00.000Z |
Connectors
Infrastructure connectors for post-step verifications (e.g., check a DB row was created, verify a Kafka event was published). See Connector Reference for all types and config fields.
| Field | Description |
|---|---|
| Name | Unique name (referenced in step verifications) |
| Type | MYSQL, POSTGRES, ORACLE, SQLSERVER, REDIS, ELASTICSEARCH, KAFKA, RABBITMQ, MONGODB |
| Config | Type-specific connection fields (host, port, credentials, SSL, etc.) |
Use the Test Connection button to verify connectivity before saving.
Files
Binary files stored in the database, referenced in form-data requests via ${FILE:fileKey}.
| Field | Description |
|---|---|
| File Key | Unique identifier (used in ${FILE:key} syntax) |
| File | The uploaded file (any type, max 50 MB) |
Test Suites
A test suite is a collection of API steps with an optional dependency graph (DAG). Go to Test Suites in the sidebar.
| Field | Description |
|---|---|
| Name | Suite name (unique) |
| Description | Optional description |
| Default Environment | Environment used unless overridden at run time |
Steps within a suite can depend on each other, forming a directed acyclic graph. The execution engine resolves this graph and runs steps in the correct order.
Steps
Each step represents a single API call. Click + Add Step or use Import from curl to create one. The step editor has a familiar tabbed interface:
- Headers — request headers
- Params — query parameters
- Body — request body (JSON or form-data)
- Dependencies — step dependencies
- Handlers — response code handlers
- Variables — variable extraction
- Verifications — infrastructure verifications
- Validation — response validation rules
HTTP Methods
GET POST PUT DELETE PATCH
The URL supports placeholders: ${BASE_URL}/api/users/{{Create User.id}}
Headers
Step-level headers that override environment defaults when the same key is used. Each header is a key-value pair. Placeholders work in both key and value.
Request Body
| Body Type | Description |
|---|---|
| None | No request body (default for GET/DELETE) |
| JSON | Raw JSON body with syntax validation. Content-Type set to application/json |
| Form Data | Multipart form-data with text and file fields |
Form Data Fields
| Field | Type | Value |
|---|---|---|
| Key | — | Form field name |
| Type | text | Plain text (supports ${VAR} and {{step.path}} placeholders) |
| Type | file | File reference using ${FILE:fileKey} syntax |
Query Parameters
Key-value pairs appended to the URL as ?key=value&key2=value2. Placeholders supported in both key and value.
Dependencies
Steps that must execute before this one. Select from other steps in the same suite.
| Option | Default | Description |
|---|---|---|
| Use Cache | true | Reuse the dependency's cached response if TTL hasn't expired. Set false to always re-execute. |
| Reuse Manual Input | true | If the dependency has #{param} placeholders and the value was already provided, silently reuse it. Set false to prompt again. |
Once a dependency is added, reference its response data with {{StepName.jsonPath}} in any field.
Variable Extraction
Extract values from a step's response for use in later steps.
| Field | Description |
|---|---|
| Variable Name | Name to store the extracted value |
| JSON Path | Path to the value in the response |
| Source | Where to extract from |
Extraction Sources
| Source | JSON Path / Key | Description |
|---|---|---|
RESPONSE_BODY | $.data.id | Extract from JSON response body |
RESPONSE_HEADER | Authorization | Extract a response header value by name |
STATUS_CODE | (not used) | Stores the HTTP status code as a string |
REQUEST_BODY | $.orderId | Extract from the resolved request body |
REQUEST_HEADER | X-Request-ID | Extract a resolved request header value |
QUERY_PARAM | page | Extract a resolved query parameter value |
REQUEST_URL | (not used) | Stores the full resolved request URL |
REQUEST_HEADER with key X-Request-ID returns the generated UUID, not ${REQUEST_ID}.
JSON Path Syntax
| Pattern | Example | Description |
|---|---|---|
$.field | $.id | Top-level field |
$.nested.field | $.data.user.name | Nested field |
$.array[0] | $.items[0] | First array element |
$.array[0].field | $.items[0].id | Field in first array element |
$.length() | $.items.length() | Array or string length |
$.size() | $.items.size() | Same as length() |
Response Handlers
Define what action to take for each HTTP status code. Handlers are evaluated in priority order. Specific codes take precedence over ranges.
| Field | Description |
|---|---|
| Match Code | HTTP status code or range: 200, 404, 2xx, 4xx, 5xx |
| Action | What to do when matched |
| Priority | Evaluation order (0 = first) |
Actions
| Action | Description | Extra Fields |
|---|---|---|
SUCCESS | Mark step as successful, proceed to dependents | — |
ERROR | Mark step as failed, skip dependents | — |
RETRY | Re-execute the step after a delay | retryCount (max attempts), retryDelaySeconds |
FIRE_SIDE_EFFECT | Execute another step as a side effect | sideEffectStepId (which step to trigger) |
Example Setup
| Match Code | Action | Priority | Notes |
|---|---|---|---|
2xx | SUCCESS | 0 | Any 2xx is success |
500 | RETRY | 1 | Retry on server error (3 times, 5s delay) |
4xx | ERROR | 2 | Client errors are failures |
Caching
Within-run response caching to avoid re-executing the same dependency multiple times.
| Field | Default | Description |
|---|---|---|
| Cacheable | false | Enable caching for this step's response |
| Cache TTL (seconds) | 0 | How long the cache is valid. 0 = valid until run ends |
Dependency-Only Steps
| Field | Default | Description |
|---|---|---|
| Dependency Only | false | When true, the step is skipped during suite runs. It only executes when a dependent step needs it. The individual Run button still works. |
Use this for setup steps (e.g., "Create Auth Token") that should only run when another step depends on them.
Verifications (Infrastructure)
Run queries against infrastructure connectors after the API call completes, then assert on the results. Verify side effects like database rows, Kafka events, or Redis keys.
| Field | Description |
|---|---|
| Connector | Which environment connector to use (by name) |
| Query | The query/command to execute (connector-specific) |
| Timeout (s) | Overall verification timeout (default 30) |
| Query Timeout (s) | Query execution timeout (default 30) |
| Pre-Listen | Start listening BEFORE the step executes (for Kafka, RabbitMQ) |
Pre-Listen Mode
For asynchronous systems where the event is published during the API call:
- Verification sets up a listener (e.g., Kafka consumer) before the API call
- Step executes the API call
- Listener waits for a matching message within the timeout
- Assertions run on the received message
Assertions
Each verification can have multiple assertions on the query result:
| Operator | Description | Example |
|---|---|---|
EQUALS | Exact match | $.status EQUALS "active" |
NOT_EQUALS | Not equal | $.status NOT_EQUALS "deleted" |
CONTAINS | Substring match | $.message CONTAINS "success" |
NOT_CONTAINS | Doesn't contain | $.error NOT_CONTAINS "fatal" |
REGEX | Regex pattern match | $.email REGEX ^.+@.+\..+$ |
GT | Greater than (numeric) | $.count GT 0 |
LT | Less than (numeric) | $.latency LT 1000 |
GTE | Greater than or equal | $.count GTE 1 |
LTE | Less than or equal | $.retries LTE 3 |
EXISTS | Field exists | $.id EXISTS |
NOT_EXISTS | Field doesn't exist | $.error NOT_EXISTS |
Response Validation
Validate the HTTP response itself (separate from infrastructure verifications). Four validation types are available:
1. Header Validation
Assert response headers match expected values. Useful for checking content types, cache headers, auth tokens.
| Field | Description |
|---|---|
| Header Name | Response header to check |
| Operator | EQUALS, CONTAINS, REGEX, EXISTS, etc. |
| Expected Value | Value to compare against |
2. Body Exact Match
Compare the entire response body against an expected payload.
| Match Mode | Description |
|---|---|
| STRICT | Exact match — same keys, same values, same structure |
| FLEXIBLE | Subset match — expected fields must be present, extra fields allowed |
| STRUCTURE | Shape match — validates structure and types only, ignores actual values |
3. Body Field Assertion
Target specific fields via JSON path and apply assertion operators.
| Field | Description |
|---|---|
| JSON Path | Path to the value (e.g., $.data.orders[0].total) |
| Operator | EQUALS, CONTAINS, GT, LT, REGEX, EXISTS, etc. |
| Expected Value | Value to compare against |
4. Body Data Type
Verify field types at any JSON path.
| Expected Type | Matches |
|---|---|
STRING | JSON string values |
NUMBER | Integer or decimal numbers |
BOOLEAN | true or false |
ARRAY | JSON arrays |
OBJECT | JSON objects |
NULL | Null values |
Placeholders & Autocomplete
OrchestAPI supports four types of dynamic placeholders. All placeholder-enabled fields show an autocomplete dropdown.
Environment Variables — ${VAR_NAME}
Type ${ to trigger autocomplete. Resolves to the variable value from the active environment. Works in URL, headers, body, query params, and verification queries.
Step Response References — {{StepName.path}}
Type {{ to trigger autocomplete. References extracted variables or any JSON path from a dependency step's response. Two-step autocomplete:
- Type
{{→ shows dependent step names - Select a step → type
.→ shows extracted variable names - You can also type a custom JSON path (e.g.,
{{StepName.data.items[0].id}})
Manual Input — #{paramName}
| Syntax | Example | Behavior |
|---|---|---|
#{paramName} | #{otp} | Prompts user at runtime (required) |
#{paramName:default} | #{env:production} | Prompts with pre-filled default (optional) |
During execution, the UI pauses and shows an input modal. Enter the value and execution resumes.
#{param:default} placeholders work (the default is applied automatically). #{param} without a default is skipped.
File References — ${FILE:fileKey}
Type ${FILE: to trigger autocomplete. References an uploaded file from the environment's Files section. Used in form-data fields to attach files to multipart requests.
Running Tests
Single Step
Click the play button next to any step. The step and all its transitive dependencies execute in order. Results show the target step at top level with dependencies in a collapsible accordion.
Full Suite
Click Run Suite at the top of the suite detail page. Optionally override the default environment. All non-dependency-only steps execute in topological order based on the dependency graph.
Live Streaming (SSE)
Both single step and suite runs stream results in real time via Server-Sent Events:
| Event | Description |
|---|---|
run-started | Run initiated, returns runId |
step | A step completed — includes full result with status, response, verifications |
input-required | Execution paused — a step needs manual input |
complete | All steps finished — includes final status and total duration |
run-error | Fatal error during run |
Manual Input During Runs
When a step contains #{param} placeholders, execution pauses and shows a modal. Each parameter is shown with its name, optional default, and cached value from earlier steps.
Run Results
Each step result includes:
| Field | Description |
|---|---|
| Status | SUCCESS, ERROR, SKIPPED, VERIFICATION_FAILED, VALIDATION_FAILED |
| Response Code | HTTP status code |
| Response Body | Full response body |
| Response Headers | All response headers |
| Duration | Execution time in milliseconds |
| Request URL | The resolved URL that was called |
| Request Body | The resolved request body |
| Extracted Variables | Variables extracted from the response |
| Verification Results | Each verification's pass/fail with assertion details |
| Validation Results | Response validation pass/fail details |
| From Cache | Whether the result was served from cache |
Step Status Values
| Status | Color | Description |
|---|---|---|
SUCCESS | Green | Step and all verifications/validations passed |
ERROR | Red | HTTP call failed or response handler returned ERROR |
SKIPPED | Gray | Dependency failed or step not needed |
VERIFICATION_FAILED | Purple | API call succeeded but infrastructure verification assertions failed |
VALIDATION_FAILED | Teal | API call succeeded but response validation failed |
Suite Status Values
| Status | Description |
|---|---|
SUCCESS | All steps passed |
PARTIAL_FAILURE | Some steps failed but suite continued |
FAILURE | A critical step failed |
Scheduling
Go to Runs page → Schedules tab.
Create a Schedule
| Field | Description |
|---|---|
| Test Suite | Which suite to run |
| Environment | Which environment to use |
| Cron Expression | Standard 5-field cron pattern |
| Description | Optional label |
| Active | Toggle on/off without deleting |
Cron Format
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, 0=Sunday)
│ │ │ │ │
* * * * *
Examples
| Expression | Description |
|---|---|
0 0 * * * | Every day at midnight |
0 9 * * * | Every day at 9:00 AM |
*/15 * * * * | Every 15 minutes |
0 */4 * * * | Every 4 hours |
0 9 * * MON | Every Monday at 9:00 AM |
0 0 1 * * | First of every month at midnight |
Use Preview to see the next fire times before saving.
#{param:default} uses the default automatically. #{param} without a default is skipped. Results are saved with trigger type SCHEDULED.
Run History
Go to Runs page → Run History tab.
| Filter | Description |
|---|---|
| Suite | Filter by test suite |
| Environment | Filter by environment |
| Status | SUCCESS, FAILURE, PARTIAL_FAILURE, CANCELLED, RUNNING |
| Trigger Type | MANUAL or SCHEDULED |
| Date Range | Filter by start date range |
Click any row to expand full step-by-step results. Export results to JSON.
Dashboard
The dashboard shows execution statistics at a glance:
- Total Runs — all runs ever executed
- Pass Rate — percentage of successful runs
- Active Schedules — number of enabled schedules
- Total Suites / Environments — entity counts
- Recent Runs — latest run results
- Suite Health — pass rate per suite
Mock Server
Create standalone mock API endpoints to simulate external services during testing. Go to Mock Server in the sidebar.
Mock Servers
| Field | Description |
|---|---|
| Name | Server name (unique) |
| Description | Optional description |
| Enabled | Toggle to enable/disable the mock server |
Each mock server gets a unique URL: http://your-host/mock/{serverId}/...
Mock Endpoints
Each endpoint defines a path pattern, HTTP method, and configurable response.
| Field | Description |
|---|---|
| Name | Endpoint name |
| HTTP Method | GET, POST, PUT, DELETE, PATCH, or ANY |
| Path Pattern | URL path to match (supports :param and /** wildcard) |
| Response Status | HTTP status code to return |
| Response Body | Body to return |
| Response Headers | Custom headers to include |
| Delay (ms) | Artificial delay before responding |
| Match Rules | Additional conditions (header, query param, body JSON path) |
Path Matching
| Pattern | Matches |
|---|---|
/api/users | Exact path |
/api/users/:id | Parameterized segment (/api/users/123) |
/api/** | Wildcard — any path under /api/ |
Match Rules
All rules must match (AND logic). Endpoints are evaluated in sort order — first match wins.
| Type | Description |
|---|---|
HEADER | Match a request header key (and optionally value) |
QUERY_PARAM | Match a query parameter key (and optionally value) |
BODY_JSON_PATH | Match a JSON path in the request body |
Request Logging
All incoming requests are logged with method, path, headers, body, response status, duration, and whether an endpoint was matched.
Webhook Tester
Receive and inspect incoming HTTP requests in real-time — like webhook.site, but self-hosted. Go to Webhooks in the sidebar.
Creating a Webhook
| Field | Description |
|---|---|
| Name | Webhook name (unique) |
| Description | Optional description |
| Default Response Status | HTTP status code returned to the caller (default: 200) |
| Default Response Body | Body returned to the caller |
| Default Response Headers | Custom headers returned to the caller |
Each webhook gets a unique URL: http://your-host/webhook/{webhookId}/...
Any HTTP method can be used. The webhook captures everything and returns the configured response.
Request Inspection
The detail page shows a two-panel layout:
- Left panel: Live list of incoming requests (method, path, source IP, timestamp)
- Right panel: Full request detail for the selected request
Captured Data
| Field | Description |
|---|---|
| HTTP Method | GET, POST, PUT, etc. |
| Path | Path after /webhook/{id}/ |
| Headers | All request headers |
| Query Parameters | URL query string parameters |
| Body | Text/JSON as-is, binary base64-encoded |
| Content-Type | Request content type |
| Source IP | Caller's IP (supports X-Forwarded-For) |
| Files | Multipart uploads with preview and download |
File Handling
| Content Type | Behavior |
|---|---|
| JSON / text | Stored as-is, formatted in the UI |
| Images (image/*) | Base64-encoded, rendered inline with preview button |
| Binary (pdf, audio, video) | Base64-encoded, download button available |
| Multipart | Files extracted with preview (images) and download buttons |
Real-Time Streaming
The detail page connects via SSE and shows new requests instantly with a green “Live” indicator. Multiple browser tabs can monitor the same webhook simultaneously.
Limits
| Limit | Value |
|---|---|
| Max request body size | 10 MB (returns 413 if exceeded) |
| Max stored requests per webhook | 500 (oldest auto-trimmed) |
| SSE connection timeout | 60 minutes |
When a webhook is disabled, incoming requests receive a 503 Service Unavailable response.
Curl Import
Quickly create a step from a curl command. Click Import from curl in the suite detail page.
Supported Flags
| Flag | Description |
|---|---|
-X METHOD / --request | HTTP method |
-H "Key: Value" / --header | Request headers (multiple allowed) |
-d data / --data | Request body |
--data-raw | Raw body data |
--data-binary | Binary body data |
| URL query params | Auto-extracted from the URL |
Line continuations (\) are handled. Step name is auto-generated from the URL path. Method defaults to POST if body is present, GET otherwise.
Connector Reference
JDBC (MySQL, PostgreSQL, Oracle, SQL Server)
| Field | Description |
|---|---|
host | Database host |
port | Port (MySQL: 3306, PG: 5432, Oracle: 1521, MSSQL: 1433) |
database | Database name |
username | Database user |
password | Database password |
ssl / caCertificate | SSL/TLS config (empty CA = trust all) |
Query: Standard SQL SELECT statements.
Result: { "rows": [{ "id": 1, "name": "test" }], "rowCount": 1 }
Redis
| Field | Description |
|---|---|
host / port | Redis host and port (default 6379) |
password | Auth password (optional) |
database | Database index 0-15 (default 0) |
Query: GET key, HGET hash field, HGETALL hash, EXISTS key, LRANGE key 0 -1, SISMEMBER set member.
Result: { "value": "data", "type": "string", "exists": true }
Elasticsearch
| Field | Description |
|---|---|
url | Base URL (e.g., https://localhost:9200) |
username / password | Basic auth credentials |
Query: METHOD /path body — e.g., GET /my-index/_search {"query":{"match_all":{}}}
Kafka
| Field | Description |
|---|---|
brokers | Comma-separated broker list |
securityProtocol | Optional: SSL, SASL_SSL, SASL_PLAINTEXT |
saslMechanism | Optional: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512 |
saslUsername / saslPassword | SASL credentials |
Query (newline-separated):
topic=events_topic
key=order-123
Creates an isolated consumer group per verification (UUID-based). Seeks to latest offset and waits for new messages.
Result: { "found": true, "key": "order-123",
"value": { "eventType": "ORDER_CREATED" },
"partition": 0, "offset": 42 }
RabbitMQ
| Field | Description |
|---|---|
host / port | Host and port (5672 or 5671 for SSL) |
virtualHost | Virtual host (default /) |
username / password | Auth credentials |
Query (space-separated): queue=my_queue routingKey=order.created
Result: { "found": true, "routingKey": "order.created",
"body": { "orderId": "123" }, "headers": {} }
MongoDB
Option A: connectionString — full MongoDB URI.
Option B: Individual fields — host, port, database, username, password.
Query: collection.{filter_json} — e.g., orders.{"orderId":"abc123"}
Result: { "documents": [{ "orderId": "abc123", "status": "completed" }], "count": 1 }
Deployment
Context Path (Reverse Proxy / Kubernetes)
When deploying behind a reverse proxy or Kubernetes Ingress with a path prefix (e.g., https://company.com/orchestapi), set two environment variables:
| Variable | Layer | Effect |
|---|---|---|
CONTEXT_PATH | Backend (Spring Boot) | Sets server.servlet.context-path — all API routes are prefixed |
VITE_BASE_PATH | Frontend (Vite/React) | Sets Vite base + React Router basename + axios interceptor |
VITE_BASE_PATH is a Docker build argument (compiled into the frontend at build time), while CONTEXT_PATH is a runtime environment variable. Both must have the same value.
# Build with custom base path
docker build --build-arg VITE_BASE_PATH=/orchestapi -t orchestapi .
# Run with context path
docker run -d \
--name orchestapi \
-p 8080:8080 \
-e CONTEXT_PATH=/orchestapi \
-e DB_URL=jdbc:postgresql://db:5432/orchestapi \
-e DB_USERNAME=orchestapi \
-e DB_PASSWORD=your_password \
orchestapi
/ — no configuration needed.
Nginx Reverse Proxy
location /orchestapi/ {
proxy_pass http://orchestapi:8080/orchestapi/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Kubernetes Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: orchestapi
spec:
rules:
- host: company.com
http:
paths:
- path: /orchestapi
pathType: Prefix
backend:
service:
name: orchestapi
port:
number: 8080
Configuration
Server Environment Variables
| Variable | Default | Description |
|---|---|---|
DB_URL | jdbc:postgresql://localhost:5432/test | PostgreSQL JDBC URL |
DB_USERNAME | (required) | Database username |
DB_PASSWORD | (required) | Database password |
SERVER_PORT | 8080 | Backend server port |
CONTEXT_PATH | / | Servlet context path (e.g., /orchestapi) |
VITE_BASE_PATH | / | Frontend base path (Docker build arg, must match CONTEXT_PATH) |
Limits
| Limit | Value |
|---|---|
| Max file upload size | 50 MB |
| Max request body size | 50 MB |
| Max page size (pagination) | 100 |
| Default page size | 10 |
Database
- Schema:
orchestrator(auto-created by Flyway) - All tables prefixed with
orchestapi_ - Flyway history table:
orchestapi_flyway_history - Migrations run automatically on startup
© 2026 OrchestAPI. Self-hosted API test orchestration platform.