status field that tells you exactly what state the operation is in and what action you should take next. This is the foundation for handling any AdCP operation.
:::note Transport-specific task management
The status values and lifecycle described here are transport-independent — they apply regardless of how you access AdCP. The mechanism for tracking async tasks varies by transport:
- MCP: Use MCP Tasks — the client polls via
tasks/getand retrieves results viatasks/resultat the protocol level. See MCP Guide. - A2A: Use native A2A task lifecycle with SSE streaming. See A2A Guide.
- REST: Use AdCP’s
task_idwith polling or push notifications. :::
Status Values
AdCP uses the same status values as the A2A protocol’s TaskState enum:| Status | Meaning | Your Action |
|---|---|---|
submitted | Task queued, blocked on external dependency | Configure webhook, show “queued” indicator |
working | Agent actively processing (>30s) | Wait for result — out-of-band progress signal, not a polling trigger |
input-required | Needs information from you | Read message field, prompt user, send follow-up |
completed | Successfully finished | Process data, show success message |
canceled | User/system canceled task | Show cancellation notice, clean up |
failed | Error occurred | Show error from message, handle gracefully |
rejected | Agent rejected the request | Show rejection reason, don’t retry |
auth-required | Authentication needed | Prompt for auth, retry with credentials |
unknown | Indeterminate state | Log for debugging, may need manual intervention |
Response Structure
Every AdCP response uses a flat structure where task-specific fields are at the top level:Status Handling
Basic Pattern
Clarification Flow
When status isinput-required, the message tells you what’s needed:
Approval Flow
Human approval is a special case ofinput-required. The pending_approval and input-required statuses implement the Embedded Human Judgment principle that judgment cannot be delegated to software — when an action exceeds autonomous authority, the system halts for human review rather than proceeding.
Operations Over 30 Seconds
Operations that take longer than 30 seconds return eitherworking or submitted. These statuses mean different things:
working: The server is actively processing and will deliver the result when ready. No polling needed — the server sends progress out-of-band and the result arrives on the open connection.submitted: The operation is blocked on an external dependency (human approval, publisher review). Configure a webhook or poll.
submitted operations:
- MCP: Use MCP Tasks or poll via
tasks/get - A2A: Subscribe to SSE stream for real-time updates
- REST: Use push notifications (recommended) or poll with
task_id
Status Progression
Tasks progress through predictable states:submitted: Task queued, blocked on external dependency — configure webhook or pollworking: Agent actively processing (>30s) — wait for result, no polling neededinput-required: Need user input, continue conversationcompleted: Success, process resultsfailed: Error, handle appropriately
Polling and Timeouts
Polling is for submitted only
Don’t poll for working — the server delivers the result on the open connection. Polling is a backup for submitted operations (webhooks are preferred).
Timeout Configuration
Task Reconciliation
Usetasks/list to recover from lost state:
Best Practices
- Always check status first - Don’t assume success
- Handle all statuses - Include a default case for unknown states
- Preserve context_id - Required for conversation continuity
- Use task_id for tracking - Especially for long-running operations
- Implement timeouts - Don’t wait forever
- Log status transitions - Helps with debugging and auditing
Next Steps
- Async Operations: See Async Operations for handling different operation types
- Webhooks: See Webhooks for push notification patterns
- Error Handling: See Error Handling for error categories and recovery