The DART Project API is designed to help Discord communities and anti-phishing initiatives report and track malicious URLs shared on Discord. This documentation provides everything you need to integrate with our API and contribute to making Discord a safer place.
https://dart-project-api.vercel.app/api All requests require an API key provided by The DART Project team. Include your API key in each request using the X-API-Key header.
X-API-Key: your_api_key_here To request an API key, please contact the sinewave_ on Discord.
POST /report Submit a report of a malicious URL encountered on Discord.
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | Must be set to application/json |
| X-API-Key | Yes | Your DART Project API key |
| Field | Type | Required | Description |
|---|---|---|---|
| url | String | Yes | The suspicious URL that was shared |
| date | String | Yes | ISO 8601 formatted date when the URL was shared (e.g., 2025-04-14T12:00:00Z) |
| discord_id | String | No | Discord user ID of the account that shared the URL |
| notes | String | No | Additional information about the URL or context |
{ "discord_id": "123456789012345678", "url": "https://malicious-site.example.com/discord-nitro", "date": "2025-04-14T15:30:00Z", "notes": "User was sharing this as a free Discord Nitro offer" }A successful response will return a 200 status code and a JSON object:
{ "success": true, "message": "Report received and forwarded to the DART Project", "report_id": "1713203716543-x7f2g9p3q" }| Status Code | Description |
|---|---|
| 200 | Success - Report has been processed |
| 400 | Bad Request - Missing required fields or invalid data |
| 401 | Unauthorized - Invalid or missing API key |
| 429 | Too Many Requests - Rate limit exceeded (120 requests per minute) |
| 500 | Internal Server Error - Something went wrong on our end |
Invalid URL format:
{ "errors": ["Invalid URL format"] }Missing required field:
{ "errors": ["URL is required"] }Rate limit exceeded:
{ "error": "Rate limit exceeded. Try again in 1 minute." }- Validate URLs before submitting them to avoid unnecessary reports
- Include Discord IDs when available to help track patterns of malicious activity
- Add detailed notes to provide context about the report
- Implement retry logic with exponential backoff if you encounter rate limiting
- Store your API key securely and never expose it in client-side code
import requests import datetime api_key = "your_api_key_here" api_url = "https://dart-project-api.vercel.app/api/report" headers = { "Content-Type": "application/json", "X-API-Key": api_key } payload = { "discord_id": "123456789012345678", "url": "https://suspicious-url.example.com", "date": datetime.datetime.now().isoformat(), "notes": "This URL was sent in multiple servers within minutes" } response = requests.post(api_url, headers=headers, json=payload) print(response.json())const reportMaliciousUrl = async () => { const apiKey = "your_api_key_here"; const apiUrl = "https://dart-project-api.vercel.app/api/report"; const payload = { discord_id: "123456789012345678", url: "https://suspicious-url.example.com", date: new Date().toISOString(), notes: "User was spamming this link in multiple channels" }; try { const response = await fetch(apiUrl, { method: "POST", headers: { "Content-Type": "application/json", "X-API-Key": apiKey }, body: JSON.stringify(payload) }); const data = await response.json(); console.log(data); } catch (error) { console.error("Error reporting malicious URL:", error); } };The API is limited to 120 requests per minute per API key. If you exceed this limit, you'll receive a 429 response code. Please implement appropriate rate limiting in your client applications.
If you encounter any issues or have questions about the API, please contact the sinewave_ on Discord.