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/reportsRequest headers
| Header | Required | Description |
|---|---|---|
X-API-KEY | yes | API key from the dashboard |
X-Real-IP | yes | An address from the key whitelist |
X-Idempotency-Key | no | Your own key, 12–128 chars of A-Z a-z 0-9 . _ : - |
Order a file
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"
}'{
"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
}
}| Field | Required | Notes |
|---|---|---|
client_request_id | yes | Your identifier. Unique per account |
address | yes | TRON base58, 34 characters |
token_id | no | TRX by default; a TRC20 contract or a TRC10 id |
date_from, date_to | yes | UTC, inclusive. At most 366 days |
format | no | csv by default. PDF is limited to 5000 operations |
Then wait for it
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 queued → running → waiting_cypherarc → done. 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:
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
| HTTP | Meaning |
|---|---|
400 | the address is 34 characters but fails its base58 checksum |
401 | key missing or invalid, or the source IP is not whitelisted |
402 | account balance below the 4 TRX minimum |
403 | the API key is blocked; contact support |
409 | the same identifier was used with a different body — the body is IDEMPOTENCY_CONFLICT |
410 | the file has expired |
422 | a field is missing or malformed, or the period exceeds 366 days |
429 | rate limit exceeded — retry after Retry-After |
Related
- Balances — reading balances and the instant statement preview
- Report webhooks — notification when a file is ready