Skip to main content

Threat Actors API v2 Integration Guide

Overview

The Threat Actors API v2 integration connects your NINA workflows to the internal Threat Intelligence (TI) API for searching and retrieving threat-actor intelligence data (/ti/threat-actors).

It supersedes the original Threat Actors API integration with a new contract:

  • No authentication — the service is reachable in-cluster
  • Cursor-based pagination — pass the cursor_value from the previous response to retrieve the next page
  • Three operations — list with filters, lookup by STIX ID, and lookup by internal ID
  • 17 filter dimensions — name, type, labels, IOCs, MITRE ATT&CK patterns, CVEs, CPEs, tools, malware, targeted sectors/countries/organizations/regions, and first/last-seen date ranges

This integration is intended for threat intelligence workflows running inside the cluster.

Status

The integration supports:

  • List with filters: cursor-paginated list of threat actors with 17 filter dimensions
  • Lookup by STIX ID: retrieve a single actor by its STIX identifier
  • Lookup by Internal ID: retrieve a single actor by its internal database identifier

Credential Configuration

This integration requires no authentication — only a base URL for the TI service.

Authentication Method

FieldDescriptionExample
DomainTI API base URLhttps://ti.internal.example.com

How to obtain your Domain:

  1. Contact your organization's security administrator for in-cluster access
  2. Request the internal Threat Intelligence API domain
  3. Ensure network access to the service (internal)

Creating a Threat Actors API v2 Credential

  1. Navigate to the Credentials section in NINA
  2. Click Add New Credential
  3. Fill in the credential details:
    • Name: A descriptive name (e.g., "TI API Production")
    • Description: Optional details about the credential's purpose
    • Integration Service: Select "Threat Actors API v2"
    • Auth Type: "No Authentication" (automatically selected)
    • Domain: Enter the TI API base URL (include https://)
  4. Click Test Connection to verify the endpoint is reachable
  5. Click Save to store the credential

Supported Resources and Operations

Threat Actors

OperationDescription
List Threat Actors (getAll)Cursor-paginated list with comprehensive filtering across 17 dimensions
Get Threat Actor by STIX ID (getById)Retrieve a single threat actor by its STIX identifier
Get Threat Actor by Internal ID (getByInternalId)Retrieve a single threat actor by its internal database identifier

Parameter Merging

The Threat Actors API v2 integration uses NINA's standard parameter merging.

Parameter Sources (in order of precedence)

  1. Node Parameters: Parameters configured directly in the integration node
  2. Extracted Parameters: Parameters automatically extracted from the input data
  3. Input Data: The complete input data from upstream nodes

Pagination

The getAll operation uses cursor-based pagination, configured via the pagination object:

  • pagination.pageSize — number of items per page (1–100, default 20; clamped if out of range)
  • pagination.cursor — opaque cursor returned by the previous response as cursor_value. Omit on the first page; pass the previous cursor_value to fetch the next page.

The getById and getByInternalId operations do not paginate.

Examples

List — Basic (First Page)

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"pagination": { "pageSize": 20 }
}

List — Fetching the Next Page

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"pagination": {
"pageSize": 20,
"cursor": "eyJwYWdlIjoyfQ=="
}
}

Filter by Name

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"nameEq": "APT29"
}
}
{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"nameIn": ["APT29", "Cozy Bear", "Midnight Blizzard"]
}
}

Filter by Actor Type and Labels

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"actorTypesIn": ["Nation-State", "criminal"],
"labelsIn": ["ransomware", "espionage"]
}
}

Filter by IOCs

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"indicatorNameIn": [
"203.0.113.42",
"malicious-c2.example.com",
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
]
}
}

Filter by MITRE ATT&CK Techniques

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"attackPatternMitreIdIn": ["T1566.001", "T1059.003", "T1055"]
}
}

Filter by Tools and Malware

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"toolsNameIn": ["Cobalt Strike", "PowerShell", "PsExec"],
"malwareNameIn": ["AkiraBot", "LaZagne"]
}
}

Filter by CVEs and Targeted CPEs

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"cvesNameIn": ["CVE-2024-40711", "CVE-2020-3259"],
"cvesCpesIn": ["fortinet", "cisco", "vmware"]
}
}

Filter by Targeted Sectors, Countries, and Regions

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"targetsSectorNameIn": ["Healthcare", "Finance"],
"targetsCountryNameIn": ["United States", "Germany"],
"targetsRegionNameIn": ["Europe", "North America"]
},
"pagination": { "pageSize": 25 }
}

Filter by First/Last Seen Date Range

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"firstSeenGte": "2024-01-01T00:00:00Z",
"lastSeenLte": "2024-12-31T23:59:59Z"
}
}

Combined Filters

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getAll",
"filters": {
"nameIn": ["APT"],
"attackPatternMitreIdIn": ["T1059.003"],
"toolsNameIn": ["Cobalt Strike"],
"cvesNameIn": ["CVE-2021-26855"],
"targetsSectorNameIn": ["Technology", "Government"]
},
"pagination": { "pageSize": 50 }
}

Get by STIX ID

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getById",
"stixId": "threat-actor--abc123"
}

The stixId is URL-path-encoded before the request is sent, so values containing reserved characters are handled safely.

Get by Internal ID

{
"integration_service": "threat-actors-api-v2",
"resource": "threat-actors",
"operation": "getByInternalId",
"internalId": "internal-999"
}

