From 6aa160edf0e922e1d90b69346c344f730e9a3bb0 Mon Sep 17 00:00:00 2001 From: Jeff Matthews Date: Fri, 16 Jan 2026 10:08:13 -0600 Subject: [PATCH] docs: new endpoint for v8.5.0 --- docs/docs.json | 1 + docs/openapi.json | 220 +++++++++++++++++- ...roup-tag-selector-member-count-by-kind.mdx | 5 + 3 files changed, 216 insertions(+), 10 deletions(-) create mode 100644 docs/reference/asset-isolation/list-asset-group-tag-selector-member-count-by-kind.mdx diff --git a/docs/docs.json b/docs/docs.json index 26b9cb02..b617a8a1 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -627,6 +627,7 @@ "reference/asset-isolation/get-asset-group-tag-selectors-of-a-specific-object-by-member-id", "reference/asset-isolation/list-asset-group-tag-member-count-by-kind", "reference/asset-isolation/list-asset-group-tag-members-by-selector", + "reference/asset-isolation/list-asset-group-tag-selector-member-count-by-kind", "reference/asset-isolation/list-asset-group-collections", "reference/asset-isolation/preview-selectors", "reference/asset-isolation/update-an-asset-group", diff --git a/docs/openapi.json b/docs/openapi.json index bbdfc96f..5c8ba2ad 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -16,7 +16,7 @@ }, "servers": [ { - "url": "/", + "url": "https://bloodhound.specterops.io/openapi.json/", "description": "This is the base path for all endpoints, relative to the domain where the API is being hosted." } ], @@ -3452,7 +3452,7 @@ }, { "name": "type", - "description": "Node type.\nSome AD examples: `Base`, `User`, `Computer`, `Group`, `Container`.\nSome Azure examples: `AZBase`, `AZApp`, `AZDevice`.\n", + "description": "Node type. Currently only supports built-in types.\nSome AD examples: `Base`, `User`, `Computer`, `Group`, `Container`.\nSome Azure examples: `AZBase`, `AZApp`, `AZDevice`.\n", "in": "query", "schema": { "type": "string" @@ -5193,10 +5193,20 @@ "counts": { "type": "object", "properties": { + "members": { + "type": "integer", + "format": "int64" + }, "selectors": { "type": "integer" }, - "members": { + "custom_selectors": { + "type": "integer" + }, + "default_selectors": { + "type": "integer" + }, + "disabled_selectors": { "type": "integer" } } @@ -5507,6 +5517,33 @@ "schema": { "$ref": "#/components/schemas/api.params.query.sort-by" } + }, + { + "name": "primary_kind", + "in": "query", + "description": "Filter by primary_kind", + "required": false, + "schema": { + "$ref": "#/components/schemas/api.params.predicate.filter.string" + } + }, + { + "name": "name", + "in": "query", + "description": "Filter by name", + "required": false, + "schema": { + "$ref": "#/components/schemas/api.params.predicate.filter.string" + } + }, + { + "name": "object_id", + "in": "query", + "description": "Filter by object_id", + "required": false, + "schema": { + "$ref": "#/components/schemas/api.params.predicate.filter.string" + } } ], "responses": { @@ -5686,7 +5723,45 @@ "in": "query", "description": "Sortable columns are `id`, `objectid`, and `name`.\n", "schema": { - "$ref": "#/components/schemas/api.params.query.sort-by" + "allOf": [ + { + "$ref": "#/components/schemas/api.params.query.sort-by" + }, + { + "enum": [ + "id", + "objectid", + "name" + ] + } + ] + } + }, + { + "name": "primary_kind", + "in": "query", + "description": "Filter by primary_kind", + "required": false, + "schema": { + "$ref": "#/components/schemas/api.params.predicate.filter.string" + } + }, + { + "name": "name", + "in": "query", + "description": "Filter by name", + "required": false, + "schema": { + "$ref": "#/components/schemas/api.params.predicate.filter.string" + } + }, + { + "name": "object_id", + "in": "query", + "description": "Filter by object_id", + "required": false, + "schema": { + "$ref": "#/components/schemas/api.params.predicate.filter.string" } } ], @@ -5733,6 +5808,111 @@ "404": { "$ref": "#/components/responses/not-found" }, + "409": { + "description": "Conflict. Selector is disabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/api.error-wrapper" + } + } + } + }, + "429": { + "$ref": "#/components/responses/too-many-requests" + }, + "500": { + "$ref": "#/components/responses/internal-server-error" + } + } + } + }, + "/api/v2/asset-group-tags/{asset_group_tag_id}/selectors/{asset_group_tag_selector_id}/members/counts": { + "parameters": [ + { + "$ref": "#/components/parameters/header.prefer" + }, + { + "name": "asset_group_tag_id", + "description": "ID of an asset group tag", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "asset_group_tag_selector_id", + "description": "ID of an asset group tag selector", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "get": { + "operationId": "GetAssetGroupSelectorMemberCountsByKind", + "summary": "List asset group tag selector member count by kind", + "description": "List counts of members of an asset group tag selector by primary kind.", + "tags": [ + "Asset Isolation", + "Community", + "Enterprise" + ], + "parameters": [ + { + "$ref": "#/components/parameters/query.environments" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "total_count": { + "type": "integer" + }, + "counts": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not-found" + }, + "409": { + "description": "Conflict. Selector is disabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/api.error-wrapper" + } + } + } + }, "429": { "$ref": "#/components/responses/too-many-requests" }, @@ -6262,7 +6442,13 @@ "additionalProperties": true }, "source": { - "type": "integer" + "description": "Describes which phase of tagging resulted in this member being tagged, 1 - direct object, 2 - expanded downward, 3 - expanded upward", + "type": "integer", + "enum": [ + 1, + 2, + 3 + ] } } } @@ -6305,7 +6491,7 @@ "Community" ], "requestBody": { - "description": "The request body for searching asset group tags.", + "description": "The request body for searching asset group tags. `query` represents being able to query by either name or object id. `tag_type` can be either 1(zone), 2(label), or 3(owned). And `asset_group_tag_id` is the ID of a tag (zone or label).", "required": true, "content": { "application/json": { @@ -6317,6 +6503,9 @@ }, "tag_type": { "type": "integer" + }, + "asset_group_tag_id": { + "type": "integer" } }, "required": [ @@ -17280,9 +17469,9 @@ "in": "header", "required": false, "schema": { - "type": "integer", - "minimum": 0, - "default": 0 + "type": "string", + "default": "wait=30", + "pattern": "^wait=[0-9]+$" } }, "query.created-at": { @@ -18975,6 +19164,11 @@ "readOnly": true, "description": "Enterprise Only" }, + "hygiene_attack_paths": { + "type": "integer", + "readOnly": true, + "description": "Enterprise Only" + }, "exposures": { "type": "array", "readOnly": true, @@ -19337,9 +19531,15 @@ "type": "object", "properties": { "type": { - "type": "integer" + "type": "integer", + "description": "The type of selector, valid types are 1 - object id or 2 - cypher.", + "enum": [ + 1, + 2 + ] }, "value": { + "description": "The string value representing either an objectid or cypher query depending on the selector type.", "type": "string" } } diff --git a/docs/reference/asset-isolation/list-asset-group-tag-selector-member-count-by-kind.mdx b/docs/reference/asset-isolation/list-asset-group-tag-selector-member-count-by-kind.mdx new file mode 100644 index 00000000..21a6c6cb --- /dev/null +++ b/docs/reference/asset-isolation/list-asset-group-tag-selector-member-count-by-kind.mdx @@ -0,0 +1,5 @@ +--- +openapi: get /api/v2/asset-group-tags/{asset_group_tag_id}/selectors/{asset_group_tag_selector_id}/members/counts +--- + +Applies to BloodHound Enterprise and CE