swagger: '2.0'
info:
title: Huntress API Reference Accounts Agents API
description: "<!-- DO NOT LINT FOR FORMATTING, you will break how it appears on the docs site -->\n<p><a href='https://www.huntress.com/terms-of-service'>© Huntress - All rights reserved</a></p>\n<h1 id='introduction'>Introduction</h1>\n\n<p>Webhook event payloads are available via the dropdown menu above the search bar on this page.</p>\n\n<p>The Huntress API follows a RESTful pattern. Requests are made via resource-oriented URLs as described in this document and API responses are formatted as JSON data.</p>\n\n<p>A command-line client is also available for interacting with the API from your terminal. It requires Ruby 3.1+ and has no external dependencies. You can download it from <a href='https://api.huntress.io/api/huntress-cli'>https://api.huntress.io/api/huntress-cli</a>.</p>\n\n<p>Alternatively, if you'd prefer to use an MCP, we have <a href=\"https://support.huntress.io/hc/en-us/articles/50846554117395-Connecting-to-the-Huntress-MCP-Server\">instructions for setting up the Huntress MCP</a>. Note that the MCP is read-only, so this is a good option if you're looking for a safer way to access your Huntress data from an LLM.</p>\n\n<p>If you'd like to request additional API endpoints or capabilities, <a href=\"https://feedback.huntress.com/\">submit feedback</a> through our feedback portal.</p>\n\n<h1 id='api-overview'>API Overview</h1>\n<details>\n\t<summary><h2 id='authentication'>Authentication</h2></summary>\n<div class=\"scalar-code-copy\"><pre class=\"scalar-codeblock-pre\"><code class=\"hljs language-curl\"><span class=\"hljs-variable\">$KEY</span> = </span><span class=\"hljs-built_in\">echo </span><span class=\"hljs-string\">\"$HUNTRESS_PUBLIC_KEY:$HUNTRESS_PRIVATE_KEY\"</span> | <span class=\"hljs-built_in\">base64</span>\n<span class=\"hljs-built_in\">curl </span><span class=\"hljs-string\">\"https://api.huntress.io/v1/agents\"</span> \\ -H <span class=\"hljs-string\">\"Authorization: Basic $KEY\"</span>\n</code></pre>\n</div>\n<p>To begin, generate your API Key at <code><your_account_subdomain>.huntress.io</code>. Once you are logged into your account on the Huntress site, check the dropdown menu at the top-right corner of the site header. You should see <code>API Credentials</code> among the options if your account has been granted access to the Huntress API. Click on the option to continue to the API Key generation page.</p>\n\n<p>Once on the API Key generation page, click on the green Setup button to begin the process to generate your API Key. You will be redirected to a page where you will be prompted to generate your API Key. Click the Generate button to generate a public and private key pair for Huntress API access. The inputs on the page will be filled in with your access credentials once you have done so.</p>\n\n<p><strong>Your API Private Key will only be visible at this stage of API Key generation. Be sure to save the value provided somewhere secure, as once you navigate away from this page, this value will no longer be accessible and you must regenerate your API credentials if your secret key value is lost.</strong></p>\n\n<p>If necessary, you can repeat the process to regenerate your API credentials with a new API Key and API Secret Key on the same API Key generation page, at <code><your_account_subdomain>.huntress.io/account/api_credentials</code>.</p>\n\n<p>The Huntress API implements basic access authentication. Once you have your API Key and API Secret Key, provide these values as the result of a Base64 encoded string in every request to the Huntress API via the <code>Authorization</code> header. Your request header should look something like <code>Authorization: Basic [Base64Encode(<your_api_key>:<your_api_secret_key>)]</code>. Please refer to the code snippets for further examples.</p>\n</details>\n<details>\n\t<summary><h2 id='rate-limits'>Rate Limits</h2></summary>\n<p>Every Huntress API account is rate limited to 60 requests per minute, on a sliding window. This means that no more than 60 requests can be made within a 60 second time interval between the first request and the last request.</p>\n\n<p>For example, if request 1 is made at T0, request 2 is made at T5, and requests 3 through 60 are made at T10, making request 61 at T55 would result in a 429 error response. Making request 61 at T61 would succeed, however making request 62 at T61 would fail, at least until the time has passed T65, corresponding to a minute after request 2 was made.</p>\n</details>\n<details>\n\t<summary><h2 id='http-response-codes'>HTTP Response Codes</h2></summary>\n<p>Huntress follows HTTP standards when delivering responses: a <code>2xx</code> response is a success, a <code>4xx</code> response indicates an issue with the client request, and a <code>5xx</code> response indicates an issue with Huntress servers.\n<br>\n<br>\nSpecific error codes are detailed in the following table:</p>\n<table><thead>\n<tr>\n<th>Error Status Code</th>\n<th>Details</th>\n</tr>\n</thead><tbody>\n<tr>\n<td>400</td>\n<td>There is an unexpected value in the API request being made.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Your request could not be authenticated. Check that your API key is properly formatted and included in the <code>Authorization</code> header.</td>\n</tr>\n<tr>\n<td>404</td>\n<td>The requested resource is unavailable: either it doesn't exist, or your account does not hold correct permissions to access it.</td>\n</tr>\n<tr>\n<td>429</td>\n<td>You have made too many requests within the rate limit timeframe. See the previous section on <a href=\"#rate_limits\">rate_limits</a> for details.</td>\n</tr>\n<tr>\n<td>500</td>\n<td><p>An error has occurred within Huntress servers.</p><p>You could retry the request, but if you encounter continued errors, please <a href=\"https://support.huntress.io\">contact Support</a> with details of your error. If all traffic from Huntress is resulting in 500 responses, please check our <a href=\"https://huntressstatus.statuspage.io/\">Huntress Status Page</a>.</p></td>\n</tr>\n</tbody></table>\n</details>\n<details>\n\t<summary><h2 id='pagination'>Pagination</h2></summary>\n<p>Certain Huntress API endpoints utilize a <code>page_token</code> and <code>limit</code> parameter to specify a window location and size, respectively, to the resources currently being requested.\n<br><br>\nEach API request will also return a pagination object with details about your current pagination state based on the parameters provided. The pagination object contains:<br></p>\n\n<table><thead>\n<tr>\n<th>Key</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead><tbody>\n<tr>\n<td>next_page_token</td>\n<td>string</td>\n<td>The token used to request the next page in paginated results. If no page token is included, the first page contains all results.</td>\n</tr>\n<tr>\n<td>next_page_url</td>\n<td>string</td>\n<td>URL containing the next page and the limit provided in the original API request, to be used to continue sequentially accessing resources. Only displays when another page can be accessed.</td>\n</tr>\n</tbody></table>\n<br>\n<p>Following is a formatted example of the pagination object in an API response:<br>\n<div class=\"scalar-code-copy\">\n<pre class=\"scalar-codeblock-pre\">\n<code class=\"hljs language-json\"><span class=\"hljs-attr\">\"pagination\"</span><span class=\"hljs-punctuation\">: {</span>\n<span class=\"hljs-attr\"> \"next_page_url\"</span><span class=\"hljs-punctuation\">: </span><span class=\"hljs-string\">\"https://api.huntress.io/v1/agents?page_token=MjAyMi0wMy0wMVQxODo1NDoyNFo&limit=10\"</span><span class=\"hljs-punctuation\">,\n</span><span class=\"hljs-attr\"> \"next_page_token\"</span><span class=\"hljs-punctuation\">: </span><span class=\"hljs-string\">\"MjAyMi0wMy0wMVQxODo1NDoyNFo\"</span><span class=\"hljs-punctuation\">\n}</span></code></pre>\n</div>\n</details>\n<details>\n\t<summary><h2 id='request-and-response-format'>Request and Response Format</h2></summary>\n\t<details>\n\t\t<summary><h3 id='request'>Request</h3></summary>\n\t<div class=\"scalar-code-copy\">\n<pre class=\"scalar-codeblock-pre\">\n<code class=\"hljs language-curl\"><span class=\"hljs-built_in\">curl</span> <span class=\"hljs-string\">\"https://api.huntress.io/v1/agents?organization_id=1&page_token=MjAyMi0wMy0wMVQxODo1NDoyNFo\"</span> -H <span class=\"hljs-string\">\"Authorization: Basic <Your B64 encoded hash>\"</span></code></pre></div>\n\t<p>The base URL for API requests is <code>api.huntress.io/v1/</code>, followed by the resource requested. Resources can be requested either singularly or as a list, which correspond to <code>/v1/<resources>/:id</code> or <code>/v1/<resources></code> respectively, with the exception of the <code>/v1/account</code> and <code>/v1/actor</code> endpoints, which only returns the account associated with the API credentials provided.</p>\n\t<p>As an example, <code>api.huntress.io/v1/agents</code> would return a list of agents, while <code>api.huntress.io/v1/agents/1</code> would return a singular agent with ID: 1.</p>\n\t<p>Parameters are provided to the API through a query string. As an example, providing the organization_id filter as a parameter to the <code>/v1/agents</code> endpoint would look like <code>api.huntress/io/v1/agents?organization_id=1</code>. Accessing a sequential page with the same filter active would look like <code>api.huntress.io/v1/agents?organization_id=1&page_token=MjAyMi0wMy0wMVQxODo1NDoyNFo</code>.</p>\n\t</details>\n\t<details>\n\t\t<summary><h3 id='response'>Response</h3></summary>\n\t<p>The Huntress API responds with a JSON object containing requested resources if the request is valid and authorized.</p>\n\t<h4 id='singular-case'>Singular Case</h4>\n\t<div class=\"scalar-code-copy\">\n\t<pre class=\"scalar-codeblock-pre\"><code class=\"hljs-json\"><span class=\"hljs-punctuation\">{</span>\n<span class=\"hljs-attr\"> \"report\"</span><span class=\"hljs-punctuation\">: { ... }\n}</span></code>\n</div>\n\t<p>In the case of accessing a singular resource, the JSON object in question will contain one key that maps the singular resource to the singular representation of the resource name. As an example, if you were to request <code>api.huntress.io/v1/reports/1</code>, the JSON response would contain a single key <code>report</code> that maps to the report with ID: 1.</p>\n\t<h4 id='multiple-case'>Multiple Case</h4><div class=\"highlight\"><pre class=\"highlight json tab-json\">\n<pre class=\"scalar-codeblock-pre\"><code class=\"hljs-json\"><span class=\"hljs-punctuation\">{</span>\n<span class=\"hljs-attr\"> \"reports\"</span><span class=\"hljs-punctuation\">: [ ... ],</span>\n<span class=\"hljs-attr\"> \"pagination\"</span><span class=\"hljs-punctuation\">: { ... }</span>\n<span class=\"hljs-punctuation\">}</span>\n</code></pre></div>\n\t<p>When accessing a list of resources, the JSON response contains two keys at the root level. The first key is the plural representation of that resource. The second is a <code>pagination</code> key that represents the current state of pagination based on parameters provided in the original request. As an example, a request to <code>api.huntress.io/v1/reports</code> returns a JSON object with the keys <code>reports</code> and <code>pagination</code> at its root level. Further details on the fields within the pagination object can be seen at <a href=\"#pagination\">the relevant section</a>.</p>\n\t</details>\n</details>\n"
version: 1.0.0
host: api.huntress.io
schemes:
- https
produces:
- application/json
security:
- basic:
- basic_auth
tags:
- name: Agents
description: Operations about Agents
paths:
/v1/agents:
get:
summary: List Agents
description: "Shows Agents associated with your account.\n\n**Note:** This endpoint will also return a `pagination` key on the root level. \nPlease refer to the [pagination section](https://api.huntress.io/docs#pagination) within our docs for more information.\n"
produces:
- application/json
parameters:
- in: query
name: limit
description: Max number of resources returned in a paged collection. Defaults to 10, with a minimum of 1 and maximum 500.
type: integer
format: int32
default: 10
minimum: 1
maximum: 500
required: false
- in: query
name: page_token
description: Token used to request the next page in paginated results. Defaults to 'null'
type: string
required: false
- in: query
name: sort_field
description: Field to sort by. Defaults to 'id'.
type: string
default: id
enum:
- id
- created_at
- updated_at
required: false
- in: query
name: sort_direction
description: Sort direction. Defaults to 'desc'.
type: string
default: desc
enum:
- asc
- desc
required: false
- in: query
name: organization_id
description: Filter by organization ID within Huntress account
type: integer
format: int32
required: false
- in: query
name: platform
description: Filter by platform. One of windows, darwin, linux
type: string
enum:
- windows
- darwin
- linux
required: false
- in: query
name: hostname
description: Filter by hostname.
type: string
required: false
- in: query
name: os
description: Filter by operating system.
type: string
required: false
- in: query
name: version
description: Filter by agent version.
type: string
required: false
responses:
'200':
description: List Agents
schema:
type: object
properties:
agents:
type: array
items:
$ref: '#/definitions/Agent'
pagination:
$ref: '#/definitions/Pagination'
required:
- agents
- pagination
'403':
description: There was an issue with your API credential or permissions.
schema:
$ref: '#/definitions/Agent'
tags:
- Agents
operationId: getV1Agents
/v1/agents/{id}:
get:
summary: Get Agent
description: Shows details on a single Agent associated with your account.
produces:
- application/json
parameters:
- in: path
name: id
type: integer
format: int32
required: true
responses:
'200':
description: Get Agent
schema:
type: object
properties:
agent:
$ref: '#/definitions/Agent'
'403':
description: There was an issue with your API credential or permissions.
schema:
$ref: '#/definitions/Agent'
tags:
- Agents
operationId: getV1AgentsId
patch:
summary: Update Agent
description: 'Updates the editable attributes of a single Agent.
**Note that the default account API key is read-only, so you''ll need to create a
user-based API key with the appropriate permissions to access this endpoint.**
'
produces:
- application/json
consumes:
- application/json
parameters:
- in: path
name: id
type: integer
format: int32
required: true
- name: UpdateAgent
in: body
required: true
schema:
$ref: '#/definitions/UpdateAgent'
responses:
'200':
description: Update Agent
schema:
type: object
properties:
agent:
$ref: '#/definitions/Agent'
'403':
description: There was an issue with your API credential or permissions.
schema:
$ref: '#/definitions/Agent'
'404':
description: Agent not found.
schema:
$ref: '#/definitions/Agent'
'409':
description: Agent does not support tamper protection.
schema:
$ref: '#/definitions/Agent'
tags:
- Agents
operationId: UpdateAgent
delete:
summary: Uninstall Agent
description: 'Schedules a remote uninstall of a single Agent, removing the Huntress agent
from the host. Uninstall is asynchronous: the host is tasked to uninstall on
its next callback, and the Agent is immediately removed from your account, so
subsequent requests for it return 404.
This endpoint requires an API key with permission to uninstall agents.
**Note that the default account API key is read-only, so you''ll need to create a
user-based API key with the appropriate permissions to access this endpoint.**
'
produces:
- application/json
parameters:
- in: path
name: id
type: integer
format: int32
required: true
responses:
'204':
description: Agent scheduled for uninstall.
'403':
description: There was an issue with your API credential or permissions.
schema:
$ref: '#/definitions/Agent'
'404':
description: Agent not found.
schema:
$ref: '#/definitions/Agent'
tags:
- Agents
operationId: UninstallAgent
/v1/agents/{id}/isolation:
post:
summary: Isolate Agent
description: 'Schedules host isolation for a single Agent, cutting the host off from the
network while leaving Huntress connectivity intact. Isolation is asynchronous:
a successful request returns the Agent with a `firewall_status` of
"Pending Isolation" until the endpoint confirms isolation.
This endpoint requires an API key with permission to isolate agents.
**Note that the default account API key is read-only, so you''ll need to create a
user-based API key with the appropriate permissions to access this endpoint.**
'
produces:
- application/json
consumes:
- application/json
parameters:
- in: path
name: id
type: integer
format: int32
required: true
- name: IsolateAgent
in: body
required: true
schema:
$ref: '#/definitions/IsolateAgent'
responses:
'201':
description: Isolate Agent
schema:
type: object
properties:
agent:
$ref: '#/definitions/Agent'
'403':
description: There was an issue with your API credential or permissions.
'404':
description: Agent not found.
'409':
description: Agent does not support host isolation, or isolation could not be scheduled.
tags:
- Agents
operationId: IsolateAgent
delete:
summary: Release Agent Isolation
description: 'Schedules release of host isolation for a single Agent, restoring the host''s
network connectivity. Release is asynchronous: a successful request returns the
Agent with a `firewall_status` of "Pending Release" until the endpoint confirms
the host is back online.
This endpoint requires an API key with permission to release agents.
**Note that the default account API key is read-only, so you''ll need to create a
user-based API key with the appropriate permissions to access this endpoint.**
'
produces:
- application/json
parameters:
- in: path
name: id
type: integer
format: int32
required: true
responses:
'204':
description: There was an issue with your API credential or permissions.
'404':
description: Agent not found.
'409':
description: Agent does not support host isolation, or release could not be scheduled.
tags:
- Agents
operationId: ReleaseAgent
definitions:
UpdateAgent:
type: object
properties:
tags:
type: array
description: The full set of user classifications on the host. The supplied list replaces any existing tags. Values are normalized to lowercase, hyphenated values (for example, "My Server" becomes "my-server"), and blank or duplicate values are dropped.
items:
type: object
properties:
? ''
: type: array
description: The full set of user classifications on the host. The supplied list replaces any existing tags. Values are normalized to lowercase, hyphenated values (for example, "My Server" becomes "my-server"), and blank or duplicate values are dropped.
items:
type: string
tamper_protection_configured:
type: boolean
description: Enable or disable EDR tamper protection for the agent. Applies asynchronously, so the host-reported state is exposed separately as tamper_protection_actual. Requires an API key with permission to manage agent security settings, and the agent must support tamper protection.
description: Update Agent
Pagination:
type: object
properties:
next_page_url:
type: string
next_page_token:
type: string
description: Pagination model
Agent:
type: object
properties:
id:
type: integer
format: int64
example: 1
description: A unique identifier for an agent.
account_id:
type: integer
format: int64
example: 5
description: The unique identifier of the account associated with the agent.
arch:
type: string
example: x86_64
description: The architecture on the host machine.
created_at:
type: string
format: date-time
example: '2022-03-01T20:05:10Z'
description: A timestamp for when the agent was created, formatted as per ISO-8601.
domain_name:
type: string
example: WORKGROUP
description: Domain that refers to the host machine.
edr_version:
type: string
example: 0.3.20
description: The semantic versioning number of the Huntress EDR software installed on the machine or `null` if EDR is not installed.
external_ip:
type: string
example: 198.51.100.42
description: The external IP of the host machine, if applicable.
hostname:
type: string
example: laptop01
description: The hostname of the host machine.
defender_policy_status:
type: string
example: Compliant
description: Policy status of Defender AV for Managed Antivirus.
defender_status:
type: string
example: Healthy
description: Status of Defender AV Managed Antivirus.
defender_substatus:
type: string
example: Up to date
description: Sub-status of Defender AV Managed Antivirus.
firewall_status:
type: string
example: Disabled
description: Status of agent firewall. Can be one of Disabled, Enabled, Pending Isolation, Isolated, Pending Release
tamper_protection_configured:
type: boolean
example: true
description: The desired EDR tamper protection state for the agent. `null` when the agent does not support tamper protection.
tamper_protection_actual:
type: boolean
example: true
description: The tamper protection state most recently reported by the host. May lag `tamper_protection_configured` and is `null` until the host reports.
ipv4_address:
type: string
example: 146.134.139.9
description: The internal IP of the host machine.
last_callback_at:
type: string
format: date-time
example: '2022-03-01T20:05:10Z'
description: A timestamp for when the last time Huntress was able to access the host machine.
last_survey_at:
type: string
format: date-time
example: '2022-03-01T20:05:10Z'
description: A timestamp for when the last Microsoft Defender survey was received by Huntress for this host machine.
mac_addresses:
type: array
items:
type: string
example:
- 7c:a7:b0:16:2f:78
description: The unique media access control (MAC) addresses associated with the agent.
service_pack_major:
type: integer
format: int32
example: 0
description: The major version of the Windows service pack installed on the host machine.
service_pack_minor:
type: integer
format: int32
example: 0
description: The minor version of the Windows service pack installed on the host machine.
organization_id:
type: integer
format: int64
example: 7
description: The unique identifier of the organization associated with the agent.
os:
type: string
example: Windows 8 Pro
description: The operating system of the host machine.
os_build_version:
type: string
example: '19044'
description: The operating system build number of the host machine corresponding to its platform (<a href='https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information'>windows</a> or <a href='https://developer.apple.com/news/releases/'>darwin</a>).
os_major:
type: integer
format: int32
example: 6
description: The major OS version of the host machine. Corresponds with the major releases of Windows operating systems. A list is accessible <a href='https://docs.microsoft.com/en-us/windows/win32/sysinfo/operating-system-version'>here</a>.
os_minor:
type: integer
format: int32
example: 2
description: ' The minor OS version of the host machine. Refer to the `os_major` field details for further details.'
os_patch:
type: integer
format: int32
example: 0
description: The patch version of the macOS update installed on the host machine, such as 1 in version 12.5.1.
platform:
type: string
example: windows
description: The platform of the host machine (`darwin`, `windows`, or `linux`).
serial_number:
type: string
example: wtIe1bvDbh
description: The serial number of the host machine as reported to the operating system.
tags:
type: array
items:
type: string
example:
- Server
- Production
description: User classifications on the host machine.
updated_at:
type: string
format: date-time
example: '2022-03-01T20:05:10Z'
description: A timestamp for when the agent was last updated, formatted as per ISO-8601.
version:
type: string
example: 0.11.3
description: The semantic versioning number of the agent installed on the host machine.
version_number:
type: integer
format: int32
example: 720899
description: Windows version number.
win_build_number:
type: integer
format: int32
example: 19044
description: The Windows Build Number. Should correspond to information on the <a href='https://docs.microsoft.com/en-us/windows/release-health/release-information'>Microsoft site</a>.
description: Agent model
IsolateAgent:
type: object
properties:
reason:
type: string
description: Reason recorded for the isolation.
strict_isolation:
type: boolean
description: Apply strict isolation. Only honored on Windows (WFP) and Linux (eBPF).
default: false
description: Isolate Agent
securityDefinitions:
basic_auth:
type: basic
desc: Base 64 encoded string of your Huntress Account API key and API secret.