Response Structure

getAll — Paginated Envelope

{
"items": [ /* threat actor objects */ ],
"total": 1234,
"cursor_value": "<opaque string or null>"
}
  • items — array of threat-actor objects
  • total — total number of matching records on the server
  • cursor_value — opaque cursor for the next page; absent or empty when no more results

getById and getByInternalId

A single threat-actor object as returned by the TI API. Shapes follow the TI contract — treat unknown fields as opaque and forward them through your workflow.

Available Parameters

List Threat Actors (getAll)

Pagination

ParameterTypeDescriptionRequiredDefault
pagination.cursorstringOpaque cursor from a previous cursor_valueNo-
pagination.pageSizenumberResults per page (1–100; clamped if out of range)No20

Filters (all optional, all under filters)

Parameter (UI)API NameTypeDescription
nameEqname_eqstringExact threat-actor name match
nameInname_inarrayMatch any of the listed names
actorTypesInactor_types_inarrayMatch any of the listed actor types (e.g. Nation-State, criminal)
labelsInlabels_inarrayMatch any of the listed labels
indicatorNameInindicator_name_inarrayMatch any of the listed IOC names (IPs, domains, hashes)
attackPatternMitreIdInattack_pattern_mitre_id_inarrayMatch any of the listed MITRE ATT&CK technique IDs
cvesNameIncves_name_inarrayMatch any of the listed CVE names
cvesCpesIncves_cpes_inarrayMatch any of the listed CPE identifiers of associated CVEs
toolsNameIntools_name_inarrayMatch any of the listed tool names
malwareNameInmalware_name_inarrayMatch any of the listed malware names
targetsSectorNameIntargets_sector_name_inarrayMatch any of the listed target sectors
targetsCountryNameIntargets_country_name_inarrayMatch any of the listed target countries
targetsOrganizationNameIntargets_organization_name_inarrayMatch any of the listed target organizations
targetsRegionNameIntargets_region_name_inarrayMatch any of the listed target regions
firstSeenGtefirst_seen_gtestringFirst-seen on or after this ISO 8601 date-time
firstSeenLtefirst_seen_ltestringFirst-seen on or before this ISO 8601 date-time
lastSeenGtelast_seen_gtestringLast-seen on or after this ISO 8601 date-time
lastSeenLtelast_seen_ltestringLast-seen on or before this ISO 8601 date-time

The UI accepts camelCase keys; the integration maps them to the API's snake_case query parameters internally.

Get Threat Actor by STIX ID (getById)

ParameterTypeDescriptionRequired
stixIdstringSTIX identifier of the threat actor (e.g. threat-actor--abc123)Yes

Get Threat Actor by Internal ID (getByInternalId)

ParameterTypeDescriptionRequired
internalIdstringInternal database identifier of the threat actorYes

Filter Behavior

  • Omitted filters and empty arrays ([]) are silently ignored — the filter is not applied.
  • Array filters use repeat-style query parameters: each element is sent as its own query value. Comma-joined strings are not parsed — pass actual arrays.
  • Multiple filter keys are combined with AND logic — a threat actor must satisfy all specified filters to appear in results.
  • Within a single array-valued filter, values are combined with OR logic (any match).

Best Practices

  • Use specific filters to reduce result volume and improve performance.
  • Paginate large queries with pagination.cursor and pagination.pageSize; do not request a single large page.
  • Normalize IOC formats (IPs, domains, hashes) before querying with indicatorNameIn.
  • Start broad (e.g., nameIn: ["APT"]) and refine with tactics/techniques and targeted-asset filters.
  • Prefer getById / getByInternalId when you already have an identifier — it is cheaper than a filtered getAll.

Integration in Workflow Context

Common patterns:

  1. IOC Attribution Alert Node → Script Node (extract IOCs) → Threat Actors v2 (getAll, indicatorNameIn) → Enrichment Node → Slack/Email notification.

  2. CVE-to-Actor Pivot CVEs v2 (vulnerability.list) → Script Node (collect CVE IDs) → Threat Actors v2 (getAll, cvesNameIn) → Report.

  3. Targeted-Sector Watchlist Schedule Node → Threat Actors v2 (getAll, targetsSectorNameIn, firstSeenGte=<recent>) → Filter Node (new actors only) → Jira Integration Node (create tickets).

  4. Actor Profile Lookup Workflow Input Node → Threat Actors v2 (getById) → Markdown Report Node.

Troubleshooting

IssueResolution
Connection timeout / unreachableVerify the Domain URL, that it includes https://, and that the worker has in-cluster access to the TI service.
stixId is requiredProvide a non-empty stixId for the getById operation.
internalId is requiredProvide a non-empty internalId for the getByInternalId operation.
Empty items with non-empty filtersFilter values may be over-constraining. Try removing one filter at a time. Remember that omitted/empty arrays are no-ops.
Array filter not appliedPass an actual JSON array, not a comma-separated string. The integration uses repeat-style query parameters.
cursor_value keeps appearingPagination continues until cursor_value is empty or absent. Pass it back as pagination.cursor to fetch the next page.
Upstream returned 4xx / 5xxThe integration surfaces the upstream status and body. Review the error for the specific reason (validation, not found, service down).
Slow responses on large pagesReduce pagination.pageSize (max 100) and paginate via cursor instead.

Updated: 2026-05-14