Tags
Tag entities for your team's workflow.
tags:read; writes require tags:write. Sandbox/test keys cannot create or delete tags.entity_type (canonical, per the OpenAPI spec) or resource (alias). Responses always return entity_type. Examples on this page use entity_type; either works.Body schema (write endpoints)
POST /v1/tags, DELETE /v1/tags, and POST /v1/tags/bulk share the same body fields:
| Parameter | Type | Description |
|---|---|---|
entity_idrequired | string | ID of the entity to tag. For bulk, use entity_ids (array) instead. |
entity_ids | string[] | Bulk endpoint only. Up to 100 entities per call. |
entity_typerequired | string | One of: companies, personnel, broker-offices, brokers. Alias: resource. |
tagrequired | string | Tag name. Free-text; normalized on write and filter (leading # stripped, casing folded). |
List Tags
/v1/tags0 creditsReturns tag names for the authenticated API user, optionally filtered by entity type or tag name. One entity can hold many tags.
| Parameter | Type | Description |
|---|---|---|
tag | string | Filter to one tag name. Normalized the same way as writes (leading # stripped, casing folded). |
entity_type | string | Filter to one entity type. Alias: resource. |
resource | string | Alias of entity_type. |
page | integer | Zero-indexed page. |
page_size | integer | Default 25, max 500. |
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/tags?entity_type=companies&page_size=3"{
"ok": true,
"data": [
{
"entity_id": "452990868",
"entity_type": "companies",
"tag": "q2-2026-outreach",
"tag_id": "cde98e19-fbb6-40f1-adf9-225d3dcd9f06"
},
{
"entity_id": "71038294",
"entity_type": "companies",
"tag": "renewals",
"tag_id": "afb60fb8-b651-4afa-89c2-4d133fae264d"
}
],
"meta": {
"total_count": 5,
"page": 0,
"page_size": 3,
"returned": 2,
"has_more": true,
"credits_charged": 0
}
}List Tags for One Entity
/v1/{resource}/{id}/tags0 creditsReturns the authenticated API user's tags for one entity. Supported resources are companies, personnel, broker-offices, and brokers.
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/companies/452990868/tags"Add Tag
/v1/tags0 creditsAdd a single tag to a single entity. Idempotent — re-tagging is a no-op.
curl -X POST -H "Authorization: Bearer ss_live_..." \
-H "Content-Type: application/json" \
-d '{"entity_type": "companies", "entity_id": "84629153", "tag": "q2-2026-outreach"}' \
"https://api.hillwinds.ai/v1/tags"{
"ok": true,
"data": {
"id": "d9118921-fcf7-4e85-8f96-4473763884ff",
"entity_id": "84629153",
"entity_type": "companies",
"tag": "q2-2026-outreach",
"created_at": "2026-06-10T02:06:37.015041+00:00",
"user_id": null
},
"meta": { "credits_charged": 0 }
}Remove Tag
/v1/tags0 creditsRemoves a (entity, tag) pair. Body matches POST /v1/tags. There is also a by-id form: DELETE /v1/tags/{id} takes the tag record UUID in the path — useful when you already have the id from a list call.
curl -X DELETE -H "Authorization: Bearer ss_live_..." \
-H "Content-Type: application/json" \
-d '{"entity_type": "companies", "entity_id": "84629153", "tag": "q2-2026-outreach"}' \
"https://api.hillwinds.ai/v1/tags"Bulk Tag
/v1/tags/bulk0 creditsApply a single tag to up to 100 entities in one request. Idempotent per entity.
curl -X POST -H "Authorization: Bearer ss_live_..." \
-H "Content-Type: application/json" \
-d '{
"entity_type": "companies",
"entity_ids": ["84629153", "71038294", "452990868"],
"tag": "q2-2026-outreach"
}' \
"https://api.hillwinds.ai/v1/tags/bulk"{
"ok": true,
"data": {
"created": 3,
"matched": 3,
"tags": [
{
"id": "33c77e89-c2cd-46d7-951d-fd5d1277e9a0",
"entity_id": "84629153",
"entity_type": "companies",
"tag": "q2-2026-outreach",
"created_at": "2026-06-10T02:41:52.769579+00:00"
}
/* ... one entry per entity_id ... */
]
},
"meta": { "credits_charged": 0 }
}created counts newly inserted tag rows; matched counts every entity the call touched (including ones that were already tagged).
List Entities for a Tag
/v1/tags/entities0 creditsThe read-side counterpart to POST /v1/tags/bulk: fetch every entity that shares a tag. Look up by either tag (name) or tag_id (UUID).
To go the other way — every tag on one entity — use the per-entity read GET /v1/personnel/:id/tags. Contacts also expose their tags inline as the tags field on GET /v1/personnel/:id?mode=full.
GET /v1/personnel/:id/tags is the only per-entity tag read endpoint today. Companies, broker offices, and brokers do not expose /:id/tags routes; use GET /v1/tags or GET /v1/tags/entities with entity_type filters instead.| Parameter | Type | Description |
|---|---|---|
tag | string | Tag name. Provide tag or tag_id. |
tag_id | string | Tag record UUID. Provide tag or tag_id. |
entity_type | string | Restrict to one entity type. Alias: resource. |
page | integer | Zero-indexed page. |
page_size | integer | Default 25, max 500. |
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/tags/entities?tag=q2-2026-outreach&entity_type=companies"{
"ok": true,
"data": [
{
"id": "d9118921-fcf7-4e85-8f96-4473763884ff",
"entity_id": "84629153",
"entity_type": "companies",
"tag": "q2-2026-outreach",
"created_at": "2026-06-10T02:06:37.015041+00:00"
}
],
"meta": {
"total_count": 1,
"page": 0,
"page_size": 25,
"returned": 1,
"has_more": false,
"credits_charged": 0
}
}Keys are issued by our team, not a signup form. Book a 25-minute walkthrough and you'll leave with sandbox and live credentials.