IOCs: lookup, list, and export.
The IOC endpoints expose the indicators in your account, complete with verdicts,
confidence scores, TLP handling markings, and sighting timestamps. They are the natural
integration point for SIEM enrichment, SOAR playbooks, and TIP synchronisation. All
three endpoints require the iocs.read scope.
verdict and confidence are two different judgements, and both differ again from the
indicator's decaying score. The verdict is the worst reading across your enrichment vendors;
confidence is how sure we are the indicator is genuinely malicious, capped low if any vendor
reports it as benign.
confidence is derived at read time and is the same number the platform
shows. It is null (empty in CSV) when there is genuinely no signal, meaning
no extraction confidence, no vendor enrichments and no explicit verdict, rather
than a misleading middling value. See
IOC enrichment and decay scoring for
how each is derived before you build filtering logic on them.
Two behaviours read as bugs if you meet them cold. UNKNOWN is not a weak BENIGN.
AbuseIPDB below 15% confidence and Censys with no malware families on a host both write
UNKNOWN deliberately, because "no signal" and "known good" are different claims: do not
build allow-listing on UNKNOWN. And verdicts only escalate: a vendor returning BENIGN
never overwrites a stored MALICIOUS.
Look up an indicator
Exact-match lookup for a single value:
curl "https://api.liberty91.com/api/v1/iocs/lookup/?value=evil-domain.example" \
-H "X-API-Key: $LIBERTY91_API_KEY"The response carries a found flag and the matching records:
{
"value": "evil-domain.example",
"found": true,
"results": [
{
"id": "7f9e1a2b-3c4d-5e6f-8a9b-0c1d2e3f4a5b",
"value": "evil-domain.example",
"kind": "domain",
"tlp": "TLP:GREEN",
"verdict": "MALICIOUS",
"confidence": 90,
"tags": ["phishing", "credential-harvesting"],
"whitelisted": false,
"first_seen": "2026-06-02T08:30:00Z",
"last_seen": "2026-07-05T11:15:00Z",
"created_at": "2026-06-02T08:31:12Z",
"source_module": "Cyber news and reports",
"enrichment_providers": ["REVERSINGLABS", "URLSCAN"],
"enrichments": [
{
"provider": "REVERSINGLABS",
"verdict": "MALICIOUS",
"detail": "malicious"
},
{
"provider": "URLSCAN",
"verdict": "MALICIOUS",
"detail": "urlscan: score 78 | country NL | categories: phishing"
}
]
}
]
}A miss is not an error: you get 200 with "found": false and an empty results
array, which keeps enrichment pipelines simple.
Per-vendor enrichment
verdict and confidence are the merged judgement. enrichments is the working underneath
it: one entry per vendor that returned something, each with the provider, that vendor's own
verdict, and a short human-readable detail. The wording of detail varies by provider,
because it is that provider's own headline finding: the summary line for URLScan, the bare
classification for ReversingLabs. It is an empty string where the provider returned a verdict
but nothing worth summarising, so treat it as display text rather than as a field to parse.
enrichment_providers is the same set as a sorted list of provider codes, which is the
cheaper field to filter your own storage on. Both are empty for an indicator nothing has
enriched yet. The full list of provider codes is on
Enumerations.
source_module names the module the indicator first arrived through, which is how you find,
for example, the indicators derived from ransomware leak-site reporting. It is an empty
string, not null, for an indicator with no recorded source module, which matches the
platform's own CSV export.
List IOCs
GET /api/v1/iocs/ returns a cursor-paginated list, filterable along every dimension
you would expect:
| Filter | Values |
|---|---|
kind | ip, domain, url, url-path, md5, sha1, sha256, filename, other |
verdict | MALICIOUS, SUSPICIOUS, BENIGN, UNKNOWN |
tlp | Effective handling marking, for example TLP:RED |
since | ISO 8601 date or datetime; returns IOCs created at or after it |
search | Substring match on the value, minimum 3 characters |
whitelisted | true or false |
enrichment_provider | One provider code, for example ABUSEIPDB; returns the indicators that provider has enriched |
?enrichment_provider= is the filter that makes per-vendor enrichment usable from a SIEM:
ask for everything AbuseIPDB flagged, or everything your ReversingLabs appliance has seen. An
unrecognised value is a 400 naming the field rather than an empty page. The filter applies
to the export endpoint as well.
For example, all malicious IP addresses added in July:
curl "https://api.liberty91.com/api/v1/iocs/?kind=ip&verdict=MALICIOUS&since=2026-07-01" \
-H "X-API-Key: $LIBERTY91_API_KEY"See Pagination and errors for walking the full result
set and the page_size parameter.
Export IOCs
For bulk transfer into another system, the export endpoint streams a file instead of a paginated list:
# CSV, up to 10,000 rows
curl "https://api.liberty91.com/api/v1/iocs/export/?format=csv" \
-H "X-API-Key: $LIBERTY91_API_KEY" -o iocs.csv
# STIX 2.1 bundle, up to 5,000 objects
curl "https://api.liberty91.com/api/v1/iocs/export/?format=stix" \
-H "X-API-Key: $LIBERTY91_API_KEY" -o iocs-bundle.jsonThe same filters as the list endpoint apply, so you can export exactly the slice you need. An export costs 10 credits, charged when the request is accepted; if a download is interrupted mid-transfer, rerun it, ideally with a narrower filter.
The CSV carries ten columns:
value, kind, tlp, verdict, confidence, tags, whitelisted, first_seen, last_seen, enrichment_providersenrichment_providers is pipe-joined, for example ABUSEIPDB|GREYNOISE, and it is
appended last so that a parser reading the first nine columns by position keeps working
unchanged. Read by header where your parser allows it. For per-vendor detail rather than the
list of names, use the JSON list or lookup endpoints: the STIX bundle carries indicator
patterns and handling markings, not enrichment.
This bundle is a flat list of indicators, right for a blocklist or a bulk
import, but it does not say what the indicators belong to. If you are feeding a
TIP such as MISP or OpenCTI, use the parented bundles instead:
/threat-events/{id}/iocs/export/ or
/threat-library/{type}/{id}/iocs/export/, which carry the occurrence or entity
plus relationships to each indicator.
Frequently asked questions
How do I check a single indicator against Liberty91?
Call GET /api/v1/iocs/lookup/?value= with the exact indicator value. The response
tells you whether it was found and returns every matching IOC record with verdict,
confidence, and TLP marking.
Can I export IOCs in STIX format?
Yes. GET /api/v1/iocs/export/?format=stix returns a STIX 2.1 bundle of up to 5,000
IOCs. CSV export supports up to 10,000 rows.
How do I pull only new IOCs since my last sync?
Pass the since filter with an ISO 8601 date or datetime to the list endpoint. Combined
with cursor pagination, that gives you a clean incremental sync.