Integration Guide — v1.4.4

Nexus Integration Guide

Complete reference for integrating with the Wormwood Engine API and building apps on the Nexus platform. All information is sourced from the live API at api.nexus-dev.codezerogroup.com. This guide covers direct REST integration, authentication, org/pipeline management, pipeline execution, SSE streams, and app construction patterns.

Live API
api.nexus-dev
.codezerogroup.com
Engine Version
1.4.4
Verified 2026-05-09
Auth Method
X-API-Key
Header or query param
MCP
Not deployed
REST only on this env

1. Base URLs

Both endpoints are live behind an ALB on nexus-prod-alb, DNS in Route 53 (codezerogroup.com zone).

PurposeURLNotes
Engine APIhttps://api.nexus-dev.codezerogroup.comAll REST calls. OpenAPI at /openapi.json, Swagger at /docs
Nexus SPAhttps://app.nexus-dev.codezerogroup.comHub dashboard, pipeline canvas, app views
Local dev APIhttp://localhost:8010Run: uvicorn wormwood.api.app:app --port 8010 in Wormwood repo with venv active
Local dev SPAhttp://localhost:8010/nexus-ui/SPA files served as static mount on engine (local only)

MCP not available on this deployment. There is no /mcp route on api.nexus-dev.codezerogroup.com. MCP integration is a separate Nexus1 deployment on an unrelated system and is not documented here.

2. Authentication

DB-backed API key authentication. Keys are stored as SHA-256 hashes in the engine database.

Sending an API Key

All protected endpoints require an API key. Two methods are accepted:

Method A — Header (preferred)

GET /orgs HTTP/1.1
Host: api.nexus-dev.codezerogroup.com
X-API-Key: your-api-key-here
# curl example
curl https://api.nexus-dev.codezerogroup.com/orgs \
  -H "X-API-Key: your-api-key-here"

Method B — Query Parameter

Required for EventSource / SSE connections which cannot set custom headers.

GET /pipelines/{id}/runs/{run_id}/events?api_key=your-api-key-here

Error Responses

StatusCondition
401 UnauthorizedNo key provided (header and query param both absent)
403 ForbiddenKey is unknown, inactive, or expired

Bootstrap Key

On the first call to any protected endpoint when the key database is empty, the engine imports the WORMWOOD_API_KEY environment variable as a full-privilege key with client_id=bootstrap. This is the initial admin key for a fresh deployment.

Keys are associated with client_id, scopes, and optional expiry. The raw key value is returned exactly once at creation time and is never retrievable again.

Public Endpoints (no key required)

EndpointPurpose
GET /healthEngine health + component versions
GET /health/resourcesDetailed resource metrics

POST /orgs/authenticate and GET /orgs/login-list are technically unauthenticated but are explicitly marked for local dev use. Do not rely on them in production.

3. API Key Management

Keys are scoped to an org. One active admin key is required to manage keys for that org.

Create a Key

POST /orgs/{org_slug}/api-keys
X-API-Key: <admin-key>
Content-Type: application/json

{
  "label": "ci-pipeline",
  "scopes": ["read", "execute"]
}

Response includes api_key (raw value, returned once only), key_id, label, scopes, created_at.

List Keys

GET /orgs/{org_slug}/api-keys

Returns key metadata. Raw key values are never returned in list responses.

Rename a Key

PATCH /orgs/{org_slug}/api-keys/{key_id}
Content-Type: application/json

{ "label": "new-label" }

Revoke a Key

DELETE /orgs/{org_slug}/api-keys/{key_id}

Deactivates the key. Requests using a revoked key receive 403.

4. Organisations, Teams & Users

All pipelines and data are scoped to an Organisation. Teams are logical groups within an org. Users belong to teams.

Create an Organisation

POST /orgs
X-API-Key: <admin-key>
Content-Type: application/json

{
  "slug": "my-org",
  "name": "My Organisation",
  "plan_tier": "enterprise"
}

Team Management

# Create team
POST /orgs/{org_slug}/teams
{ "slug": "ops", "name": "Operations" }

