API REFERENCE

Nexus Trinity API

One endpoint. Send a contract or wallet address, get back the same analysis the free Contract Reader shows on the web — as JSON, for your own scripts, bots, or dashboards. Real value against bank-priced compliance tools like Chainalysis or Elliptic — and unlike most APIs at this price, going over your daily limit never cuts you off (see Rate limits below). This page is the technical reference; the legal terms are at /legal/api-terms.

Getting a key

API access is a $29/month subscription via Stripe checkout. On successful payment you get one API key by email, shown exactly once — we store only a hash of it, so we can't re-display it if you lose it. Contact security@nexustrinity.io to revoke and reissue.

Authentication

Send your key as a bearer token on every request:

Authorization: Bearer ntk_...

A missing or inactive key returns 401.

Make a request

POST /api/v1/check against https://nexustrinity.io. Body is JSON: address (required) and chain (optional, defaults to ethereum). The same endpoint handles both contracts and wallets — you don't need to tell it which; it works that out from the address itself, same as the free tool.

curl -X POST https://nexustrinity.io/api/v1/check \
  -H "Authorization: Bearer ntk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "chain": "ethereum"}'

Response — contract address

kind: "contract". analysis carries the capability findings (owner powers, rug vectors, notable code, scope, and limitations) — same shape and depth as the free web tool.

{
  "success": true,
  "kind": "contract",
  "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
  "chain": "Ethereum",
  "explorer": "etherscan.io/address/0xC02...#code",
  "analysis": {
    "tokenName": "Wrapped Ether",
    "observations": [ { "id": "...", "title": "...", "finding": "PRESENT | ABSENT | UNDETERMINED", "evidence": "...", "whyItMatters": "..." } ],
    "rugVectors": [ { "id": "...", "title": "...", "present": "YES | NO | UNDETERMINED", "severity": "HIGH | MEDIUM", "howItRugsYou": "...", "evidence": "..." } ],
    "analysisScope": { "isProxy": false, "sourceTruncated": false },
    "notableCode": [ "..." ],
    "limitations": [ "..." ]
  },
  "remaining": 99,
  "timestamp": "2026-08-15T00:00:00.000Z"
}

Response — wallet address

kind: "wallet". Pure on-chain facts — no score, no scam-list check, nothing inferred beyond what's on-chain. historyUnavailable: true means the underlying chain data couldn't be confirmed either way — never treat that the same as "confirmed empty."

{
  "success": true,
  "kind": "wallet",
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "chain": "Ethereum",
  "nativeSymbol": "ETH",
  "explorer": "etherscan.io/address/0xd8d...",
  "wallet": {
    "nativeBalance": "12.4",
    "txCount": 842,
    "firstSeenAt": "2018-05-02T10:14:22.000Z",
    "lastActiveAt": "2026-08-10T03:41:09.000Z",
    "ageDays": 3028,
    "recentTransactions": [ { "hash": "0x...", "direction": "in | out", "counterparty": "0x...", "valueFormatted": "0.5", "timestamp": "..." } ],
    "recentTokenTransfers": [ { "hash": "0x...", "tokenSymbol": "USDC", "tokenName": "USD Coin", "direction": "in | out", "counterparty": "0x...", "valueFormatted": "100", "timestamp": "..." } ],
    "historyConfirmedEmpty": false,
    "historyUnavailable": false
  },
  "remaining": 98,
  "timestamp": "2026-08-15T00:00:00.000Z"
}

Deep reports over the API

POST /api/v1/deep-report — same key, same auth header, but a different product and a different billing model entirely. This runs the full-depth analysis (Claude Sonnet 5, not the free tool's Groq model): a bigger source budget, extra capability categories, and a written summary — same depth as the one-off $19 web purchase. It doesn't draw from your daily_limit at all. Instead, every subscription includes a metered line item that only bills when you actually call this endpoint — $19 per successful call, charged after the analysis completes, never for a failed one. Nothing to provision or pre-purchase; call it and it's on your next invoice.

curl -X POST https://nexustrinity.io/api/v1/deep-report \
  -H "Authorization: Bearer ntk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "chain": "ethereum"}'

Response shape mirrors /api/v1/check's contract response, with analysis carrying the extra deep-report fields (summary, feeStructure, ownerTransfer, blacklistExceptions, externalDependencies). No remaining field — there's no daily cap to count down. Wallet addresses aren't supported here (a deep report is a contract product) — pass a contract address.

  • 400Missing/malformed address, or an unsupported chain slug.
  • 401Missing, invalid, or inactive API key.
  • 402Key isn't set up for per-call billing — contact support.
  • 404Source isn't verified on that chain, so it can't be analyzed.
  • 500Analysis failed — not billed. Retry.

Sanctions screening over the API

POST /api/v1/screen — same key, same auth header, but its own quota (tracked independently from Contract Reader checks — see Rate limits below). Direct-match screening against OFAC's published Specially Designated Nationals digital-currency address list, refreshed daily. Works on any address — a contract or a plain wallet — no chain parameter needed.

curl -X POST https://nexustrinity.io/api/v1/screen \
  -H "Authorization: Bearer ntk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"address": "0x..."}'

{
  "success": true,
  "address": "0x...",
  "sanctioned": false,
  "matches": [],
  "source": "OFAC Specially Designated Nationals (SDN) List — digital currency addresses",
  "listLastSynced": "2026-09-01T07:45:00.000Z",
  "scope": "Direct-match screening against OFAC's published SDN list only...",
  "permalink": "https://nexustrinity.io/screen/result/3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90",
  "remaining": 499,
  "timestamp": "2026-09-01T12:00:00.000Z"
}

If sanctioned is true, matches lists every currency/entity pairing the address is listed under — an address can legitimately match more than one.

permalink is a stable, shareable URL for this exact result — the verdict, every match, the source, and the list-sync time, rendered as a page you can hand to a regulator, auditor, or counterparty. It is reachable only by its unguessable id and is not search-indexed. (Omitted only if the record could not be stored; the screen still succeeds.)

Batch sanctions screening

POST /api/v1/screen/batch — same key, same auth header. Screen up to 20 addresses against the OFAC SDN list in a single request. Each item counts against your screen quota individually, returns in input order, and carries its own permalink. A paying key is never hard-blocked mid-batch: an over-limit item is still screened and reports a non-positive remaining. Items that fail validation come back with an error field instead of failing the whole request. Accepts bare address strings or { "address": "0x..." } objects.

curl -X POST https://nexustrinity.io/api/v1/screen/batch \
  -H "Authorization: Bearer ntk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"items": [
    "0x252a8bd2319d8a555b872990601221b3a2053bce",
    {"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"}
  ]}'

