API Reference
API
Tool / Contract Summary
jhf-fabric exposes a versioned REST API under /api/v1. The API is the canonical operator and consumer access layer for contract publication, readiness, drift, provider runtime observation, and downstream handoff truth.
Business Value
- gives downstream repos and operators one stable, typed interface to Fabric truth
- separates authoritative shared-state publication from repo-local materialization
- provides machine-readable and human-readable verification paths for Wiki.js, CI, and runtime checks
Current Verified State
- API base:
/api/v1 - worker health endpoint:
http://<internal-runtime-redacted>:28080/health(loopback-only, operator auth precedes route resolution) - platform contract API:
api/v1(public read-only contract surfaces) - OpenAPI export:
/api/v1/openapi.json - throttled deep-smoke runner:
python scripts/throttled_api_sweep.py --base-url http://<internal-runtime-redacted>:38081 --rate-limit-rpm 90 - route families are assembled in
src/helpifyr_fabric/api/app.py - route implementations are split across
routes.py,identity_routes.py,plane_routes.py,support_routes.py,voice_routes.py, andcombinations_routes.py - Fabric-first agent bootstrap and access-answer routes are implemented in
agent_routes.py
Unauthenticated 401 responses from :28080 do not prove that a route exists: the worker's auth middleware runs before route resolution. Use :38081 for public contract verification and require both a real 200 and the runtime-topology verifier's fake-route 404 control.
Server-error observability
The API emits one bounded uvicorn.error line for every returned or unhandled 5xx
response. The line contains only the HTTP method, URL path (without query data), and
status code; request headers, request/response bodies, and authorization values are
never included. The repository regression path is:
python -m pytest tests/test_api.py -q
This proves the logging boundary locally. A live acceptance still requires an
owner-authorized request that returns 5xx and a same-window docker logs jhf-fabric-api readback; repository verification does not claim that runtime gate.
Throttled Deep-Smoke Sweep
Use scripts/throttled_api_sweep.py for future broad GET-only API sweeps instead of ad hoc fast loops. The runner reads OpenAPI, substitutes deterministic smoke values for path parameters, respects a requests-per-minute budget, sleeps between batches, retries 429 responses with backoff, and writes optional JSON evidence.
Recommended <internal-runtime-redacted> command:
python3 scripts/throttled_api_sweep.py \
--base-url http://<internal-runtime-redacted>:38081 \
--rate-limit-rpm 90 \
--batch-size 30 \
--batch-sleep-seconds 20 \
--retry-429 2 \
--output /tmp/jhf-fabric-throttled-api-sweep.json
The sweep is read-only. Parameter-sample-dependent 404 and 422 responses stay classified separately from failures, while exhausted 429, transport errors, unresolved path parameters, and 5xx responses fail the run.
Available Now
Stalwart management admission
POST /api/v1/identity/stalwart-management/projectionGET /api/v1/identity/stalwart-management/decision
Fabric durably projects only fresh, active, human Spindle administrator truth for the stalwart_management surface. The producer and consumer use separate scoped tokens and missing or ambiguous exact-scope reads deny access. See docs/contracts/HELPIFYR_STALWART_MANAGEMENT_PROJECTION.md.
Core and governance routes
GET /health- Health responses include
status,service, and the configureddeployment_role(control-api,platform-api,test, orunknownwhen unset). GET /api/v1/platform/servicesGET /api/v1/contracts/*GET /api/v1/semantic/projection-verification-harnessGET /api/v1/acp/contracts/*POST /api/v1/contracts/compatibility/checkPOST /api/v1/tools/admission/dry-runGET /api/v1/governance/*
Purpose:
- publish contract catalogs, drift, governance posture, and additive admission results
- keep semantic knowledge extensions on the same canonical dry-run lane instead of introducing a parallel onboarding surface
- publish only the S0 admission contract for the Bobbin-owned projection verification harness; this readback does not expose an ingress, database access, or agent-visible action
Identity and access routes
GET /api/v1/identity/contracts/*GET /api/v1/identity/agent-federation/*POST /api/v1/warp/contextGET /api/v1/projections/plane-unified-access*GET /api/v1/agent/contracts*GET /api/v1/agent/workflowGET /api/v1/agent/bootstrapGET /api/v1/agent/action-context/{module_key}GET /api/v1/agent/methodology/event-modeling
Purpose:
- publish deterministic identity policy, access handoff, agent-federation, and authz projection truth
- publish deterministic Fabric-first agent bootstrap, workflow, owner-matrix, task-to-tool, access-answer, usage, and methodology truth
Tooling, products, and update routes
GET /api/v1/tools/*POST /api/v1/products/registerGET /api/v1/products/*GET /api/v1/capabilitiesPOST /api/v1/updates/checkPOST /api/v1/updates/rollout-gatePOST /api/v1/integrations/gitea/webhook
Purpose:
- normalize repo/tool metadata, expose compatibility views, and accept guarded intake
Provider, runtime, and platform routes
GET /api/v1/providers/openclaw/*GET /api/v1/dapr/*POST /api/v1/dapr/state/probePOST /api/v1/dapr/invocation/self-health/probeGET /api/v1/persistence/*GET /api/v1/observability/*GET /api/v1/recovery/*GET /api/v1/security/*GET /api/v1/signoff/*
Purpose:
- expose runtime dependency posture, provider observations, security, recovery, and operator signoff state
Product-domain contract routes
GET /api/v1/combinations/*GET /api/v1/support-orchestration/*GET /api/v1/voice/*GET /api/v1/planning/contractsGET /api/v1/planning/interaction-lanesGET /api/v1/planning/interaction-lanes/create-sessionGET /api/v1/planning/interaction-lanes/answer-turnGET /api/v1/planning/interaction-lanes/owner-decisionGET /api/v1/planning/sessions/{session_id}GET /api/v1/planning/sessions/{session_id}/review-bundleGET /api/v1/planning/sessions/{session_id}/owner-decisionPOST /api/v1/planning/sessions/{session_id}/owner-decisionGET /api/v1/planning/interaction-lanes/start-review-roundPOST /api/v1/planning/sessions/{session_id}/review-roundsGET /api/v1/planning/interaction-lanes/owner-decisionGET /api/v1/planning/sessions/{session_id}/owner-decisionPOST /api/v1/planning/sessions/{session_id}/owner-decisionGET /api/v1/planning/sessions/{session_id}/score-gateGET /api/v1/planning/sessions/{session_id}/materialization-admissionGET /api/v1/planning/sessions/{session_id}/execution-contextGET /api/v1/planning/sessions/{session_id}/revision-ledgerGET /api/v1/planning/sessions/{session_id}/resume-state
For dynamic Phase-1 sessions, the reviewer-round action creates only a Fabric-owned, redacted package intent and
append-only round readback. The response is not provider execution, score approval, HIDL, materialization or
execution authority. Shuttle remains the transport owner, and missing owner-service or Keystore truth stays
explicitly awaiting_shuttle_owner/fail-closed.
For dynamic Plan Studio sessions, the owner-decision surface binds the existing
contracts/operator_lanes/operator_lane_owner_decision_v1.json contract to the current planning-session
revision. It exposes approved, rejected and needs_more_context with deterministic resume posture, but
remains non-actionable until score, HIDL and owner-packet source readbacks are present. A recorded decision
does not grant materialization, provider execution or domain-write authority.
GET /api/v1/planning/events/catalogGET /api/v1/memory/runtime-claims/*GET /api/v1/events/publishing/*POST /api/v1/events/outbox/*
Purpose:
- publish product-adjacent contract truth, including the read-only Plan Studio Phase-0 planning family, and record event/evidence flows where Fabric owns the publication path
Optional / Extended
- platform-plane-specific routes and assets that matter only when Wiki.js and observability services are deployed
- provider preview routes that explain possible actions without directly mutating host state
- product-specific surfaces used only when corresponding consumers exist
Planned / Not In Current Scope
- later governance waves and downstream behaviors not yet implemented
- any undocumented route or contract behavior must be treated as not in current scope until it exists in code and verification
Public Surfaces
Common high-value endpoints for operator and consumer usage:
GET /healthGET /api/v1/contracts/registryGET /api/v1/contracts/driftGET /api/v1/acp/contracts/capability-registryGET /api/v1/acp/contracts/skill-pack-eventsGET /api/v1/acp/contracts/agent-handoff-eventsGET /api/v1/acp/projections/reed-read-only-capabilityGET /api/v1/acp/projections/swatch-scenario-verdictGET /api/v1/acp/projections/agent-handoff-ownershipGET /api/v1/acp/contracts/tool-action-registryGET /api/v1/acp/assertions/reed-context-capability/{tool_name}- CRM assertions require fresh
tenant_id,company_id,environment, andadapter_instance_idquery parameters; unknown companies are denied before upstream. GET /api/v1/acp/contracts/tool-execution-evidenceGET /api/v1/contracts/jarvisGET /api/v1/combinations/profilesGET /api/v1/identity/contracts/access-mappingGET /api/v1/identity/contracts/entitlement-policyGET /api/v1/identity/contracts/surface-admissionGET /api/v1/identity/contracts/surface-accessGET /api/v1/identity/contracts/surface-lifecycleGET /api/v1/identity/consumers/onboardingPOST /api/v1/identity/jadda-entitlement/projectionGET /api/v1/identity/jadda-entitlement/decisionGET /api/v1/identity/agent-federation/readinessGET /api/v1/projections/plane-unified-access/readinessGET /api/v1/platform/version-truthGET /api/v1/platform/projection-catalogGET /api/v1/platform/oss-security-readbackGET /api/v1/platform/tool-oss-inventory-directoryGET /api/v1/tools/host-pressure-policyGET /api/v1/mcp/grafana-readonlyGET /api/v1/event-modeling/standardGET /api/v1/event-modeling/catalogGET /api/v1/event-modeling/issue-spec-exportGET /api/v1/planning/contractsGET /api/v1/planning/interaction-lanesGET /api/v1/planning/interaction-lanes/create-sessionGET /api/v1/planning/interaction-lanes/answer-turnGET /api/v1/planning/sessions/{session_id}GET /api/v1/planning/sessions/{session_id}/review-bundleGET /api/v1/planning/sessions/{session_id}/score-gateGET /api/v1/planning/sessions/{session_id}/materialization-admissionGET /api/v1/planning/sessions/{session_id}/execution-contextGET /api/v1/planning/sessions/{session_id}/revision-ledgerGET /api/v1/planning/sessions/{session_id}/resume-stateGET /api/v1/planning/events/catalogGET /api/v1/events/issue-spec-export/contractsGET /api/v1/event-modeling/readinessGET /api/v1/event-modeling/standard-health-reportGET /api/v1/event-modeling/companion-surfaces-contractGET /api/v1/event-modeling/audit-aggregation-contractGET /api/v1/event-modeling/tenant-bootstrap-contractGET /api/v1/agent/contractsGET /api/v1/agent/contracts/workflowGET /api/v1/agent/workflowGET /api/v1/agent/bootstrapGET /api/v1/agent/action-context/{module_key}GET /api/v1/agent/methodology/event-modelingGET /api/v1/tools/runtime-statusGET /api/v1/providers/openclaw/runtime-statusGET /api/v1/observability/readinessGET /api/v1/recovery/readiness
Contract Families
The API publishes data from:
contracts/docs/contracts/- runtime composition under
deploy/compose/ - repo metadata such as
fabric-manifest.json
OpenAPI is the machine-readable contract envelope, but route meaning is also anchored by the JSON contract artifacts and docs pages.
For platform OSS upgrade governance, Fabric now publishes one canonical version-truth surface plus one canonical projection-catalog surface instead of expecting Beam or other consumers to infer Grafana, Prometheus, Wiki.js, Dapr, n8n, or NATS pins, readback routes, or compatibility surfaces from distributed compose/docs history:
GET /api/v1/platform/version-truthGET /api/v1/platform/projection-catalogGET /api/v1/platform/tool-oss-inventory-directorycontracts/platform/platform_version_truth.jsoncontracts/platform/platform_projection_catalog.jsondocs/contracts/HELPIFYR_PLATFORM_VERSION_TRUTH.mddocs/contracts/HELPIFYR_PLATFORM_PROJECTION_CATALOG.mddocs/contracts/HELPIFYR_PLATFORM_OSS_SECURITY_READBACK.mdcontracts/platform/platform_oss_security_readback_contract_v1.json
For cross-repo runtime gating on weak or shared hosts, Fabric now publishes one canonical host-pressure policy surface so runtime materialization and deployment repos do not invent repo-local CPU, memory, swap, or kswapd thresholds:
GET /api/v1/tools/host-pressure-policycontracts/runtime/host_pressure_policy_v1.jsoncontracts/runtime/host_pressure_policy_evidence_v1.schema.jsondocs/contracts/HELPIFYR_HOST_PRESSURE_POLICY.md
For ACP Wave 0/Wave 1 contract truth, Fabric now publishes one canonical capability-registry and skill-pack event-family surface so Reed and Warp consume explicit repository-standard Manifest v2 coupling, Reed-lane admission coupling, projection semantics, and fail-closed behavior instead of reconstructing them from backlog or local repo memory:
GET /api/v1/acp/contracts/capability-registryGET /api/v1/acp/contracts/skill-pack-eventsGET /api/v1/acp/projections/reed-read-only-capabilityGET /api/v1/acp/projections/swatch-scenario-verdict
For Event Modeling Wave 1 core publication, Fabric now publishes one canonical pilot-catalog plus one issue-spec export surface so Shuttle and Warp consume the same serial-first Wave-1 truth instead of reconstructing sequencing from issue comments or chat history:
GET /api/v1/event-modeling/standardGET /api/v1/event-modeling/catalogGET /api/v1/event-modeling/issue-spec-exportGET /api/v1/events/issue-spec-export/contractsGET /api/v1/event-modeling/readinessGET /api/v1/event-modeling/standard-health-reportGET /api/v1/event-modeling/companion-surfaces-contractGET /api/v1/event-modeling/audit-aggregation-contractGET /api/v1/event-modeling/tenant-bootstrap-contractcontracts/event_modeling/event_modeling_issue_spec_export.jsoncontracts/event_modeling/event_modeling_standard_health_report.jsoncontracts/event_modeling/event_modeling_companion_surfaces_contract.jsoncontracts/event_modeling/event_modeling_audit_aggregation_contract.jsoncontracts/event_modeling/event_modeling_tenant_bootstrap_contract.jsondocs/event-models/agent-task-delegation/manifest.jsoncontracts/acp/capability_registry_v1.jsoncontracts/acp/skill_pack_event_families_v1.jsoncontracts/acp/reed_read_only_projection_v1.jsoncontracts/acp/swatch_scenario_verdict_projection_v1.jsondocs/contracts/HELPIFYR_ACP_CAPABILITY_REGISTRY_V1.mddocs/contracts/HELPIFYR_ACP_REED_READ_ONLY_PROJECTION_V1.mddocs/contracts/HELPIFYR_ACP_SWATCH_SCENARIO_VERDICT_PROJECTION_V1.md
For Wave 4 adoption parity, Fabric also publishes one canonical contract descriptor surface for later-wave issue-spec consumers so Bobbin and adjacent repos can discover the single authoritative export path instead of probing undocumented alternatives:
GET /api/v1/events/issue-spec-export/contractsGET /api/v1/event-modeling/issue-spec-export
For Plan Studio Phase-0 live integration, Fabric now publishes one canonical read-only planning-session family plus one explicit interaction-lane catalog so Lantern, Pattern, Shuttle, Warp, and OpenClaw read live session, review, score-gate, materialization-admission, execution-context, revision-ledger, resume-state, event-vocabulary, and compose-lane admission truth from Fabric instead of inferring it from docs, chat, or repo-local fixture state:
GET /api/v1/planning/contractsGET /api/v1/planning/interaction-lanesGET /api/v1/planning/interaction-lanes/create-sessionGET /api/v1/planning/interaction-lanes/answer-turnGET /api/v1/planning/sessions/{session_id}GET /api/v1/planning/sessions/{session_id}/review-bundleGET /api/v1/planning/sessions/{session_id}/score-gateGET /api/v1/planning/sessions/{session_id}/materialization-admissionGET /api/v1/planning/sessions/{session_id}/execution-contextGET /api/v1/planning/sessions/{session_id}/revision-ledgerGET /api/v1/planning/sessions/{session_id}/resume-stateGET /api/v1/planning/events/catalogcontracts/planning/plan_studio_planning_session_v1.jsoncontracts/planning/plan_studio_create_session_lane_v1.jsoncontracts/planning/plan_studio_answer_turn_lane_v1.jsoncontracts/planning/plan_studio_review_bundle_v1.jsoncontracts/planning/plan_studio_score_gate_policy_v1.jsoncontracts/planning/plan_studio_materialization_admission_v1.jsoncontracts/planning/plan_studio_execution_context_v1.jsoncontracts/planning/plan_studio_revision_ledger_v1.jsoncontracts/planning/plan_studio_session_resume_policy_v1.jsoncontracts/planning/plan_studio_event_catalog_v1.jsoncontracts/planning/plan_studio_producer_consumer_matrix_v1.jsondocs/contracts/HELPIFYR_PLAN_STUDIO_CONTRACT_FAMILY.mdpython scripts/check_event_modeling_wave4_adoption.py --check-live --fabric-base-url http://<internal-runtime-redacted>:28080
The same GET /api/v1/event-modeling/issue-spec-export surface now also carries
the bounded phase0_scenarios section for Plan Studio. That additive block is
read-only and documents the dry-run planning flow only; it must not be treated
as live issue-materialization or execution-readiness truth.
The planning-session family now also carries consumer-safe detail projection for operator tabs:
- current revision detail on
GET /api/v1/planning/sessions/{session_id} - reviewer-summary and round-synthesis review detail projection on
GET /api/v1/planning/sessions/{session_id}/review-bundle - suggested issue/wave refs plus admitted action intents on
GET /api/v1/planning/sessions/{session_id}/execution-context - append-only timeline and evidence-entry projection on
GET /api/v1/planning/sessions/{session_id}/revision-ledger
Where detail truth is not yet safe or complete for downstream publication, the surfaces stay explicit and fail closed with projection-state markers instead of falling back to fixture/demo detail.
The interaction-lane catalog makes one additional boundary explicit: the generic
admitted docs-change write posture still does not imply broad interactive compose
authority. create_session and answer_turn are now admitted only as bounded
Fabric-owned runtime session writes for Lantern BFF consumption, with dedicated
POST routes, request/response DTO contracts, and explicit authority/auth truth
for those actions.
For Event Modeling v2.0 execution-safety and consumer-governance truth, Fabric additionally publishes:
GET /api/v1/event-modeling/standard-health-reportGET /api/v1/event-modeling/companion-surfaces-contractGET /api/v1/event-modeling/audit-aggregation-contractGET /api/v1/event-modeling/tenant-bootstrap-contract
These surfaces provide read-only truth for:
- Dobby-backed standard evolution metrics
- companion-surface read permissions and prohibited behaviors
- audit-safe aggregation boundaries
- tenant bootstrap defaults and module-onboarding linkage
The companion contracts now also publish the explicit codex-companion passive-supervision lane.
That consumer may read Fabric Event Modeling truth for closeout-readiness, drift visibility, and
bounded supervision summaries, but it must remain fail-closed on sync conflict, may not self-close
work by projection, and may not create shadow execution or blocker ownership outside Fabric gates.
For Fabric-first agent bootstrap and access-answer truth, Fabric now also publishes one canonical agent contract catalog plus one role-filtered bootstrap context and one module-scoped action-context surface so agents ask Fabric first instead of inferring stack behavior from scattered repo docs:
GET /api/v1/agent/contractsGET /api/v1/agent/contracts/owner-matrixGET /api/v1/agent/contracts/capability-module-mapGET /api/v1/agent/contracts/task-tool-selectionGET /api/v1/agent/contracts/access-answersGET /api/v1/agent/contracts/tool-usageGET /api/v1/agent/contracts/dobby-learning-signalGET /api/v1/agent/contracts/workflowGET /api/v1/agent/workflowGET /api/v1/agent/bootstrapGET /api/v1/agent/action-context/{module_key}GET /api/v1/agent/methodology/event-modelingcontracts/agent/agent_truth_layer_v1.jsoncontracts/agent/agent_workflow_phase_contract_v1.jsondocs/contracts/HELPIFYR_AGENT_BOOTSTRAP_TRUTH_LAYER.mddocs/contracts/HELPIFYR_AGENT_WORKFLOW_PHASE_CONTRACT.md
For ACP Wave 2 contract truth, Fabric now also publishes one canonical tool/action registry and one canonical execution-evidence/event family surface so consumers do not create local shadow tool/action truth for approval, dry-run, rollback, or evidence semantics:
GET /api/v1/acp/contracts/tool-action-registryGET /api/v1/acp/contracts/tool-execution-evidencecontracts/acp/tool_action_registry_v1.jsoncontracts/acp/tool_execution_evidence_v1.jsondocs/contracts/HELPIFYR_ACP_TOOL_ACTION_REGISTRY_V1.md
For ACP Wave 4 contract truth, Fabric now also publishes one canonical handoff/escalation/ownership event catalog and one matching ownership projection so consumers do not invent local delegation or owner-selection truth when handoff event chains are missing, stale, circular, or conflicting:
GET /api/v1/acp/contracts/agent-handoff-eventsGET /api/v1/acp/projections/agent-handoff-ownershipcontracts/acp/agent_handoff_event_catalog_v1.jsoncontracts/acp/agent_handoff_ownership_projection_v1.jsondocs/contracts/HELPIFYR_ACP_AGENT_HANDOFF_EVENT_CATALOG_V1.md
For SSO-v4 surfaces, the API now also exposes explicit special-admin posture truth:
surface-accesspublishes machine-readableadmin_capable_surfaceandadmin_posturesconsumers/onboardingmirrors the same superadmin and recovery-only admin posture for downstream consumerssurface-lifecycledefines the audit-evidence event vocabulary forsurface-superadmin-elevatedandsurface-recovery-admin-elevated
Producer / Consumer Zuordnung
- producer:
jhf-fabric - consumers: downstream JHF repos, Wiki.js docs publishing, operators, CI, provider integrators
- rule: consumers must not infer or redefine blocked/degraded/stale/conflict semantics beyond what Fabric already publishes
Compatibility Window
- current route families are versioned under
/api/v1 - additive extension is preferred over incompatible rename or shape drift
- compatibility and admission are explicit route families, not undocumented conventions
Lifecycle Status
- active, verified, and used as the shared truth publication surface
- some preview families remain intentionally preview-only
Readiness / Drift / Monitoring
Typical route-check order:
GET /healthGET /api/v1/contracts/driftGET /api/v1/observability/readinessGET /api/v1/security/readinessGET /api/v1/recovery/readiness- subsystem-specific readiness routes relevant to the current consumer
Deployment / Verify
- local API start:
uvicorn helpifyr_fabric.api.app:app --reload - OpenAPI export:
GET /api/v1/openapi.json - test coverage:
tests/test_api.pyplus subsystem-specific tests - live host verification: route reads against the owner-declared Fabric runtime authority
Known Limits
- not every consumer needs every route family
- some route families summarize deeper contract documents and should be read alongside their matching docs pages
- preview endpoints must not be mistaken for direct mutation authority
Exceptions / Waivers
- local dev/test paths can differ from guarded live-host auth posture
- provider-derived runtime observations inform API output but do not replace Fabric-owned contract truth
Related Issues
- route and contract history is reflected in
docs/issues/ - contract plans live under
docs/plans/
License
- License: AGPLv3
- Project: https://helpifyr.com