Admin API Reference

For: Platform operators and automation scripts managing Axemere Gateway at runtime.

Complete endpoint listing for the Axemere Gateway v1 Admin API. If you prefer a CLI over direct HTTP calls, see the CLI Reference. For a hosted, API-key-authenticated equivalent of these endpoints (no admin token or direct gateway network access required), see the Management API Reference.

All endpoints require one of:

  • MVGC-Admin-Token: <token> header
  • Authorization: Bearer <token> header

The token value is set via MVGC_ADMIN_TOKEN on the gateway.

Table of Contents


DELETE endpoint availability: DELETE is supported for credentials and workloads. There is no DELETE endpoint for policies.

  • To remove a credential: DELETE /v1/admin/credentials/{id} (returns 200 on success, 404 if not found).
  • To remove a policy bundle: push a new empty bundle (deny-all default) via PUT /v1/admin/policies.
  • To remove a workload: DELETE /v1/admin/workloads/{id} (returns 200 on success, 404 if not found).

Health Check

MethodEndpointDescription
GET/healthzGateway health (no token required); returns status, version, node ID, control plane connection status, and list of registered connectors with versions

Credentials

MethodEndpointDescription
GET/v1/admin/credentialsList registered credentials
PUT/v1/admin/credentialsCreate or update a credential. In CP-managed deployments, also triggers auto-rule generation (auto.allow.{provider}) in the org's policy overlay for ai_provider credentials.
DELETE/v1/admin/credentials/{id}Delete a credential (returns 200, or 404 if not found). In CP-managed deployments, also removes the corresponding auto-rules from the org's policy overlay atomically.
POST/v1/admin/credentials/reloadRe-read all *.yaml files from MVGC_CREDENTIALS_DIR and upsert every credential (overwrites DB values; no restart needed)

Workloads

MethodEndpointDescription
GET/v1/admin/workloadsList registered workloads
PUT/v1/admin/workloadsCreate or update a workload
DELETE/v1/admin/workloads/{id}Delete a workload (returns 200, or 404 if not found)

Policies

MethodEndpointDescription
GET/v1/admin/policiesReturn the currently active bundle (bundle_id, version, source, loaded_at)
PUT/v1/admin/policiesHot-load a policy bundle (YAML body) without restarting
POST/v1/admin/policies/reloadRe-read bundle.yaml and all add-ons from MVGC_POLICIES_DIR on disk; picks up new add-ons without restarting (returns 400 in CP/remote mode)

Addons

Addons are org-level feature toggles managed from the control plane. When enabled, an addon contributes additional policy rules to the effective bundle for that org. The addon catalog is seeded at migration time; operators enable or disable individual addons per org.

MethodEndpointDescription
GET/v1/orgs/{orgID}/addonsList the addon catalog with per-org enabled state
POST/v1/orgs/{orgID}/addons/{addonID}/enableEnable an addon for the org (returns 200; 404 if addon not found)
POST/v1/orgs/{orgID}/addons/{addonID}/disableDisable an addon for the org (returns 200; 404 if addon not found)

Response shape for GET /v1/orgs/{orgID}/addons:

{
  "addons": [
    {
      "addon_id": "credential-passthrough",
      "display_name": "Credential Passthrough",
      "description": "Forward client-supplied auth headers to AI providers unchanged while applying full governance.",
      "category": "credentials",
      "version": "1.0.0",
      "enabled": false,
      "enabled_at": ""
    }
  ]
}

Note: Addon endpoints are org-scoped (path prefix /v1/orgs/) and require the standard admin token. They are available only when the gateway is connected to a control plane (MVGC_CP_ADDR set).


Connectors

MethodEndpointDescription
GET/v1/admin/connectorsList registered connectors with metadata and health

Approvals

MethodEndpointDescription
GET/v1/admin/approvalsList approval requests (query: org_id, status, limit, page_token); returns {"items": [...], "next_page_token": "..."}
GET/v1/admin/approvals/{id}Get a specific approval request
POST/v1/admin/approvals/{id}/approveApprove a pending request (body: {"decided_by": "..."})
POST/v1/admin/approvals/{id}/denyDeny a pending request (body: {"decided_by": "..."})

Quarantine

MethodEndpointDescription
GET/v1/admin/quarantineList quarantine entries (query: org_id, limit, page_token); returns {"items": [...], "next_page_token": "..."}
POST/v1/admin/quarantine/{id}/releaseRelease a quarantined request (body: {"released_by": "..."})

Org Management

These endpoints let platform operators inspect and control the suspension state of an organisation without restarting the gateway. They are available in both managed and self-hosted modes when the gateway is connected to a control plane.

MethodEndpointDescription
GET/v1/admin/orgReturn the current org status (active, suspended, or terminated) and, when suspended, the operator-supplied reason
POST/v1/admin/org/suspendSuspend the org: all inbound requests immediately receive {"error":"org_suspended"}. Optionally accepts a reason in the request body.
POST/v1/admin/org/reactivateLift a suspension and restore normal traffic flow