# Add user to team
POST /orgs/{org_slug}/teams/{team_slug}/users
{ "email": "user@example.com", "role": "operator" }

# List users in team
GET /orgs/{org_slug}/teams/{team_slug}/users

# List all users across all teams
GET /orgs/{org_slug}/users

User Roles

RoleCapabilities
adminFull access: org management, pipeline CRUD, key management
operatorExecute pipelines, view runs, approve HumanGate tokens
viewerRead-only: view pipelines, runs, and status

Environments

Deployment environments are metadata attached to an org (e.g. dev / staging / prod). Used for pipeline routing context.

POST /orgs/{org_slug}/environments
{ "slug": "prod", "name": "Production", "app_url": "https://app.example.com" }

GET /orgs/{org_slug}/environments
GET /orgs/{org_slug}/environments/{env_slug}

5. Pipelines

Pipelines are directed graphs of typed nodes. Node types are registered in the engine's executor registry (40+ types).

Create a Pipeline

POST /pipelines
X-API-Key: <key>
Content-Type: application/json

{
  "org_slug": "my-org",
  "name": "Intake Form",
  "slug": "intake-form",
  "graph_json": {
    "nodes": [...],
    "edges": [...]
  }
}

Node Types

# List all registered node types
GET /node-types

# Get schema for a specific node type
GET /node-types/{name}

Key node types available in this deployment:

TypePurpose
FormInputRenders a schema-driven form for user data entry
HumanGateSuspends execution pending manual approval/rejection
AITransformLLM-based data transformation step
PDFGeneratorGenerates a PDF from structured data
ParallelSplitFans out to multiple parallel branches
ParallelJoinWaits for all parallel branches to complete
RuleValidatorApplies Wormwood rules to a data payload
NavMenuDefines navigation structure for an app shell
DashboardRenders a metrics/widget dashboard view

Pipeline Versioning

# Fork active pipeline into new draft (bumps version)
POST /pipelines/{pipeline_id}/fork

# List all versions for a slug
GET /pipelines/history?org_slug={org_slug}&slug={slug}

# Deactivate (active -> archived)
POST /pipelines/{pipeline_id}/deactivate

# Export as self-contained descriptor JSON
GET /pipelines/{pipeline_id}/descriptor

# Import from descriptor
POST /pipelines/import

Canvas Navigation

The engine generates multi-scale canvas layouts for SPAs to render node graphs without layout computation.

# Returns SVG/layout data at 4 zoom scales (overview / mid / detail / full)
GET /pipelines/{pipeline_id}/canvas/{scale}

Node Schema (Chameleon Integration)

Chameleon uses these endpoints to render schema-driven forms for individual nodes.

# Full node schema
GET /pipelines/{pipeline_id}/nodes/{node_id}/schema

# Schema filtered by user role (RBAC)
GET /pipelines/{pipeline_id}/nodes/{node_id}/schema/role

# Dynamic options for a BDT field
GET /pipelines/{pipeline_id}/nodes/{node_id}/bdt/{field_name}/options

6. Pipeline Execution

Pipelines are executed via run objects. A run tracks state across all nodes and supports resumption.

Start a Run

POST /pipelines/{pipeline_id}/run
X-API-Key: <key>
Content-Type: application/json

{
  "inputs": {
    "field_a": "value",
    "field_b": 42
  },
  "triggered_by": "user@example.com"
}

Returns a run object with run_id, status (pending / running / suspended / completed / failed), started_at.

Execute (immediate, synchronous for ARC SPA)

POST /pipelines/{pipeline_id}/execute

Executes and returns node outputs directly. Used by the ARC SPA for short-lived validation pipelines.

Run Lifecycle

EndpointPurpose
GET /pipelines/{id}/runsList all runs for a pipeline
GET /pipelines/runs/{run_id}Get single run state
GET /pipelines/runs/{run_id}/node-logsPer-node execution logs
POST /pipelines/runs/{run_id}/resumeResume a suspended run (post HumanGate resolution)

Generic Execute Endpoint

POST /execute

Low-level executor. Accepts a pipeline graph and inputs inline, without a persisted pipeline record. Used for ad-hoc validation.

