API Documentation
Access the abuse.wtf database programmatically. Search approved reports, retrieve detailed information, and download evidence files.
The public API does not require authentication. All endpoints listed in this documentation are freely accessible. Rate limits apply based on IP address to prevent abuse.
For private API access with extended capabilities, an API key is required. Contact an administrator to request one.
To ensure fair usage and availability, the following rate limits are enforced:
| Tier | Limit | Window |
|---|---|---|
| Public (no key) | 60 requests | Per hour per IP |
| Private (API key) | Configurable | Per hour per key |
When the rate limit is exceeded, a 429 status code is returned.
All responses follow a consistent structure. By default, responses are in JSON. Add format=xml to any request to receive XML instead.
{ "success": true, "version": "v1", "total": 42, "limit": 50, "offset": 0, "reports": [...] }
Search through all publicly approved abuse reports. Supports filtering by report type, reported user, and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
| report_type | string | Optional | Filter by type: scamming, griefing, hacking, harassment, other |
| reported_user_id | string | Optional | Filter by the reported user's ID |
| limit | integer | Optional | Number of results to return. Default: 50 Max: 100 |
| offset | integer | Optional | Number of results to skip for pagination. Default: 0 |
| format | string | Optional | Response format: json or xml. Default: json |
curl -X GET "https://abuse.wtf/api/public/reports/search?report_type=scamming&limit=10"
const params = new URLSearchParams({ report_type: 'scamming', limit: 10 }); const response = await fetch( `https://abuse.wtf/api/public/reports/search?${params}` ); const data = await response.json(); console.log(data.reports);
import requests response = requests.get( "https://abuse.wtf/api/public/reports/search", params={ "report_type": "scamming", "limit": 10 } ) data = response.json() print(data["reports"])
$response = file_get_contents( 'https://abuse.wtf/api/public/reports/search?' . http_build_query([ 'report_type' => 'scamming', 'limit' => 10 ]) ); $data = json_decode($response, true); print_r($data['reports']);
Retrieve detailed information about a specific approved report, including reported user fields and evidence metadata.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | The unique report ID |
| format | string | Optional | Response format: json or xml. Default: json |
curl -X GET "https://abuse.wtf/api/public/reports/1"
const response = await fetch( 'https://abuse.wtf/api/public/reports/1' ); const data = await response.json(); console.log(data.report);
import requests response = requests.get( "https://abuse.wtf/api/public/reports/1" ) data = response.json() print(data["report"])
$response = file_get_contents( 'https://abuse.wtf/api/public/reports/1' ); $data = json_decode($response, true); print_r($data['report']);
| Field | Type | Description |
|---|---|---|
| report_id | integer | Unique report identifier |
| reported_user_id | string | ID of the reported user |
| reported_username | string | Username of the reported user |
| report_type | string | Category of the report |
| title | string | Report title |
| description | string | Detailed report description |
| approved_at | datetime | When the report was approved |
| created_at | datetime | When the report was created |
| reported_user_fields | array | Additional user identifiers (Discord, Minecraft, etc.) |
| evidence | array | Evidence files metadata (id, filename, type, size) |
Download or view evidence files attached to an approved report. Returns the actual file content with the appropriate MIME type for inline viewing or download.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | The report ID (path parameter) |
| evidence_id | integer | Required | The evidence file ID (query parameter) |
curl -X GET "https://abuse.wtf/api/public/reports/1/evidence?evidence_id=5" \ --output evidence.png
const response = await fetch( 'https://abuse.wtf/api/public/reports/1/evidence?evidence_id=5' ); const blob = await response.blob(); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'evidence.png'; a.click();
import requests response = requests.get( "https://abuse.wtf/api/public/reports/1/evidence", params={"evidence_id": 5} ) with open("evidence.png", "wb") as f: f.write(response.content)