Taskgroups
Audience: Developers
Taskgroups API Contract
Overview
The Taskgroups API provides endpoints for managing groups of related research tasks. Taskgroups allow you to create multiple tasks with shared configuration (profile and webhook), track group-level status computed from member tasks, and receive webhook notifications for group status changes.
Authentication: All endpoints require the X-API-Key header with either:
Account API key (from account creation)
Master API key (from
GL_DEEP_RESEARCH_MASTER_API_KEYenvironment variable)
Key Features:
Shared Configuration: All tasks in a group share the same profile and webhook
Flexible Query Input: Create groups with single query, multiple queries, or no queries (empty group)
Computed Status: Group status is calculated from member task statuses
Webhook Support: Receive notifications when group status changes (only on status transitions, not on GET requests)
Create Taskgroup (POST /v1/taskgroups)
POST /v1/taskgroups)Create a new taskgroup with one or more research tasks. All tasks in the group will share the same profile and webhook configuration.
Authentication: API key required (account or master key)
Example cURL:
Request Fields:
query
string | array
No
Query or list of queries. If string, creates one task. If array, creates one task per query. If omitted, creates an empty group (no tasks).
profile
string
Yes
Profile name to use for research configuration. The value represents the profile name, e.g., "TONGYI", "GPTR-QUICK", "GPTR-DEEP"
webhook
string
No
Optional webhook config as JSON: {"url": "...", "secret": "..."}. Both url and secret are optional. Webhook will be called when group status changes to STARTED, SUCCESS, FAILURE, or PARTIAL_FAILURE. If secret is provided, requests include X-Webhook-Signature header for verification.
Note: The request must be sent as application/x-www-form-urlencoded form data.
Query Parameter Formats:
Single Query (String):
Creates one task with the query.
Multiple Queries (JSON Array):
Creates one task per query in the array.
Empty Group (Omit query):
Creates a taskgroup with no tasks (status will be
EMPTY).
Example Success Response (202 Accepted):
Example Success Response with Partial Failures (202 Accepted):
If some tasks succeed and others fail during creation:
Response Fields:
taskgroup_id
string
Unique identifier for the created taskgroup
created_at
datetime (ISO 8601)
Timestamp when taskgroup was created
tasks
array of strings
List of created task IDs (empty if no tasks created)
errors
array of strings | null
List of errors if any task creation failed (null if all succeeded)
Error Handling:
400 Bad Request: Invalid query format, invalid webhook config, or invalid profile
404 Not Found: Profile not found
500 Internal Server Error: Server error
Webhook Behavior:
Webhooks are only sent when the group status changes (not on GET requests)
Webhooks are triggered when status transitions to:
STARTED,SUCCESS,FAILURE, orPARTIAL_FAILUREWebhook payload matches the
GET /v1/taskgroups/{taskgroup_id}response formatIf
secretis provided, webhook requests includeX-Webhook-Signatureheader for verification
Note: Tasks within a group use the group's webhook configuration. Attempting to customize individual task webhooks will result in a validation error.
Get Taskgroup (GET /v1/taskgroups/{taskgroup_id})
GET /v1/taskgroups/{taskgroup_id})Retrieve taskgroup information including computed status, profile, webhook configuration, and list of task IDs.
Authentication: API key required (account or master key)
Example cURL:
Example Success Response (200 OK):
Example Error Response (404 Not Found - Taskgroup Not Found):
Response Fields:
taskgroup_id
string
Unique identifier for the taskgroup
status
string
Taskgroup status: "EMPTY", "PENDING", "STARTED", "SUCCESS", "FAILURE", "PARTIAL_FAILURE"
profile
string
Profile name used for research configuration
created_at
datetime (ISO 8601)
Timestamp when taskgroup was created
updated_at
datetime (ISO 8601) | null
Timestamp when taskgroup was last updated (null if never updated)
webhook
object | null
Webhook configuration (URL only, secret excluded for security). Null if no webhook configured.
webhook.url
string
Webhook URL (only if webhook is configured)
tasks
array of strings
List of task IDs in the group
Status Values:
"EMPTY": Taskgroup has no tasks (default status for empty groups)"PENDING": At least one task is pending, but no tasks have started yet"STARTED": At least one task has started (or is in a running state:RECEIVED,RETRY)"SUCCESS": All tasks completed successfully"FAILURE": All tasks failed"PARTIAL_FAILURE": Some tasks succeeded, some failed
Status Calculation Priority:
If no tasks →
EMPTYIf at least one task is
STARTED,RECEIVED, orRETRY→STARTEDElse if at least one task is
PENDING→PENDINGElse if at least one task is
FAILURE→PARTIAL_FAILUREElse if all tasks are
FAILURE→FAILUREElse if all tasks are
SUCCESS→SUCCESSElse →
PENDING
Note:
Status is computed on-demand from member task statuses
Status is updated in the database when
GET /v1/taskgroups/{taskgroup_id}is calledWebhooks are NOT sent when calling GET endpoint - they are only sent when status changes occur due to task updates
Error Handling:
400 Bad Request: Invalid
taskgroup_idformat404 Not Found: Taskgroup not found
500 Internal Server Error: Server error
Add Task to Taskgroup (POST /v1/taskgroups/{taskgroup_id}/tasks)
POST /v1/taskgroups/{taskgroup_id}/tasks)Add a new task to an existing taskgroup. The task inherits the group's profile and webhook configuration.
Authentication: API key required (account or master key)
Example cURL:
Request Fields:
query
string
Yes
The research query for the new task (minimum length: 1)
Inherited Configuration:
Profile: Inherits from the taskgroup
Webhook: Inherits from the taskgroup (if configured)
Example Success Response (202 Accepted):
Response Fields:
task_id
string
Unique identifier for the created task
taskgroup_id
string
ID of the taskgroup the task was added to
created_at
datetime (ISO 8601)
Timestamp when task was created
error
string
Error message if creation failed (empty if successful)
Error Handling:
400 Bad Request: Invalid taskgroup_id format or empty query
404 Not Found: Taskgroup not found
500 Internal Server Error: Server error
Get Task from Taskgroup (GET /v1/taskgroups/{taskgroup_id}/tasks/{task_id})
GET /v1/taskgroups/{taskgroup_id}/tasks/{task_id})Retrieve a specific task from a taskgroup. This is equivalent to GET /v1/tasks/{task_id} but validates that the task belongs to the specified group.
Authentication: API key required (account or master key)
Example cURL:
Example Success Response (200 OK):
Response Fields:
task_id
string
Unique identifier for the task
taskgroup_id
string | null
ID of the taskgroup if the task belongs to one (null for standalone tasks)
status
string
Task status: "PENDING", "RECEIVED", "STARTED", "SUCCESS", "FAILURE", "REVOKED", "RETRY"
data
object | null
Research result data (null if status is not "SUCCESS")
error
string
Error message if task failed (empty string if successful)
Error Handling:
400 Bad Request: Invalid taskgroup_id or task_id format
404 Not Found: Taskgroup not found or task does not belong to group
500 Internal Server Error: Server error
Get Taskgroup Stream (GET /v1/taskgroups/{taskgroup_id}/stream)
GET /v1/taskgroups/{taskgroup_id}/stream)Get compiled streaming events from all tasks in a taskgroup. Events are streamed sequentially from each task in the group using Server-Sent Events (SSE).
Authentication: API key required (account or master key)
Example cURL:
Response: Server-Sent Events (SSE) stream containing events from all tasks in the group, delivered sequentially.
Error Handling:
400 Bad Request: Invalid taskgroup_id format
404 Not Found: Taskgroup not found
500 Internal Server Error: Server error
Get Task Stream from Taskgroup (GET /v1/taskgroups/{taskgroup_id}/tasks/{task_id}/stream)
GET /v1/taskgroups/{taskgroup_id}/tasks/{task_id}/stream)Get streaming events for a specific task in a taskgroup. This is equivalent to GET /v1/tasks/{task_id}/stream but validates that the task belongs to the specified group.
Authentication: API key required (account or master key)
Example cURL:
Response: Server-Sent Events (SSE) stream containing the task's events.
Error Handling:
400 Bad Request: Invalid taskgroup_id or task_id format
404 Not Found: Taskgroup not found or task does not belong to group
500 Internal Server Error: Server error
Use Cases
Batch Processing: Create multiple related research queries with shared configuration:
Project Organization: Organize tasks by project or research topic with consistent configuration:
Monitoring Progress: Track the overall progress of related research tasks:
Empty Group Creation: Create a taskgroup first, then add tasks later (if needed):
Webhook Integration
Taskgroups support webhook notifications when the group status changes. Webhooks are only sent when status transitions occur (not on GET requests).
Webhook Trigger Events:
Status changes to
STARTEDStatus changes to
SUCCESSStatus changes to
FAILUREStatus changes to
PARTIAL_FAILURE
Webhook Payload:
The webhook payload matches the GET /v1/taskgroups/{taskgroup_id} response format:
Webhook Signature Verification:
If a secret is provided when creating the taskgroup, webhook requests will include an X-Webhook-Signature header for verification. The signature is computed using HMAC-SHA256 with the webhook secret.
Example Webhook Verification (Python):
Relationship with Tasks API
Taskgroups are built on top of the Tasks API. Each task in a group is created using the same logic as POST /v1/tasks, but with the following differences:
Shared Configuration: All tasks in a group share the same profile and webhook
Group Status: Group status is computed from member task statuses
Webhook Behavior: Group webhooks are sent for group status changes, not individual task status changes
Individual Task Access:
You can still access individual tasks using the Tasks API:
GET /v1/tasks/{task_id}- Get full task resultGET /v1/tasks/{task_id}/status- Get task statusGET /v1/tasks/{task_id}/stream- Get task streaming events
Taskgroup vs Individual Tasks:
Use Taskgroups when you want to manage multiple related tasks with shared configuration
Use Individual Tasks when you need fine-grained control over each task's configuration
Cleanup and Retention
Taskgroups are automatically cleaned up based on the following criteria:
Cleanup Conditions: Taskgroups with status
SUCCESS,FAILURE,PARTIAL_FAILURE, orEMPTYthat haveupdated_atolder than the retention period (default: 24 hours, configurable viaTASK_RESULT_EXPIRES_HOURS)Cleanup Process: Runs automatically as part of the main application process
Retention Period: Configurable via
TASK_RESULT_EXPIRES_HOURSenvironment variable
Note: Taskgroups with status PENDING or STARTED are not cleaned up, even if they exceed the retention period.
Last updated
