Add or remove tags from task executions in batch operations.
Overview
Task tags provide flexible categorization and workflow state tracking for task executions.
Tags enable custom workflows like review/approval processes, quality assurance, and
business-specific categorization. This endpoint supports batch operations to efficiently
add or remove multiple tags in a single request.
What are Task Tags?
Task tags are key-value metadata attached to task executions for:
Workflow state tracking: ‘reviewed’, ‘approved’, ‘rejected’
Audit trails: Track who reviewed what and when (via tag_metadata)
Batch Operations
This endpoint accepts an array of tag operations in a single request:
operation=‘add’: Creates new tag (idempotent - returns ‘already_exists’ if duplicate)
operation=‘remove’: Soft-deletes tag (sets status=‘deleted’)
Mixed operations: Can add and remove different tags in same request
Atomic processing: All operations succeed or all fail
Idempotency
Adding an existing tag returns status=‘already_exists’ without error.
Removing a non-existent tag returns status=‘not_found’ without error.
This enables safe retries and prevents duplicate tag creation.
Soft Delete Behavior
Tags are never hard-deleted. Removal sets status=‘deleted’ and records:
updated_at: Timestamp of deletion
modified_by: User/service that performed deletion
Soft-deleted tags are excluded from all list queries automatically.
Use Cases
Human-in-the-loop workflows: Tag tasks as ‘reviewed’ after manual inspection
Approval chains: Track ‘pending_approval’, ‘approved’, ‘rejected’ states
Quality control: Flag suspicious outputs with ‘requires_review’ tag
Custom business logic: Apply domain-specific tags for routing/filtering
Error Scenarios
404 Not Found: flow_execution_id doesn’t exist or belongs to different organization
403 Forbidden: User lacks permission to modify tags in this organization
400 Bad Request: Invalid operation value or malformed request
Performance Notes
Batch operations are optimized with a single database transaction.
All tag additions/removals commit atomically. WebSocket notifications
are sent after commit to notify connected clients of tag changes.
Related Endpoints
GET /task-tags - List tags for a flow execution
GET /task-executions - View task executions with their tags
PUT /task-executions - Update task execution (separate from tagging)
Array of tag operations to perform in a single atomic transaction. Each item specifies an 'add' or 'remove' operation for a specific task. Operations processed sequentially; all succeed or all fail together.
Batch benefits:
Single database transaction for consistency
Reduced network overhead (one request vs many)
Atomic operations (no partial failures)
Mixed operations supported:
Add tags to multiple tasks
Remove tags from multiple tasks
Add and remove different tags in same request
Practical limit: 1-100 operations per request for performance. For bulk tagging beyond 100 operations, split into multiple requests.
Array of operation results in request array order. Each element corresponds to the tag operation at the same index in the request.
Response structure:
Length: Always equals request.tags length
Order: Preserves request order (response[i] is result of request.tags[i])
Content: Each item contains 'status' field indicating operation outcome
Example mapping:
Request: [add_tag1, remove_tag2, add_tag3]
Response: [status1, status2, status3]
All operations complete (no partial failures). Check each status to determine individual operation outcomes. Use array index to match operations with results.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SuperAI Flows","description":"Build reliable, scalable workflows that orchestrate AI models, data processing, and business logic through a simple API.","colors":{"primary":"#7443ff","light":"#9775f7","dark":"#6c40f5"},"logo":{"light":"https://mintcdn.com/superai-flows-docs/mOFmLJuUNWWCPrgW/logo/light.svg?fit=max\u0026auto=format\u0026n=mOFmLJuUNWWCPrgW\u0026q=85\u0026s=763a91d73e6886f99fbebba85459ee15","dark":"https://mintcdn.com/superai-flows-docs/mOFmLJuUNWWCPrgW/logo/dark.svg?fit=max\u0026auto=format\u0026n=mOFmLJuUNWWCPrgW\u0026q=85\u0026s=5e03ccaedeb7b9890d260cd5f28ba690","href":"https://flows.super.ai"},"favicon":"https://mintcdn.com/superai-flows-docs/mOFmLJuUNWWCPrgW/favicon.png?fit=max\u0026auto=format\u0026n=mOFmLJuUNWWCPrgW\u0026q=85\u0026s=a54a72f5610b7af45f895302bd9fec95","navbar":{"links":[{"href":"mailto:support@super.ai","label":"Support"},{"href":"https://status.super.ai","label":"Status"}],"primary":{"type":"button","label":"Dashboard","href":"https://flows.super.ai"}},"footer":{"socials":{"website":"https://super.ai","x":"https://x.com/mysuperai","linkedin":"https://www.linkedin.com/company/mysuperai"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"superai-flows-docs","hasAudioNarration":false,"actualSubdomain":"superai-flows-docs","customDomains":["docs.flows.super.ai"],"gitSource":{"type":"github","owner":"mysuperai","repo":"superai-flows-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"4c020797-e5c5-4927-8e18-f9ead2828ae7","liveDeploymentHistoryId":"6adb511a124faf20fe6181b8","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb511a124faf20fe6181b8"},"entitlements":{},"buildId":"6adb511a124faf20fe6181b8","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API Reference","count":159},{"language":"default","tag":"Endpoints","count":155},{"language":"default","tag":"integrations","count":37},{"language":"default","tag":"flows","count":31},{"language":"default","tag":"organizations","count":15},{"language":"default","tag":"plugins","count":11},{"language":"default","tag":"auth","count":9},{"language":"default","tag":"service-accounts","count":9},{"language":"default","tag":"flow-executions","count":8},{"language":"default","tag":"human-review-tasks","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/task-tags/add-or-remove-task-tags-in-batch","slug":"/api-reference/task-tags/add-or-remove-task-tags-in-batch","pageMetadata":{"title":"Add or remove task tags in batch","description":"Add or remove tags from task executions in batch operations.\n\n**Overview**\nTask tags provide flexible categorization and workflow state tracking for task executions.\nTags enable custom workflows like review/approval processes, quality assurance, and\nbusiness-specific categorization. This endpoint supports batch operations to efficiently\nadd or remove multiple tags in a single request.\n\n**What are Task Tags?**\nTask tags are key-value metadata attached to task executions for:\n- Workflow state tracking: 'reviewed', 'approved', 'rejected'\n- Quality assurance: 'quality_checked', 'flagged', 'verified'\n- Custom categorization: 'priority_high', 'customer_vip', 'requires_attention'\n- Audit trails: Track who reviewed what and when (via tag_metadata)\n\n**Batch Operations**\nThis endpoint accepts an array of tag operations in a single request:\n- operation='add': Creates new tag (idempotent - returns 'already_exists' if duplicate)\n- operation='remove': Soft-deletes tag (sets status='deleted')\n- Mixed operations: Can add and remove different tags in same request\n- Atomic processing: All operations succeed or all fail\n\n**Idempotency**\nAdding an existing tag returns status='already_exists' without error.\nRemoving a non-existent tag returns status='not_found' without error.\nThis enables safe retries and prevents duplicate tag creation.\n\n**Soft Delete Behavior**\nTags are never hard-deleted. Removal sets status='deleted' and records:\n- updated_at: Timestamp of deletion\n- modified_by: User/service that performed deletion\nSoft-deleted tags are excluded from all list queries automatically.\n\n**Use Cases**\n1. Human-in-the-loop workflows: Tag tasks as 'reviewed' after manual inspection\n2. Approval chains: Track 'pending_approval', 'approved', 'rejected' states\n3. Quality control: Flag suspicious outputs with 'requires_review' tag\n4. Custom business logic: Apply domain-specific tags for routing/filtering\n\n**Error Scenarios**\n- 404 Not Found: flow_execution_id doesn't exist or belongs to different organization\n- 403 Forbidden: User lacks permission to modify tags in this organization\n- 400 Bad Request: Invalid operation value or malformed request\n\n**Performance Notes**\nBatch operations are optimized with a single database transaction.\nAll tag additions/removals commit atomically. WebSocket notifications\nare sent after commit to notify connected clients of tag changes.\n\n**Related Endpoints**\n- GET /task-tags - List tags for a flow execution\n- GET /task-executions - View task executions with their tags\n- PUT /task-executions - Update task execution (separate from tagging)","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/task-tags","href":"/api-reference/task-tags/add-or-remove-task-tags-in-batch","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n li: \"li\",\n ol: \"ol\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Add or remove tags from task executions in batch operations.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Overview\"\n }), \"\\nTask tags provide flexible categorization and workflow state tracking for task executions.\\nTags enable custom workflows like review/approval processes, quality assurance, and\\nbusiness-specific categorization. This endpoint supports batch operations to efficiently\\nadd or remove multiple tags in a single request.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"What are Task Tags?\"\n }), \"\\nTask tags are key-value metadata attached to task executions for:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Workflow state tracking: ‘reviewed’, ‘approved’, ‘rejected’\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Quality assurance: ‘quality_checked’, ‘flagged’, ‘verified’\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Custom categorization: ‘priority_high’, ‘customer_vip’, ‘requires_attention’\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Audit trails: Track who reviewed what and when (via tag_metadata)\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Batch Operations\"\n }), \"\\nThis endpoint accepts an array of tag operations in a single request:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"operation=‘add’: Creates new tag (idempotent - returns ‘already_exists’ if duplicate)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"operation=‘remove’: Soft-deletes tag (sets status=‘deleted’)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Mixed operations: Can add and remove different tags in same request\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Atomic processing: All operations succeed or all fail\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Idempotency\"\n }), \"\\nAdding an existing tag returns status=‘already_exists’ without error.\\nRemoving a non-existent tag returns status=‘not_found’ without error.\\nThis enables safe retries and prevents duplicate tag creation.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Soft Delete Behavior\"\n }), \"\\nTags are never hard-deleted. Removal sets status=‘deleted’ and records:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"updated_at: Timestamp of deletion\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"modified_by: User/service that performed deletion\\nSoft-deleted tags are excluded from all list queries automatically.\"\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Use Cases\"\n })\n }), \"\\n\", _jsxs(_components.ol, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Human-in-the-loop workflows: Tag tasks as ‘reviewed’ after manual inspection\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Approval chains: Track ‘pending_approval’, ‘approved’, ‘rejected’ states\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Quality control: Flag suspicious outputs with ‘requires_review’ tag\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"Custom business logic: Apply domain-specific tags for routing/filtering\"\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Error Scenarios\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"404 Not Found: flow_execution_id doesn’t exist or belongs to different organization\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"403 Forbidden: User lacks permission to modify tags in this organization\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"400 Bad Request: Invalid operation value or malformed request\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Performance Notes\"\n }), \"\\nBatch operations are optimized with a single database transaction.\\nAll tag additions/removals commit atomically. WebSocket notifications\\nare sent after commit to notify connected clients of tag changes.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Related Endpoints\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"GET /task-tags - List tags for a flow execution\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"GET /task-executions - View task executions with their tags\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"PUT /task-executions - Update task execution (separate from tagging)\"\n }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Add or remove task tags in batch","description":"Add or remove tags from task executions in batch operations.\n\n**Overview**\nTask tags provide flexible categorization and workflow state tracking for task executions.\nTags enable custom workflows like review/approval processes, quality assurance, and\nbusiness-specific categorization. This endpoint supports batch operations to efficiently\nadd or remove multiple tags in a single request.\n\n**What are Task Tags?**\nTask tags are key-value metadata attached to task executions for:\n- Workflow state tracking: 'reviewed', 'approved', 'rejected'\n- Quality assurance: 'quality_checked', 'flagged', 'verified'\n- Custom categorization: 'priority_high', 'customer_vip', 'requires_attention'\n- Audit trails: Track who reviewed what and when (via tag_metadata)\n\n**Batch Operations**\nThis endpoint accepts an array of tag operations in a single request:\n- operation='add': Creates new tag (idempotent - returns 'already_exists' if duplicate)\n- operation='remove': Soft-deletes tag (sets status='deleted')\n- Mixed operations: Can add and remove different tags in same request\n- Atomic processing: All operations succeed or all fail\n\n**Idempotency**\nAdding an existing tag returns status='already_exists' without error.\nRemoving a non-existent tag returns status='not_found' without error.\nThis enables safe retries and prevents duplicate tag creation.\n\n**Soft Delete Behavior**\nTags are never hard-deleted. Removal sets status='deleted' and records:\n- updated_at: Timestamp of deletion\n- modified_by: User/service that performed deletion\nSoft-deleted tags are excluded from all list queries automatically.\n\n**Use Cases**\n1. Human-in-the-loop workflows: Tag tasks as 'reviewed' after manual inspection\n2. Approval chains: Track 'pending_approval', 'approved', 'rejected' states\n3. Quality control: Flag suspicious outputs with 'requires_review' tag\n4. Custom business logic: Apply domain-specific tags for routing/filtering\n\n**Error Scenarios**\n- 404 Not Found: flow_execution_id doesn't exist or belongs to different organization\n- 403 Forbidden: User lacks permission to modify tags in this organization\n- 400 Bad Request: Invalid operation value or malformed request\n\n**Performance Notes**\nBatch operations are optimized with a single database transaction.\nAll tag additions/removals commit atomically. WebSocket notifications\nare sent after commit to notify connected clients of tag changes.\n\n**Related Endpoints**\n- GET /task-tags - List tags for a flow execution\n- GET /task-executions - View task executions with their tags\n- PUT /task-executions - Update task execution (separate from tagging)","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/task-tags","href":"/api-reference/task-tags/add-or-remove-task-tags-in-batch","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Add or remove tags from task executions in batch operations.\n\n**Overview**\nTask tags provide flexible categorization and workflow state tracking for task executions.\nTags enable custom workflows like review/approval processes, quality assurance, and\nbusiness-specific categorization. This endpoint supports batch operations to efficiently\nadd or remove multiple tags in a single request.\n\n**What are Task Tags?**\nTask tags are key-value metadata attached to task executions for:\n- Workflow state tracking: 'reviewed', 'approved', 'rejected'\n- Quality assurance: 'quality_checked', 'flagged', 'verified'\n- Custom categorization: 'priority_high', 'customer_vip', 'requires_attention'\n- Audit trails: Track who reviewed what and when (via tag_metadata)\n\n**Batch Operations**\nThis endpoint accepts an array of tag operations in a single request:\n- operation='add': Creates new tag (idempotent - returns 'already_exists' if duplicate)\n- operation='remove': Soft-deletes tag (sets status='deleted')\n- Mixed operations: Can add and remove different tags in same request\n- Atomic processing: All operations succeed or all fail\n\n**Idempotency**\nAdding an existing tag returns status='already_exists' without error.\nRemoving a non-existent tag returns status='not_found' without error.\nThis enables safe retries and prevents duplicate tag creation.\n\n**Soft Delete Behavior**\nTags are never hard-deleted. Removal sets status='deleted' and records:\n- updated_at: Timestamp of deletion\n- modified_by: User/service that performed deletion\nSoft-deleted tags are excluded from all list queries automatically.\n\n**Use Cases**\n1. Human-in-the-loop workflows: Tag tasks as 'reviewed' after manual inspection\n2. Approval chains: Track 'pending_approval', 'approved', 'rejected' states\n3. Quality control: Flag suspicious outputs with 'requires_review' tag\n4. Custom business logic: Apply domain-specific tags for routing/filtering\n\n**Error Scenarios**\n- 404 Not Found: flow_execution_id doesn't exist or belongs to different organization\n- 403 Forbidden: User lacks permission to modify tags in this organization\n- 400 Bad Request: Invalid operation value or malformed request\n\n**Performance Notes**\nBatch operations are optimized with a single database transaction.\nAll tag additions/removals commit atomically. WebSocket notifications\nare sent after commit to notify connected clients of tag changes.\n\n**Related Endpoints**\n- GET /task-tags - List tags for a flow execution\n- GET /task-executions - View task executions with their tags\n- PUT /task-executions - Update task execution (separate from tagging)","operationId":"patch_flow_task_tags_api_task_tags_patch","requestBody":"30c189d5-3ca0-4408-880d-703bd685299d","responses":{"200":"aff2a165-7841-4466-9a4d-c8062d829e39","400":"391f309f-f4b8-4b27-ac92-a4ae56d7a767","404":"1378facc-4ad2-4cd2-8152-08d9d450d0c4","422":"2aaaf2c7-2361-43ab-9cd5-878ab35f70b9","500":"b2aabc24-daac-4dc3-8e35-d318ea4a7c9c"},"security":["6d5bfe7a-c69d-41ee-8cbb-1cfd0661a8d7","2677162a-5fba-4484-b60a-2ce6b144233b"],"summary":"Add or remove task tags in batch","tags":["task-tags"],"method":"patch","type":"path","servers":["4d0b7ba2-10f8-42a9-8f2d-c56b9c660af5"],"path":"/api/task-tags","baseUrlOptions":["https://flows.super.ai"],"title":"Add or remove task tags in batch","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"description":"Batch request to add or remove multiple task execution tags.\n\nSupports mixed operations (add and remove) in a single atomic transaction.\nAll operations succeed together or all fail. Efficient for bulk tagging.","properties":{"tags":{"description":"Array of tag operations to perform in a single atomic transaction. Each item specifies an 'add' or 'remove' operation for a specific task. Operations processed sequentially; all succeed or all fail together. \n\nBatch benefits:\n- Single database transaction for consistency\n- Reduced network overhead (one request vs many)\n- Atomic operations (no partial failures)\n\nMixed operations supported:\n- Add tags to multiple tasks\n- Remove tags from multiple tasks\n- Add and remove different tags in same request\n\nPractical limit: 1-100 operations per request for performance. For bulk tagging beyond 100 operations, split into multiple requests.","examples":[[{"flow_execution_id":"123e4567-e89b-12d3-a456-426614174000","operation":"add","tag":"reviewed","tag_metadata":{"reviewer":"user@example.com"},"tag_type":"review_status","task_name":"extract_data"},{"flow_execution_id":"123e4567-e89b-12d3-a456-426614174000","operation":"remove","tag":"pending_review","tag_type":"review_status","task_name":"extract_data"}]],"items":{"description":"Single tag operation in a batch request.\n\nRepresents one add or remove operation for a task execution tag.\nBatch multiple operations in a single PATCH request for efficiency.","properties":{"flow_execution_id":{"description":"Unique identifier of the flow execution containing the target task. Used to locate task execution and determine organization scope. Must exist and belong to user's organization or request fails with 404. All tags are scoped to a specific flow execution.","examples":["123e4567-e89b-12d3-a456-426614174000"],"format":"uuid","title":"Flow Execution Id","type":"string","isRequired":true,"uniqueKey":"tags.items.[INDEX].flow_execution_id","typeLabel":"string\u003cuuid>"},"operation":{"description":"Tag operation to perform on the specified task execution. \n\n'add': Create new tag (idempotent - no error if already exists). Server generates UUID, timestamps, and organization_id automatically. Returns status='added' on success or status='already_exists' if duplicate. \n\n'remove': Soft-delete existing tag by setting status='deleted'. Preserves tag record with deletion metadata (updated_at, modified_by). Returns status='removed' on success or status='not_found' if missing. \n\nNote: Tags are never hard-deleted for audit trail compliance.","enum":["add","remove"],"examples":["add","remove"],"title":"Operation","type":"string","isRequired":true,"uniqueKey":"tags.items.[INDEX].operation","typeLabel":"enum\u003cstring>"},"tag":{"description":"Tag value to add or remove from the task execution. Free-form string identifier for categorization or workflow state. On 'add', surrounding whitespace is stripped before storing, so no new stored tag carries padding. On 'remove', the value is matched byte-for-byte — rows written before stripping was introduced may carry padding, and stripping would make them unremovable. Case-sensitive; 'reviewed' and 'Reviewed' are different tags. Combine with tag_type and tag_metadata for rich categorization. \n\nCommon patterns:\n- Simple: 'reviewed', 'approved', 'rejected'\n- Namespaced: 'priority:high', 'customer:acme'\n- Descriptive: 'requires_human_review', 'quality_flagged'\n\nTag uniqueness: (flow_execution_id, task_name, tag, tag_type, tag_metadata) forms composite unique key. Same tag with different metadata creates separate records.","examples":["reviewed","approved","priority_high","requires_attention"],"maxLength":200,"minLength":1,"title":"Tag","type":"string","isRequired":true,"uniqueKey":"tags.items.[INDEX].tag","typeLabel":"string"},"tag_type":{"description":"Category or namespace for the tag value. Groups related tags for filtering and organization. Case-sensitive; used for tag classification in UI and queries. \n\nCommon types:\n- 'review_status': Workflow states ('reviewed', 'approved', 'rejected')\n- 'quality': QA flags ('quality_checked', 'flagged', 'verified')\n- 'priority': Business priority ('high', 'medium', 'low')\n- 'approval': Approval workflow ('pending', 'approved', 'denied')\n- 'custom': Domain-specific categories\n\nBest practice: Use consistent tag_type values across your organization to enable filtering and reporting.","examples":["review_status","quality","priority","approval","custom"],"maxLength":100,"minLength":1,"title":"Tag Type","type":"string","isRequired":true,"uniqueKey":"tags.items.[INDEX].tag_type","typeLabel":"string"},"task_name":{"description":"Name of the task to tag, as defined in flow definition YAML. Case-sensitive identifier matching task name in flow configuration. Task must exist within the specified flow_execution_id. Tags are attached to (flow_execution_id, task_name) pair. \n\nExamples: 'send_email', 'extract_data', 'validate_document'","examples":["send_email","extract_data","validate_document"],"maxLength":200,"minLength":1,"title":"Task Name","type":"string","isRequired":true,"uniqueKey":"tags.items.[INDEX].task_name","typeLabel":"string"},"tag_metadata":{"oneOf":[{"title":"Tag Metadata","description":"Optional structured metadata providing context for the tag. Can be object, array, or primitive types. NULL if no additional context needed. \n\nCommon patterns:\n- Reviewer info: {'reviewer': 'user@example.com', 'reviewed_at': '2025-01-23T10:30:00Z'}\n- Approval details: {'approver': 'manager@example.com', 'notes': 'Approved with conditions'}\n- Quality metrics: {'confidence_score': 0.95, 'flagged_reason': 'Low confidence'}\n- Custom data: Any JSON-serializable structure relevant to your workflow\n\nNote: tag_metadata is part of the composite unique key. Same tag with different metadata creates multiple tag records.","example":{"notes":"Looks good","reviewer":"user@example.com"},"uniqueKey":"tags.items.[INDEX].tag_metadata.oneOf.0","typeLabel":"any"},{"type":"null","title":"Tag Metadata","description":"Optional structured metadata providing context for the tag. Can be object, array, or primitive types. NULL if no additional context needed. \n\nCommon patterns:\n- Reviewer info: {'reviewer': 'user@example.com', 'reviewed_at': '2025-01-23T10:30:00Z'}\n- Approval details: {'approver': 'manager@example.com', 'notes': 'Approved with conditions'}\n- Quality metrics: {'confidence_score': 0.95, 'flagged_reason': 'Low confidence'}\n- Custom data: Any JSON-serializable structure relevant to your workflow\n\nNote: tag_metadata is part of the composite unique key. Same tag with different metadata creates multiple tag records.","example":{"notes":"Looks good","reviewer":"user@example.com"},"uniqueKey":"tags.items.[INDEX].tag_metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"tags.items.[INDEX].tag_metadata","typeLabel":"any | null"}},"required":["operation","flow_execution_id","task_name","tag","tag_type"],"title":"PatchFlowTaskTagsRequestItem","type":"object","uniqueKey":"tags.items.[INDEX]","typeLabel":"PatchFlowTaskTagsRequestItem · object"},"maxItems":100,"minItems":1,"title":"Tags","type":"array","isRequired":true,"uniqueKey":"tags","typeLabel":"PatchFlowTaskTagsRequestItem · object[]"}},"required":["tags"],"title":"PatchFlowTaskTagsRequest","type":"object","uniqueKey":"","typeLabel":"PatchFlowTaskTagsRequest · object"},"examples":{"Example":{"title":"Example","value":{"tags":[{"flow_execution_id":"123e4567-e89b-12d3-a456-426614174000","operation":"add","tag":"reviewed","tag_metadata":{"reviewer":"user@example.com"},"tag_type":"review_status","task_name":"extract_data"},{"flow_execution_id":"123e4567-e89b-12d3-a456-426614174000","operation":"remove","tag":"pending_review","tag_type":"review_status","task_name":"extract_data"}]}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"aff2a165-7841-4466-9a4d-c8062d829e39":{"content":{"application/json":{"schema":{"description":"Response from batch tag operations.\n\nReturns status for each operation in request array order.\nArray length matches request array length (1:1 correspondence).","properties":{"tags":{"description":"Array of operation results in request array order. Each element corresponds to the tag operation at the same index in the request. \n\nResponse structure:\n- Length: Always equals request.tags length\n- Order: Preserves request order (response[i] is result of request.tags[i])\n- Content: Each item contains 'status' field indicating operation outcome\n\nExample mapping:\nRequest: [add_tag1, remove_tag2, add_tag3]\nResponse: [status1, status2, status3]\n\nAll operations complete (no partial failures). Check each status to determine individual operation outcomes. Use array index to match operations with results.","examples":[[{"status":"added"},{"status":"removed"},{"status":"already_exists"}]],"items":{"description":"Result of a single tag operation in a batch request.\n\nIndicates success or idempotent outcome for each operation.\nResponse array matches request array order (1:1 correspondence).","properties":{"status":{"description":"Outcome of the tag operation. Idempotent operations return success status even if no change occurred. \n\nStatus values:\n- 'added': Tag successfully created (operation='add'). New tag record inserted with status='active'. \n- 'removed': Tag successfully soft-deleted (operation='remove'). Tag record updated with status='deleted' and deletion metadata. \n- 'already_exists': Add operation found existing identical tag (operation='add'). No change made; existing tag remains active. Idempotent success. \n- 'not_found': Remove operation found no matching tag (operation='remove'). No change made; tag already absent or deleted. Idempotent success. \n\nNote: All statuses indicate successful processing. No 'error' status exists; errors raise HTTP 4xx/5xx responses instead. \n\nIdempotency guarantee: Same request produces same result when repeated. Safe to retry on network failures without duplicate tags or errors.","enum":["added","removed","already_exists","not_found"],"examples":["added","removed","already_exists","not_found"],"title":"Status","type":"string","isRequired":true,"uniqueKey":"tags.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"required":["status"],"title":"PatchFlowTaskTagsResponseItem","type":"object","uniqueKey":"tags.items.[INDEX]","typeLabel":"PatchFlowTaskTagsResponseItem · object"},"title":"Tags","type":"array","isRequired":true,"uniqueKey":"tags","typeLabel":"PatchFlowTaskTagsResponseItem · object[]"}},"required":["tags"],"title":"PatchFlowTaskTagsResponse","type":"object","uniqueKey":"","typeLabel":"PatchFlowTaskTagsResponse · object"},"examples":{"Example":{"title":"Example","value":{"tags":[{"status":"added"},{"status":"removed"},{"status":"already_exists"}]}}},"exampleType":"generated"}},"description":"Task tags successfully updated","exampleType":"generated"},"391f309f-f4b8-4b27-ac92-a4ae56d7a767":{"content":{"application/json":{"schema":{"description":"Standard API error response structure.\n\nAll error responses from the API follow this format, ensuring\nconsistent error handling for API consumers.\n\nExample:\n {\n \"error\": {\n \"message\": \"Flow not found\",\n \"code\": \"not_found\"\n },\n \"request_id\": \"01K8KABR6S16YETA2SZPVBS9SP\"\n }","examples":[{"error":{"code":"not_found","message":"Resource not found"},"request_id":"01K8KABR6S16YETA2SZPVBS9SP"}],"properties":{"error":{"description":"Standard error detail structure.\n\nThis model matches the error format returned by the centralized\nexception handlers in app/api/errors/handlers.py.","properties":{"message":{"description":"Human-readable error message","title":"Message","type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"oneOf":[{"type":"string","title":"Code","description":"Machine-readable error code for programmatic handling","uniqueKey":"error.code.oneOf.0","typeLabel":"string"},{"type":"null","title":"Code","description":"Machine-readable error code for programmatic handling","uniqueKey":"error.code.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.code","typeLabel":"string | null"},"details":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"error.details.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.0","typeLabel":"string[]"},{"type":"array","items":{"additionalProperties":true,"type":"object","uniqueKey":"error.details.oneOf.1.items.[INDEX]","typeLabel":"object"},"title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.1","typeLabel":"Details · object[]"},{"type":"object","title":"Details","description":"Additional error context, validation errors, or debugging information","additionalProperties":true,"uniqueKey":"error.details.oneOf.2","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.3","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"string[] | Details · object[] | Details · object | null"}},"required":["message"],"title":"ErrorDetail","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorDetail · object"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Unique request identifier in ULID format for debugging and support. Example: 01K8KABR6S16YETA2SZPVBS9SP","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Unique request identifier in ULID format for debugging and support. Example: 01K8KABR6S16YETA2SZPVBS9SP","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"}},"required":["error"],"title":"ErrorResponse","type":"object","uniqueKey":"","typeLabel":"ErrorResponse · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"not_found","message":"Resource not found"},"request_id":"01K8KABR6S16YETA2SZPVBS9SP"}}},"exampleType":"generated"}},"description":"Bad Request - Invalid tag operation or missing required fields","exampleType":"generated"},"1378facc-4ad2-4cd2-8152-08d9d450d0c4":{"content":{"application/json":{"examples":{"flow_not_found":{"title":"flow_not_found","value":{"error":{"code":"not_found","message":"Flow not found"},"request_id":"01K8KACP7D2XFGHJ9KLM4NPQR8"}},"resource_not_found":{"title":"resource_not_found","value":{"error":{"code":"not_found","message":"Resource not found"},"request_id":"01K8KABR6S16YETA2SZPVBS9SP"}}},"schema":{"description":"Standard API error response structure.\n\nAll error responses from the API follow this format, ensuring\nconsistent error handling for API consumers.\n\nExample:\n {\n \"error\": {\n \"message\": \"Flow not found\",\n \"code\": \"not_found\"\n },\n \"request_id\": \"01K8KABR6S16YETA2SZPVBS9SP\"\n }","examples":[{"error":{"code":"not_found","message":"Resource not found"},"request_id":"01K8KABR6S16YETA2SZPVBS9SP"}],"properties":{"error":{"description":"Standard error detail structure.\n\nThis model matches the error format returned by the centralized\nexception handlers in app/api/errors/handlers.py.","properties":{"message":{"description":"Human-readable error message","title":"Message","type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"oneOf":[{"type":"string","title":"Code","description":"Machine-readable error code for programmatic handling","uniqueKey":"error.code.oneOf.0","typeLabel":"string"},{"type":"null","title":"Code","description":"Machine-readable error code for programmatic handling","uniqueKey":"error.code.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.code","typeLabel":"string | null"},"details":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"error.details.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.0","typeLabel":"string[]"},{"type":"array","items":{"additionalProperties":true,"type":"object","uniqueKey":"error.details.oneOf.1.items.[INDEX]","typeLabel":"object"},"title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.1","typeLabel":"Details · object[]"},{"type":"object","title":"Details","description":"Additional error context, validation errors, or debugging information","additionalProperties":true,"uniqueKey":"error.details.oneOf.2","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.3","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"string[] | Details · object[] | Details · object | null"}},"required":["message"],"title":"ErrorDetail","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorDetail · object"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Unique request identifier in ULID format for debugging and support. Example: 01K8KABR6S16YETA2SZPVBS9SP","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Unique request identifier in ULID format for debugging and support. Example: 01K8KABR6S16YETA2SZPVBS9SP","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"}},"required":["error"],"title":"ErrorResponse","type":"object","uniqueKey":"","typeLabel":"ErrorResponse · object"},"exampleType":"examples"}},"description":"Not Found - The requested resource does not exist","exampleType":"examples"},"2aaaf2c7-2361-43ab-9cd5-878ab35f70b9":{"content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"oneOf":[{"type":"string","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"integer","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.1","typeLabel":"integer"}],"uniqueKey":"detail.items.[INDEX].loc.items.[INDEX]","typeLabel":"string | integer"},"title":"Location","type":"array","isRequired":true,"uniqueKey":"detail.items.[INDEX].loc","typeLabel":"(string | integer)[]"},"msg":{"title":"Message","type":"string","isRequired":true,"uniqueKey":"detail.items.[INDEX].msg","typeLabel":"string"},"type":{"title":"Error Type","type":"string","isRequired":true,"uniqueKey":"detail.items.[INDEX].type","typeLabel":"string"}},"required":["loc","msg","type"],"title":"ValidationError","type":"object","uniqueKey":"detail.items.[INDEX]","typeLabel":"ValidationError · object"},"title":"Detail","type":"array","uniqueKey":"detail","typeLabel":"ValidationError · object[]"}},"title":"HTTPValidationError","type":"object","uniqueKey":"","typeLabel":"HTTPValidationError · object"},"examples":{"Example":{"title":"Example","value":{"detail":[{"loc":["\u003cstring>"],"msg":"\u003cstring>","type":"\u003cstring>"}]}}},"exampleType":"generated"}},"description":"Validation Error","exampleType":"generated"},"b2aabc24-daac-4dc3-8e35-d318ea4a7c9c":{"content":{"application/json":{"examples":{"internal_error":{"title":"internal_error","value":{"error":{"code":"internal_error","message":"Internal server error"},"request_id":"01K8KABR6S16YETA2SZPVBS9SP"}},"repository_error":{"title":"repository_error","value":{"error":{"code":"repository_error","message":"Database operation failed"},"request_id":"01K8KACP7D2XFGHJ9KLM4NPQR8"}}},"schema":{"description":"Standard API error response structure.\n\nAll error responses from the API follow this format, ensuring\nconsistent error handling for API consumers.\n\nExample:\n {\n \"error\": {\n \"message\": \"Flow not found\",\n \"code\": \"not_found\"\n },\n \"request_id\": \"01K8KABR6S16YETA2SZPVBS9SP\"\n }","examples":[{"error":{"code":"not_found","message":"Resource not found"},"request_id":"01K8KABR6S16YETA2SZPVBS9SP"}],"properties":{"error":{"description":"Standard error detail structure.\n\nThis model matches the error format returned by the centralized\nexception handlers in app/api/errors/handlers.py.","properties":{"message":{"description":"Human-readable error message","title":"Message","type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"oneOf":[{"type":"string","title":"Code","description":"Machine-readable error code for programmatic handling","uniqueKey":"error.code.oneOf.0","typeLabel":"string"},{"type":"null","title":"Code","description":"Machine-readable error code for programmatic handling","uniqueKey":"error.code.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.code","typeLabel":"string | null"},"details":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"error.details.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.0","typeLabel":"string[]"},{"type":"array","items":{"additionalProperties":true,"type":"object","uniqueKey":"error.details.oneOf.1.items.[INDEX]","typeLabel":"object"},"title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.1","typeLabel":"Details · object[]"},{"type":"object","title":"Details","description":"Additional error context, validation errors, or debugging information","additionalProperties":true,"uniqueKey":"error.details.oneOf.2","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Additional error context, validation errors, or debugging information","uniqueKey":"error.details.oneOf.3","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"string[] | Details · object[] | Details · object | null"}},"required":["message"],"title":"ErrorDetail","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorDetail · object"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Unique request identifier in ULID format for debugging and support. Example: 01K8KABR6S16YETA2SZPVBS9SP","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Unique request identifier in ULID format for debugging and support. Example: 01K8KABR6S16YETA2SZPVBS9SP","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"}},"required":["error"],"title":"ErrorResponse","type":"object","uniqueKey":"","typeLabel":"ErrorResponse · object"},"exampleType":"examples"}},"description":"Internal Server Error - An unexpected error occurred","exampleType":"examples"}},"security":{"6d5bfe7a-c69d-41ee-8cbb-1cfd0661a8d7":{"BearerAuth":{"bearerFormat":"JWT","description":"JWT Bearer token authentication. Include your access token in the Authorization header as: `Bearer YOUR_ACCESS_TOKEN`\n\nExample:\n```\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\n```","scheme":"bearer","type":"http","scopes":[],"schemeName":"BearerAuth"}},"2677162a-5fba-4484-b60a-2ce6b144233b":{"APIKeyAuth":{"description":"API key authentication. Include your API key in the X-API-Key header as: `X-API-Key YOUR_API_KEY`\n\nExample:\n```\nX-API-Key: saf_1234567890\n```","in":"header","name":"X-API-Key","type":"apiKey","scopes":[],"schemeName":"APIKeyAuth"}}},"servers":{"4d0b7ba2-10f8-42a9-8f2d-c56b9c660af5":{"description":"Production server","url":"https://flows.super.ai"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"bearerFormat":"JWT","description":"JWT Bearer token authentication. Include your access token in the Authorization header as: `Bearer YOUR_ACCESS_TOKEN`\n\nExample:\n```\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\n```","scheme":"bearer","type":"http","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"JWT Bearer token authentication. Include your access token in the Authorization header as: `Bearer YOUR_ACCESS_TOKEN`\n\nExample:\n```\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\n```","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"},{"schemes":[{"scheme":{"description":"API key authentication. Include your API key in the X-API-Key header as: `X-API-Key YOUR_API_KEY`\n\nExample:\n```\nX-API-Key: saf_1234567890\n```","in":"header","name":"X-API-Key","type":"apiKey","scopes":[],"schemeName":"APIKeyAuth"},"schema":{"title":"X-API-Key","type":"string","description":"API key authentication. Include your API key in the X-API-Key header as: `X-API-Key YOUR_API_KEY`\n\nExample:\n```\nX-API-Key: saf_1234567890\n```","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"APIKeyAuth","name":"X-API-Key"}],"title":"APIKeyAuth"}]},"originalFileLocation":"openapi/superai-flows-openapi.json"},"subdomain":"superai-flows-docs","siteName":"SuperAI Flows","title":"Add or remove task tags in batch - SuperAI Flows","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T12:20:52.762Z","originalFileLocation":"api-reference/task-tags/add-or-remove-task-tags-in-batch.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Add or remove tags from task executions in batch operations. Overview Task tags provide flexible categorization and workflow state tracking for task executions. Tags enable custom workflows like review/approval processes, quality assurance, and business-specific categorization. This endpoint supports batch operations to efficiently add or remove multiple tags in a single request. What are Task Tags? Task tags are key-value metadata attached to task executions for: - Workflow state tracking: \u0026#x27;reviewed\u0026#x27;, \u0026#x27;approved\u0026#x27;, \u0026#x27;rejected\u0026#x27; - Quality assurance: \u0026#x27;quality_checked\u0026#x27;, \u0026#x27;flagged\u0026#x27;, \u0026#x27;verified\u0026#x27; - Custom categorization: \u0026#x27;priority_high\u0026#x27;, \u0026#x27;customer_vip\u0026#x27;, \u0026#x27;requires_attention\u0026#x27; - Audit trails: Track who reviewed what and when (via tag_metadata) Batch Operations This endpoint accepts an array of tag operations in a single request: - operation=\u0026#x27;add\u0026#x27;: Creates new tag (idempotent - returns \u0026#x27;already_exists\u0026#x27; if duplicate) - operation=\u0026#x27;remove\u0026#x27;: Soft-deletes tag (sets status=\u0026#x27;deleted\u0026#x27;) - Mixed operations: Can add and remove different tags in same request - Atomic processing: All operations succeed or all fail Idempotency Adding an existing tag returns status=\u0026#x27;already_exists\u0026#x27; without error. Removing a non-existent tag returns status=\u0026#x27;not_found\u0026#x27; without error. This enables safe retries and prevents duplicate tag creation. Soft Delete Behavior Tags are never hard-deleted. Removal sets status=\u0026#x27;deleted\u0026#x27; and records: - updated_at: Timestamp of deletion - modified_by: User/service that performed deletion Soft-deleted tags are excluded from all list queries automatically. Use Cases 1. Human-in-the-loop workflows: Tag tasks as \u0026#x27;reviewed\u0026#x27; after manual inspection 2. Approval chains: Track \u0026#x27;pending_approval\u0026#x27;, \u0026#x27;approved\u0026#x27;, \u0026#x27;rejected\u0026#x27; states 3. Quality control: Flag suspicious outputs with \u0026#x27;requires_review\u0026#x27; tag 4. Custom business logic: Apply domain-specific tags for routing/filtering Error Scenarios - 404 Not Found: flow_execution_id doesn\u0026#x27;t exist or belongs to different organization - 403 Forbidden: User lacks permission to modify tags in this organization - 400 Bad Request: Invalid operation value or malformed request Performance Notes Batch operations are optimized with a single database transaction. All tag additions/removals commit atomically. WebSocket notifications are sent after commit to notify connected clients of tag changes. Related Endpoints - GET /task-tags - List tags for a flow execution - GET /task-executions - View task executions with their tags - PUT /task-executions - Update task execution (separate from tagging)\">\u003cmeta data-mint-head name=\"application-name\" content=\"SuperAI Flows\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Add or remove task tags in batch - SuperAI Flows\">\u003cmeta data-mint-head property=\"og:description\" content=\"Add or remove tags from task executions in batch operations. Overview Task tags provide flexible categorization and workflow state tracking for task executions. Tags enable custom workflows like review/approval processes, quality assurance, and business-specific categorization. This endpoint supports batch operations to efficiently add or remove multiple tags in a single request. What are Task Tags? Task tags are key-value metadata attached to task executions for: - Workflow state tracking: \u0026#x27;reviewed\u0026#x27;, \u0026#x27;approved\u0026#x27;, \u0026#x27;rejected\u0026#x27; - Quality assurance: \u0026#x27;quality_checked\u0026#x27;, \u0026#x27;flagged\u0026#x27;, \u0026#x27;verified\u0026#x27; - Custom categorization: \u0026#x27;priority_high\u0026#x27;, \u0026#x27;customer_vip\u0026#x27;, \u0026#x27;requires_attention\u0026#x27; - Audit trails: Track who reviewed what and when (via tag_metadata) Batch Operations This endpoint accepts an array of tag operations in a single request: - operation=\u0026#x27;add\u0026#x27;: Creates new tag (idempotent - returns \u0026#x27;already_exists\u0026#x27; if duplicate) - operation=\u0026#x27;remove\u0026#x27;: Soft-deletes tag (sets status=\u0026#x27;deleted\u0026#x27;) - Mixed operations: Can add and remove different tags in same request - Atomic processing: All operations succeed or all fail Idempotency Adding an existing tag returns status=\u0026#x27;already_exists\u0026#x27; without error. Removing a non-existent tag returns status=\u0026#x27;not_found\u0026#x27; without error. This enables safe retries and prevents duplicate tag creation. Soft Delete Behavior Tags are never hard-deleted. Removal sets status=\u0026#x27;deleted\u0026#x27; and records: - updated_at: Timestamp of deletion - modified_by: User/service that performed deletion Soft-deleted tags are excluded from all list queries automatically. Use Cases 1. Human-in-the-loop workflows: Tag tasks as \u0026#x27;reviewed\u0026#x27; after manual inspection 2. Approval chains: Track \u0026#x27;pending_approval\u0026#x27;, \u0026#x27;approved\u0026#x27;, \u0026#x27;rejected\u0026#x27; states 3. Quality control: Flag suspicious outputs with \u0026#x27;requires_review\u0026#x27; tag 4. Custom business logic: Apply domain-specific tags for routing/filtering Error Scenarios - 404 Not Found: flow_execution_id doesn\u0026#x27;t exist or belongs to different organization - 403 Forbidden: User lacks permission to modify tags in this organization - 400 Bad Request: Invalid operation value or malformed request Performance Notes Batch operations are optimized with a single database transaction. All tag additions/removals commit atomically. WebSocket notifications are sent after commit to notify connected clients of tag changes. Related Endpoints - GET /task-tags - List tags for a flow execution - GET /task-executions - View task executions with their tags - PUT /task-executions - Update task execution (separate from tagging)\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SuperAI Flows\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://superai-flows-docs.mintlify.app/_mintlify/api/og/v2?division=task-tags\u0026amp;title=Add+or+remove+task+tags+in+batch\u0026amp;description=Add+or+remove+tags+from+task+executions+in+batch+operations.%0A%0A**Overview**%0ATask+tags+provide+flexible+categorization+and+workflow+state+tracking+for+task+execut\u0026amp;theme=ab5065c76c8574caf1b0798b\u0026amp;signature=331424da6225186a4c0dae949e77485cda4b938e3182f0a402953dc18d5955db\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Add or remove task tags in batch - SuperAI Flows\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Add or remove tags from task executions in batch operations. Overview Task tags provide flexible categorization and workflow state tracking for task executions. Tags enable custom workflows like review/approval processes, quality assurance, and business-specific categorization. This endpoint supports batch operations to efficiently add or remove multiple tags in a single request. What are Task Tags? Task tags are key-value metadata attached to task executions for: - Workflow state tracking: \u0026#x27;reviewed\u0026#x27;, \u0026#x27;approved\u0026#x27;, \u0026#x27;rejected\u0026#x27; - Quality assurance: \u0026#x27;quality_checked\u0026#x27;, \u0026#x27;flagged\u0026#x27;, \u0026#x27;verified\u0026#x27; - Custom categorization: \u0026#x27;priority_high\u0026#x27;, \u0026#x27;customer_vip\u0026#x27;, \u0026#x27;requires_attention\u0026#x27; - Audit trails: Track who reviewed what and when (via tag_metadata) Batch Operations This endpoint accepts an array of tag operations in a single request: - operation=\u0026#x27;add\u0026#x27;: Creates new tag (idempotent - returns \u0026#x27;already_exists\u0026#x27; if duplicate) - operation=\u0026#x27;remove\u0026#x27;: Soft-deletes tag (sets status=\u0026#x27;deleted\u0026#x27;) - Mixed operations: Can add and remove different tags in same request - Atomic processing: All operations succeed or all fail Idempotency Adding an existing tag returns status=\u0026#x27;already_exists\u0026#x27; without error. Removing a non-existent tag returns status=\u0026#x27;not_found\u0026#x27; without error. This enables safe retries and prevents duplicate tag creation. Soft Delete Behavior Tags are never hard-deleted. Removal sets status=\u0026#x27;deleted\u0026#x27; and records: - updated_at: Timestamp of deletion - modified_by: User/service that performed deletion Soft-deleted tags are excluded from all list queries automatically. Use Cases 1. Human-in-the-loop workflows: Tag tasks as \u0026#x27;reviewed\u0026#x27; after manual inspection 2. Approval chains: Track \u0026#x27;pending_approval\u0026#x27;, \u0026#x27;approved\u0026#x27;, \u0026#x27;rejected\u0026#x27; states 3. Quality control: Flag suspicious outputs with \u0026#x27;requires_review\u0026#x27; tag 4. Custom business logic: Apply domain-specific tags for routing/filtering Error Scenarios - 404 Not Found: flow_execution_id doesn\u0026#x27;t exist or belongs to different organization - 403 Forbidden: User lacks permission to modify tags in this organization - 400 Bad Request: Invalid operation value or malformed request Performance Notes Batch operations are optimized with a single database transaction. All tag additions/removals commit atomically. WebSocket notifications are sent after commit to notify connected clients of tag changes. Related Endpoints - GET /task-tags - List tags for a flow execution - GET /task-executions - View task executions with their tags - PUT /task-executions - Update task execution (separate from tagging)\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://superai-flows-docs.mintlify.app/_mintlify/api/og/v2?division=task-tags\u0026amp;title=Add+or+remove+task+tags+in+batch\u0026amp;description=Add+or+remove+tags+from+task+executions+in+batch+operations.%0A%0A**Overview**%0ATask+tags+provide+flexible+categorization+and+workflow+state+tracking+for+task+execut\u0026amp;theme=ab5065c76c8574caf1b0798b\u0026amp;signature=331424da6225186a4c0dae949e77485cda4b938e3182f0a402953dc18d5955db\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/superai-flows-docs/qpT9WA2q8_qrkdpL/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SuperAI Flows\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7443ff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/task-tags/add-or-remove-task-tags-in-batch.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.flows.super.ai/#organization\",\"name\":\"SuperAI Flows\",\"url\":\"https://docs.flows.super.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/superai-flows-docs/mOFmLJuUNWWCPrgW/logo/light.svg?fit=max\u0026auto=format\u0026n=mOFmLJuUNWWCPrgW\u0026q=85\u0026s=763a91d73e6886f99fbebba85459ee15\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.flows.super.ai#website\",\"name\":\"SuperAI Flows\",\"url\":\"https://docs.flows.super.ai\",\"publisher\":{\"@id\":\"https://docs.flows.super.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch#webpage\",\"url\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch\",\"name\":\"Add or remove task tags in batch\",\"description\":\"Add or remove tags from task executions in batch operations. Overview Task tags provide flexible categorization and workflow state tracking for task executions. Tags enable custom workflows like review/approval processes, quality assurance, and business-specific categorization. This endpoint supports batch operations to efficiently add or remove multiple tags in a single request. What are Task Tags? Task tags are key-value metadata attached to task executions for: - Workflow state tracking: 'reviewed', 'approved', 'rejected' - Quality assurance: 'quality_checked', 'flagged', 'verified' - Custom categorization: 'priority_high', 'customer_vip', 'requires_attention' - Audit trails: Track who reviewed what and when (via tag_metadata) Batch Operations This endpoint accepts an array of tag operations in a single request: - operation='add': Creates new tag (idempotent - returns 'already_exists' if duplicate) - operation='remove': Soft-deletes tag (sets status='deleted') - Mixed operations: Can add and remove different tags in same request - Atomic processing: All operations succeed or all fail Idempotency Adding an existing tag returns status='already_exists' without error. Removing a non-existent tag returns status='not_found' without error. This enables safe retries and prevents duplicate tag creation. Soft Delete Behavior Tags are never hard-deleted. Removal sets status='deleted' and records: - updated_at: Timestamp of deletion - modified_by: User/service that performed deletion Soft-deleted tags are excluded from all list queries automatically. Use Cases 1. Human-in-the-loop workflows: Tag tasks as 'reviewed' after manual inspection 2. Approval chains: Track 'pending_approval', 'approved', 'rejected' states 3. Quality control: Flag suspicious outputs with 'requires_review' tag 4. Custom business logic: Apply domain-specific tags for routing/filtering Error Scenarios - 404 Not Found: flow_execution_id doesn't exist or belongs to different organization - 403 Forbidden: User lacks permission to modify tags in this organization - 400 Bad Request: Invalid operation value or malformed request Performance Notes Batch operations are optimized with a single database transaction. All tag additions/removals commit atomically. WebSocket notifications are sent after commit to notify connected clients of tag changes. Related Endpoints - GET /task-tags - List tags for a flow execution - GET /task-executions - View task executions with their tags - PUT /task-executions - Update task execution (separate from tagging)\",\"dateModified\":\"2026-10-23T12:20:52.762Z\",\"isPartOf\":{\"@id\":\"https://docs.flows.super.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.flows.super.ai/api-reference/auth/submit-a-self-service-access-request\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"task-tags\",\"item\":\"https://docs.flows.super.ai/api-reference/task-tags/list-active-task-tags-for-a-flow-execution\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Add or remove task tags in batch\",\"item\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch#apireference\",\"headline\":\"Add or remove task tags in batch\",\"name\":\"Add or remove task tags in batch\",\"description\":\"Add or remove tags from task executions in batch operations. Overview Task tags provide flexible categorization and workflow state tracking for task executions. Tags enable custom workflows like review/approval processes, quality assurance, and business-specific categorization. This endpoint supports batch operations to efficiently add or remove multiple tags in a single request. What are Task Tags? Task tags are key-value metadata attached to task executions for: - Workflow state tracking: 'reviewed', 'approved', 'rejected' - Quality assurance: 'quality_checked', 'flagged', 'verified' - Custom categorization: 'priority_high', 'customer_vip', 'requires_attention' - Audit trails: Track who reviewed what and when (via tag_metadata) Batch Operations This endpoint accepts an array of tag operations in a single request: - operation='add': Creates new tag (idempotent - returns 'already_exists' if duplicate) - operation='remove': Soft-deletes tag (sets status='deleted') - Mixed operations: Can add and remove different tags in same request - Atomic processing: All operations succeed or all fail Idempotency Adding an existing tag returns status='already_exists' without error. Removing a non-existent tag returns status='not_found' without error. This enables safe retries and prevents duplicate tag creation. Soft Delete Behavior Tags are never hard-deleted. Removal sets status='deleted' and records: - updated_at: Timestamp of deletion - modified_by: User/service that performed deletion Soft-deleted tags are excluded from all list queries automatically. Use Cases 1. Human-in-the-loop workflows: Tag tasks as 'reviewed' after manual inspection 2. Approval chains: Track 'pending_approval', 'approved', 'rejected' states 3. Quality control: Flag suspicious outputs with 'requires_review' tag 4. Custom business logic: Apply domain-specific tags for routing/filtering Error Scenarios - 404 Not Found: flow_execution_id doesn't exist or belongs to different organization - 403 Forbidden: User lacks permission to modify tags in this organization - 400 Bad Request: Invalid operation value or malformed request Performance Notes Batch operations are optimized with a single database transaction. All tag additions/removals commit atomically. WebSocket notifications are sent after commit to notify connected clients of tag changes. Related Endpoints - GET /task-tags - List tags for a flow execution - GET /task-executions - View task executions with their tags - PUT /task-executions - Update task execution (separate from tagging)\",\"url\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch\",\"mainEntityOfPage\":{\"@id\":\"https://docs.flows.super.ai/api-reference/task-tags/add-or-remove-task-tags-in-batch#webpage\"},\"dateModified\":\"2026-10-23T12:20:52.762Z\",\"publisher\":{\"@id\":\"https://docs.flows.super.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.flows.super.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SuperAI Flows\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SuperAI Flows","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"Overview","icon":"code","href":"/api-reference/introduction"},{"title":"Authentication","icon":"lock","href":"/api-reference/authentication"},{"title":"Error Codes","icon":"triangle-exclamation","href":"/api-reference/errors"},{"title":"MCP Server","icon":"robot","href":"/api-reference/mcp-server"}]},{"group":"Endpoints","pages":[{"group":"auth","pages":[{"title":"Submit a self-service access request","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/auth/access-request","href":"/api-reference/auth/submit-a-self-service-access-request"},{"title":"Retrieve authentication API key","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/auth/anon-key","href":"/api-reference/auth/retrieve-authentication-api-key"},{"title":"Human-verification challenge configuration for the sign-in and signup forms","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/auth/captcha-config","href":"/api-reference/auth/human-verification-challenge-configuration-for-the-sign-in-and-signup-forms"},{"title":"Resolve login method for an email","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/auth/login-method","href":"/api-reference/auth/resolve-login-method-for-an-email"},{"title":"Public compliance configuration for the signup and sign-in surfaces","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/auth/public-config","href":"/api-reference/auth/public-compliance-configuration-for-the-signup-and-sign-in-surfaces"},{"title":"Resend user invitation email","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/auth/resend-invite","href":"/api-reference/auth/resend-user-invitation-email"},{"title":"Reset Password","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/auth/reset-password","href":"/api-reference/auth/reset-password"},{"title":"Pre-flight signup email policy check for magic link","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/auth/signup-email-policy","href":"/api-reference/auth/pre-flight-signup-email-policy-check-for-magic-link"},{"title":"The authenticated caller's terms-acceptance state","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/auth/terms-status","href":"/api-reference/auth/the-authenticated-callers-terms-acceptance-state"}]},{"group":"files","pages":[{"title":"Download file by URI (with redirect)","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/files/download","href":"/api-reference/files/download-file-by-uri-with-redirect"},{"title":"Resolve storage URI to download URL","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/files/resolve","href":"/api-reference/files/resolve-storage-uri-to-download-url"}]},{"group":"flow-executions","pages":[{"title":"List flow executions with filtering and pagination","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flow-executions","href":"/api-reference/flow-executions/list-flow-executions-with-filtering-and-pagination"},{"title":"Create and start a flow execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flow-executions","href":"/api-reference/flow-executions/create-and-start-a-flow-execution"},{"title":"List the execution IDs of one filtered, sorted runs-table page","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flow-executions/page-ids","href":"/api-reference/flow-executions/list-the-execution-ids-of-one-filtered-sorted-runs-table-page"},{"title":"Retrieve a specific flow execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flow-executions/{flow_execution_id}","href":"/api-reference/flow-executions/retrieve-a-specific-flow-execution"},{"title":"Soft delete a flow execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/flow-executions/{flow_execution_id}","href":"/api-reference/flow-executions/soft-delete-a-flow-execution"},{"title":"Cancel a flow execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flow-executions/{flow_execution_id}/cancel","href":"/api-reference/flow-executions/cancel-a-flow-execution"},{"title":"Re-execute a flow execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flow-executions/{flow_execution_id}/execute","href":"/api-reference/flow-executions/re-execute-a-flow-execution"},{"title":"Add task status updates (Internal API)","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flow-executions/{flow_execution_id}/task-status","href":"/api-reference/flow-executions/add-task-status-updates-internal-api"}]},{"group":"webhook-data","pages":[{"title":"Submit webhook data for a waiting task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flow-executions/{flow_execution_id}/webhook-data","href":"/api-reference/webhook-data/submit-webhook-data-for-a-waiting-task"}]},{"group":"flows","pages":[{"title":"List all flows","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows","href":"/api-reference/flows/list-all-flows"},{"title":"Create a new flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flows","href":"/api-reference/flows/create-a-new-flow"},{"title":"Get available flow tags for autocomplete","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/available-tags","href":"/api-reference/flows/get-available-flow-tags-for-autocomplete"},{"title":"Generate file download URL","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flows/download-url","href":"/api-reference/flows/generate-file-download-url"},{"title":"Retrieve a flow by ID","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}","href":"/api-reference/flows/retrieve-a-flow-by-id"},{"title":"Delete a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/flows/{flow_id}","href":"/api-reference/flows/delete-a-flow"},{"title":"Partially update a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/flows/{flow_id}","href":"/api-reference/flows/partially-update-a-flow"},{"title":"Get clone info for a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/clone-info","href":"/api-reference/flows/get-clone-info-for-a-flow"},{"title":"Update flow definition","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/flows/{flow_id}/definition","href":"/api-reference/flows/update-flow-definition"},{"title":"List flow files","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/files","href":"/api-reference/flows/list-flow-files"},{"title":"List flow invitations","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/invitations","href":"/api-reference/flows/list-flow-invitations"},{"title":"Upsert user invitations to a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/flows/{flow_id}/invitations","href":"/api-reference/flows/upsert-user-invitations-to-a-flow"},{"title":"Remove user invitations from a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/flows/{flow_id}/invitations","href":"/api-reference/flows/remove-user-invitations-from-a-flow"},{"title":"Get distinct metadata keys for a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/metadata/keys","href":"/api-reference/flows/get-distinct-metadata-keys-for-a-flow"},{"title":"Get distinct values for a metadata key","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/metadata/values","href":"/api-reference/flows/get-distinct-values-for-a-metadata-key"},{"title":"Get tag suggestions for a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/tag-suggestions","href":"/api-reference/flows/get-tag-suggestions-for-a-flow"},{"title":"Get tag usage for a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/tag-usage","href":"/api-reference/flows/get-tag-usage-for-a-flow"},{"title":"Get tags for flow executions","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/tags","href":"/api-reference/flows/get-tags-for-flow-executions"},{"title":"Permanently delete tags from a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/flows/{flow_id}/tags","href":"/api-reference/flows/permanently-delete-tags-from-a-flow"},{"title":"Update a single task in flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/flows/{flow_id}/task","href":"/api-reference/flows/update-a-single-task-in-flow"},{"title":"List team invitations for a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/team-invitations","href":"/api-reference/flows/list-team-invitations-for-a-flow"},{"title":"Upsert team (worker group) invitations to a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/flows/{flow_id}/team-invitations","href":"/api-reference/flows/upsert-team-worker-group-invitations-to-a-flow"},{"title":"Remove team invitations from a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/flows/{flow_id}/team-invitations","href":"/api-reference/flows/remove-team-invitations-from-a-flow"},{"title":"Generate file upload URL","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flows/{flow_id}/upload-url","href":"/api-reference/flows/generate-file-upload-url"},{"title":"Validate a flow definition without persisting","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flows/{flow_id}/validate","href":"/api-reference/flows/validate-a-flow-definition-without-persisting"},{"title":"List all versions of a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/versions","href":"/api-reference/flows/list-all-versions-of-a-flow"},{"title":"List version summaries for a flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/versions/summary","href":"/api-reference/flows/list-version-summaries-for-a-flow"},{"title":"Get specific flow version","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/versions/{version}","href":"/api-reference/flows/get-specific-flow-version"},{"title":"Update version metadata","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/flows/{flow_id}/versions/{version}","href":"/api-reference/flows/update-version-metadata"},{"title":"Restore a past version","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/flows/{flow_id}/versions/{version}/restore","href":"/api-reference/flows/restore-a-past-version"},{"title":"List task summaries for flow version","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/flows/{flow_id}/versions/{version}/summary","href":"/api-reference/flows/list-task-summaries-for-flow-version"}]},{"group":"human-review-tasks","pages":[{"title":"List human review tasks assigned to the current user","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/human-review-tasks","href":"/api-reference/human-review-tasks/list-human-review-tasks-assigned-to-the-current-user"},{"title":"Create a new human review task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/human-review-tasks","href":"/api-reference/human-review-tasks/create-a-new-human-review-task"},{"title":"List human review tasks for a flow execution (org-level access)","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/human-review-tasks/by-execution","href":"/api-reference/human-review-tasks/list-human-review-tasks-for-a-flow-execution-org-level-access"},{"title":"Get a human review task by ID","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/human-review-tasks/{task_id}","href":"/api-reference/human-review-tasks/get-a-human-review-task-by-id"},{"title":"List all assignments for a human review task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/human-review-tasks/{task_id}/assignments","href":"/api-reference/human-review-tasks/list-all-assignments-for-a-human-review-task"},{"title":"Complete a human review task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/human-review-tasks/{task_id}/complete","href":"/api-reference/human-review-tasks/complete-a-human-review-task"},{"title":"Start a human review task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/human-review-tasks/{task_id}/start","href":"/api-reference/human-review-tasks/start-a-human-review-task"},{"title":"Unstart a human review task assignment","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/human-review-tasks/{task_id}/unstart","href":"/api-reference/human-review-tasks/unstart-a-human-review-task-assignment"}]},{"group":"integrations","pages":[{"title":"List integration catalog","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/catalog","href":"/api-reference/integrations/list-integration-catalog"},{"title":"List user credentials","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/credentials","href":"/api-reference/integrations/list-user-credentials"},{"title":"Create integration credentials","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/credentials","href":"/api-reference/integrations/create-integration-credentials"},{"title":"List credentials by provider","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/credentials/provider/{provider}","href":"/api-reference/integrations/list-credentials-by-provider"},{"title":"Get credential by ID","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/credentials/{credential_id}","href":"/api-reference/integrations/get-credential-by-id"},{"title":"Delete credential","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/integrations/credentials/{credential_id}","href":"/api-reference/integrations/delete-credential"},{"title":"Update credential","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/integrations/credentials/{credential_id}","href":"/api-reference/integrations/update-credential"},{"title":"Get credential secrets","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/credentials/{credential_id}/credentials","href":"/api-reference/integrations/get-credential-secrets"},{"title":"List user databases","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database","href":"/api-reference/integrations/list-user-databases"},{"title":"Create Database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database","href":"/api-reference/integrations/create-database"},{"title":"Create managed database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/managed","href":"/api-reference/integrations/create-managed-database"},{"title":"List tables in managed database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database/managed/tables","href":"/api-reference/integrations/list-tables-in-managed-database"},{"title":"Create table in managed database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/managed/tables","href":"/api-reference/integrations/create-table-in-managed-database"},{"title":"Get table columns from managed database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database/managed/tables/{table_name}/columns","href":"/api-reference/integrations/get-table-columns-from-managed-database"},{"title":"Get table data from managed database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database/managed/tables/{table_name}/data","href":"/api-reference/integrations/get-table-data-from-managed-database"},{"title":"Query a managed-DB table with exact-match filters","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/managed/tables/{table_name}/query","href":"/api-reference/integrations/query-a-managed-db-table-with-exact-match-filters"},{"title":"Insert one row into a managed-DB table","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/managed/tables/{table_name}/rows","href":"/api-reference/integrations/insert-one-row-into-a-managed-db-table"},{"title":"Get database by ID","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database/{db_id}","href":"/api-reference/integrations/get-database-by-id"},{"title":"Delete database","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/integrations/database/{db_id}","href":"/api-reference/integrations/delete-database"},{"title":"Get database columns","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database/{db_id}/columns","href":"/api-reference/integrations/get-database-columns"},{"title":"Get Download Url","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/database/{db_id}/download","href":"/api-reference/integrations/get-download-url"},{"title":"Generate database upload URL","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/{db_id}/upload-url","href":"/api-reference/integrations/generate-database-upload-url"},{"title":"Compare Csv For Replace","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/{db_id}/upload/compare","href":"/api-reference/integrations/compare-csv-for-replace"},{"title":"Complete File Upload","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/{db_id}/upload/complete","href":"/api-reference/integrations/complete-file-upload"},{"title":"Preview CSV file before import","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/{db_id}/upload/preview","href":"/api-reference/integrations/preview-csv-file-before-import"},{"title":"Replace File Upload","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/database/{db_id}/upload/replace","href":"/api-reference/integrations/replace-file-upload"},{"title":"Process Emails","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/email/process","href":"/api-reference/integrations/process-emails"},{"title":"Create Email Task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/email/tasks","href":"/api-reference/integrations/create-email-task"},{"title":"Deactivate Email Task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/integrations/email/tasks","href":"/api-reference/integrations/deactivate-email-task"},{"title":"Get Email Task Status","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/email/tasks/{task_id}","href":"/api-reference/integrations/get-email-task-status"},{"title":"List all registered plugins","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/plugins/","href":"/api-reference/integrations/list-all-registered-plugins"},{"title":"Execute Postgres Plugin Task","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/plugins/postgres/execute","href":"/api-reference/integrations/execute-postgres-plugin-task"},{"title":"Test Postgres Plugin Connection","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/plugins/postgres/test-connection","href":"/api-reference/integrations/test-postgres-plugin-connection"},{"title":"Get plugin capabilities","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/integrations/plugins/{plugin_name}/capabilities","href":"/api-reference/integrations/get-plugin-capabilities"},{"title":"Test Postgres Connection","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/postgres/test-connection","href":"/api-reference/integrations/test-postgres-connection"},{"title":"Test Postgres Connection By Credential Id","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/postgres/test-connection/{credential_id}","href":"/api-reference/integrations/test-postgres-connection-by-credential-id"},{"title":"Test Sftp Connection","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/integrations/sftp/test-connection","href":"/api-reference/integrations/test-sftp-connection"}]},{"group":"models","pages":[{"title":"List available models","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/models","href":"/api-reference/models/list-available-models"}]},{"group":"organizations","pages":[{"title":"Why this account is restricted, if it is","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/account-restriction","href":"/api-reference/organizations/why-this-account-is-restricted-if-it-is"},{"title":"Get credit balance for current user's organization","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/credits","href":"/api-reference/organizations/get-credit-balance-for-current-users-organization"},{"title":"List the email domains this organization has claimed","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/domains","href":"/api-reference/organizations/list-the-email-domains-this-organization-has-claimed"},{"title":"Claim an email domain for this organization","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/organizations/domains","href":"/api-reference/organizations/claim-an-email-domain-for-this-organization"},{"title":"Release a claimed email domain","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/organizations/domains/{claim_id}","href":"/api-reference/organizations/release-a-claimed-email-domain"},{"title":"List signups waiting on this organization's review","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/join-requests","href":"/api-reference/organizations/list-signups-waiting-on-this-organizations-review"},{"title":"Decline a signup request","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/organizations/join-requests/{request_id}/reject","href":"/api-reference/organizations/decline-a-signup-request"},{"title":"Update organization settings","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/organizations/settings","href":"/api-reference/organizations/update-organization-settings"},{"title":"List all worker groups","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/worker-groups","href":"/api-reference/organizations/list-all-worker-groups"},{"title":"Create a worker group","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/organizations/worker-groups","href":"/api-reference/organizations/create-a-worker-group"},{"title":"Get a worker group","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/worker-groups/{group_id}","href":"/api-reference/organizations/get-a-worker-group"},{"title":"Update a worker group","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/organizations/worker-groups/{group_id}","href":"/api-reference/organizations/update-a-worker-group"},{"title":"Delete a worker group","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/organizations/worker-groups/{group_id}","href":"/api-reference/organizations/delete-a-worker-group"},{"title":"Add or remove members from a worker group","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/organizations/worker-groups/{group_id}/members","href":"/api-reference/organizations/add-or-remove-members-from-a-worker-group"},{"title":"Get organization by ID","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/organizations/{organization_id}","href":"/api-reference/organizations/get-organization-by-id"}]},{"group":"plugins","pages":[{"title":"List Instances","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/plugins/instances","href":"/api-reference/plugins/list-instances"},{"title":"List Integrations","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/plugins/{plugin_name}/instances","href":"/api-reference/plugins/list-integrations"},{"title":"Create Integration","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/plugins/{plugin_name}/instances","href":"/api-reference/plugins/create-integration"},{"title":"Update Integration","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/plugins/{plugin_name}/instances/{integration_id}","href":"/api-reference/plugins/update-integration"},{"title":"Delete Integration","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/plugins/{plugin_name}/instances/{integration_id}","href":"/api-reference/plugins/delete-integration"},{"title":"Execute Integration","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/plugins/{plugin_name}/instances/{integration_id}/execute","href":"/api-reference/plugins/execute-integration"},{"title":"Poll Integration","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/plugins/{plugin_name}/instances/{integration_id}/poll","href":"/api-reference/plugins/poll-integration"},{"title":"Get Ui Schema","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/plugins/{plugin_name}/instances/{integration_id}/ui_schema","href":"/api-reference/plugins/get-ui-schema"},{"title":"Handle Webhook","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/plugins/{plugin_name}/instances/{integration_id}/webhook/callback","href":"/api-reference/plugins/handle-webhook"},{"title":"Oauth Authorize","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/plugins/{plugin_name}/oauth/authorize","href":"/api-reference/plugins/oauth-authorize"},{"title":"Oauth Callback","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/plugins/{plugin_name}/{provider_name}/oauth/callback","href":"/api-reference/plugins/oauth-callback"}]},{"group":"profile","pages":[{"title":"Record the caller's acceptance of one or more documents","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/profile/accept-terms","href":"/api-reference/profile/record-the-callers-acceptance-of-one-or-more-documents"},{"title":"Whether this account has a password and whether it is SSO-managed","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/profile/credential-state","href":"/api-reference/profile/whether-this-account-has-a-password-and-whether-it-is-sso-managed"},{"title":"Grant or withdraw marketing consent","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/profile/marketing-consent","href":"/api-reference/profile/grant-or-withdraw-marketing-consent"},{"title":"Get current user profile","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/profile/me","href":"/api-reference/profile/get-current-user-profile"},{"title":"Update current user profile","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/profile/me","href":"/api-reference/profile/update-current-user-profile"},{"title":"Change the authenticated user's password","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/profile/password","href":"/api-reference/profile/change-the-authenticated-users-password"}]},{"group":"service-accounts","pages":[{"title":"List all service accounts","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/service-accounts","href":"/api-reference/service-accounts/list-all-service-accounts"},{"title":"Create a new service account","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/service-accounts","href":"/api-reference/service-accounts/create-a-new-service-account"},{"title":"Get a specific service account","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/service-accounts/{service_account_id}","href":"/api-reference/service-accounts/get-a-specific-service-account"},{"title":"Delete a service account","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/service-accounts/{service_account_id}","href":"/api-reference/service-accounts/delete-a-service-account"},{"title":"Update a service account","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/service-accounts/{service_account_id}","href":"/api-reference/service-accounts/update-a-service-account"},{"title":"List API keys for a service account","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/service-accounts/{service_account_id}/api-keys","href":"/api-reference/service-accounts/list-api-keys-for-a-service-account"},{"title":"Create an API key for a service account","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/service-accounts/{service_account_id}/api-keys","href":"/api-reference/service-accounts/create-an-api-key-for-a-service-account"},{"title":"Delete an API key","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/service-accounts/{service_account_id}/api-keys/{api_key_id}","href":"/api-reference/service-accounts/delete-an-api-key"},{"title":"Update an API key","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/service-accounts/{service_account_id}/api-keys/{api_key_id}","href":"/api-reference/service-accounts/update-an-api-key"}]},{"group":"sso","pages":[{"title":"Get SSO configuration for organization","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/sso","href":"/api-reference/sso/get-sso-configuration-for-organization"},{"title":"Create SSO configuration for organization","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/sso","href":"/api-reference/sso/create-sso-configuration-for-organization"},{"title":"Remove SSO configuration for organization","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json delete /api/sso","href":"/api-reference/sso/remove-sso-configuration-for-organization"},{"title":"Update SSO metadata configuration","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/sso","href":"/api-reference/sso/update-sso-metadata-configuration"},{"title":"Proxy SAML metadata to avoid CORS issues","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/sso/metadata","href":"/api-reference/sso/proxy-saml-metadata-to-avoid-cors-issues"},{"title":"Get Supabase SAML service-provider URLs","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/sso/service-provider-details","href":"/api-reference/sso/get-supabase-saml-service-provider-urls"}]},{"group":"task-data","pages":[{"title":"Analyze flow definition and extract schemas","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/task-data","href":"/api-reference/task-data/analyze-flow-definition-and-extract-schemas"}]},{"group":"task-executions","pages":[{"title":"List task executions with filtering","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/task-executions","href":"/api-reference/task-executions/list-task-executions-with-filtering"},{"title":"Update task execution and optionally re-execute flow","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json put /api/task-executions","href":"/api-reference/task-executions/update-task-execution-and-optionally-re-execute-flow"},{"title":"Create a task execution record","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/task-executions","href":"/api-reference/task-executions/create-a-task-execution-record"},{"title":"Retrieve a specific task execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/task-executions/{task_execution_id}","href":"/api-reference/task-executions/retrieve-a-specific-task-execution"}]},{"group":"task-executors","pages":[{"title":"List all available task executors","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/task-executors","href":"/api-reference/task-executors/list-all-available-task-executors"}]},{"group":"task-outputs","pages":[{"title":"List all task outputs","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/task-outputs","href":"/api-reference/task-outputs/list-all-task-outputs"},{"title":"Create task output","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json post /api/task-outputs","href":"/api-reference/task-outputs/create-task-output"},{"title":"Get task output by ID","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/task-outputs/{task_output_id}","href":"/api-reference/task-outputs/get-task-output-by-id"}]},{"group":"task-tags","pages":[{"title":"List active task tags for a flow execution","description":"List all active tags for task executions within a flow execution.\n\n**Overview**\nRetrieve tags associated with task executions in a specific flow execution.\nResults can be filtered to a single task or return all tasks' tags. Only\nactive tags are returned; soft-deleted tags (status='deleted') are excluded.\n\n**What are Task Tags?**\nTask tags provide flexible categorization and workflow state for task executions:\n- Review status: 'reviewed', 'approved', 'rejected'\n- Quality flags: 'quality_checked', 'flagged', 'verified'\n- Custom categories: 'priority_high', 'customer_acme', 'requires_attention'\nEach tag includes optional metadata for context (reviewer name, notes, etc.)\n\n**Filtering Logic**\nQuery parameters combine with AND logic:\n- flow_execution_id (required): Return tags for this flow execution\n- task_name (optional): Filter to tags for a specific task\nWithout task_name: Returns all tags across all tasks in the flow execution\n\n**Common Query Patterns**\n1. All tags in flow execution:\n GET /task-tags?flow_execution_id={id}\n\n2. Tags for specific task:\n GET /task-tags?flow_execution_id={id}\u0026task_name=send_email\n\n3. Check if task reviewed:\n GET /task-tags?flow_execution_id={id}\u0026task_name=extract_data\n Filter results where tag='reviewed'\n\n**Response Format**\nReturns array of FlowTaskTagAPI objects with:\n- Tag identification: tag, tag_type, task_name\n- Metadata: tag_metadata (JSON object for custom data)\n- Lifecycle: created_at, updated_at, modified_by\n- Status: Always 'active' (deleted tags excluded)\n- Organization context: organization_id for tenant isolation\n\n**Tag Types and Usage**\nCommon tag_type values:\n- 'review_status': Workflow state ('reviewed', 'approved', 'rejected')\n- 'quality': Quality assurance ('quality_checked', 'flagged')\n- 'priority': Business priority ('high', 'medium', 'low')\n- 'custom': Domain-specific categories\n\n**Performance Considerations**\n- Queries scoped by organization_id via RLS (automatic filtering)\n- Indexes on (flow_execution_id, task_name, status) for fast lookups\n- Typical response: 5-50 tags per flow execution\n- Soft-deleted tags excluded at query time (no filtering overhead)\n\n**Use Cases**\n- Display task status in UI (show 'reviewed' badge)\n- Filter tasks by approval state (find all 'approved' tasks)\n- Audit workflow progression (who reviewed what, when)\n- Custom business logic (trigger actions based on tag presence)\n\n**Error Scenarios**\n- 400 Bad Request: Invalid UUID format for flow_execution_id\n- 403 Forbidden: User lacks permission to access flow execution's organization\n- 404 Not Found: flow_execution_id doesn't exist\nNote: Missing task_name is NOT an error; returns empty array\n\n**Related Endpoints**\n- PATCH /task-tags - Add/remove tags\n- GET /task-executions - List task executions (includes tags via TaskExecutionWithTagsAPI)\n- GET /flow-executions/{id} - View parent flow execution","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json get /api/task-tags","href":"/api-reference/task-tags/list-active-task-tags-for-a-flow-execution"},{"title":"Add or remove task tags in batch","deprecated":null,"version":null,"openapi":"/openapi/superai-flows-openapi.json patch /api/task-tags","href":"/api-reference/task-tags/add-or-remove-task-tags-in-batch"}]}]}]},{"tab":"Changelog","icon":"bullhorn","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Add or remove task tags in batch - SuperAI Flows","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js","Markdown-DKsLa3wy.js","clsx-CefdjKz2.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BaREnp3o.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-sgx_0XzF.js"]}