Skip to main content

Recorded Future Integration Guide

Overview

The Recorded Future integration connects NINA workflows to Recorded Future's threat intelligence platform across seven API modules:

  • Alert — Manage and query Recorded Future alerts (v2 and v3)
  • Analyst Note — Create, publish, search, and manage analyst notes
  • Entity Match — Resolve entity names to RF entity IDs and look up entities
  • Identity — Query credential exposures, detections, and incident reports
  • List — Read and write user-managed entity watch lists
  • Playbook Alert — Search, retrieve, and update playbook alerts across all categories
  • Threat — Retrieve threat maps (actor and malware), search threat actors, and list categories

Authentication uses a single API key (X-RFToken header). All seven modules share the same credential.


Credential Configuration

Authentication

FieldDescriptionDefault
API KeyYour Recorded Future API key (X-RFToken)
Base URLAPI endpointhttps://api.recordedfuture.com

How to Get Your Recorded Future API Key

  1. Log in to the Recorded Future Portal
  2. Navigate to User SettingsAPI Access
  3. Copy your existing key or generate a new one
  4. Verify your key has access to the modules your workflows require (Identity, Playbook Alert, etc.)

Subscription notes:

  • Identity and Playbook Alert APIs require specific subscription tiers
  • Some endpoints are in Beta — check Recorded Future docs for current availability

Creating a Credential in NINA

  1. Navigate to CredentialsAdd New Credential
  2. Select integration service: Recorded Future
  3. Auth type: API Key
  4. Fill in your API Key and optionally override the Base URL
  5. Click Test Connection then Save

Supported Resources and Operations

Alert

Interact with Recorded Future alerts (rule-triggered intelligence alerts). Supports both the legacy v2 and current v3 APIs.

OperationNameHTTPDescription
listV2SearchList V2 SearchGET /v2/searchSearch alerts with filters (status, assignee, alertRule, freetext, date range)
listV2SearchDetailsList V2 Search DetailsGET /v2/search/detailsSame as above with additional detail fields
listV3List V3GET /v3Search alerts using the v3 API (statusInPortal filter)
getV2ByIdGet V2 By IdGET /v2/{alert_id}Fetch a single alert by ID (v2)
getV3ByIdGet V3 By IdGET /v3/{alert_id}Fetch a single alert by ID (v3) with field selection
listV3HitsList V3 HitsGET /v3/hitsFetch a flat collection of hits for one or more alert IDs
listV3ImageList V3 ImageGET /v3/imageFetch raw image data by image ID
createV2UpdateCreate V2 UpdatePOST /v2/updateUpdate status/assignee on one or more alerts
listV2RuleList V2 RuleGET /v2/ruleSearch alert rules (freetext, limit, taggedText)

Key parameters for listV2Search / listV2SearchDetails:

  • status — enum: unassigned, assigned, pending, dismiss, no-action, actionable, tuning
  • triggered — date range filter (e.g., [-24h,] for last 24 hours)
  • alertRule — filter by alert rule ID
  • limit / from — pagination (max limit+from = 1000)
  • directionasc or desc

Analyst Note

Create, publish, look up, export, and delete analyst notes in Recorded Future.

OperationNameHTTPDescription
searchSearchSearchPOST /searchSearch analyst notes by entity, topic, title, label, date, source
createLookupByIdLookup By IdPOST /lookup/{note_id}Fetch a specific analyst note by ID
createDraftCreate DraftPOST /draftSave a note as a draft
createPreviewCreate PreviewPOST /previewPreview note rendering before publishing
createPublishCreate PublishPOST /publishPublish or edit an analyst note
deleteDeleteByIdDelete By IdDELETE /delete/{note_id}Delete an analyst note by ID
getAttachmentByIdGet AttachmentGET /attachment/{note_id}Retrieve an attachment for a note
getExportByFormatByIdExport By FormatGET /export/{format}/{note_id}Export a note as html or pdf

Common parameters:

  • note_id — required for all *ById operations (path parameter)
  • attributes — note content object (title, text, topic, etc.)
  • source — entity ID for the note source
  • tagged_text — boolean; inline entity tags in output
  • serializationid, min, or full

Entity Match

Resolve entity names to Recorded Future IDs and look up entities by ID. Useful as a pre-step before other operations that require RF entity IDs.

