Look up an IOC
Perform an exact-match lookup of a single IOC value (domain, IP address, URL, or file hash) across the IOC feed and blog-derived IOC references, returning enrichment data when the value is known.
This endpoint shares the /v1/ioc collection path with Search IOCs;
the two are selected by the query parameter you supply. Pass value for an exact
lookup, or q for a substring search.
/v1/iocCost: 1 credit per successful call
Query parameters
valuestringrequiredThe exact IOC value to look up (domain, IP address, URL, or file hash). Accepted range: 1–255 characters. This endpoint performs exact matching only; for substring search across 1M+ IOCs use Search IOCs.
Request
curl "https://api.precursorintelligence.com/functions/v1/ioc?value=evil-azure-update.com" \
-H "Authorization: Bearer $PRECURSOR_API_KEY"Response
{
"data": {
"value": "evil-azure-update.com",
"iocs": [
{
"id": 4819023,
"ioc_type": "domain",
"threat_type": "botnet_cc",
"malware": "cobalt_strike",
"malware_printable": "Cobalt Strike",
"confidence_level": 90,
"first_seen_utc": "2026-05-16T11:00:00Z",
"last_seen_utc": "2026-05-27T03:14:00Z",
"is_compromised": false,
"tags": ["c2", "cobalt-strike"],
"reporter": "community"
}
],
"blog_iocs": [
{
"blog_guid": "3f2a1b4c-9e8d-4a2b-b1c3-7d6e5f4a3b2c",
"ioc_type": "domain",
"context": "C2 domain used in Cobalt Strike campaign targeting financial sector",
"confidence": 85,
"verified": true,
"false_positive": false,
"created_at": "2026-05-17T08:00:00Z"
}
],
"blog_enrichment": [
{
"source": "threat_report",
"data": {
"threat_actors": ["FIN7"],
"report_url": "https://example.com/cobalt-strike-campaign"
},
"created_at": "2026-05-17T08:05:00Z"
}
],
"generated_at": "2026-05-29T10:24:31.118Z"
},
"meta": {
"request_id": "8b16efb8-9a6c-4ace-b817-11cbee626d08",
"generated_at": "2026-05-18T10:24:31.118Z",
"credits": { "charged": 1, "remaining": 9998 }
}
}When the value is not found in any source, the call still succeeds and all three arrays are empty:
{
"data": {
"value": "not-a-known-ioc.example.com",
"iocs": [],
"blog_iocs": [],
"blog_enrichment": [],
"generated_at": "2026-05-29T10:24:31.118Z"
},
"meta": {
"request_id": "8b16efb8-9a6c-4ace-b817-11cbee626d08",
"generated_at": "2026-05-18T10:24:31.118Z",
"credits": { "charged": 1, "remaining": 9998 }
}
}Response fields
data.valuestringoptionalThe IOC value that was looked up, echoed back from the request.
data.iocsarrayoptionalMatching entries from the IOC feed. Empty when the value is unknown. Each
object contains id, ioc_type, threat_type, malware,
malware_printable, confidence_level (integer), first_seen_utc,
last_seen_utc, is_compromised (boolean), tags (string array), and
reporter.
data.blog_iocsarrayoptionalBlog-derived IOC references. Empty when none exist. Each object contains
blog_guid, ioc_type, context, confidence (integer), verified
(boolean), false_positive (boolean), and created_at.
data.blog_enrichmentarrayoptionalAdditional enrichment records derived from blog reporting. Each object
contains source, a free-form data object (which may include
threat_actors and report_url), and created_at.
data.generated_atstringoptionalISO 8601 timestamp indicating when this response was generated.
Errors
| Status | error | When |
|---|---|---|
| 400 | missing_query | Neither value nor q was supplied. |
| 400 | invalid_value | value is empty or exceeds 255 characters. |
| 401 | invalid_authorization | Missing or malformed Authorization header. |
| 401 | unauthorized | Invalid/revoked key, or IP not allowlisted. |
| 402 | insufficient_credits | Organisation credit balance is below 1. |
| 404 | not_found | The route or entity does not exist. |
| 405 | method_not_allowed | Only GET and OPTIONS are accepted. |
| 500 | internal | Unexpected server error (credit auto-refunded). |
See Errors for the full error reference.