GET /v1/admin/org response:

{
  "org_id": "org_01j...",
  "status": "suspended",
  "suspended_reason": "Non-payment: invoice #1234 overdue"
}

suspended_reason is omitted when the org is active or when no reason was given at suspension time.

POST /v1/admin/org/suspend request body (optional):

{ "reason": "Non-payment: invoice #1234 overdue" }

Returns {"status":"suspended"} on success, 404 if the gateway has no org configured.

POST /v1/admin/org/reactivate response:

Returns {"status":"active"} on success, 404 if the gateway has no org configured.

Effect on traffic:

  • Managed gateway: Enforced at the auth layer via push events. Suspension propagates within one CheckIn cycle (~60 s) to all managed nodes.
  • Self-hosted + CP: Enforced at execution time. The gateway learns the suspended status on its next periodic CheckIn (default 60 s interval). At most one request may pass through between the suspension event and the next check-in. Reactivation is detected on the first denied request: a background check-in is triggered immediately, so the following request is unblocked without waiting for the full interval.

Keys are not revoked; suspension is fully reversible.


Nodes

MethodEndpointDescription
GET/v1/admin/nodesList gateway nodes (returns [{"node_id","registered_at","mode"}]; mode is "embedded" or "distributed")

Rate Limiting

MethodEndpointDescription
GET/v1/admin/ratelimit/configGet current rate limiter configuration (refill_rate, max_tokens, window_duration)
PUT/v1/admin/ratelimit/configUpdate rate limiter configuration (body: {"refill_rate": N, "max_tokens": N, "window_duration": "1m"}; both must be > 0)
GET/v1/admin/ratelimit/keysList active rate limiter bucket keys (workload IDs with tracked state)

Discovery

MethodEndpointDescription
GET/v1/admin/discovery/domainsList discovered domains with hit counts (query: managed=true|false); requires MVGC_DISCOVERY_ENABLED=true
DELETE/v1/admin/discovery/domainsReset all discovery domain counters (returns 204)

Policy Cache

MethodEndpointDescription
DELETE/v1/admin/policy/cacheClear the durable policy bundle cache for this node (returns 204; returns {"status":"no_cache"} when no durable cache is configured)

Observability

MethodEndpointDescription
GET/metricsPrometheus metrics endpoint (requires MVGC_METRICS_ENABLED=true)
GET/v1/dashboard/summaryDashboard summary (query: org_id, from, to)
GET/v1/dashboard/decisionsDecision breakdown (query: org_id, from, to)

Record Verification

MethodEndpointDescription
GET/v1/verify/{record_hash}Verify a record hash and retrieve its inclusion proof; returns status: "verified" or "pending_inclusion"

SSL MITM Proxy

MethodEndpointDescription
GET/v1/proxy/ca.crtRetrieve the gateway root CA certificate for client trust store installation; returns 404 when MVGC_PROXY_MITM_ENABLED=false


Response Schemas

Approval object

Returned by GET /v1/admin/approvals and GET /v1/admin/approvals/{id}:

{
  "approval_id": "01955f3e-bbbb-7abc-8def-000000000002",
  "org_id": "org-example-001",
  "workload_id": "wl-prod-app-1",
  "caller_id": "service-abc",
  "status": "pending",
  "reason": "high-cost model requires operator approval",
  "decided_by": null,
  "created_at": "2026-03-12T10:00:00Z",
  "decided_at": null,
  "expires_at": "2026-03-13T10:00:00Z"
}

status values: pending, approved, denied, expired

Quarantine entry object

Returned by GET /v1/admin/quarantine:

{
  "quarantine_id": "01955f3e-aaaa-7abc-8def-000000000001",
  "org_id": "org-example-001",
  "workload_id": "wl-prod-app-1",
  "caller_id": "service-abc",
  "caller_ip": "10.0.1.42",
  "action_type": "ai.infer",
  "reason": "composite risk score exceeds threshold",
  "risk_score": 0.87,
  "created_at": "2026-03-12T10:15:00Z",
  "released_at": null,
  "released_by": null
}

Record verification response

Returned by GET /v1/verify/{record_hash}:

{
  "status": "verified",
  "record_hash": "a1b2c3d4e5f6...",
  "inclusion_proof": {
    "schema": "mvgc.inclusion_proof.v1",
    "record_hash": "a1b2c3d4e5f6...",
    "batch_id": "01955f3e-0000-7abc-8def-000000000001",
    "leaf_index": 42,
    "leaf_count": 1000,
    "path": [
      { "side": "right", "hash": "deadbeef..." },
      { "side": "left", "hash": "cafebabe..." }
    ],
    "root": {
      "schema": "mvgc.merkle_root.v1",
      "batch_id": "01955f3e-0000-7abc-8def-000000000001",
      "root_hash": "abcdef01...",
      "leaf_count": 1000,
      "sig": { "alg": "ed25519", "kid": "kid_cp_1", "sig": "..." }
    }
  }
}

When not yet batched: {"status": "pending_inclusion", "record_hash": "..."}


See Also