Developers

Two SDKs, one contract.

Official clients for TypeScript and Python. Both wrap the same typed REST API, and both return the evidence chain alongside the verdict.

@omni-intel/sdk-js

v0.2.0npm

TypeScript / JavaScript

$ npm install @omni-intel/sdk-js
import { OmniIntel } from "@omni-intel/sdk-js";

const omni = new OmniIntel({ apiKey: process.env.OMNI_INTEL_KEY! });

const result = await omni.enrich("http://evil.example/payload.exe");

console.log(result.verdict);            // "malicious"
console.log(result.confidence);         // 0.92
console.log(result.evidence[0].source); // "abusech/urlhaus"

omni-intel

v0.2.0PyPI

Python 3.9+

$ pip install omni-intel
from omni_intel import OmniIntel

omni = OmniIntel(api_key=os.environ["OMNI_INTEL_KEY"])

result = omni.enrich("http://evil.example/payload.exe")

print(result.verdict)               # "malicious"
print(result.confidence)            # 0.92
print(result.evidence[0].source)    # "abusech/urlhaus"

One contract, two clients

specs/openapi/v1.yamlsource of truth@omni-intel/sdk-jstypescript · v0.2.0omni-intelpython · v0.2.0API gatewaycodegen, nothand-writtencovers 6 of 22route groups today
Fig. Both clients are generated from the same OpenAPI contract, so neither can drift from the API independently.

What both give you

Typed end to end

Request and response shapes are generated from the same specs that drive the API, so a breaking change surfaces at compile time rather than in production.

Evidence included

Every enrichment carries its evidence chain and retriever trace — the SDKs expose them as first-class fields, not an opaque blob.

One Bearer key

Same scoped, revocable key as the REST API. Keys are tenant-scoped and rate-limited per plan.

STIX 2.1 shapes

Indicator objects follow STIX 2.1 so results drop into a SOAR or TAXII consumer without translation.