For developers

The core request/response shapes for integrating against the Inzinx API. This covers the flow most integrations need — submit a rule, activate it, then evaluate or rate. New to this? Start with Getting started.

Authentication

Every request (other than admin-only ones you won't need as a subscriber) carries an x-api-key header — the per-tenant key you got when your workspace was created, sent only over TLS to a rate-limited, per-tenant isolated endpoint (see our security page for the details). Two things determine what a key can do, independently of each other:

  • Key type — admin keys can submit drafts and activate them, in addition to evaluating and rating; consumer keys can only evaluate, rate, and list — a write to a /tenant/... route with a consumer key returns 403.
  • Key management — a separate flag, can_manage_keys, controls whether a key can mint or revoke further keys for your tenant. Handing out a regular admin key to a teammate doesn't also give them the ability to create or revoke credentials.

Core endpoints

POST/tenant/rules

Auth: Tenant key (admin)

Submits (or replaces) a draft eligibility rule. Re-submitting the same id is how you edit a draft — it's an upsert, not an append.

{
  "id": "adult-eligibility",
  "conditions": [
    { "field": "age", "op": ">=", "value": 18 },
    { "field": "email", "op": "matches", "value": "^[a-zA-Z0-9._%+-]+@company\\.com$" },
    { "field": "ip_address", "op": "cidr_match", "value": "192.168.1.0/24" }
  ],
  "output": { "eligible": true }
}

conditions supports 10 native leaf operators:

  • Equality & numeric: ==, !=, >=, >, <=, <, and in (list membership).
  • Rich String: starts_with, ends_with, contains, not_contains.
  • Regex pattern: matches (compiled Rust linear-time regex).
  • Null & empty safety: is_null, is_not_null, is_empty, is_not_empty.
  • Network & CIDR: cidr_match (IPv4 & IPv6 subnet check).
  • Nested Array Quantifiers: array_any, array_all, array_none, array_count (with "$item" for primitive arrays).
  • Groups & references: all, any, not, and ref.
POST/tenant/rules/activate

Auth: Tenant key (admin)

Validates and promotes drafts to active. An empty or omitted body activates every current draft (rules, rating rules, tables, and decision graphs together); pass an optional body to activate only specific ones:

{
  "rule_ids": ["adult-eligibility"],
  "rating_rule_ids": [],
  "table_names": [],
  "graph_ids": ["checkout-flow"]
}

Activation validates the entire resulting active set as one atomic operation — it either fully succeeds, or nothing is changed. A named id with no matching draft is rejected and commits nothing.

POST/eligibility/{rule_id}/evaluate

Auth: Tenant key (any)

Evaluates an active eligibility rule against arbitrary JSON input in microseconds (≤ 1ms). Optional query params: as_of (YYYY-MM-DD, defaults to today) and region.

curl -X POST https://api.inzinx.com/eligibility/adult-eligibility/evaluate \
  -H "x-api-key: <your_key>" -H "Content-Type: application/json" \
  -d '{"age": 25, "email": "user@company.com", "ip_address": "192.168.1.42"}'

Response:

{
  "passed": true,
  "output": { "eligible": true },
  "trace": [
    { "type": "leaf", "field": "age", "op": ">=", "value": 18, "actual": 25, "passed": true }
  ]
}

trace explains exactly how the result was reached, step by step — including nested all/any/not groups, array_* element traces, and ref nodes (whose own referenced-rule trace appears as children, not flattened away).

POST/rating/{rule_id}/rate

Auth: Tenant key (any)

Rates a single item against an active rating rule — runs a base rate through an ordered list of factors (table lookups with DMN hit policies, tiers, deductible curves, conditions, flat adjustments) and returns the computed amount plus a step-by-step trace of how it got there. Same as_of/region query params as evaluate.

curl -X POST https://api.inzinx.com/rating/simple-rating/rate \
  -H "x-api-key: <your_key>" -H "Content-Type: application/json" \
  -d '{"tier": "silver", "risk_score": 72}'

Response:

{
  "amount": 525.00,
  "trace": [
    { "step": "base_rate", "amount": 500 },
    { "step": "service_fee", "op": "add", "delta": 25, "amount": 525 }
  ]
}
POST/tenant/graphs/{graph_id}/run

Auth: Tenant key (any)

Executes an active Decision Graph (DAG). Topologically evaluates connected nodes (Input → Eligibility → Table → Rating → Transform → Output), mutates context across edges, and branches via on_pass / on_fail conditions.

curl -X POST https://api.inzinx.com/tenant/graphs/order-approval/run \
  -H "x-api-key: <your_key>" -H "Content-Type: application/json" \
  -d '{"cart_total": 450, "loyalty_years": 3, "country": "US"}'

Response:

{
  "graph_id": "order-approval",
  "as_of": "2026-09-20",
  "output": { "approved": true, "final_discount_rate": 0.15 },
  "trace": [
    { "node_type": "input", "node_id": "in_1" },
    { "node_type": "eligibility", "node_id": "chk_1", "rule_id": "order-valid", "passed": true, "trace": [...] },
    { "node_type": "rating", "node_id": "rate_1", "rule_id": "calc-discount", "amount": "0.15", "trace": [...] },
    { "node_type": "output", "node_id": "out_1", "fields": { "approved": true, "final_discount_rate": 0.15 } }
  ]
}

Skipped nodes on untaken conditional branches are explicitly tracked with { "node_type": "skipped", "node_id": "..." }.

POST/tenant/graphs/{graph_id}/test

Auth: Tenant key (any)

Same execution semantics as /run, but against a draft graph — for trying out a decision pipeline against real input before it's ever live. Never touches production traffic.

curl -X POST https://api.inzinx.com/tenant/graphs/order-approval/test \
  -H "x-api-key: <your_key>" -H "Content-Type: application/json" \
  -d '{"cart_total": 450, "loyalty_years": 3, "country": "US"}'
GET/tenant/graphs

Auth: Tenant key (any)

Lists this tenant's decision graphs by status.

curl -X GET "https://api.inzinx.com/tenant/graphs?status=active" \
  -H "x-api-key: <your_key>"
GET/tenant/graphs/{graph_id}/versions

Auth: Tenant key (any)

Every version ever written for a graph id — draft, active, and archived — newest first. Nothing is ever deleted; archiving just marks a version archived rather than removing the row.

POST/tenant/graphs/{graph_id}/deactivate

Auth: Tenant key (admin)

Archives an active graph directly. One-way — reactivating means submitting a fresh draft and activating it again.

GET/tenant/analytics/overview

Auth: Tenant key (any)

Retrieves operational decision telemetry and hit-rate distributions over a trailing window (default 7 days). Useful for streaming Inzinx metrics into your internal Datadog, Grafana, or cloud dashboards.

curl -X GET "https://api.inzinx.com/tenant/analytics/overview?days=7" \
  -H "x-api-key: <your_key>"

Response:

{
  "days": 7,
  "total_evaluations": 142500,
  "passed_count": 131100,
  "failed_count": 11400,
  "pass_rate_pct": 92.0,
  "latency": {
    "min_us": 18,
    "p50_us": 42,
    "p95_us": 110,
    "p99_us": 195,
    "max_us": 680
  },
  "top_rules": [
    { "rule_id": "checkout-fraud-check", "record_type": "eligibility", "count": 85000, "avg_latency_us": 38 }
  ],
  "dead_rules": []
}
GET/tenant/analytics/funnel/{rule_id}

Auth: Tenant key (any)

Breaks down an eligibility rule's pass rate by its individual top-level conditions, so you can see which specific condition is disqualifying the most calls — not just the rule's overall pass/fail rate.

curl -X GET "https://api.inzinx.com/tenant/analytics/funnel/checkout-fraud-check?days=7" \
  -H "x-api-key: <your_key>"

Response:

{
  "rule_id": "checkout-fraud-check",
  "total_evaluations": 85000,
  "steps": [
    { "index": 0, "label": "age >= 18", "total": 85000, "passed_count": 84200 },
    { "index": 1, "label": "country in [US, CA, UK]", "total": 84200, "passed_count": 79600 }
  ]
}

Beyond this page

Inzinx provides a clean, synchronous REST API engineered for sub-millisecond (≤ 1ms) execution in Rust. The same API includes endpoints for DMN decision tables with hit policies (First, Unique, CollectSum, CollectCount, CollectMin/Max), key management (/tenant/keys...), multi-item bundles, rating-rule composition (rating_ref), persistent accumulators, and excess-of-loss reinsurance layers — all accessible directly over HTTPS with your tenant x-api-key. See your dashboard's "Rules & rating guide" or contact support for specialized schemas.