The gateway is how teams automatically seal workflow evidence. You run it (or pilot our hosted preview). Plaintext and package keys stay in the customer environment — not in a Qira cloud that can read your documents.
Accept normalized events (API, webhook, connectors). Optionally evaluate policy. Seal a case into an encrypted package. Return metadata and verification — not open plaintext to the internet.
Use the gateway when jobs, photos, or change orders should be sealed as they happen. For a one-off secret with no integration, use the browser vault instead.
Try the pilot at /platform/, or run apps/gateway from qev-platform on your host.
Confirm the process is up and see mode (shadow vs control). Use GET /v1/health and GET /v1/preflight.
POST /v1/events with a bearer ingest token, or a signed webhook, or the JS SDK / a connector.
Complete a case with POST /v1/flows/{flow_id}/complete, then inspect package metadata and run verify.
Hosted preview of the gateway UI and API (admin, wizard, portal, review when enabled on the process).
GET /platform/v1/health — product, version, shadow modeschemas/gateway.openapi.yaml in the monorepo# Example — public pilot health (no secrets)
curl -sS https://secure.imagineqira.com/platform/v1/health | jq .
# Expect fields like: product, version, mode (e.g. shadow),
# mode_behavior.records_events, preflight checks
| Method | Path | Purpose |
|---|---|---|
| GET | /healthz · /readyz | Liveness / readiness |
| GET | /v1/health · /v1/preflight | Product status, mode, dependency checks |
| POST | /v1/events | Ingest one event (bearer token) |
| POST | /v1/webhooks/{connector_id} | Signed webhook ingress |
| POST | /v1/flows/{flow_id}/complete | Seal a case into a package |
| GET | /v1/packages/{id} | Package metadata (not plaintext) |
| POST | /v1/packages/{id}/verify | Integrity / decrypt check with passphrase |
| GET | /v1/cases · /v1/receipts/{event_id} | Case list, ingest receipts |
| POST | /v1/policy/evaluate | Policy dry-run without sealing |
Protected routes expect Authorization: Bearer <ingest token> (see OpenAPI IngestToken). Configure tokens only on instances you control — do not paste production secrets into public examples.
curl -sS -X POST "$QEV_GATEWAY_URL/v1/events" \
-H "Authorization: Bearer $QEV_INGEST_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"event": {
"schema": "qev.event.v1",
"flow": "field-service",
"case_id": "JOB-1",
"type": "work.completed",
"actor": { "id": "tech@example.com" }
},
"seal_if_complete": false
}'
From app code, use the JS SDK (qev.capture(...)) pointed at your gateway base URL.
Source: packages/sdk-js.
Gateway code lives in the monorepo under apps/gateway. Default local surfaces include admin, wizard, portal, and review UIs, plus the /v1/* API.
schemas/gateway.openapi.yamlDesign intent: customer documents, prompts, and encryption keys stay with the gateway you operate. Optional control-plane features must not receive package plaintext. See Trust program.
Evidence bundles Audit statusWe help wire capture without taking custody of your keys.