OperationNameHTTPDescription
createEntityMatchMatchMatch EntitiesPOST /entity-match/matchFind entity IDs by name (and optionally type)
getEntityMatchEntityByIdGet Entity By IdGET /entity-match/entity/{id}Look up a specific entity by its RF ID

Parameters for createEntityMatchMatch:

  • name (required) — entity name to search
  • type — array of entity types to filter (e.g., ["IpAddress", "InternetDomainName"])
  • limit — number of results (default: 10)

Identity

Query Recorded Future's Identity Intelligence module for credential exposures, compromised accounts, and incident reports.

OperationNameHTTPDescription
searchCredentialsSearch CredentialsPOST /identity/credentials/searchSearch exposed credentials by domain
lookupCredentialsLookup CredentialsPOST /identity/credentials/lookupLook up credentials by subject, SHA1 hash, or login
lookupPasswordLookup PasswordPOST /identity/password/lookupCheck if specific passwords have been exposed
lookupHostnameLookup HostnamePOST /identity/hostname/lookupFind credential exposure for a hostname
lookupIPLookup IPPOST /identity/ip/lookupFind credential exposure for an IP or IP range
getDetectionsGet DetectionsPOST /identity/detections(Beta) List identity detections for an organization
getIncidentReportGet Incident ReportPOST /identity/incident/reportGet a detailed incident report for a data dump/breach
getDumpMetadataGet Dump MetadataPOST /identity/metadata/dump/searchSearch metadata for known data dumps by name

Common parameters:

  • organization_id — string; scopes results to your organization
  • domains / domain_types — filter by domain for credential searches
  • limit / offset — pagination

lookupCredentials lookup methods (use one):

  • subjects — list of email addresses or usernames to look up directly
  • subjects_sha1 — list of SHA1-hashed subject identifiers (privacy-preserving)
  • subjects_login + subjects_domain — paired arrays for domain/login lookup (e.g., login: ["j.doe"], domain: ["corp.com"]). Both arrays are required and matched by index. The API requires a domain for each login entry.

lookupPassword parameters:

  • passwords — array of password hash objects, each with:
    • algorithm (required) — hash algorithm enum: SHA1, SHA256, MD5, NTLM, BCRYPT, and 20 others
    • hash — full hash value (use this OR hash_prefix)
    • hash_prefix — hash prefix for partial matching (use this OR hash)

getDetections filter object children:

  • novel_only / malware_only — boolean filters
  • domains — array of domain names
  • detection_types / detection_type — enum: Workforce, External, Vip
  • cookies — enum: Cookies, UnexpiredCookies
  • authorization_technology — object with any (boolean), id (array), name (array)
  • created — date range object with gte / lt (ISO-8601)

Credential filter parameters (available on searchCredentials, lookupCredentials, lookupHostname, lookupIP):

  • time_window — quick preset: last_24h, last_7d, last_30d, last_90d (overrides date filters below)
  • first_downloaded_gte — credentials first seen after this date (ISO-8601)
  • latest_downloaded_gte — credentials last downloaded after this date
  • exfiltration_date_gte — malware exfiltration date filter
  • properties — enum array: Letter, Number, Symbol, UpperCase, LowerCase, MixedCase, AtLeast8Characters, AtLeast10Characters, AtLeast12Characters, AtLeast16Characters, AtLeast24Characters, Cookies, UnexpiredCookies, AuthorizationTechnology, MalwareOnly
  • username_properties — enum array: Email
  • breach_properties — object with name and date children
  • dump_properties — object with name and date children
  • authorization_technologies — free-text array (e.g., SAML, OAuth, Okta Single Sign-On)
  • authorization_protocols — free-text array (e.g., RDP, SSH, HTTPS, FTP)
  • malware_families — free-text array (e.g., RedLine Stealer, Vidar Stealer)
  • mask_passwords — boolean; masks cleartext passwords in response (keeps first 2 chars visible)

List

Read and write user-managed entity watch lists in Recorded Future.

OperationNameHTTPDescription
createListCreateCreate ListPOST /list/createCreate a new watch list
searchListSearchSearch ListsPOST /list/searchFind lists by name or type
getListInfoByListidGet List InfoGET /list/{listId}/infoGet metadata for a specific list
getListStatusByListidGet List StatusGET /list/{listId}/statusGet status information for a list
getListEntitiesByListidGet List EntitiesGET /list/{listId}/entitiesGet entities on a list
getListEntitieswithtagsByListidGet List Entities With TagsGET /list/{listId}/entitiesWithTagsGet entities including their list-specific tags
getListTextentriesByListidGet List Text EntriesGET /list/{listId}/textEntriesGet text entries on a list
createListEntityAddByListidAdd Entity To ListPOST /list/{listId}/entity/addAdd an entity to a list
createListEntityRemoveByListidRemove Entity From ListPOST /list/{listId}/entity/removeRemove an entity from a list
createListEntityTagsByListidUpdate Entity TagsPOST /list/{listId}/entity/tagsSet all tags for an entity on a watch list (replaces existing)

