Developers

One call before every high-risk action

Your system sends the action to Omnareth before it carries it out, and acts only on the answer. The decision comes back with its reasons, and the evidence is sealed. Median end-to-end decision in our lab test: 75 ms.

Integration

Four steps

The first three are setup. The fourth is the call your systems make in production. A JSON REST API over HTTPS; no SDK required.

Step 1

Model the record

POST /v1/entity-types

Describe the thing you protect (a shipment, a vendor, an onboarding) with a JSON Schema, and say which event fields identify people, devices, documents and accounts. Omnareth remembers those across records.

Step 2

Load the rules

POST /v1/rules

Each rule is JSON: the condition, the decision (DENY or FLAG), a code, a message and a remediation. Start from a reference set and change what your policy needs.

Step 3

Mirror your records

POST /v1/entities · PUT /v1/entities/{id}

Create each record once and update it when your system of record changes it. Omnareth checks events against the record as it stands.

Step 4

Ask before acting

POST /v1/events/process

Send each high-risk action before your system carries it out, and act only on the answer.

Steps 1 to 3

The record, its identifiers and a rule

From the identity verification reference set. The entity type declares which fields identify whom; singleUse means a value seen on another record is suspicious, hopping means one value behind denials on many records is a ring.

// POST /v1/entity-types (excerpt)
"fraud": { "identifiers": [
  { "path": "document.number",  "type": "DOCUMENT", "role": "SUBJECT", "singleUse": true },
  { "path": "document.deviceId", "type": "DEVICE",  "role": "SUBJECT", "hopping": true },
  { "path": "selfie.faceId",    "type": "FACE",     "role": "SUBJECT", "singleUse": true },
  { "path": "selfie.deviceId",  "type": "DEVICE",   "role": "SUBJECT", "hopping": true }
] }

// POST /v1/entities
{ "entity": { "type": "Onboarding", "jurisdiction": "US", "data": {
  "onboardingId": "ONB-26-70503", "status": "OPEN",
  "declaredName": "Priya Nair", "declaredDateOfBirth": "1996-08-30",
  "acceptedDocuments": ["PASSPORT", "DRIVING_LICENCE", "NATIONAL_ID"],
  "minFaceMatch": 90, "maxAttempts": 3 } } }
// POST /v1/rules
{ "rule": {
  "name": "Document Expired",
  "appliesToEntityType": "Onboarding",
  "appliesToEventType": "DOCUMENT_CHECK",
  "severity": "HIGH",
  "condition": { "type": "compare", "field": "document.expired",
                 "operator": "==", "value": true },
  "consequence": {
    "decision": "DENY",
    "code": "DOCUMENT_EXPIRED",
    "message": "The document has expired",
    "remediation": "Ask for a current document"
  },
  "status": "ACTIVE"
} }

Conditions compare event fields, record fields (entity.*) and fraud context (context.fraud.*), with and, or and not. A rule can compare one field with another through valueField, for example a selfie's face-match score with the record's minFaceMatch. Rules are versioned; a rule that has made decisions can be set INACTIVE but not deleted.

Step 4

Ask before acting

A document check with an expired passport, and the answer. The response carries the decision, the ids of the decision and its audit record, and the block the record was anchored in.

POST /v1/events/process
Authorization: Bearer <access token>
{ "event": {
    "source": "onboarding-app",
    "type": "DOCUMENT_CHECK",
    "entityId": "ent_1f4654eb0732461988a0c1e772002f03",
    "entityType": "Onboarding",
    "jurisdiction": "US",
    "payload": { "document": {
      "type": "PASSPORT", "number": "P90031177",
      "dateOfBirth": "1996-08-30",
      "expired": true, "tamperDetected": false,
      "deviceId": "dev-7f3a" } } } }
201 Created
{ "success": true,
  "data": {
    "decisionId": "dec_3da77a1363584b358b4f2ab41551c98a",
    "auditId": "aud_41e173d965fc463a9ee299bb26ad7d2c",
    "status": "DENY",
    "summary": { "rulesEvaluated": 149, "rulesFailed": 1,
                 "rulesPassed": 9, ... },
    "anchor": { "status": "anchored", "blockHeight": 4447,
                "txHash": "a5365a02…", ... }
  },
  "meta": { "requestId": "8e15a3a5-…", "timestamp": "…" } }

When an event opens or updates a fraud case, the response also lists it under fraudCases. rulesEvaluated counts every active rule; those for other entity or event types are recorded as not applicable.

Acting on the answer

Three outcomes

DecisionMeaningWhat your system does
ALLOWNo rule objected.Carry out the action, then update the record in Omnareth if it changed.
FLAGAllowed, but at least one rule flagged it.Carry out the action and queue it for review with the flag's message.
DENYAt least one rule refused it.Do not carry out the action. Show or route the rule's remediation.

If Omnareth cannot be reached, your system decides what happens; for high-risk actions we recommend holding the action rather than letting it through unchecked.

Reasons

Why a decision was made

Fetch the decision to see every rule evaluated. Rules with "result": "FAIL" are the ones that fired; each carries the code, message and remediation exactly as they were when it was evaluated, so a later edit to the rule does not rewrite history.

During a pilot's shadow run, your system sends every event and records the decision without acting on it. At the end, the decisions show what Omnareth would have stopped.

GET /v1/decisions/dec_3da77a13…
// data.decision.ruleEvaluations, the failed rule
{ "ruleId": "rul_25de63eb51b14a3ba6deafcf1f969c0e",
  "version": 1,
  "result": "FAIL",
  "details": "The document has expired",
  "conditionSnapshot": { "type": "compare",
    "field": "document.expired",
    "operator": "==", "value": true },
  "consequenceSnapshot": {
    "decision": "DENY",
    "code": "DOCUMENT_EXPIRED",
    "message": "The document has expired",
    "remediation": "Ask for a current document" } }

Evidence

Prove it later

Verification recomputes the audit record's hash and compares it with the stored hash and with the copy anchored on chain. An auditor, regulator or court gets the same answer you do. How tamper evidence works

GET /v1/audits/aud_41e173d9…/verify
{ "decisionStatus": "DENY",
  "storedHash":     "6b20f432ff6a91cb…",
  "recomputedHash": "6b20f432ff6a91cb…",
  "recordIntact": true,
  "chain": { "status": "match", "blockHeight": 4447,
             "onChainHash": "6b20f432ff6a91cb…",
             "onChainDecision": "DENY" },
  "verified": true }

Access

Authentication and roles

Tokens

Bearer tokens

POST /v1/auth/login returns an access token (valid 15 minutes by default) and a refresh token (valid 7 days); POST /v1/auth/refresh exchanges one for a new pair. Every /v1 call needs the access token, except sign-in and the public pilot application form. Accounts are created by an administrator; there is no open sign-up.

Roles

Least privilege

Give each connected system an integration account: it can send events, keep records in sync and read decisions and evidence, but cannot change rules. fraud_analyst accounts read everything and work fraud cases and the watchlist. Only admin changes rules and record types.

Every response uses the same envelope: success, data (or error with a code and message) and meta.requestId. Quote the request id when reporting a problem. All endpoints

Pilot program

Integrate against your own events in a pilot

One lane, facility or process, in shadow mode, with results measured against criteria we agree with you. Qualified companies and organizations can apply.