Skip to main content

Address reports

You often know things about an address before any dataset does: a customer was scammed through it, or a deposit address on your platform belongs to you. POST /v1/address-reports lets you send that knowledge to us. There are two kinds of report.

report_typeWhat it saysNeeds
abuse (the default)The address is used for abuse.A category and at least one verifiable proof: evidence_url or evidence_tx_hash.
own_depositThe address is one of your own deposit addresses.No category and no proof.

What a report does​

A report goes into a separate intake queue. It never changes a verdict, a score or a label by itself: a screening result stays exactly what the ruleset and the published labels say. Only a later review can turn a report into a published label. The account behind a report is kept for abuse control only and is never attached to a label that may later be published from it.

The received status in the response is a receipt, not a decision. Do not rely on a report to change the result of a check; keep applying your own policy to the verdicts you get.

Request​

POST /v1/address-reports with the checks:write scope (see Authentication).

FieldRequiredDescription
chainyestron, ethereum, bsc, base or bitcoin.
addressyesThe address, at most 160 characters. It is checked for the chain, including the checksum where the format has one.
report_typenoabuse (default) or own_deposit.
categoryfor abusescam, illicit or exploit. Not accepted for own_deposit.
evidenceyesA short description of what you know, 1 to 2000 characters.
evidence_urlfor abuse, unless evidence_tx_hash is sentA public https link that supports the report, at most 2048 characters. We never fetch it.
evidence_tx_hashfor abuse, unless evidence_url is sentA transaction hash on the same chain that shows the abuse, at most 160 characters. It must be well formed for the chain.

Unknown fields are rejected. Abuse is a serious accusation: send only what you can substantiate.

curl -s -X POST https://api.leeri.ai/v1/address-reports \
-H "Authorization: Bearer $LEERI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"chain": "tron",
"address": "'"$ADDRESS"'",
"report_type": "abuse",
"category": "scam",
"evidence": "Received customer funds under a fake investment offer.",
"evidence_tx_hash": "'"$TX_HASH"'"
}'

To confirm one of your own deposit addresses, send "report_type": "own_deposit" with chain, address and evidence, and no category or proof.

Response​

A new report answers 202; a repeat answers 200. Both carry the report in data:

FieldDescription
report_idThe id of the intake record. Stable across repeats of the same report.
statusreceived.
chain, addressAs stored: EVM and bech32 addresses are lowercased, every other form is kept as sent.
report_type, categoryAs filed. category is null for own_deposit.
duplicatetrue when your account already filed a report of this type for this address in this environment.
created_atWhen the report was first received.

There is one report per account, key environment, chain, address and report type. Filing it again answers 200 with the stored report and duplicate: true, and never overwrites the evidence you sent the first time.

Limits and errors​

Address reports are limited to 10 per minute per account, across all of its keys; see Rate limits and quotas.

StatusCodeWhen
400VALIDATION_ERRORAn unknown field; an address that is invalid for the chain (format or checksum); a missing category on an abuse report, or a category on an own_deposit one; an abuse report with neither evidence_url nor evidence_tx_hash; an evidence_url that is not https; or a transaction hash that is malformed for the chain.
403SCOPE_ERRORThe key does not have the checks:write scope.
429RATE_LIMIT_EXCEEDEDMore than 10 reports in a minute. Retry after Retry-After.
503RATE_LIMIT_STORE_UNAVAILABLEThe rate-limit store is unavailable; the request is refused rather than served without a limit. Retry shortly.