Key parameters:

  • listId (required) — path parameter identifying the target list; use searchListSearch to find IDs
  • entity — object with id and/or name fields
  • type — list type filter (e.g., ip, domain, hash, url, vulnerability)

Playbook Alert

Programmatic access to Recorded Future Playbook Alerts — structured, analyst-ready alerts with typed categories (Domain Abuse, Vulnerability, Malware, etc.).

Core Operations

OperationNameHTTPDescription
searchSearchSearchPOST /searchSearch playbook alerts with filters (status, priority, category, assignee, date ranges)
getCommonByIdGet Common By IdGET /common/{playbook_alert_id}Fetch common preview data for any playbook alert
updateCommonByIdUpdate Common By IdPUT /common/{playbook_alert_id}Update status, priority, assignee, or add log entries
listMetadataCommonList Metadata CommonGET /metadata/commonEnumerate valid statuses, priorities, and categories
createMetadataAssigneesCreate Metadata AssigneesPOST /metadata/assigneesList available assignees for a playbook alert

Category-Specific Operations

Each category supports both single-ID and bulk lookup:

CategorySingle ID OperationBulk Operation
Domain AbusecreateDomainAbuseByIdcreateDomainAbuse
VulnerabilitycreateVulnerabilityByIdcreateVulnerability
Code Repo LeakagecreateCodeRepoLeakageByIdcreateCodeRepoLeakage
Third Party RiskcreateThirdPartyRiskByIdcreateThirdPartyRisk
Identity Novel ExposurescreateIdentityNovelExposuresByIdcreateIdentityNovelExposures
Geopolitics FacilitycreateGeopoliticsFacilityByIdcreateGeopoliticsFacility
Malware ReportcreateMalwareReportByIdcreateMalwareReport
Compromised Bank CheckscreateCompromisedBankChecksByIdcreateCompromisedBankChecks

Single-ID operations accept playbook_alert_id (required path param) + optional panels array. Bulk operations accept playbook_alert_ids array (required) + optional panels array. Bulk max: 250 IDs.

Image Operations

OperationNameHTTPDescription
getDomainAbuseImageByIdByIdGet Domain Abuse ImageGET /domain_abuse/{playbook_alert_id}/image/{image_id}Screenshot for a Domain Abuse alert
getGeopoliticsFacilityImageByIdGet Geopolitics Facility ImageGET /geopolitics_facility/image/{image_id}Image for a Geopolitics Facility alert
getCompromisedBankChecksImageByIdGet Compromised Bank Checks ImageGET /compromised_bank_checks/image/{playbook_alert_id}Check image for a Compromised Bank Checks alert

Key searchSearch parameters:

  • statuses — array; enum: New, InProgress, Dismissed, Resolved
  • priority — array; enum: High, Moderate, Informational
  • category — array; enum: domain_abuse, cyber_vulnerability, code_repo_leakage, third_party_risk, identity_novel_exposures, geopolitics_facility
  • assignee — array of assignee IDs
  • created_range / updated_range — time range objects with from and until children (ISO-8601 date-time)
  • entity — array of RF entity IDs
  • limit / offset — pagination (max limit+from = 10,000)
  • order_bycreated or modified; directionasc or desc

Key updateCommonById parameters:

  • status — enum: New, InProgress, Dismissed, Resolved
  • priority — enum: High, Moderate, Informational
  • reopen — enum: Never, SignificantUpdates (only valid for Dismissed/Resolved alerts)
  • assignee — assignee ID string
  • log_entry — freetext message (max 5000 chars)
  • added_actions_taken / removed_actions_taken — arrays of action IDs (only when status is Dismissed or Resolved)

Threat

Retrieve threat intelligence maps, search threat actors, and list categories for filtering. Threat maps show actor/malware activity mapped against your organization's watchlists.