7. HumanGate Approval Flow

When a pipeline reaches a HumanGate node, execution suspends and a unique approval token is generated.

HumanGate endpoints (/approvals/*) do not require an API key if the token is a valid UUID. The token itself acts as the credential.

8. SSE Streams

Server-Sent Events for live run monitoring. Use api_key query parameter (EventSource cannot set headers).

Run Event Stream

GET /pipelines/{pipeline_id}/runs/{run_id}/events?api_key={key}

Emits events as nodes execute: node_started, node_completed, node_failed, run_completed, run_failed, gate_suspended.

# JavaScript EventSource example
const es = new EventSource(
  `https://api.nexus-dev.codezerogroup.com/pipelines/${pipelineId}/runs/${runId}/events?api_key=${key}`
);
es.onmessage = (e) => {
  const evt = JSON.parse(e.data);
  console.log(evt.type, evt.node_id, evt.status);
};

Global Pipeline Status Stream

GET /pipeline-status-stream?api_key={key}

Emits live status updates for all active pipeline runs across all orgs the key has access to. Used by the Nexus hub dashboard.

Telemetry Stream

GET /run/telemetry/stream?api_key={key}

Emits engine telemetry metrics (CPU, memory, active runs, queue depth) on a fixed interval.

9. Rules Engine

Wormwood's rule engine validates entity data against registered rule sets. 232 rules loaded in the live deployment.

Validate a Payload

POST /validate
X-API-Key: <key>
Content-Type: application/json

{
  "entity_class": "infrastructure",
  "data": {
    "capacity_kw": 500,
    "cooling_type": "rdhx"
  }
}
POST /edr/validate        # EDR domain validation
POST /edr/validate/batch  # Batch EDR validation

Rule CRUD

GET  /rules              # List all rules
GET  /rules/{rule_id}    # Get single rule
PATCH /rules/{rule_id}   # Update rule fields
DELETE /rules/{rule_id}  # Delete rule

GET  /rules/{rule_id}/history  # Audit trail

GET  /rules/files              # List rule files on disk
GET  /rules/files/{file_path}  # Get file contents
GET  /rules/files/{file_path}/rules  # Rules in a specific file

deltaPrism Rule Execution

POST /delta-prism/execute-rules      # CPU rule execution
POST /delta-prism/execute-rules-gpu  # GPU-accelerated rule execution

10. CDC (Change Data Capture)

Event-driven pipeline triggering. External systems fire CDC events; subscribed pipelines are triggered automatically.

Register a Subscription

POST /cdc/subscribe
X-API-Key: <key>
Content-Type: application/json

{
  "event_type": "record.created",
  "source": "crm",
  "pipeline_id": 42
}

Fire an Event

POST /cdc/event
Content-Type: application/json

{
  "event_type": "record.created",
  "source": "crm",
  "payload": { "id": "abc123", "name": "Acme Corp" }
}

GET /cdc/subscriptions  # List all active subscriptions

11. Building Apps on Nexus

An app is a set of pipelines registered under an org, with a catalog entry and an optional SPA shell.

App Registration Sequence

App Catalog API

# All apps
GET /orgs/apps/catalog

# Single app by slug
GET /orgs/apps/catalog?slug=my-app

Response shape:

{
  "slug": "my-app",
  "display_name": "My App",
  "domain": "Finance",
  "status": "operational",
  "actions": ["Intake", "Review", "Approve"],
  "components": [
    { "name": "Wormwood", "version": "1.4.4" }
  ]
}

Entity Classes (Schema Registry)

Define custom entity schemas for your org. These drive validation and form rendering.

POST /orgs/{org_slug}/entity-classes
{ "slug": "invoice", "schema": { ... JSON Schema ... } }

GET  /orgs/{org_slug}/entity-classes
GET  /orgs/{org_slug}/entity-classes/{class_slug}
DELETE /orgs/{org_slug}/entity-classes/{class_slug}

ARC Schema (Global Read-Only)

GET /arc/classes             # List global ARC entity classes
GET /arc/schema/{class_slug} # Get ARC class schema

12. Full Endpoint Reference

All endpoints from the live OpenAPI spec. Auth column: PUBLIC = no key required, KEY = X-API-Key required, SSE = EventSource stream.

Health & Diagnostics
GETPUBLIC
/health
Engine health, version, component status
GETPUBLIC
/health/resources
Detailed resource metrics
GETKEY
/orgs/{org_slug}/health
Org-level health status
GETKEYSSE
/run/telemetry/stream
Engine telemetry stream (use api_key query param)
GETKEY
/run/telemetry
Telemetry snapshot
Organisations
GETKEY
/orgs
List all organisations
POSTKEY
/orgs
Create organisation
GETKEY
/orgs/{org_slug}
Get organisation
DELKEY
/orgs/{org_slug}
Delete organisation
GETPUBLIC
/orgs/apps/catalog
App catalog (all or ?slug=)
GETKEY
/orgs/system/bdt-types
BDT type catalogue
GETKEY
/orgs/user-hub
Hub dashboard: orgs/roles for a user (?email=)
Teams & Users
GETKEY
/orgs/{org_slug}/teams
List teams
POSTKEY
/orgs/{org_slug}/teams
Create team
GETKEY
/orgs/{org_slug}/teams/{team_slug}
Get team
DELKEY
/orgs/{org_slug}/teams/{team_slug}
Delete team
GETKEY
/orgs/{org_slug}/teams/{team_slug}/users
List users in team
POSTKEY
/orgs/{org_slug}/teams/{team_slug}/users
Add user to team
DELKEY
/orgs/{org_slug}/teams/{team_slug}/users/{email}
Remove user from team
GETKEY
/orgs/{org_slug}/users
List all users in org (all teams)
POSTKEY
/orgs/{org_slug}/users
Add user to org (no team slug required)
PATCHKEY
/orgs/{org_slug}/users/{email}
Update user display name or role
DELKEY
/orgs/{org_slug}/users/{email}
Remove user from org (all teams)
API Keys
GETKEY
/orgs/{org_slug}/api-keys
List API keys (metadata only, no raw values)
POSTKEY
/orgs/{org_slug}/api-keys
Create key (raw value returned once)
PATCHKEY
/orgs/{org_slug}/api-keys/{key_id}
Rename key
DELKEY
/orgs/{org_slug}/api-keys/{key_id}
Revoke (deactivate) key
Pipelines
GETKEY
/pipelines
List all pipelines
POSTKEY
/pipelines
Create pipeline
GETKEY
/pipelines/{pipeline_id}
Get pipeline
DELKEY
/pipelines/{pipeline_id}
Delete pipeline
GETKEY
/orgs/{org_slug}/pipelines
List pipelines for an org
GETKEY
/pipelines/by-slug/{slug}
Resolve pipeline by slug within org (?org_slug=)
GETKEY
/pipelines/history
All versions of a slug (?org_slug=&slug=)
GETKEY
/pipelines/{pipeline_id}/descriptor
Export as self-contained descriptor JSON
POSTKEY
/pipelines/import
Import from descriptor
POSTKEY
/pipelines/{pipeline_id}/fork
Fork into new draft (bumps version)
POSTKEY
/pipelines/{pipeline_id}/deactivate
Deactivate (active → archived)
GETKEY
/pipelines/{pipeline_id}/canvas/{scale}
Canvas layout at scale (overview/mid/detail/full)
POSTKEY
/pipelines/{pipeline_id}/publish
Publish pipeline
POSTKEY
/pipelines/{pipeline_id}/restore
Restore from archive
GETKEY
/pipelines/{pipeline_id}/style
CSS style token overrides for Chameleon
Node Types & Schemas
GETKEY
/node-types
List all registered node types
GETKEY
/node-types/{name}
Get node type schema
GETKEY
/pipelines/{pipeline_id}/nodes/{node_id}/schema
Node schema (Chameleon integration)
GETKEY
/pipelines/{pipeline_id}/nodes/{node_id}/schema/role
Node schema filtered by RBAC role
GETKEY
/pipelines/{pipeline_id}/nodes/{node_id}/bdt/{field_name}/options
Dynamic BDT field options
POSTKEY
/pipelines/{pipeline_id}/nodes/{node_id}/resolve
Resolve node inputs
Execution & Runs
POSTKEY
/pipelines/{pipeline_id}/run
Start a pipeline run
POSTKEY
/pipelines/{pipeline_id}/execute
Execute and return node outputs (ARC SPA, synchronous)
POSTKEY
/execute
Ad-hoc execution (inline pipeline graph)
GETKEY
/pipelines/{pipeline_id}/runs
List runs for a pipeline
GETKEY
/pipelines/runs/{run_id}
Get run state
GETKEY
/pipelines/runs/{run_id}/node-logs
Per-node execution logs
POSTKEY
/pipelines/runs/{run_id}/resume
Resume suspended run (post HumanGate)
GETKEYSSE
/pipelines/{pipeline_id}/runs/{run_id}/events
Live run event stream (use api_key query param)
GETKEYSSE
/pipeline-status-stream
Global pipeline status stream
GETKEY
/pipelines/history
All pipeline versions
HumanGate Approvals
GETKEY
/orgs/{org_slug}/humangate/pending
List pending gates for a role (?role=)
GETTOKEN
/approvals/{token}
Get gate context (token is credential)
POSTTOKEN
/approvals/{token}/approve
Approve gate, resume run
POSTTOKEN
/approvals/{token}/reject
Reject gate, fail run
Rules Engine & Validation
GETKEY
/rules
List all rules
GETKEY
/rules/{rule_id}
Get rule
PATCHKEY
/rules/{rule_id}
Update rule
DELKEY
/rules/{rule_id}
Delete rule
GETKEY
/rules/{rule_id}/history
Rule audit history
GETKEY
/rules/files
List rule files
GETKEY
/rules/files/{file_path}
Get file contents
GETKEY
/rules/files/{file_path}/rules
Rules within a file
GETKEY
/orgs/{org_slug}/rules
Rules for org (aggregated)
GETKEY
/types
Get entity types
POSTKEY
/validate
Validate payload against rules
POSTKEY
/edr/validate
EDR domain validation
POSTKEY
/edr/validate/batch
Batch EDR validation
POSTKEY
/delta-prism/execute-rules
CPU rule execution via deltaPrism
POSTKEY
/delta-prism/execute-rules-gpu
GPU rule execution via deltaPrism
CDC (Change Data Capture)
POSTKEY
/cdc/subscribe
Register pipeline trigger subscription
POSTKEY
/cdc/event
Fire CDC event, trigger subscribed pipelines
GETKEY
/cdc/subscriptions
List all CDC subscriptions
Environments, Entity Classes, Connectors
GETKEY
/orgs/{org_slug}/environments
List deployment environments
POSTKEY
/orgs/{org_slug}/environments
Create environment
GETKEY
/orgs/{org_slug}/environments/{env_slug}
Get environment
PATCHKEY
/orgs/{org_slug}/environments/{env_slug}
Update environment
DELKEY
/orgs/{org_slug}/environments/{env_slug}
Delete environment
GETKEY
/orgs/{org_slug}/entity-classes
List entity class schemas
POSTKEY
/orgs/{org_slug}/entity-classes
Create entity class schema
GETKEY
/orgs/{org_slug}/entity-classes/{class_slug}
Get entity class schema
DELKEY
/orgs/{org_slug}/entity-classes/{class_slug}
Delete entity class schema
GETKEY
/orgs/{org_slug}/connectors
List connectors for org
POSTKEY
/orgs/{org_slug}/connectors
Add connector to org
DELKEY
/orgs/{org_slug}/connectors/{connector_id}
Delete connector
GETKEY
/arc/classes
List global ARC entity classes
GETKEY
/arc/schema/{class_slug}
Get ARC class schema
API Profiles
GETKEY
/api/profiles
List profiles
GETKEY
/api/profiles/active
Active profile
GETKEY
/api/profiles/{profile_id}
Get profile
POSTKEY
/api/profiles/{profile_id}/activate
Activate profile
POSTKEY
/api/profiles/{profile_key}/run
Run a profile