> ## 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.

# OpenGraph Custom Icons

> How to set Custom Icons for your Custom Nodes

<img noZoom src="https://mintcdn.com/specterops/tTIczgde9H07oLXf/assets/enterprise-AND-community-edition-pill-tag.svg?fit=max&auto=format&n=tTIczgde9H07oLXf&q=85&s=ad49a576589f4d2a8081df77d07fdf56" alt="Applies to BloodHound Enterprise and CE" width="482" height="45" data-path="assets/enterprise-AND-community-edition-pill-tag.svg" />

# Introduction

Since arbitrary nodes don’t have predefined types, there needs to be a way to specify custom icons. Here are a few possible approaches.

# Icon Selection

## Predefined icon set

* Provide a set of icons (from Font Awesome) and allow users to specify an icon name
* Users can optionally specify a color per node kind. Acceptable values are #RGB or #RRGGBB
* The entirety of the free, solid icons that font awesome offers are available. Supported icons can be viewed on the [official Font Awesome docs](https://fontawesome.com/search?o=r\&ic=free\&s=solid).
* User must correctly specify the icon name using Font Awesome’s naming conventions.
  * A valid icon name will be something like “house” or “smile” without any fa-, fas-, etc. prefixes
* Render a (?) icon on failed mappings.
* Provide a `PUT` endpoint for users to correct erroneous mappings (ie. feUser instead of faUser)

### Example payload for custom icons

```JSON theme={null}
{
  "custom_types": {
    "person": {
      "icon": {
        "type": "font-awesome",
        "name": "user",
        "color": "#FFF"
      }
    },
    "device": {
      "icon": {
        "type": "font-awesome",
        "name": "desktop"
      }
    },
    "alert": {
      "icon": {
        "type": "font-awesome",
        "name": "house"
      }
    }
  }
}
```

### Example with API Explorer

You can set custom icons directly from the BloodHound API Explorer without writing any code.

<Steps>
  <Step title="Open the API Explorer">
    Navigate to the API Explorer from the BloodHound menu.

    <img src="https://mintcdn.com/specterops/FqFBuWU7NMJY7iGF/images/extensions/custom-icons/custom-icons-01.png?fit=max&auto=format&n=FqFBuWU7NMJY7iGF&q=85&s=d3d4072bc3ffa5c0364fbf511b56e821" alt="BloodHound menu showing the API Explorer option" width="343" height="349" data-path="images/extensions/custom-icons/custom-icons-01.png" />
  </Step>

  <Step title="Select the POST endpoint">
    Under **Custom Node Management**, expand the `POST /api/v2/custom-nodes` endpoint and click **Try it out**.

    <img src="https://mintcdn.com/specterops/FqFBuWU7NMJY7iGF/images/extensions/custom-icons/custom-icons-02.png?fit=max&auto=format&n=FqFBuWU7NMJY7iGF&q=85&s=86d1ca79b89b014a48e752e79f0a87fd" alt="API Explorer showing the POST custom-nodes endpoint" width="1584" height="491" data-path="images/extensions/custom-icons/custom-icons-02.png" />
  </Step>

  <Step title="Enter your payload and execute">
    Enter your custom icon configuration in the **Request body** field and click **Execute**.

    <img src="https://mintcdn.com/specterops/FqFBuWU7NMJY7iGF/images/extensions/custom-icons/custom-icons-03.png?fit=max&auto=format&n=FqFBuWU7NMJY7iGF&q=85&s=e6415b459a01c48d7f17cecd977718dc" alt="API Explorer with a custom icon payload ready to execute" width="1583" height="1127" data-path="images/extensions/custom-icons/custom-icons-03.png" />
  </Step>

  <Step title="Verify the response">
    A `201` response confirms your custom icons were created successfully.

    <img src="https://mintcdn.com/specterops/FqFBuWU7NMJY7iGF/images/extensions/custom-icons/custom-icons-04.png?fit=max&auto=format&n=FqFBuWU7NMJY7iGF&q=85&s=df7df67d1ec800360394378b6f30da2d" alt="API Explorer showing a successful 201 response with the custom icon configuration" width="1576" height="1007" data-path="images/extensions/custom-icons/custom-icons-04.png" />
  </Step>
</Steps>

### Example with Python

Here's a simple Python script to help you customize your icons.\
You will need to generate a [Bearer Token](/reference/overview#jwt-bearer-token)

**Note** Make sure to adjust the `url` and replace the `place holder token` in the script.

```Python theme={null}
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = "http://127.0.0.1:8080/api/v2/custom-nodes"

headers = {
    "Authorization": "Bearer ey<REDACTED>scduDoG7TmxU",
    "Content-Type": "application/json"
}

def define_icon(icon_type, icon_name, icon_color):
    payload = {
        "custom_types": {
            icon_type: {
                "icon": {
                    "type": "font-awesome",
                    "name": icon_name,
                    "color": icon_color
                }
            }
        }
    }

    response = requests.post(
        url,
        headers=headers,
        json=payload,
        verify=False  # Disables SSL verification
    )

    print(f"🔹 Sent icon for: {icon_type}")
    print("Status Code:", response.status_code)
    print("Response Body:", response.text)
    print("---")

# Call function for each icon type you want to send
define_icon("Node1", "burst", "#03CEFC")
define_icon("Node2", "home", "#D67500")
```

You can call `define_icon` as many time as you need for each of your node type.