OperationNameHTTPDescription
getMapsGet MapsGET /threat/mapsList available threat maps for your account
getActorThreatMapGet Actor Threat MapPOST /threat/map/actorsActor threat map for your primary organization
getActorThreatMapByOrgGet Actor Threat Map By OrgPOST /threat/map/{orgId}/actorsActor threat map for a specific organization
getMalwareThreatMapGet Malware Threat MapPOST /threat/map/malwareMalware threat map for your primary organization
getMalwareThreatMapByOrgGet Malware Threat Map By OrgPOST /threat/map/{orgId}/malwareMalware threat map for a specific organization
searchActorsSearch Threat ActorsPOST /threat/actor/searchSearch threat actors by name with pagination
getActorCategoriesGet Actor CategoriesGET /threat/actor/categoriesList threat actor categories (for filtering maps)
getMalwareCategoriesGet Malware CategoriesGET /threat/malware/categoriesList malware categories (for filtering maps)

Threat map filter parameters (for getActorThreatMap / getActorThreatMapByOrg):

  • actors — array of threat actor IDs to filter by
  • categories — array of actor category IDs
  • watchlists — array of watchlist IDs to include

Malware map filter parameters (for getMalwareThreatMap / getMalwareThreatMapByOrg):

  • malware — array of malware IDs to filter by
  • categories — array of malware category IDs
  • watchlists — array of watchlist IDs to include

searchActors parameters:

  • name — search string (matches names, common names, and aliases)
  • limit — max results, 1-10000 (default: 10000)
  • offset — pagination token from next_offset in previous response

Examples

Search for Open Playbook Alerts

{
"integration_service": "recorded-future",
"resource": "playbook-alert",
"operation": "searchSearch",
"parameters": {
"statuses": ["New"],
"priority": ["High"],
"order_by": "created",
"direction": "desc",
"limit": 25
}
}

Update a Playbook Alert Status

{
"integration_service": "recorded-future",
"resource": "playbook-alert",
"operation": "updateCommonById",
"parameters": {
"playbook_alert_id": "abc-123-xyz",
"status": "InProgress",
"assignee": "uhash:40wXmPVONA",
"log_entry": "Reviewed domain registration — confirmed abuse. Escalating."
}
}

Get Domain Abuse Alert Detail

{
"integration_service": "recorded-future",
"resource": "playbook-alert",
"operation": "createDomainAbuseById",
"parameters": {
"playbook_alert_id": "abc-123-xyz",
"panels": ["dns", "whois", "screenshot"]
}
}

Search Exposed Credentials by Domain

{
"integration_service": "recorded-future",
"resource": "identity",
"operation": "searchCredentials",
"parameters": {
"domains": ["example.com", "corp.example.com"],
"domain_types": ["corporate"],
"limit": 50
}
}

Look Up Credentials for Specific Users

{
"integration_service": "recorded-future",
"resource": "identity",
"operation": "lookupCredentials",
"parameters": {
"subjects": ["[email protected]", "[email protected]"],
"limit": 100
}
}

Look Up Credentials by Login and Domain

Use subjects_login + subjects_domain when you have a login/domain pair rather than an email:

{
"integration_service": "recorded-future",
"resource": "identity",
"operation": "lookupCredentials",
"parameters": {
"subjects_login": ["j.doe", "admin"],
"subjects_domain": ["corp.example.com", "portal.example.com"],
"limit": 50
}
}

Search Credentials with Filters

{
"integration_service": "recorded-future",
"resource": "identity",
"operation": "searchCredentials",
"parameters": {
"domains": ["example.com"],
"time_window": "last_30d",
"properties": ["AtLeast8Characters", "MixedCase"],
"malware_families": ["RedLine Stealer"],
"limit": 100
}
}

Get Actor Threat Map

{
"integration_service": "recorded-future",
"resource": "threat",
"operation": "getActorThreatMap",
"parameters": {
"categories": ["GK7qU"],
"watchlists": ["report:Hsxme2"]
}
}

Search Threat Actors

{
"integration_service": "recorded-future",
"resource": "threat",
"operation": "searchActors",
"parameters": {
"name": "Fancy Bear",
"limit": 10
}
}

Resolve an Entity Name to RF ID

{
"integration_service": "recorded-future",
"resource": "entity-match",
"operation": "createEntityMatchMatch",
"parameters": {
"name": "APT29",
"type": ["ThreatActor"],
"limit": 5
}
}

Search Alerts by Status

