Tags

The workspace tag library the dashboard's pickers offer: list it (with the tags in use on contacts and AI agents), add to it, rename and delete.

The workspace tag library the dashboard's pickers offer: list it (with the tags in use on contacts and AI agents), add to it, rename and delete.

Every route takes Authorization: Bearer <ACCESS_TOKEN> unless the auth line says otherwise. Ids are numbers. Errors use the shape on the errors page.

RouteScopeWhat it does
GET /v1/tagscontacts.readA workspace's tag library, A–Z.
POST /v1/tagscontacts.writeAdd a tag to the library.
PATCH /v1/tags/{id}contacts.writeRename a library tag.
DELETE /v1/tags/{id}contacts.writeRemove a tag from the library.

List tags

GET https://api.bluereacher.com/v1/tags

Auth: Bearer access token. Scope: contacts.read.

A workspace's tag library, A–Z.

The library is the list the dashboard's tag pickers and Settings › Tags manage. A contact's tags are kept on the contact itself, so a tag can be on contacts without being in the library (imports, platform sync, automations). Pass include_in_use=1 to get those too: rows with source: "contact" (on contacts only) or source: "agent" (an AI agent's tag, with agent_name) and id: null. Only library rows have an id and can be renamed or deleted.

Parameters

NameInTypeRequiredDescription
workspace_idquerynumberyesThe workspace.
searchquerystringnoPart of a name.
include_in_usequerybooleanno1 = also the tags that are on contacts or AI agents but not in the library.

Request

curl -X GET "https://api.bluereacher.com/v1/tags?workspace_id=7&search=vi" \
  -H "Authorization: Bearer <ACCESS_TOKEN>"

Responses

A 200 reply (OK):

{
  "success": true,
  "data": [
    {
      "id": 310,
      "workspace_id": 7,
      "name": "vip",
      "source": "library",
      "created_at": "2026-11-04T02:10:00.000Z",
      "updated_at": "2026-11-04T02:10:00.000Z"
    },
    {
      "id": 311,
      "workspace_id": 7,
      "name": "demo-booked",
      "source": "library",
      "created_at": "2026-11-04T02:11:00.000Z",
      "updated_at": "2026-11-04T02:11:00.000Z"
    },
    {
      "id": null,
      "workspace_id": 7,
      "name": "Sales Agent",
      "source": "agent",
      "agent_name": "Sales Agent",
      "created_at": null,
      "updated_at": null
    }
  ]
}
StatusWhenMessage
200OK
400No workspace_idworkspace_id is required.
401Missing or invalid tokenInvalid or expired access token.
403Missing scopeMissing scope(s): contacts.read. This integration was granted: …
404Workspace does not exist or is not owned by the installer (same response for both)Workspace not found or not accessible to this token

Create tag

POST https://api.bluereacher.com/v1/tags

Auth: Bearer access token. Scope: contacts.write.

Add a tag to the library.

Up to 100 characters. Creating a name the workspace already has answers 200 with the existing tag (201 when it is new), so the call is safe to repeat. The library row makes the tag available in pickers; it does not tag any contact — use Add tags on a contact for that.

Parameters

NameInTypeRequiredDescription
workspace_idbodynumberyesThe workspace.
namebodystringyesThe tag.

Request

curl -X POST "https://api.bluereacher.com/v1/tags" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
  "workspace_id": 7,
  "name": "vip"
}'

Responses

A 201 reply (Created):

{
  "success": true,
  "message": "Tag created",
  "data": {
    "id": 310,
    "workspace_id": 7,
    "name": "vip",
    "source": "library",
    "created_at": "2026-11-04T02:10:00.000Z",
    "updated_at": "2026-11-04T02:10:00.000Z"
  }
}
StatusWhenMessage
201Created
200The name was already in the library
400No name, or over 100 charactersname is required.
401Missing or invalid tokenInvalid or expired access token.
403Missing scopeMissing scope(s): contacts.write. This integration was granted: …
404Workspace does not exist or is not owned by the installer (same response for both)Workspace not found or not accessible to this token

Rename tag

PATCH https://api.bluereacher.com/v1/tags/{id}

Auth: Bearer access token. Scope: contacts.write.

Rename a library tag.

Renames the library row only; contacts that carry the old name keep it. A name another tag in the workspace already has answers 409.

Parameters

NameInTypeRequiredDescription
idpathnumberyesThe tag id (from List tags).
namebodystringyesThe new name.

Request

curl -X PATCH "https://api.bluereacher.com/v1/tags/310" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "VIP client"
}'

Responses

A 200 reply (OK):

{
  "success": true,
  "message": "Tag updated",
  "data": {
    "id": 310,
    "workspace_id": 7,
    "name": "VIP client",
    "source": "library",
    "created_at": "2026-11-04T02:10:00.000Z",
    "updated_at": "2026-11-04T03:00:00.000Z"
  }
}
StatusWhenMessage
200OK
400No namename is required.
401Missing or invalid tokenInvalid or expired access token.
403Missing scopeMissing scope(s): contacts.write. This integration was granted: …
404Tag does not exist or is not owned by the installer (same response for both)Tag not found or not accessible to this token
409Another tag has that nameA tag with this name already exists in the workspace.

Delete tag

DELETE https://api.bluereacher.com/v1/tags/{id}

Auth: Bearer access token. Scope: contacts.write.

Remove a tag from the library.

The library row only: contacts that carry the tag keep it (remove it from them with Remove tags). AI agent tags are not library rows and cannot be deleted here.

Parameters

NameInTypeRequiredDescription
idpathnumberyesThe tag id.

Request

curl -X DELETE "https://api.bluereacher.com/v1/tags/310" \
  -H "Authorization: Bearer <ACCESS_TOKEN>"

Responses

A 200 reply (OK):

{
  "success": true,
  "message": "Tag deleted",
  "data": {
    "id": 310,
    "workspace_id": 7,
    "name": "vip"
  }
}
StatusWhenMessage
200OK
401Missing or invalid tokenInvalid or expired access token.
403Missing scopeMissing scope(s): contacts.write. This integration was granted: …
404Tag does not exist or is not owned by the installer (same response for both)Tag not found or not accessible to this token

On this page