Documentation Index
Fetch the complete documentation index at: https://bloodhound.specterops.io/llms.txt
Use this file to discover all available pages before exploring further.
kinds array, and can also include optional properties.
Use this page to validate structure before ingestion. For a full data payload example, see Graph Data.
kinds array.
Unique identifier for the node in your data payload. Use a stable, globally unique value from the source system when possible.Every node must have a globally unique
id to distinguish it from every other node in BloodHound’s graph database. Use the identifier that the source system itself uses to differentiate objects, such as a GUID when available.| Identifier quality | Examples |
|---|---|
| Good: globally unique | GUIDs, SIDs, certificate thumbprints |
| Avoid: not guaranteed unique | Usernames, email addresses, hostnames, auto-incremented integers |
An array of strings that classify the node. You can include up to three kinds per node. The first value is the primary kind, which controls the node styling in the graph.In Cypher queries, node kinds function as labels for pattern matching. Use the colon (
:) syntax to match nodes by kind: MATCH (n:Okta_User) or MATCH (n:Okta_User|Okta_Group). All values in the kinds array can be used as labels, enabling flexible querying by any assigned kind.-
Node
kindsmust not overlap with built-in node kinds. Consider using a prefix related to your data source or environment separated by an underscore. For example,Okta_User. For structured graphs, a prefix that matches the extension’snamespaceis required. -
For a node to participate in a structured graph, at least one value in its
kindsarray should match anode_kinds.namedefined in an installed extension definition schema.
Optional key-value map of custom node attributes. Values must be primitives or homogeneous arrays of primitives. BloodHound displays node properties in the Entity Panel when you click a node in the graph.See Constraints and Reserved properties below for details on allowed property formats and reserved property names.
Associates a node with a specific environment.To enable in structured graphs, define an environment node in
graph.nodes. To be included in analysis, metrics, and findings generation, a node must have properties.environmentid set to an environment node’s id.Environment nodes themselves must also have properties.environmentid set, but the value does not have to match the node’s own id. For example, a child environment node can have properties.environmentid set to a parent node environment id.Indicates whether an environment node kind was observed directly during data collection.In structured graphs, only environment nodes with
properties.collected set to true and a registered source_kind are used to produce . You can register and apply source_kind through metadata or apply it directly in node kinds after it has been registered.This property is not necessary for nodes of other kinds.Property rules
Properties must adhere to the following constraints:-
Values must be:
- string
- number
- boolean
- array of primitives
- Nested objects are not allowed
- Arrays of objects are not allowed
- Arrays must be homogeneous (e.g., all strings or all numbers)
-
Property names should be lowercase.
BloodHound currently accepts property names with uppercase characters, but will enforce lowercase property names in a future release.
-
Property names are case-sensitive.
For example,
exampleidandExampleIDare treated as different properties on the same node. - Special characters in property names or values may cause ingest to fail or lead to unexpected behavior. Avoid spaces and special characters.
-
The
lastseenproperty is injected automatically by BloodHound during ingestion and overwrites any value provided in the payload. -
The
reconcileproperty is stripped during ingestion. -
The following property values are uppercased during ingest if they are present as strings:
nameoperatingsystemdistinguishednameenvironmentid
Reserved properties
Some node properties are reserved and have special behavior during ingest. These properties must not be included in theproperties object of a node definition, as they may cause ingest to fail or lead to unexpected behavior.
objectid
The property name objectid is reserved and must not be included in the properties object of a node definition.
The top-level id field serves as the node identifier in your payload.
During ingest, BloodHound maps this id value internally to objectid. If you also define objectid in properties, ingest fails due to a conflicting definition.
Findings and metrics
This is a SpecterOps-managed feature. If it is not enabled in your environment, contact your account team for assistance.
| Field | Where | Requirement |
|---|---|---|
environment_kind | Extension definition schema | Must match the environment node kind defined in the node_kinds.name field.If a relationship-based finding exists for the environment, relationship_findings.environment_kind must also match. |
source_kind | Data payload | Must be present on nodes for them to be included in findings and metrics. |
environmentid | Data payload | For nodes that belong to an environment, must be set to the graph.nodes.id of that environment node.That environment’s node kind must match the node_kinds.name with the corresponding environments.environment_kind definition. |
collected | Data payload | Must be set to true on nodes with an environment kind to indicate that data has actually been collected for that environment.For example, your payload might include multiple environment nodes, but only nodes for environments with successfully collected data should have collected: true. |
Users must also create Privilege Zone rules after installing an extension and prior to uploading a data payload to see findings in BloodHound Enterprise.
Schema
Use the following JSON schema for validation requirements. You can also download the same schema as a file: opengraph-node.json.Troubleshooting
- Upload fails with schema validation errors: Verify that every property value is a primitive or a homogeneous array of primitives.
-
Unexpected duplicate properties in results: Check for case differences such as
exampleidandExampleID. -
Upload fails on reserved property conflict: Remove
objectidfrompropertiesand keep the identifier only inid.