Get a key
We issue a partner key (vlx_live_…) and a tier. The plaintext is shown exactly once; we only store its SHA-256 hash.

One HTTPS call in. A scored, explained verdict out: action, reasons, evidence and confidence. The same engine that protects people, exposed as plain JSON.
Get a key, make one call, act on the verdict. Every example below targets a real, live endpoint. No separate host, no test keys.
We issue a partner key (vlx_live_…) and a tier. The plaintext is shown exactly once; we only store its SHA-256 hash.
Send Authorization: Bearer vlx_live_… on every request. Each endpoint requires a scope the key carries.
POST a signal bundle, get back the verdict, score, reasons and confidence. Approve, queue for review, or block.
Transparent per-call metering. Light lookups bill 1 unit, deep fused calls bill 3, usage is free. Check it any time.
One key family: vlx_live_<key> as HTTP Bearer. No test / live split. Shown once in plaintext; stored as SHA-256 only.
A key carries scopes: decide, kyt:screen, signals:read, risk:lookup, usage:read. A wildcard (e.g. signals:*) grants the family.
Missing key, bad header, revoked, under-scoped or quota-exhausted: all reject before the engine runs. Never a silent downgrade to a free read.
EU-edge only. Inputs aren't training fodder; decisioning never stores raw PII. Self-host available on Enterprise.
Real, deployed routes on https://vilkax.com. Contract stable across model updates. Fields add, never break.
Bearer key on every call; wildcards like signals:* grant the family. Missing, inactive or under-scoped keys fail closed. No silent downgrade.
When a source isn't configured yet, responses are still well-formed with "degraded": true. Never a false all-clear. Build against the real shape from day one.
Every error is { "ok": false, "error": "<code>" }, documented and machine-parseable. Metering and limits ride in response headers.
400 bad_bodyBody wasn't valid JSON or didn't match the endpoint schema.400 no_signalsThe bundle carried no known signal id / feature.400 pii_in_featuresA feature id smuggled raw PII. Send opaque signal ids only, never a card / SSN / email.400 invalid_typeA query type wasn't one of the allowed values for that lookup.401 invalid_authMissing or malformed Authorization: Bearer header. Sends WWW-Authenticate: Bearer.401 invalid_api_keyNo active row matches the key's SHA-256 hash.403 insufficient_scopeKey authenticated but lacks the scope this endpoint needs.403 tier_gatedEndpoint needs a higher tier (SRI and KYT require Pro+). The response names your tier.403 key_revoked / key_inactiveThe key was revoked or has been deactivated.403 partner_suspendedThe partner account is suspended.403 business_trial_expiredThe 15-day business evaluation has ended; pick a plan to continue.413 body_too_largeRequest body exceeded the per-endpoint limit (decide is 16 KB).429 rate_limitedPer-minute burst limit hit. Honour Retry-After and back off.429 quota_exceededMonthly metered-unit quota for the tier exhausted. Upgrade or wait for the period to roll.503 service_unavailableBacking store briefly unavailable. Retry with backoff. Never returned as a false success.405 method_not_allowedWrong HTTP method for the route.500 internal_errorAn unexpected server-side error; safe to retry with backoff.Burst limit (per-minute) + monthly unit quota. Deep calls = 3 units, lookups = 1, usage = 0. Burst → 429 rate_limited + Retry-After; quota exhausted → 429 quota_exceeded. Enterprise uncapped.
Same bundle → same verdict, so retrying /decide is safe. 503 service_unavailable → retry with backoff; never a false success. idempotency-key header on roadmap
Every route is namespaced and versioned under /v1. The allow / review / block verdict contract is stable; we add fields, we don't break them.
Lookups bill 1 unit, deep fused calls (/decide, KYT) bill 3, usage bills 0. No seat fees, no lock-in. Plans from €149/mo. Enterprise is uncapped by contract with EU-dedicated residency.
Request one from the contact form. We issue your vlx_live_ key and tier; the plaintext is shown exactly once. A self-serve portal is on the way.
One production server: https://vilkax.com, no separate api. host. There are no test keys; every new key starts with a free 15-day evaluation across all signal types.
Responses are still well-formed with "degraded": true and an honest note. Never a false all-clear. Build against the real shape from day one.
No. Decisioning endpoints take opaque signal ids only; raw PII is rejected with pii_in_features. Lookup values (email, phone, domain, IP, wallet) are hashed server-side.
Start free, wire one call, and decide with evidence from day one.