Each result has the same shape as a single /api/v1/screen response (including permalink), wrapped in a top-level results array.

Batch contract checks

POST /api/v1/batch — same key, same auth header. Run up to 20 Contract Reader checks in a single request (this is source analysis, not sanctions screening — use /api/v1/screen/batch for that). Each item counts against your daily_limit individually. Results are returned in the same order as the input. Items that fail validation or hit a per-item error are still included in the response with an error field rather than causing the whole request to fail. Available on Partner / Enterprise tiers; contact security@nexustrinity.io to enable it on your key.

curl -X POST https://nexustrinity.io/api/v1/batch \
  -H "Authorization: Bearer ntk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"items": [
    {"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "chain": "ethereum"},
    {"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "chain": "ethereum"}
  ]}'
{
  "results": [
    {
      "success": true,
      "kind": "contract",
      "address": "0xC02...",
      "chain": "Ethereum",
      "report_url": "https://nexustrinity.io/check/ethereum/0xC02...",
      "analysis": { ... },
      "remaining": 1998
    },
    {
      "success": true,
      "kind": "contract",
      "address": "0xdAC...",
      "chain": "Ethereum",
      "report_url": "https://nexustrinity.io/check/ethereum/0xdAC...",
      "analysis": { ... },
      "remaining": 1997
    }
  ],
  "timestamp": "2026-10-15T00:00:00.000Z"
}

Max 20 items per request. Items over the batch limit return a 400. Per-item errors (unverified source, unsupported chain) appear as { "error": "..." } entries in results rather than failing the whole call.

Errors

Every error response is { "error": "..." } with one of these statuses (this table is for /api/v1/check and /api/v1/screen — the deep-report endpoint has its own set above):

  • 400Missing/malformed address, or an unsupported chain slug.
  • 401Missing, invalid, or inactive API key.
  • 404Address is a contract, but its source isn't verified on that chain — nothing to analyze (check only).
  • 413Contract is too large to analyze right now (check only).
  • 500Analysis or lookup failed — retry.

Note what's not in that list: going over your daily limit is not an error. See Rate limits below.

Rate limits

Your key has two independently-tracked daily limits, shown at checkout and in your welcome email — one for Contract Reader checks, one for sanctions screenings. Each is a rolling 24-hour window from each counted request, not a fixed calendar reset.

Going over your limit never returns an error. The request still succeeds — remaining in the response just reads 0 once you're at capacity. We get notified automatically and follow up to raise your limit; you're never blocked while that happens. If you're integrating this and want to watch for it yourself, remaining: 0 is the signal — not a 429.

If our usage-tracking system itself is unreachable, the request is rejected rather than let through unchecked — that failure mode (infrastructure being down) is different from a plan limit, and the API fails closed on it, same principle as everything else we build.

Supported chains (23)

Pass the slug on the left as chain. Full, live list — this is generated from the same config the API itself reads, so it can't drift out of sync.

ethereum — Ethereum (ETH)
base — Base (ETH)
arbitrum — Arbitrum (ETH)
optimism — Optimism (ETH)
polygon — Polygon (POL)
bsc — BNB Chain (BNB)
avalanche — Avalanche (AVAX)
linea — Linea (ETH)
blast — Blast (ETH)
gnosis — Gnosis (xDAI)
mantle — Mantle (MNT)
celo — Celo (CELO)
opbnb — opBNB (BNB)
sonic — Sonic (S)
unichain — Unichain (ETH)
abstract — Abstract (ETH)
berachain — Berachain (BERA)
sei — Sei (SEI)
bittorrent — BitTorrent Chain (BTT)
fraxtal — Fraxtal (frxETH)
xdc — XDC (XDC)
apechain — ApeChain (APE)
worldchain — World Chain (ETH)