Subscribe to Cloud Agents lifecycle events over HTTP webhooks, including endpoint management, delivery behavior, and the supported event catalog.
1. Overview
Webhooks are an event-driven push mechanism provided by Qoder Cloud Agents. When resources such as Agents or Sessions undergo lifecycle changes, the system delivers structured events via HTTP POST to developer-registered URLs — no polling required.
Core Features:
- Event-driven push — Proactive notifications on resource state changes, no client polling needed
- Envelope structure — Uniform
BetaWebhookEvent { id, created_at, data, type:"event" }format - Delivery semantics — At-least-once guarantee; exponential backoff retry
| Scenario | Description |
|---|---|
| Async task completion notification | Trigger downstream workflows when a Session finishes |
| Agent configuration audit | Track Agent create/update/delete operations |
| Multi-Agent orchestration | Drive sub-task scheduling on Thread state changes |
| Ops monitoring & alerting | Alert when consecutive failure count exceeds threshold |
2. Domain Types
This section defines the data structures of Webhook events. The data field of each event type follows a uniform object format containing the resource ID, event type, and event-specific additional fields.
Session Lifecycle Events
Webhook Session Updated Event Data
-
WebhookSessionUpdatedEventData object { id, type }-
id: stringThe Session ID that triggered the event. -
type: "session.updated""session.updated"
-
Webhook Session Deleted Event Data
-
WebhookSessionDeletedEventData object { id, type }-
id: stringThe Session ID that triggered the event. -
type: "session.deleted""session.deleted"
-
Session Status Events
Webhook Session Status Run Started Event Data
-
WebhookSessionStatusRunStartedEventData object { id, type }-
id: stringThe Session ID that triggered the event. -
type: "session.status_run_started""session.status_run_started"
-
Webhook Session Status Idled Event Data
-
WebhookSessionStatusIdledEventData object { id, type }-
id: stringThe Session ID that triggered the event. -
type: "session.status_idled""session.status_idled"
-
Session Thread Events
Applicable to multi-Agent collaboration scenarios. Thread events carry an additional session_thread_id field on top of the base fields, identifying the specific execution thread.
Webhook Session Thread Created Event Data
-
WebhookSessionThreadCreatedEventData object { id, type, session_thread_id }-
id: stringThe Session ID that triggered the event. -
type: "session.thread_created""session.thread_created"
-
session_thread_id: stringThe associated Session Thread ID.
-
Webhook Session Thread Idled Event Data
-
WebhookSessionThreadIdledEventData object { id, type, session_thread_id }-
id: stringThe Session ID that triggered the event. -
type: "session.thread_idled""session.thread_idled"
-
session_thread_id: stringThe associated Session Thread ID.
-
Webhook Session Thread Terminated Event Data
-
WebhookSessionThreadTerminatedEventData object { id, type, session_thread_id }-
id: stringThe Session ID that triggered the event. -
type: "session.thread_terminated""session.thread_terminated"
-
session_thread_id: stringThe associated Session Thread ID.
-
Agent Lifecycle Events
Webhook Agent Created Event Data
-
WebhookAgentCreatedEventData object { id, type }-
id: stringThe Agent ID that triggered the event. -
type: "agent.created""agent.created"
POST /agents.
-
Webhook Agent Updated Event Data
-
WebhookAgentUpdatedEventData object { id, type }-
id: stringThe Agent ID that triggered the event. -
type: "agent.updated""agent.updated"
-
Webhook Agent Archived Event Data
-
WebhookAgentArchivedEventData object { id, type }-
id: stringThe Agent ID that triggered the event. -
type: "agent.archived""agent.archived"
-
Webhook Agent Deleted Event Data
-
WebhookAgentDeletedEventData object { id, type }-
id: stringThe Agent ID that triggered the event. -
type: "agent.deleted""agent.deleted"
-
Deployment Run Events
For Deployment Run events, id is the Deployment Run ID.
WebhookDeploymentRunStartedEventData object { id, type: "deployment_run.started" }WebhookDeploymentRunSucceededEventData object { id, type: "deployment_run.succeeded" }WebhookDeploymentRunFailedEventData object { id, type: "deployment_run.failed" }
3. Webhook Endpoint API
CRUD endpoints for managing Webhook endpoints. Use these to create, query, update, and delete Webhook endpoints, as well as send test events and control endpoint enable/disable state.
Base URL:
| Region | Address |
|---|---|
| Global | https://api.qoder.com/api/v1/cloud |
| CN | https://api.qoder.com.cn/api/v1/cloud |
POST /webhook_endpoints
Create a new Webhook endpoint.
Request Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Publicly reachable HTTPS URL for event delivery; port 443 is required |
description | string | No | Endpoint description for management purposes |
events | string[] | Yes | List of explicitly named event types; see Section 5 for allowed values |
201 Created
Note: signing_secret is returned only once at creation time; store it securely.
Status Codes:
| Code | Description |
|---|---|
| 201 | Created successfully |
| 400 | Invalid request parameters (e.g., URL is not a public HTTPS port 443 address, invalid event type) |
| 401 | Unauthorized, invalid or expired token |
| 422 | Semantic error (e.g., duplicate URL registration) |
GET /webhook_endpoints
List all Webhook endpoints under the current account.
Request Parameters: None
Response: 200 OK
| Field | Type | Description |
|---|---|---|
id | string | Endpoint unique identifier |
url | string | URL receiving events |
description | string | Endpoint description |
events | string[] | Subscribed event types |
active | boolean | Whether enabled |
consecutive_fail | integer | Consecutive delivery failure count |
last_success_at | string | Last successful delivery time (RFC 3339) |
last_failure_at | string | Last delivery failure time (RFC 3339), null if no failures |
created_at | string | Creation time (RFC 3339) |
updated_at | string | Last update time (RFC 3339) |
GET /webhook_endpoints/{id}
Retrieve details of a specific Webhook endpoint.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook endpoint ID |
200 OK
Returns a single endpoint object with the same structure as elements in the list endpoint.
Status Codes:
| Code | Description |
|---|---|
| 200 | Success |
| 404 | Endpoint not found |
PUT /webhook_endpoints/{id}
Update the configuration of a specific Webhook endpoint.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook endpoint ID |
| Field | Type | Required | Description |
|---|---|---|---|
url | string | No | Update the publicly reachable HTTPS port 443 delivery URL |
description | string | No | Update endpoint description |
events | string[] | No | Update the explicitly named subscribed event types |
200 OK
Returns the full updated endpoint object.
Status Codes:
| Code | Description |
|---|---|
| 200 | Updated successfully |
| 400 | Invalid request parameters |
| 404 | Endpoint not found |
DELETE /webhook_endpoints/{id}
Permanently delete a Webhook endpoint. All undelivered events will be discarded.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook endpoint ID |
204 No Content
Status Codes:
| Code | Description |
|---|---|
| 204 | Deleted successfully |
| 404 | Endpoint not found |
POST /webhook_endpoints/{id}/test
Send a test event to the specified endpoint to verify connectivity and payload processing logic.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook endpoint ID |
202 Accepted
| Field | Type | Description |
|---|---|---|
event_id | integer | Internal ID of the test event |
delivery_rows | integer | Number of message partitions the event was published to |
| Code | Description |
|---|---|
| 202 | Test event sent |
| 404 | Endpoint not found |
POST /webhook_endpoints/{id}/enable
Enable a disabled Webhook endpoint. Once enabled, the endpoint will resume receiving event deliveries.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook endpoint ID |
200 OK
Returns the endpoint object after enabling (active: true).
Status Codes:
| Code | Description |
|---|---|
| 200 | Enabled successfully |
| 404 | Endpoint not found |
POST /webhook_endpoints/{id}/disable
Disable a Webhook endpoint. Once disabled, the endpoint will stop receiving event deliveries but will not be deleted.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook endpoint ID |
200 OK
Returns the endpoint object after disabling (active: false).
Status Codes:
| Code | Description |
|---|---|
| 200 | Disabled successfully |
| 404 | Endpoint not found |
GET /webhook_events
List Webhook event delivery records for auditing and troubleshooting.
Request Parameters: None
Response: 200 OK
Returns an event list containing delivery status, timestamps, and other information.
Example:
GET /webhook_events/{id}
Retrieve detailed information for a single Webhook event.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Webhook event ID |
200 OK
Status Codes:
| Code | Description |
|---|---|
| 200 | Success |
| 404 | Event not found |
Error Response Format
All endpoints return a uniform error structure when an error occurs:
| Field | Type | Description |
|---|---|---|
error.message | string | Human-readable error description |
error.type | string | Error category (e.g., invalid_request_error, not_found_error) |
request_id | string | Request trace ID for troubleshooting with support team |
type | string | Fixed value "error" |
Note: 401 responses from the authentication layer (e.g., invalid or missing Token) may not follow the business error structure above, as they are returned directly by the gateway.
4. Webhook Delivery
Delivery Method
The system delivers events to registered URLs via HTTP POST with the following format:
- Method:
POST - Content-Type:
application/json - Body: JSON envelope structure (see Section 6)
Request Headers
Each delivery includes the following HTTP headers:
| Header | Description |
|---|---|
Content-Type | application/json |
User-Agent | QoderCloudAgents-Webhook/1.0 |
Retry Strategy
When delivery fails, the system uses exponential backoff for retries:
| Attempt | Delay | Description |
|---|---|---|
| 1st | Immediate | Initial delivery |
| 2nd | 1 second | First retry |
| 3rd | 5 seconds | Second retry |
| 4th | 30 seconds | Final retry |
Response Code Handling
| Response Code Range | Handling |
|---|---|
| 2xx | Delivery successful, event marked as delivered |
| 4xx | No retry, event marked as discarded (client errors should be fixed by developer) |
| 5xx | Triggers retry (temporary server failure) |
| Timeout | Triggers retry (default timeout 30 seconds) |
Automatic Degradation
When an endpoint's consecutive_fail count exceeds 20, the system triggers a degradation warning. Developers should monitor this metric and check the following when failures persist:
- Is the endpoint URL reachable
- Is the SSL certificate valid
- Is the server responding normally
5. Supported Event Types
The events below can currently be subscribed to and have live emission paths. events must contain explicitly named events from this table.
| Event Type | Additional data fields | Trigger Condition |
|---|---|---|
session.updated | — | Session metadata modified |
session.deleted | — | Session permanently deleted |
session.status_run_started | — | Agent starts a run |
session.status_idled | — | Turn completed and Session returned to idle |
session.thread_created | session_thread_id | New Session Thread created |
session.thread_idled | session_thread_id | Thread execution finished and entered idle |
session.thread_terminated | session_thread_id | Thread terminated |
agent.created | — | Agent created |
agent.updated | — | Agent configuration updated |
agent.archived | — | Agent archived |
agent.deleted | — | Agent deleted |
deployment_run.started | — | A Deployment Run starts execution |
deployment_run.succeeded | — | A Deployment Run succeeds |
deployment_run.failed | — | A Deployment Run fails |
6. Envelope Structure
All Webhook events are wrapped in a uniform envelope structure for delivery.
Base Envelope Structure
Thread Event Envelope
Thread events include an additional session_thread_id field in data:
Field Descriptions
| Field | Type | Description |
|---|---|---|
id | string | Unique event identifier prefixed with whe_; it remains stable across retries of the same event |
created_at | string | Event creation time, RFC 3339 UTC format |
type | string | Fixed value "event", identifies this as an event envelope |
data | object | Event payload containing trigger resource information |
data.id | string | ID of the resource that triggered the event, such as a Session, Agent, or Deployment Run ID |
data.type | string | Event type string, e.g., "session.status_idled", "agent.updated" |
data.session_thread_id | string | (Thread events only) Associated Session Thread ID |
Idempotency Handling
The id field in the envelope can be used as a deduplication key. Since delivery semantics are at-least-once, the same event may be delivered multiple times. Receivers should:
- Use
idas a unique key for deduplication - Check whether the
idhas already been consumed before processing - Ensure event processing logic is idempotent
Appendix A: Quick Start Guide
Step 1: Create a Webhook Endpoint
Step 2: Implement the Receiver
Implement the Webhook receiver endpoint in your service, ensuring:
- Parse the JSON payload and handle the event according to
type - Use the event
idfor idempotent deduplication - Return
200 OKto acknowledge receipt - Process business logic asynchronously (avoid timeouts)
Step 3: Send a Test Event
Step 4: Verify and Go Live
After confirming test events are received correctly, you're ready for production use.
Appendix B: Best Practices
| Practice | Description |
|---|---|
| Idempotent processing | Use event id for deduplication to prevent duplicate consumption |
| Fast response | Receiver should return 2xx within 5 seconds; run time-consuming logic asynchronously |
| Precise subscription | Only subscribe to needed event types to reduce unnecessary network overhead |
| Monitoring & alerting | Monitor consecutive_fail metric to detect delivery anomalies promptly |