{
"integration_service": "recorded-future",
"resource": "alert",
"operation": "listV2Search",
"parameters": {
"status": "unassigned",
"triggered": "[-7d,]",
"limit": 50,
"direction": "desc"
}
}

Add Entity to a Watch List

{
"integration_service": "recorded-future",
"resource": "list",
"operation": "createListEntityAddByListid",
"parameters": {
"listId": "my-list-id-here",
"entity": { "id": "ip:8.8.8.8" },
"context": { "comment": "Added during incident IR-2024-001" }
}
}

Search Analyst Notes

{
"integration_service": "recorded-future",
"resource": "analyst-note",
"operation": "searchSearch",
"parameters": {
"entity": "idn:example.com",
"published": "-30d",
"limit": 20,
"serialization": "full"
}
}

Bulk Vulnerability Playbook Alert Lookup

{
"integration_service": "recorded-future",
"resource": "playbook-alert",
"operation": "createVulnerability",
"parameters": {
"playbook_alert_ids": ["alert-id-1", "alert-id-2", "alert-id-3"],
"panels": ["summary", "affected_products"]
}
}

Common Workflow Patterns

Playbook Alert Triage Workflow

  1. searchSearch (playbook-alert) — fetch new/unassigned alerts
  2. getCommonById — get preview for each alert
  3. createDomainAbuseById / createVulnerabilityById / etc. — get category-specific detail
  4. updateCommonById — set status, assign to analyst, add log entry

Identity Exposure Investigation

  1. searchCredentials — find exposed accounts for your domains (use time_window or date filters to scope)
  2. lookupCredentials — look up specific users by email (subjects) or by login/domain pair (subjects_login + subjects_domain)
  3. getIncidentReport — get full incident report for a known breach source
  4. getDumpMetadata — look up metadata about a specific dump by name

Entity-Driven Intelligence

  1. createEntityMatchMatch (entity-match) — resolve an observable name to RF entity ID
  2. Use the entity ID in searchSearch (analyst-note or playbook-alert) to find related intelligence
  3. getEntityMatchEntityById — enrich entity with full RF metadata

Threat Map Analysis

  1. getMaps (threat) — list available threat maps for your organization
  2. getActorCategories / getMalwareCategories — fetch category IDs for filtering
  3. getActorThreatMap or getMalwareThreatMap — retrieve the threat map with optional filters
  4. searchActors — search for specific threat actors by name for deeper investigation

Watch List Management

  1. searchListSearch — find your target list by name
  2. getListEntitiesByListid — review current list contents
  3. createListEntityAddByListid / createListEntityRemoveByListid — add/remove entities
  4. getListStatusByListid — verify list sync status

Troubleshooting

IssueResolution
401 UnauthorizedAPI key invalid or expired — verify in RF portal and update credential
403 ForbiddenSubscription does not include this endpoint (e.g., Identity, Playbook Alert)
404 Not FoundWrong entity/alert/note ID, or endpoint path mismatch
429 Too Many RequestsRate limit hit — implement exponential backoff; reduce request frequency
Empty resultsEntity or alert may not exist in RF database; verify IDs from a prior search
Missing path parameter errorEnsure playbook_alert_id, alert_id, note_id, or listId is included in params
Bulk request limit exceededPlaybook alert bulk ops max 250 IDs per request — split into batches
Identity data unavailableRequires Identity Intelligence subscription tier
Playbook alerts unavailableRequires Playbook Alert subscription — confirm with RF account team
panels returns partial dataSpecific panels may not apply to all alert subtypes; omit to return all available panels
400 error on lookupCredentials with subjects_loginsubjects_domain is required when using subjects_login — provide both arrays matched by index
400 error on lookupPasswordpasswords must be an array of hash objects ({algorithm, hash}), not plain password strings
Wrong enum values on updateCommonByIdUse exact casing: InProgress (not in-progress), High (not high), Resolved (not resolved)

Security Considerations

  1. Protect API Keys: Store exclusively through NINA credential management — never in workflow parameters or logs
  2. Sensitive Data: Credential lookups and identity data are highly sensitive — restrict workflow access accordingly
  3. IOC Submission Awareness: IOCs submitted to RF APIs may be logged for service improvement
  4. Subscription Scoping: Ensure your API key subscription tier covers the modules your workflows use
  5. Credential Rotation: Rotate API keys regularly; revoke immediately if compromised

Additional Resources

Updated: 2026-03-19