{"id":53786,"plugin_id":"plugins_6ac012b82680819195f8a26cbe32c246","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-24T13:55:06.759Z","digest":"40f287b3fae7fd5c3d66c67c139fc8bde59ce0ae5d577b029e370f7027604391","against":null,"payload":{"description":"Manage Domino tags and properties via the Taxonomy API. Covers tags/namespaces (create, list, update, delete; tag entities — project, model, dataset, app, project_template, netapp_volume; query by tag; autocomplete; merge; CSV import/export) AND properties (typed metadata fields — text, number, date, boolean, url, user, organization, select, multi_select — with per-entity values, groups, and versioned entities like model_version/app_version). Use when organizing entities with tags, building hierarchical namespaces, defining typed metadata fields, setting property values on projects/models/apps, finding entities by tag, bulk-tagging during onboarding, or migrating taxonomy across environments.","included_files":[{"relative_path":"BULK-OPS.md","size_in_bytes":3838},{"relative_path":"IMPORT-EXPORT.md","size_in_bytes":4839},{"relative_path":"PROPERTIES.md","size_in_bytes":8757},{"relative_path":"PROPERTY-VALUES.md","size_in_bytes":8265}],"name":"tags-and-properties","skill_md_contents":"---\nname: tags-and-properties\ndescription: Manage Domino tags and properties via the Taxonomy API. Covers tags/namespaces (create, list, update, delete; tag entities — project, model, dataset, app, project_template, netapp_volume; query by tag; autocomplete; merge; CSV import/export) AND properties (typed metadata fields — text, number, date, boolean, url, user, organization, select, multi_select — with per-entity values, groups, and versioned entities like model_version/app_version). Use when organizing entities with tags, building hierarchical namespaces, defining typed metadata fields, setting property values on projects/models/apps, finding entities by tag, bulk-tagging during onboarding, or migrating taxonomy across environments.\n---\n\n# Domino Tags and Properties Skill\n\n## Description\n\nThis skill covers Domino's Taxonomy API, which manages two complementary\nmetadata systems for organizing entities (projects, models, datasets, apps,\nproject templates, NetApp volumes):\n\n- **Tags** — hierarchical labels grouped into namespaces. An entity either has\n  a tag or it doesn't.\n- **Properties** — typed metadata *fields* (`text`, `number`, `date`,\n  `select`, …), each holding a value per entity.\n\nIt documents every public endpoint with curl examples that work today against\na Domino cluster where the taxonomy service is enabled. Properties are covered\nin depth in [PROPERTIES.md](./PROPERTIES.md) (definitions) and\n[PROPERTY-VALUES.md](./PROPERTY-VALUES.md) (per-entity values).\n\n## Activation\n\nActivate this skill when the user wants to:\n\n- Tag a project, model, dataset, app, project template, or NetApp volume\n- Find all entities that share a tag, or query by multiple tags\n- Build a hierarchical taxonomy (namespaces with nested tags)\n- Bulk-tag entities during onboarding\n- Migrate a taxonomy tree across Domino environments (CSV export/import)\n- Merge duplicate tags\n- Tune autocomplete results in a tagging UI\n- Define typed metadata fields (properties) — e.g. a `Budget` number, a\n  `Review Date`, an `Owner` user, or a `Status` single-select\n- Set, read, or clear property values on an entity (incl. versioned entities\n  like `model_version` / `app_version`)\n- Group properties or manage property definitions across a deployment\n\n## Configuration\n\nAuth via the local access-token endpoint. Never use `DOMINO_USER_API_KEY`.\n\n```bash\nTOKEN=$(curl -s http://localhost:8899/access-token)\n# Taxonomy is served through the Domino API host gateway.\nBASE=\"$DOMINO_API_HOST/api/taxonomy/v1\"\nH=\"Authorization: Bearer $TOKEN\"\n```\n\n## Key Concepts\n\n| Concept | Description |\n|---------|-------------|\n| **Namespace** | Top-level group for **tags** (e.g. `Indication`, `Analysis`). Has `label`, optional `description`, and `allowMultipleAssignments` flag. |\n| **Tag** | A label inside a namespace. Can be hierarchical via `parentId` (e.g. `Clinical_Data / SDTM`). Has `label`, `namespaceId`, optional `description` and `parentId`, and `status` (`active` / `inactive`). |\n| **Property** | A typed metadata *field* — has a `label`, a `type` (`text`, `number`, `date`, `boolean`, `url`, `user`, `organization`, `user_or_org`, `select`, `multi_select`), a set of `allowedEntities`, an optional `groupName`, and (for select types) `allowedValues`. See [PROPERTIES.md](./PROPERTIES.md). |\n| **Property value** | The typed value a property holds for one specific entity, set via `PATCH /property-values`. See [PROPERTY-VALUES.md](./PROPERTY-VALUES.md). |\n| **Property group** | Free-form `groupName` string that buckets properties in the values view; ungrouped properties fall under `Miscellaneous`. |\n| **EntityType** | Enum over entities. Tags apply to `dataset`, `project`, `project_template`, `model`, `app`, `netapp_volume`. Properties additionally support the *versioned* types `model_version` and `app_version`. |\n| **`allowMultipleAssignments`** | (Tags) When `true`, an entity can hold multiple tags from the same namespace. When `false`, applying a new tag from the namespace replaces any existing one. |\n| **Taxonomy tree** | The full nested view: namespaces → root tags → child tags. Returned by `GET /taxonomy`. |\n| **Limits** | `GET /config` returns `maxDepth` (max tag nesting), `maxLabelLength` (max characters per label), `maxSelectAllowedValuesCount` (max options on a select property), and `maxSelectAllowedValueLength` (max length of one option). |\n\n## Taxonomy API Reference\n\nAll endpoints are under `$BASE` (`/api/taxonomy/v1`). Authenticate every\nrequest with `Authorization: Bearer $TOKEN`.\n\n| Endpoint | Method | Purpose |\n|----------|--------|---------|\n| `/config` | GET | Get configuration limits |\n| `/taxonomy` | GET | Get full taxonomy tree (nested namespaces + tags) |\n| `/namespaces` | GET / POST | List / create namespaces |\n| `/namespaces/{namespaceId}` | GET / PUT / DELETE | Get / update / delete a namespace |\n| `/namespaces/bulk-delete` | POST | Bulk delete namespaces — see [BULK-OPS.md](./BULK-OPS.md) |\n| `/tags` | GET / POST | List / create tags |\n| `/tags/{tagId}` | GET / PUT / DELETE | Get / update / delete a tag |\n| `/tags/{tagId}/entities` | GET | List entities tagged with a tag |\n| `/tags/autocomplete` | GET | Autocomplete tag suggestions for a query |\n| `/tags/bulk-delete` | POST | Bulk delete tags — see [BULK-OPS.md](./BULK-OPS.md) |\n| `/rpc/merge-tags` | POST | Merge tags — see [BULK-OPS.md](./BULK-OPS.md) |\n| `/entities` | GET | Get entities by one or more tag IDs |\n| `/entity-tags` | GET / DELETE | Get tags for entities / delete all tags for an entity |\n| `/rpc/tag-entity` | POST | Tag an entity |\n| `/rpc/untag-entity` | POST | Remove specific tags from an entity |\n| `/rpc/export-to-file` | POST | Export taxonomy as CSV — see [IMPORT-EXPORT.md](./IMPORT-EXPORT.md) |\n| `/rpc/import-from-file` | POST | Import taxonomy from CSV — see [IMPORT-EXPORT.md](./IMPORT-EXPORT.md) |\n| `/rpc/validate-file` | POST | Validate a CSV before import — see [IMPORT-EXPORT.md](./IMPORT-EXPORT.md) |\n| `/properties` | GET / POST | List / create property definitions — see [PROPERTIES.md](./PROPERTIES.md) |\n| `/properties/{propertyId}` | GET / PUT / DELETE | Get / update / soft-delete a property — see [PROPERTIES.md](./PROPERTIES.md) |\n| `/property-groups` | GET | List distinct property group names — see [PROPERTIES.md](./PROPERTIES.md) |\n| `/property-values/{entityType}/{entityId}` | GET / PATCH / DELETE | Get / set-clear / delete-all property values for an entity — see [PROPERTY-VALUES.md](./PROPERTY-VALUES.md) |\n\n## Common Workflows\n\n### Workflow 1 — Tag a project (data scientist)\n\n```bash\nTOKEN=$(curl -s http://localhost:8899/access-token)\nBASE=\"$DOMINO_API_HOST/api/taxonomy/v1\"\nH=\"Authorization: Bearer $TOKEN\"\n\n# 1. Discover the tag you want to apply\ncurl -s -H \"$H\" \"$BASE/tags/autocomplete?q=clinical\" | python3 -m json.tool\n\n# 2. Apply it to your project\ncurl -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d \"{\\\"entityType\\\":\\\"project\\\",\\\"entityId\\\":\\\"$DOMINO_PROJECT_ID\\\",\\\"tagIds\\\":[\\\"<tag-id>\\\"]}\" \\\n  \"$BASE/rpc/tag-entity\"\n\n# 3. Verify\ncurl -s -H \"$H\" \"$BASE/entity-tags?entityType=project&entityIds=$DOMINO_PROJECT_ID\"\n```\n\n### Workflow 2 — Build a hierarchical taxonomy (governance admin)\n\n```bash\n# Create a namespace\nNS=$(curl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"label\":\"Analysis\",\"description\":\"Type of analysis\",\"allowMultipleAssignments\":false}' \\\n  \"$BASE/namespaces\" | python3 -c \"import sys,json; print(json.load(sys.stdin)['id'])\")\n\n# Create a parent tag\nPARENT=$(curl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d \"{\\\"label\\\":\\\"Interim\\\",\\\"namespaceId\\\":\\\"$NS\\\"}\" \\\n  \"$BASE/tags\" | python3 -c \"import sys,json; print(json.load(sys.stdin)['id'])\")\n\n# Create a child tag under it\ncurl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d \"{\\\"label\\\":\\\"Milestone_01\\\",\\\"namespaceId\\\":\\\"$NS\\\",\\\"parentId\\\":\\\"$PARENT\\\"}\" \\\n  \"$BASE/tags\"\n```\n\nTag depth is capped at `maxDepth` from `GET /config` (5 on most deployments).\n\n### Workflow 3 — Find all entities with a tag (discovery)\n\n```bash\n# Single tag\ncurl -s -H \"$H\" \"$BASE/tags/<tag-id>/entities\" | python3 -m json.tool\n\n# Multiple tags (intersection) — tagIds is a REPEATED query parameter, not comma-separated\ncurl -s -H \"$H\" \"$BASE/entities?tagIds=<tag-id-1>&tagIds=<tag-id-2>&entityType=project\"\n```\n\nBoth endpoints return paginated results with `meta.pagination.{total,limit,offset}`.\nPaginate with `?limit=50&offset=50`.\n\n> **Heads-up:** `tagIds` on `/entities` must be repeated per value\n> (`?tagIds=A&tagIds=B`). Comma-separating returns\n> `400 {\"message\":\"invalid tag ID: A,B\"}`. By contrast, `entityIds` on\n> `/entity-tags` *is* comma-separated. Yes, the convention is inconsistent.\n\n### Workflow 4 — Autocomplete in a tagging UI (discovery)\n\n```bash\ncurl -s -H \"$H\" \"$BASE/tags/autocomplete?q=clin\"\n```\n\nResponse:\n\n```json\n{\"items\":[\n  {\"id\":\"23ca6d78-...\",\"path\":\"Clinical_Data\"},\n  {\"id\":\"0b55bf67-...\",\"path\":\"Clinical_Data / SDTM\"},\n  {\"id\":\"57454f72-...\",\"path\":\"Clinical_Data / ADaM\"}\n]}\n```\n\n`path` shows the full hierarchy with ` / ` between levels — surface it\nverbatim in the UI to disambiguate same-named tags in different branches.\n\n## Namespaces\n\n```bash\n# List\ncurl -s -H \"$H\" \"$BASE/namespaces?limit=50&offset=0\"\n\n# Create (label required)\ncurl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"label\":\"Indication\",\"description\":\"Therapeutic area\",\"allowMultipleAssignments\":true}' \\\n  \"$BASE/namespaces\"\n# 201 → returns full Namespace including id, status, timestamps\n\n# Get one\ncurl -s -H \"$H\" \"$BASE/namespaces/<id>\"\n\n# Update (label and status both required)\ncurl -s -X PUT -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"label\":\"Indication\",\"description\":\"updated\",\"status\":\"active\",\"allowMultipleAssignments\":true}' \\\n  \"$BASE/namespaces/<id>\"\n\n# Delete — cascades through the namespace's tags and entity-tag bindings.\n# Returns 204 even on a non-empty namespace. There is no \"are you sure\" prompt.\n# Reach for `namespaces/bulk-delete` when removing several at once.\ncurl -s -X DELETE -H \"$H\" \"$BASE/namespaces/<id>\"\n# 204 No Content\n```\n\n## Tags\n\n```bash\n# List with optional filters\ncurl -s -H \"$H\" \"$BASE/tags?namespaceId=<ns>&limit=50\"\n\n# Create (label and namespaceId required, parentId optional for hierarchy)\ncurl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"label\":\"SDTM\",\"namespaceId\":\"<ns>\",\"description\":\"Study Data Tabulation Model\",\"parentId\":\"<parent-tag>\"}' \\\n  \"$BASE/tags\"\n\n# Get one — includes entityCount broken down by EntityType\ncurl -s -H \"$H\" \"$BASE/tags/<id>\"\n\n# Update (label required; you can change parentId to re-parent within the same namespace)\ncurl -s -X PUT -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"label\":\"SDTMv2\",\"description\":\"new desc\",\"status\":\"active\",\"parentId\":\"<new-parent>\"}' \\\n  \"$BASE/tags/<id>\"\n\n# Delete (single)\ncurl -s -X DELETE -H \"$H\" \"$BASE/tags/<id>\"\n# 204 No Content\n```\n\n## Entity Tags\n\n```bash\n# Tag an entity (entityType, entityId, tagIds[] all required)\ncurl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"entityType\":\"project\",\"entityId\":\"<project-id>\",\"tagIds\":[\"<tag-1>\",\"<tag-2>\"]}' \\\n  \"$BASE/rpc/tag-entity\"\n# 201 → {\"entityId\":\"...\",\"entityType\":\"project\",\"entityName\":\"...\",\"tags\":[...]}\n#\n# Constraint: if `tagIds` contains more than one tag from the SAME namespace,\n# that namespace must have `allowMultipleAssignments=true`. Otherwise:\n# 400 → {\"message\":\"namespace does not allow multiple tag assignments per entity\"}\n# To replace a tag in a single-assign namespace, send a separate request — the\n# new tag overwrites the prior one for that namespace.\n\n# Remove specific tags from an entity\ncurl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"entityType\":\"project\",\"entityId\":\"<project-id>\",\"tagIds\":[\"<tag-1>\"]}' \\\n  \"$BASE/rpc/untag-entity\"\n# 200 → {\"entityId\":\"...\",\"entityType\":\"project\",\"entityName\":\"...\",\"removedTagIds\":[...]}\n\n# Get tags for one or more entities (entityIds is comma-separated)\ncurl -s -H \"$H\" \"$BASE/entity-tags?entityType=project&entityIds=<id-1>,<id-2>\"\n# 200 → {\"data\":{\"<id-1>\":[Tag,...], \"<id-2>\":[Tag,...]}}\n\n# Remove ALL tags from an entity\ncurl -s -X DELETE -H \"$H\" \"$BASE/entity-tags?entityType=project&entityId=<id>\"\n# 200 → {\"removedCount\":N}\n```\n\n`entityType` must be one of: `dataset`, `project`, `project_template`,\n`model`, `app`, `netapp_volume`. Other values return 400.\n\n## Taxonomy Tree\n\n```bash\ncurl -s -H \"$H\" \"$BASE/taxonomy\" | python3 -m json.tool\n```\n\nReturns an array of `TreeNamespace` objects, each with nested `tags` of type\n`TreeTag`:\n\n```json\n[{\n  \"id\":\"821e1455-...\",\n  \"label\":\"Indication\",\n  \"description\":\"Therapeutic area\",\n  \"status\":\"active\",\n  \"allowMultipleAssignments\":false,\n  \"tags\":[\n    {\"id\":\"...\", \"label\":\"Oncology\", \"status\":\"active\", \"children\":[\n      {\"id\":\"...\", \"label\":\"Breast_Cancer\", \"status\":\"active\", \"children\":[]}\n    ]}\n  ]\n}]\n```\n\nUse this to render the full taxonomy in a UI in one call.\n\n## Config\n\n```bash\ncurl -s -H \"$H\" \"$BASE/config\"\n# {\"maxDepth\":5,\"maxLabelLength\":128,\"maxSelectAllowedValuesCount\":100,\"maxSelectAllowedValueLength\":2048}\n```\n\n| Field | Applies to |\n|-------|-----------|\n| `maxDepth` | Max tag nesting depth |\n| `maxLabelLength` | Max characters for a namespace/tag/property label (and property group name) |\n| `maxSelectAllowedValuesCount` | Max options on a `select`/`multi_select` property |\n| `maxSelectAllowedValueLength` | Max length of a single select option |\n\nSurface these limits in any UI that lets users create tags, namespaces, or\nproperties so the user gets immediate validation feedback.\n\n## Properties\n\nProperties are typed metadata *fields* — a complement to tags. Where a tag is\npresent-or-absent, a property holds a typed value per entity (`Budget = 50000`,\n`Review Date = 2026-01-31`, `Status = \"Approved\"`).\n\nTwo layers:\n\n1. **Definitions** — the field schema (`label`, `type`, `allowedEntities`,\n   optional `groupName` and `allowedValues`). Managed under `/properties`;\n   create/update/delete requires the Librarian or Admin role. Full reference:\n   [PROPERTIES.md](./PROPERTIES.md).\n2. **Values** — the value a property holds for a specific entity. Managed under\n   `/property-values/{entityType}/{entityId}`; permissions are per-entity, not\n   role-based. Full reference: [PROPERTY-VALUES.md](./PROPERTY-VALUES.md).\n\n### Workflow 5 — Define a property (governance admin)\n\n```bash\ncurl -s -X POST -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\n        \"label\":\"Review Status\",\n        \"groupName\":\"Governance\",\n        \"type\":\"select\",\n        \"allowedEntities\":[\"project\",\"model\"],\n        \"allowedValues\":[{\"value\":\"Draft\"},{\"value\":\"In Review\"},{\"value\":\"Approved\"}]\n      }' \\\n  \"$BASE/properties\"\n# 201 → full Property with id, status, timestamps\n```\n\n`type` is immutable after creation. `select`/`multi_select` require\n`allowedValues`; other types reject it. `project_template` is not allowed in\n`allowedEntities` — use `project` and it applies to templates too. See\n[PROPERTIES.md](./PROPERTIES.md).\n\n### Workflow 6 — Set property values on an entity (data scientist)\n\n```bash\n# See which properties apply and their current values\ncurl -s -H \"$H\" \"$BASE/property-values/project/$DOMINO_PROJECT_ID\" | python3 -m json.tool\n\n# Set several at once (best-effort batch: per-item failures don't abort)\ncurl -s -X PATCH -H \"$H\" -H \"Content-Type: application/json\" \\\n  -d '{\"items\":[\n        {\"propertyId\":\"<budget-id>\",\"value\":\"50000\"},\n        {\"propertyId\":\"<review-status-id>\",\"value\":\"Approved\"}\n      ]}' \\\n  \"$BASE/property-values/project/$DOMINO_PROJECT_ID\"\n```\n\n`multi_select` properties take a `values[]` array; all other types use `value`.\nAn empty `value` clears the property. Versioned entities (`model_version`,\n`app_version`) require a `?version=` query param. See\n[PROPERTY-VALUES.md](./PROPERTY-VALUES.md).\n\n## Bulk Operations and Tag Merging\n\nSee [BULK-OPS.md](./BULK-OPS.md) for `tags/bulk-delete`,\n`namespaces/bulk-delete`, and `rpc/merge-tags`.\n\n## Import / Export\n\nSee [IMPORT-EXPORT.md](./IMPORT-EXPORT.md) for `rpc/export-to-file`,\n`rpc/import-from-file`, and `rpc/validate-file` — useful for migrating a\ntaxonomy across Domino environments.\n\n## Best Practices\n\n- **One namespace per dimension.** Don't pile orthogonal concepts (e.g.\n  Indication and Analysis Type) into one namespace; separate so users can\n  filter cleanly.\n- **Use `allowMultipleAssignments=false`** for mutually exclusive concepts\n  (e.g. \"Phase\" — a project is in exactly one phase). Use `true` when an\n  entity can plausibly carry several values from the same namespace\n  (e.g. multiple \"Indication\" tags).\n- **Hierarchy via `parentId`** rather than encoding hierarchy into labels\n  (e.g. `Clinical_Data/SDTM`). This lets autocomplete and tree views render\n  the structure for you.\n- **Query `GET /config` once** at app startup and cache `maxLabelLength` /\n  `maxDepth` for client-side validation.\n- **Pin tag IDs, not labels.** Tag labels can be renamed via `PUT /tags/{id}`;\n  IDs are stable. Workflows that automate tagging should reference tag IDs.\n- **Discoverability**: use `GET /taxonomy` for full-tree views,\n  `GET /tags/autocomplete?q=...` for typeaheads, and\n  `GET /entities?tagIds=A&tagIds=B&entityType=...` (one `tagIds` per value,\n  not comma-separated) for filtered lists.\n\n## Troubleshooting\n\n### `Public api endpoint not found` (404)\n\nThe taxonomy service is not registered on the gateway you are calling. Two\ncommon causes:\n\n1. **Wrong base URL.** Taxonomy is served through the Domino API host gateway.\n   Ensure `BASE` is set to `$DOMINO_API_HOST/api/taxonomy/v1` and that\n   `$DOMINO_API_HOST` is populated (it is set automatically in Domino\n   workspaces, jobs, and apps).\n2. **Taxonomy not enabled on this deployment.** Older or stripped-down\n   deployments may not include the taxonomy microservice. Confirm with\n   your Domino administrator before working around this.\n\n### `400 Bad Request` on `POST /rpc/tag-entity`\n\nEnsure `entityType` is exactly one of:\n`dataset | project | project_template | model | app | netapp_volume`.\nCasing matters — `Project` and `PROJECT` will be rejected.\n\n### `400` on `POST /tags`\n\n`namespaceId` must reference an existing namespace, and the `label` must be\nnon-empty and ≤ `maxLabelLength` (from `/config`). If you intend to nest the\ntag, `parentId` must reference a tag in the same namespace.\n\n### Deleting a namespace removes its tags too\n\n`DELETE /namespaces/{id}` is a cascading delete: it removes the namespace,\nevery tag inside it, and every entity-tag binding pointing at those tags.\nThere is no \"namespace must be empty\" check — confirm with the user before\ncalling it against a shared cluster. `namespaces/bulk-delete` has the same\ncascade behavior across multiple IDs.\n\n## Documentation Reference\n\nBefore writing or verifying any API call, use the cluster swagger to confirm current endpoint paths and field names. Use public docs for workflow context and field explanations.\n\n**Taxonomy API base:** `$DOMINO_API_HOST/api/taxonomy/v1` (served through the\nDomino API host gateway; `$DOMINO_API_HOST` is populated automatically in\nworkspaces, jobs, and apps).\n\nFetch the taxonomy swagger spec (requires bearer token):\n```bash\nTOKEN=$(curl -s http://localhost:8899/access-token)\n\ncurl -H \"Authorization: Bearer $TOKEN\" \"$DOMINO_API_HOST/api/taxonomy/swagger/doc.json\"\n\n# Browser UI — use the external cluster URL (must be logged in):\n# https://<your-cluster>/api/taxonomy/swagger/index.html\n```\n\n**Public docs (workflow context and field explanations):**\n- [Taxonomy API guide](https://docs.dominodatalab.com/en/cloud/api_guide/fc6b7c/taxonomy-api/)\n- [PROPERTIES.md](./PROPERTIES.md) — property definitions (typed metadata fields)\n- [PROPERTY-VALUES.md](./PROPERTY-VALUES.md) — setting property values on entities\n- [BULK-OPS.md](./BULK-OPS.md) — bulk-delete + merge-tags + migration patterns\n- [IMPORT-EXPORT.md](./IMPORT-EXPORT.md) — CSV export/import for taxonomy migration\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}