Skip to content

POST /apiv2/reports/statement

Order a statement file — every operation of one token over a period, as CSV or PDF. The file is built in the background: the request returns an order number straight away, and the file is fetched once it is ready.

For a quick look at the same data without waiting, use the statement preview instead — it answers immediately but caps the number of operations it returns.

Endpoint base URL

https://netts.io/apiv2/reports

Request headers

HeaderRequiredDescription
X-API-KEYyesAPI key from the dashboard
X-Real-IPyesAn address from the key whitelist
X-Idempotency-KeynoYour own key, 12–128 chars of A-Z a-z 0-9 . _ : -

Order a file

bash
curl -s -X POST 'https://netts.io/apiv2/reports/statement' \
  -H 'X-API-KEY: your-api-key' \
  -H 'X-Real-IP: 203.0.113.10' \
  -H 'Content-Type: application/json' \
  -d '{
        "client_request_id": "stmt-2026-09-usdt",
        "address": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "token_id": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "date_from": "2026-09-01",
        "date_to": "2026-09-30",
        "format": "csv"
      }'
json
{
  "status": "success",
  "code": 0,
  "msg": "created",
  "data": {
    "order_no": "REPxxxxxxxxxxxx",
    "client_request_id": "stmt-2026-09-usdt",
    "type": "statement",
    "status": "queued",
    "quota_bucket": "free",
    "progress_pct": 0,
    "address": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "token_id": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "date_from": "2026-09-01",
    "date_to": "2026-09-30",
    "format": "csv",
    "created_at": "2026-09-06 17:01:51.868542+00:00",
    "finished_at": null,
    "expires_at": null,
    "artifact_sha256": null,
    "artifact_size": null,
    "download_url": null
  }
}
FieldRequiredNotes
client_request_idyesYour identifier. Unique per account
addressyesTRON base58, 34 characters
token_idnoTRX by default; a TRC20 contract or a TRC10 id
date_from, date_toyesUTC, inclusive. At most 366 days
formatnocsv by default. PDF is limited to 5000 operations

Then wait for it

bash
curl -s 'https://netts.io/apiv2/reports/REPxxxxxxxxxxxx' \
  -H 'X-API-KEY: your-api-key' -H 'X-Real-IP: 203.0.113.10'

The status field walks through queuedrunningwaiting_cypherarcdone. Two more are terminal: error, with the reason in error_code and error_message, and expired once the file has aged out. A short statement is usually ready in well under a minute; treat any status other than done as "keep waiting".

Once it is done, download_url is filled in — as a path, not a full URL — and the file can be fetched:

bash
curl -s -OJ 'https://netts.io/apiv2/reports/REPxxxxxxxxxxxx/download' \
  -H 'X-API-KEY: your-api-key' -H 'X-Real-IP: 203.0.113.10'

The file arrives gzipped. A CSV order downloads as application/gzip with a .csv.gz filename in Content-Disposition; decompress it before parsing. The status reply carries artifact_sha256 and artifact_size for the compressed file exactly as delivered, so you can verify the download without a second request.

Rather than polling, register a webhook and be told when the file is ready.

Repeating a request is safe

Send the same client_request_id, or the same X-Idempotency-Key, and you get the existing order back instead of a second one being built. The reply carries "msg": "existing" so you can tell the two apart.

Reusing an identifier with a different body is an error, not a new order: that gives 409. Identifiers are unique within your account only — another account's identifiers never collide with yours.

Files live for 30 days

After that the order becomes expired and downloading gives 410. Order it again if you need it later.

Rate limits

10 requests per second per endpoint, shared across all clients. Exceeding it gives 429 with Retry-After: 1 and the message Endpoint rate limit exceeded (10 req/s shared).

That is the only limit. There is no monthly quota, no cap on how many files you may order, and no limit on how many build at once — an account with a positive balance may order as much as the rate limit allows. Orders beyond what the build queue can take are held and retried automatically rather than refused, so a burst costs you latency, not failures.

Errors

HTTPMeaning
400the address is 34 characters but fails its base58 checksum
401key missing or invalid, or the source IP is not whitelisted
402account balance below the 4 TRX minimum
403the API key is blocked; contact support
409the same identifier was used with a different body — the body is IDEMPOTENCY_CONFLICT
410the file has expired
422a field is missing or malformed, or the period exceeds 366 days
429rate limit exceeded — retry after Retry-After
  • Balances — reading balances and the instant statement preview
  • Report webhooks — notification when a file is ready