Skip to content

GET /apiv2/screening/ ​

Read a screening order in any state. Reading is free and can be repeated as often as you like.

This is the version 2 contract. It replaces GET /apiv2/aml/{order_id}, which keeps working.

Endpoint URL ​

GET https://netts.io/apiv2/screening/{client_order_id}

Request Headers ​

HeaderRequiredDescription
X-API-KEYYesYour API key from the Netts dashboard

Path Parameters ​

ParameterTypeDescription
client_order_idstringThe identifier returned when the order was created: A followed by 14 hexadecimal characters

Query Parameters ​

ParameterTypeDefaultDescription
formatstringjsonRepresentation of the result. json is the only accepted value

The representation is a property of the request, not of the order. In version 1 it was fixed when the order was created, so a check ordered as JSON could never be read any other way.

There is one representation, and it is JSON. The parameter is kept so that adding a second one later is not a breaking change; today any other value returns 4001. A report is a rendering of data you already have in full, and rendering it yourself gives you your own branding, your own language and your own layout. See Reports.

Example Requests ​

cURL ​

bash
curl https://netts.io/apiv2/screening/A90D21F68C9AEA2 \
  -H "X-API-KEY: your_api_key"

Python — poll until the check is finished ​

python
import time
import requests

headers = {"X-API-KEY": "your_api_key"}
url = "https://netts.io/apiv2/screening/A90D21F68C9AEA2"

while True:
    body = requests.get(url, headers=headers).json()
    status = body["order"]["status"]
    if status in ("completed", "failed", "skipped"):
        break
    time.sleep(2)

print(status, body["risk"]["level"], body["risk"]["score"])

Response ​

200 OK with the same body as POST /apiv2/screening, in every state of the order. The field set does not depend on the state: blocks that have no data yet are filled with nulls and empty lists rather than left out.

Responses carrying a screening result are sent with Cache-Control: private, no-store.

A check that is not finished ​

json
{
  "schema_version": 2,
  "order": {
    "client_order_id": "A90D21F68C9AEA2",
    "status": "pending",
    "api_version": "v2",
    "cache_hit": false,
    "created_at": "2026-09-13T08:14:29.614988Z",
    "started_at": null,
    "completed_at": null
  },
  "request": { "address": "YOUR_ADDRESS_HERE", "network": "trx", "provider": "elliptic" },
  "billing": {
    "charged": true, "price_usdt": "0.98", "base_amount": "2.882421",
    "markup_amount": "0", "charged_amount": "2.882421", "charged_currency": "TRX",
    "exchange_rate": "0.33999200", "payment_status": "pending"
  },
  "precheck": { "activity_checked": true, "activity_status": "active", "source": "tron-address-checker" },
  "check": {
    "provider": "elliptic", "provider_check_id": null, "checked_at": null,
    "status": "pending", "provider_status": null
  },
  "risk": {
    "score": null, "scale": { "min": 0, "max": 10 }, "level": "none",
    "level_source": "computed", "provider_level": null, "policy": "netts-risk-v1",
    "by_direction": { "source": null, "destination": null }
  },
  "sanctions": null,
  "exposure": [],
  "rules": [],
  "entities": [],
  "primary_entity": null,
  "sanctioned_entities": [],
  "wallet": { "inflow_usd": null, "outflow_usd": null },
  "provider_data": { }
}

An address with no activity ​

An address that has never been used on the blockchain is not sent to the provider and is not charged. The order exists, so the result can be read:

json
{
  "order": {
    "client_order_id": "AC4F9BC45A79323",
    "status": "skipped",
    "started_at": null,
    "completed_at": null,
    "reason": "address_inactive"
  },
  "billing": { "charged": false, "charged_amount": "0", "payment_status": "not_charged" },
  "precheck": { "activity_checked": true, "activity_status": "inactive", "source": "tron-address-checker" },
  "check": { "status": "not_performed", "provider_check_id": null, "checked_at": null }
}

Only the blocks that change are shown here; the rest are present with nulls and empty lists as always.

Errors ​

The format is RFC 9457, Content-Type: application/problem+json. The full code list is on the POST page.

CodeHTTPWhen
4003400The identifier is not A plus 14 hexadecimal characters
4040404No such order
4010 / 4011401No API key, or a key or IP that is not accepted

An order belonging to another account answers 404, not 403. Otherwise the response code alone would confirm that somebody else's identifier exists.

json
{
  "type": "https://doc.netts.io/api/v2/errors/order-not-found",
  "title": "Order not found",
  "status": 404,
  "detail": "Order not found",
  "instance": "/apiv2/screening/AFFFFFFFFFFFFFF",
  "code": 4040
}

Rate Limits ​

Shared with every other AML path: 5 requests per second, 150 per minute. Polling costs nothing but counts towards the limit — two seconds between polls is plenty.

See Also ​