Nodexa - API Testing in VS Code
Version 1.1.0 | Extension ID: nodexa.nodexa | VS Code 1.95+
Create, send and test HTTP requests without leaving VS Code. Organize JSON collections, chain requests in visual flows, run data-driven suites and measure concurrent flow workloads with local environments and Git-friendly files.
No separate app. No sync account. Your definitions live in your workspace.
Index
- Why Nodexa?
- Quick Start
- Views
- Request Editor
- Authentication
- Environments, Variables And Secrets
- Visual Flows
- Assertions
- Pre-request And Post-response Actions
- Test Suites And Load Tests
- JSON Datasets
- History And Reports
- Import, Export And Compatibility
- File Layout
- Safety And Limits
- Requirements
- Troubleshooting
- Support
- Development From Source
- Roadmap
- Documentation
Why Nodexa?
- Stay in VS Code: collections, request tabs, responses, flow properties and test results in your editor.
- Review changes in Git: requests, flows, suites, load plans and non-secret datasets are ordinary JSON files.
- Test complete workflows: reuse earlier responses, extract variables, branch, loop, retry and poll.
- Separate positive and negative scenarios: override request payloads and assertions per flow without changing shared requests.
- Use data-driven tests: select JSON datasets and run ordered suites or isolated concurrent flow iterations.
- Inspect results: assertion outcomes, HTTP latency, throughput, error rates and redacted metadata reports.
- Keep execution local: no Nodexa cloud backend, account, sync service, analytics or telemetry.
Quick Start
- In VS Code's Extensions view, choose Install from VSIX... and select the supplied Nodexa 1.1.0 package.
- Open a local folder or workspace and trust it before writing definitions or sending requests.
- Run Nodexa: Initialize Collections from the Command Palette.
- Set your API's
baseUrl and credentials in the selected local environment.
- Open Nodexa: Open API Client, select a request, review it and choose Send.
- Use Nodexa: New Flow, Nodexa: New Test Suite or Nodexa: New Load Test for repeatable workflows.
Cmd/Ctrl+Enter sends a request; Cmd/Ctrl+S saves while the request editor is focused. Initialization creates missing examples only and does not start an API server.
This is a locally packaged release. A Marketplace listing and publishing are separate steps; this document does not claim an existing listing.
For an existing installation under the previous name, stop runs and save drafts before renaming its shared definitions folder to nodexa/ and its local environment folder to .nodexa/. Preserve file contents, never overwrite an existing destination, and Git-ignore .nodexa/. Install Nodexa, remove the old extension if both appear, reload and reselect the intended environment. Extension-scoped history and environment selection are not automatically migrated. The detailed guide in docs/README.md contains the complete upgrade steps.
Views
The Nodexa activity bar contains four sections:
| View |
Purpose |
| Collections |
Browse nested request folders, create requests, refresh files and open request tabs. |
| Flows |
Create, open and refresh saved visual workflows. |
| Test Suites |
Manage ordered request/flow test plans. |
| Load Tests |
Manage flow-only plans with independent concurrent row-iterations. |
Environments are selected and managed through the request editor's environment controls and Nodexa: Manage Environments. They are not a separate activity-bar view. History is local request-summary storage, not a replayable snapshot archive. There is no Credentials or WebSocket view in this release.
Request Editor
Edit method, URL, query parameters, headers, authentication, body, tests, pre-request actions and post-response actions. Supported HTTP methods are GET, POST, PUT, PATCH, DELETE, HEAD and OPTIONS.
- Open multiple request tabs and browse nested collections.
- Send the current draft, save its JSON definition or open the source in VS Code.
- Use JSON objects/arrays as bodies or strings as raw text; GET and HEAD cannot have bodies.
- Inspect status, elapsed time, response size, pretty/raw body text, headers and test outcomes.
- Cancel active requests and copy response text.
- Copy a redacted, shell-quoted cURL command using the code icon beside Save.
Example collection request:
{
"name": "Create User",
"method": "POST",
"url": "{{baseUrl}}/users",
"headers": { "Content-Type": "application/json" },
"auth": { "type": "bearer", "token": "{{accessToken}}" },
"body": { "name": "{{name}}", "requestId": "{{uuid}}" },
"tests": [
{ "type": "status", "expected": 201 },
{ "type": "json-path", "path": "$.id", "exists": true }
]
}
Provide name through an environment, a dataset or an earlier action. Headers and parameters are string maps; duplicate keys are not supported. Unsaved drafts are not automatically replaced by external file changes.
Authentication
| Type |
Configuration |
| No authentication |
Omit authentication or select none. |
| Bearer |
Resolve a token, usually from an environment secret. |
| Basic |
Configure username and password; keep credentials local. |
| API key |
Add a named key to a header or query parameter. |
OAuth token acquisition, Digest, OAuth 1.0/2.0 flows, AWS SigV4, NTLM, Hawk, WSSE and client-certificate authentication are not implemented. Declarative HMAC actions generate values; they are not full authentication-protocol implementations.
Environments, Variables And Secrets
Each local environment is a JSON file under .nodexa/env/. For example:
{
"variables": {
"baseUrl": "http://localhost:8080",
"name": "Jane"
},
"secrets": {
"accessToken": "replace-with-your-local-token"
},
"protected": false
}
The filename determines the environment name. Select it in the editor and use placeholders such as {{baseUrl}}, {{name}} and {{accessToken}} in request strings.
- Use the plus control to add an environment and the key control to enter a secret through a masked native input.
- The environment menu offers local configuration editing, environment creation, secret setting and secret removal.
- Secrets take precedence over ordinary variables, including dataset values with the same name.
{{uuid}} and millisecond {{timestamp}} are built-in reserved variables.
- Missing variables cause an error instead of sending unresolved placeholders.
- Environment names containing
prod are protected by default unless explicitly overridden.
Secrets are plaintext in environment files, not encrypted or stored in the OS keychain. The extension Git-ignores .nodexa/ and excludes it from packages. Protect local files and backups; .gitignore does not remove credentials already tracked in Git.
Visual Flows
Drag nodes onto the canvas or add them with palette buttons. Connect output dots to input dots, select nodes to edit Properties, and save the graph under nodexa/flows/.
| Node |
Shape / type colour |
Behavior |
| Start |
Circle / green |
Enter the workflow. |
| Request |
Rectangle / neutral |
Run a saved collection request with optional payload/test overrides. |
| If / Else |
Diamond / blue |
Choose the true or false branch using JSON Logic. |
| Switch |
Diamond / teal |
Choose a matching case or the default output; up to ten cases. |
| For Loop |
Hexagon / purple |
Run a bounded number of body iterations, then exit. |
| While Loop |
Hexagon / pink |
Evaluate a condition before each body iteration. |
| Delay |
Hexagon / amber |
Wait, then continue. |
| Retry |
Rectangle / olive |
Retry a bounded body, restoring failed-attempt run-local data. |
| Timeout |
Hexagon / coral |
Cancel a body after its configured deadline. |
| Parallel |
Split hexagon / blue |
Run 2-8 isolated branches concurrently. |
| Join |
Inverted trapezoid / green-teal |
Wait for every branch; continue once or fail the group. |
| Display |
Rectangle / steel blue |
Evaluate and log a redacted JSON Logic value. |
| Transform |
Rectangle / gold |
Assign run-local values with declarative JSON Logic. |
| Try |
Scope rectangle / lavender |
Run a body with a matching Finally and error route. |
| Catch |
Scope rectangle / red |
Handle a Try failure using structured error data. |
| Finally |
Scope rectangle / green |
Run cleanup once on success, failure or cancellation. |
| End |
Circle / grey |
Complete the workflow. |
Controls are smaller than request boxes. Scroll up to zoom in and down to zoom out on the canvas, within 40%-160%; Properties and run-log scrolling stay independent.
Execution badges show a green circle with a tick for success, a red circle with a cross for failure and a spinning loader inside a circle while processing. Waiting, retrying and stopped states are also shown. Reduced-motion preferences disable spinning.
Dependencies And Conditions
Request nodes reference collection-relative filenames. An extraction such as extract: { "userId": "$.id" } exposes {{userId}} and {{vars.userId}} later in the same run. Full dependencies can reference earlier executed nodes, for example {{responses.create.body.id}}.
Conditions use bounded JSON Logic over env, vars, responses, loops and scoped error:
{ "===": [{ "var": "responses.lookup.status" }, 200] }
Branches, Loops And Error Handling
Connect every output before running. Outputs have one next node; multiple incoming edges are allowed. A loop body must connect back to its loop node, and the exit output must continue to the next step.
Ordinary paths execute in order; Parallel starts isolated branches and its selected Join waits for all of them, even if one fails. Outputs are namespaced under responses.<joinId>.body.branch1.vars and .responses (then branch2, etc.), not silently merged into parent state. Use Transform to explicitly select a joined value. Dependencies must already exist in the active scope.
Retry, Timeout and Finally have body/done outputs: return the body to its owning node, then continue through done. Retry defaults to two additional attempts and restores run-local data between attempts, not HTTP side effects. Timeout aborts scoped work before error routing. Parallel selects joinId in Properties and every branch returns to that Join; Join has one next continuation.
Try selects finallyId; its body and catch routes converge at that Finally. The catch output must start with a Catch node. Catch and Finally can read error.nodeId, error.code, redacted error.message and optional error.status. Fatal budgets and global cancellation bypass Catch. Finally executes once; an expired enclosing scope gets a one-second cleanup window, and global Stop/deadline disables all new cleanup HTTP requests. Request retry/polling/continueOnError policies remain compatible.
Display evaluates value, redacts known secrets and truncates the log value at 64 KiB. Transform evaluates every assign expression against the pre-transform state and writes string or JSON-encoded values under vars; it does not edit environment files or run JavaScript.
Use separate positive/negative graphs with request-level payload and test overrides. An explicitly expected 400 response can pass its assertions; otherwise non-2xx fails by default. Overrides do not modify the shared request file.
Use Run to execute and Stop to cancel requests, polling, retries and waits. Save before closing: drafts and results are not durable panel state.
Assertions
The Tests tab edits a declarative JSON array:
[
{ "type": "status", "expected": 201 },
{ "type": "duration", "maxMs": 1000 },
{ "type": "header", "name": "content-type", "exists": true },
{ "type": "json-path", "path": "$.id", "exists": true },
{ "type": "schema", "schema": { "type": "object", "required": ["id"] } },
{ "type": "condition", "condition": { ">": [{ "var": "body.id" }, 0] } }
]
Header names are case-insensitive. JSONPath supports existence and structural expected-value comparisons, with script evaluation disabled. Schema checks use inline draft-07 JSON Schema without remote fetching or format validation. Conditions use bounded JSON Logic, not JavaScript callbacks.
Pre-request And Post-response Actions
Actions are declarative JSON, not Bruno or Postman scripts:
{
"preRequest": [
{ "type": "set", "name": "name", "value": "Jane" },
{ "type": "timestamp", "name": "sentAt" },
{ "type": "uuid", "name": "requestId" },
{ "type": "random-token", "name": "nonce" },
{
"type": "hmac-sha256",
"name": "signature",
"key": "{{signingKey}}",
"value": "{{nonce}}"
}
],
"postResponse": [
{ "type": "extract", "name": "userId", "path": "$.id" },
{
"type": "extract",
"name": "sessionToken",
"path": "$.token",
"secret": true,
"required": false
}
]
}
Actions run in order and can reference earlier values. Extractions are required by default. Values carry between requests within a flow or sequential suite, but are not written back to environment files or shared with other manual tabs.
Use secret: true for sensitive aliases. Random-token/HMAC outputs and token/signature/password-like aliases are automatically masked. Keep signing keys in environment secrets. Arbitrary JavaScript, bru.* and pm.* execution are not supported.
Test Suites And Load Tests
Create plans from their sidebar sections or the Command Palette. Import saved entries using the native picker, then save the plan.
| Plan |
Entries |
Execution |
| Test Suite |
Requests or flows |
Sequential, in the saved order. |
| Load Test |
Flows only |
Concurrent isolated row-iterations with scoped parallel branches. |
The editor follows Input -> Flow -> Result:
- Input: select a JSON dataset, refresh available files or open its source.
- Flow: import entries, reorder them or remove entries.
- Result: inspect status and metrics, navigate to the report and export metadata.
Example load plan:
{
"version": 1,
"mode": "load",
"name": "User workflow load",
"entries": [{ "type": "flow", "file": "users.json" }],
"dataset": { "type": "json", "file": "users.json" },
"iterations": 2,
"concurrency": 4
}
The flow entry above requires a separately saved flow with that filename. A suite uses mode: "suite" and concurrency 1. Every row-iteration runs all entries in order. Every load run requires confirmation; Stop cancels it.
JSON Datasets
Save a JSON array of non-secret objects under nodexa/dataset/:
[
{ "name": "Jane", "role": "admin" },
{ "name": "Taylor", "role": "viewer" }
]
Row keys become template variables. Non-string values are encoded as JSON strings. Iterations repeat the entire dataset, not just one row. Input values overlay ordinary environment variables, while environment secrets retain precedence.
The dataset dropdown includes nested JSON files and preserves a missing saved selection rather than silently substituting another file. Missing selections disable Run. Omitted datasets default to users.json, which must exist.
CSV, inline and environment datasets are not supported. Convert older rows to a JSON file and update the plan's dataset reference; no automatic conversion overwrites your files.
History And Reports
Local history keeps up to 100 request summaries per workspace folder: request name, method, environment, status, duration and timestamp. It does not persist bodies, credentials or resolved URLs and does not provide full replay snapshots.
Suite/load results include completed, failed, cancelled and unstarted row-iterations, HTTP attempts, requests per second, min/max/mean duration, p50/p95/p99 latency, error rate and non-2xx count.
- Retries are additional HTTP attempts.
- Expected negative responses can pass while still increasing the non-2xx count.
- A flow failure without an HTTP attempt does not increase the HTTP error rate.
- Percentiles use observed attempt durations, including transport and validation overhead.
- Throughput excludes definition loading; exported JSON is metadata-only, without response bodies, URLs, row values or secrets.
Import, Export And Compatibility
Nodexa uses its own schema-validated JSON definitions. It is not a Bruno/Postman file or script compatibility layer.
| Capability |
Version 1.1.0 |
| Workspace JSON requests and flows |
Supported. |
| Copy as cURL |
Supported, with secret redaction and shell quoting. |
| Metadata-only suite/load report export |
Supported. |
Bruno .bru files and Postman collections/scripts |
Not supported. |
| cURL/OpenAPI/Swagger import and Postman export |
Not implemented. |
| Generated client code in multiple languages |
Not implemented. |
| Dedicated GraphQL, SOAP, OData or WebSocket tools |
Not implemented. |
| SAP BAS destinations or XSUAA service-key integration |
Not implemented. |
HTTP endpoints can accept manually supplied JSON or text bodies, but this does not imply dedicated protocol editors, discovery or authentication integrations.
File Layout
<workspace>/
.nodexa/
env/
dev.json
prod.json
nodexa/
collection/
create-user.json
users/
lookup.json
flows/
users.json
dataset/
users.json
suites/
smoke.json
load-tests/
users-load.json
Commit shared requests, workflows, plans and non-secret datasets under nodexa/. Never commit .nodexa/ or embedded credentials. Requests reference collection-relative paths; plan entries and datasets are relative to their owning directories. Workspace-boundary checks reject escaping paths.
Safety And Limits
| Area |
Bound or policy |
| Request transport |
HTTP(S) only; no URL-embedded credentials. |
| Request timeout / response |
30 seconds / 5 MB. |
| TLS / redirects |
TLS verification stays enabled; redirects are returned without following. |
| Flow size |
At most 100 nodes and 1,000 transitions/HTTP attempts. |
| Flow duration / delay |
10-minute deadline; individual delays up to 60 seconds. |
| Parallel / nesting |
2-8 branches per split; at most 16 nested scopes. |
| HTTP scheduling |
Manual flows: 8 slots; suites: 1; load: shared plan concurrency (1-20). |
| Retry / polling / loop |
Up to 10 additional retries, 100 polling attempts and 1,000 loop iterations. |
| Test plan |
1-100 entries; at most 1,000 total row-iterations. |
| Load concurrency / attempts |
1-20 workers; up to 10,000 total HTTP attempts. |
| Dataset |
1-1,000 rows; file up to 1 MiB; row up to 64 KiB / 100 columns. |
| Assertions / actions |
Up to 100 assertions and 100 actions per phase per request. |
| Inline schema / extracted value |
Up to 64 KiB each. |
| Response / run-local data cache |
Shared 32 MiB per flow across scopes; load combined-worker bounds also apply. |
| Displayed flow responses / log |
Responses truncated after 64 KiB; latest 200 log entries retained. |
Writes and execution require workspace trust. Protected environments require confirmation; load tests require confirmation even in unprotected environments. Active runs block conflicting Nodexa runs and environment changes.
Response HTML is displayed as inert text. Secret redaction is best-effort, not a guarantee for transformed or unrelated secrets returned by servers. Repeated writes, retries and loads can create real side effects; prefer test environments and idempotency keys where appropriate.
There are no user settings for disabling TLS verification, automatically following redirects or choosing arbitrary transport limits in this release.
Requirements
- VS Code 1.95 or newer.
- A local folder/workspace containing request and test definitions.
- Workspace trust for writes and execution.
- Access to the API endpoints you configure.
- Node.js 22.15 or newer for development tooling, not as a separate runtime requirement for installing the VSIX.
Troubleshooting
| Problem |
Action |
| No collections or flows |
Verify the workspace folder and layout, then refresh the relevant sidebar list. |
| Missing variable |
Select the correct environment and check variables, secrets, dataset keys and extracted aliases. |
| Dataset selector is empty |
Create a JSON file under nodexa/dataset/ and refresh Input. |
| Flow cannot run |
Connect every output and verify node settings and referenced request files. |
| Error status fails a negative test |
Set its expected status and other assertions explicitly. |
| Save is blocked |
Resolve a dirty native JSON editor document before overwriting the same file. |
| External changes are not loaded |
Save your draft, close the panel and reopen the definition. |
| Example requests cannot connect |
Start your API and configure baseUrl; initialization does not start a server. |
| Duplicate Nodexa installations |
Older publisher-less packages have a different identity; remove the old installation if both appear. |
| The extension or panel is unresponsive |
Reload the window; inspect the Extension Host log or Developer Tools for activation/webview errors. |
Support
When reporting an issue through your team's repository or support channel, include:
- Nodexa and VS Code versions, OS and whether the workspace is multi-root.
- Steps to reproduce, expected behavior and the actual result.
- A minimal redacted request, flow or test-plan JSON example.
- Relevant error messages or logs with credentials and personal data removed.
Do not attach local environment secrets or unredacted API responses. No public Marketplace or issue-tracker URL is asserted here; use the distribution/support channel supplied with your build.
Development From Source
npm ci
npm run compile
npm test
npm run check:webview
npm run test:extension
npm run package
Press F5 to launch an Extension Development Host. Use npm run preview for the loopback-only browser harness; /flows previews the designer and /tests previews plans. Preview saves and configuration are in-memory substitutes, not real VS Code storage.
Build a local VSIX from the repository root:
npm exec --yes --package=node@22 --package=@vscode/vsce -- \
vsce package --allow-missing-repository --skip-license \
--changelog-path docs/CHANGELOG.md
This creates a versioned package and does not publish it. Marketplace publishing separately requires a publisher account you control. The source repository also contains an example Go API; follow docs/example-api.md and use npm run test:example after starting it.
Roadmap
Version 1.1.0 ships Retry, Timeout, Parallel, Join, Display, Transform and Try/Catch/Finally. Further data operators, scopes/subflows, compensation, breakpoints and additional protocols remain planned. Parallel follows the wait-all-then-fail policy today.
Visual assertion building, import/export integrations, OAuth flows, arbitrary scripting, AI assistance and a standalone CLI are not shipped features. The detailed guide and orchestration design document under docs/ distinguish current behavior from planned work.
Documentation
The root README is this overview and supplies the extension's installation/details page. Supporting Markdown lives under docs/ in the source repository. Packaging keeps the guides there, while VSCE places the changelog at its standard package path for the extension's Changes tab:
| Document |
Contents |
docs/README.md |
Detailed configuration, request formats, flow rules, limits and upgrade instructions. |
docs/CHANGELOG.md |
Version history and release notes; also used for the extension's Changes tab. |
docs/ORCHESTRATION.md |
Current orchestration behavior and planned execution nodes. |
docs/nodexa-visual-api-workflow-builder.md |
Visual workflow builder design. |
docs/example-api.md |
Go example API setup, endpoints and flow recipes. |
docs/vsc-extension-quickstart.md |
VS Code extension development quick start. |