Intel API (Defused TF Feed)
β οΈ Authentication Required
All endpoints described on this page require a valid API key.
Requests without an API key will return:
{ "detail": "Authentication credentials were not provided." }
Authenticationβ
Authentication is done via an API key associated with your user account. An API key can be created in Settings.
Header-based authenticationβ
Send the API key in one of the following headers:
X-API-Key: <your_api_key>
or
Authorization: ApiKey <your_api_key>
Only following account types:
TF_ENTEnterprise
are allowed to access this API.
Base URLβ
https://console.defusedcyber.com/api/v2/
All endpoints below are relative to this base.
Rate Limitsβ
The API enforces per-API-key rate limits.
| Limit type | Value |
|---|---|
| Burst | 10 requests per minute |
| Daily | 50 requests per day |
If exceeded, the API returns:
429 Too Many Requests
{
"detail": "Request was throttled. Expected available in X seconds."
}
Date Range Rules (Important)β
All alert queries are hard-limited to a maximum lookback of 30 days.
- If you request a
fromdate older than 30 days β it is clamped to 30 days ago. - If
fromis omitted β defaults tonow β 30 days - If
tois omitted β defaults tonow
Dates must be ISO-8601 timestamps:
YYYY-MM-DDTHH:MM:SSZ
Example:
2026-01-14T12:00:00Z
Endpointsβ
List Shared Alertsβ
GET /shared-alerts/
Returns a paginated list of shared alerts.
Query Parametersβ
| Parameter | Type | Description |
|---|---|---|
from | datetime | Start of date range (ISO-8601) |
to | datetime | End of date range (ISO-8601) |
severity | string | Exact match on alert_severity |
q | string | Case-insensitive search on rawdata and alert_info |
sensor_type | string | Filter by honeypot type |
relevant | boolean | true / false |
Example: curl (basic list)β
curl -H "X-API-Key: YOUR_API_KEY" \
"https://console.defusedcyber.com/api/v2/shared-alerts/"
Example: curl (date range + severity + search)β
curl -H "X-API-Key: YOUR_API_KEY" \
"https://console.defusedcyber.com/api/v2/shared-alerts/?from=2026-01-01T00:00:00Z&severity=high&q=execSync"
Example: Python (requests)β
import requests
BASE_URL = "https://console.defusedcyber.com/api/v2"
API_KEY = "YOUR_API_KEY"
headers = {
"X-API-Key": API_KEY,
}
params = {
"from": "2026-01-01T00:00:00Z",
"severity": "high",
"q": "execSync",
}
resp = requests.get(
f"{BASE_URL}/shared-alerts/",
headers=headers,
params=params,
timeout=10,
)
resp.raise_for_status()
data = resp.json()
for alert in data.get("results", []):
print(alert["alert_info"], alert["alert_severity"])
Fetch a Single Eventβ
GET /shared-alerts/{uuid}/
Returns the full alert record, including fields that may be omitted from list views.
Example: curlβ
curl -H "X-API-Key: YOUR_API_KEY" \
"https://console.defusedcyber.com/api/v2/shared-alerts/8c6e5b6a-1111-2222-3333-444444444444/"
Example: Pythonβ
alert_uuid = "8c6e5b6a-1111-2222-3333-444444444444"
resp = requests.get(
f"{BASE_URL}/shared-alerts/{alert_uuid}/",
headers=headers,
timeout=10,
)
resp.raise_for_status()
alert = resp.json()
print(alert)
Paginationβ
Responses are paginated automatically, with a default page size of 50 results per request.
Use the page query parameter to request subsequent pages:
- Page 1:
?page=1(or omitpage) - Page 2:
?page=2 - Page 3:
?page=3 - β¦and so on
Example response shape:
{
"count": 124,
"next": "/api/v2/shared-alerts/?page=2",
"previous": null,
"results": [
{
"uuid": "...",
"alert_severity": "high",
"alert_datetime": "2026-01-14T10:12:33Z"
}
]
}
How to paginate (recommended)β
Treat results as the current page, then follow next until it becomes null.
curl examplesβ
Fetch page 1:
curl -H "X-API-Key: YOUR_API_KEY" \
"https://console.defusedcyber.com/api/v2/shared-alerts/"
Fetch page 2:
curl -H "X-API-Key: YOUR_API_KEY" \
"https://console.defusedcyber.com/api/v2/shared-alerts/?page=2"
Fetch all pages (bash + jq):
BASE="https://console.defusedcyber.com"
URL="/api/v2/shared-alerts/"
KEY="YOUR_API_KEY"
while [ -n "$URL" ] && [ "$URL" != "null" ]; do
RESP=$(curl -s -H "X-API-Key: $KEY" "$BASE$URL")
# Process this page's results (example: print uuids)
echo "$RESP" | jq -r '.results[].uuid'
# Get next page URL (relative path) or null
URL=$(echo "$RESP" | jq -r '.next')
done
Python examplesβ
Fetch one page:
import requests
BASE_URL = "https://console.defusedcyber.com"
API_KEY = "YOUR_API_KEY"
headers = {"X-API-Key": API_KEY}
resp = requests.get(f"{BASE_URL}/api/v2/shared-alerts/", headers=headers, timeout=10)
resp.raise_for_status()
data = resp.json()
alerts = data["results"]
print("Got", len(alerts), "alerts on this page")
Fetch all pages (follow next):
import requests
BASE_URL = "https://console.defusedcyber.com"
API_KEY = "YOUR_API_KEY"
headers = {"X-API-Key": API_KEY}
url = f"{BASE_URL}/api/v2/shared-alerts/"
all_alerts = []
while url:
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()
data = resp.json()
all_alerts.extend(data.get("results", []))
next_path = data.get("next") # may be None/null
if not next_path:
break
# `next` may be a relative path like "/api/v2/shared-alerts/?page=2"
if next_path.startswith("http://") or next_path.startswith("https://"):
url = next_path
else:
url = f"{BASE_URL}{next_path}"
print("Total alerts fetched:", len(all_alerts))
Notesβ
countis the total number of matches across all pages.nextis either a URL/path to the next page, ornullwhen you're at the end.- If you apply filters (severity/date/search), the
nextlink preserves them automatically.
Error Responsesβ
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 403 | Account type not permitted |
| 404 | Alert or resource not found |
| 429 | Rate limit exceeded |
For integration questions or higher limits, contact Defused support.