Skip to main content
Questions or issues? Contact us at api-support@manus.ai. After creating a task with task.create, the agent runs asynchronously. Use task.listMessages to poll for events and track progress.
curl 'https://api.manus.ai/v2/task.listMessages?task_id=YOUR_TASK_ID&order=desc&limit=10' \
  -H 'x-manus-api-key: YOUR_API_KEY'

Task status

Look for status_update events in the response. The agent_status field tells you what to do next:
agent_statusMeaningAction
runningAgent is workingKeep polling
stoppedTask completedRead assistant_message events for results
waitingNeeds user confirmation or inputHandle based on event type (see below)
errorTask failedRead error_message for details

Handling waiting status

When agent_status is waiting, the status_detail tells you what the agent needs:
{
    "type": "status_update",
    "status_update": {
        "agent_status": "waiting",
        "status_detail": {
            "waiting_for_event_id": "evt_abc123",
            "waiting_for_event_type": "gmailSendAction",
            "waiting_description": "Send email to user@example.com",
            "confirm_input_schema": {
                "type": "object",
                "properties": {
                    "accept": { "type": "boolean" },
                    "save_draft": { "type": "boolean" }
                }
            }
        }
    }
}
The confirm_input_schema field is a JSON Schema object that describes the expected format of the input parameter when calling task.confirmAction. Use it to validate or dynamically build the confirmation payload. There are two ways to respond, depending on waiting_for_event_type:
  • messageAskUser — The agent is asking a question. Reply with task.sendMessage. Do not use task.confirmAction.
  • All other types — Confirm or reject via task.confirmAction.

Using task.confirmAction

curl -X POST 'https://api.manus.ai/v2/task.confirmAction' \
  -H 'x-manus-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "task_id": "YOUR_TASK_ID",
    "event_id": "evt_abc123",
    "input": { "accept": true }
  }'
The input format varies by waiting_for_event_type:

needConnectMyBrowser

Connect a user’s browser. Get available clients from browser.onlineList first.
// Select a browser
{ "action": "select", "client_id": "0e9ad711-..." }

// Skip browser connection
{ "action": "skip" }

gmailSendAction / outlookSendMailsAction

// Confirm send
{ "accept": true }

// Save as draft instead
{ "accept": true, "save_draft": true }

deployAction

{ "accept": true }

terminalExecute

{ "accept": true }

videoGenerate

// Standard quality (default)
{ "choice": "standard" }

// Premium quality
{ "choice": "premium" }

apiHighCreditNotice

// Accept
{ "action": "accept" }

// Reject
{ "action": "reject" }

webdevRunAction

{ "accept": true, "mode": "speed" }
mode options: "quality" / "speed" (default) / "max"

webdevRequestSecrets

{
    "accept": true,
    "secrets": [
        { "key": "DATABASE_URL", "value": "mysql://..." }
    ]
}

connectorOauthExpired / mapreduceAction

{ "accept": true }
For event types that support accept, passing accept: false will not produce any event — the task remains in waiting status.

Using My Browser

You can let the agent use your local browser. First, get online clients:
curl 'https://api.manus.ai/v2/browser.onlineList' \
  -H 'x-manus-api-key: YOUR_API_KEY'
Then pass the client_id as a connector when creating a task:
curl -X POST 'https://api.manus.ai/v2/task.create' \
  -H 'x-manus-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "message": {
      "content": "Search for Manus AI on Google",
      "connectors": ["0e9ad711-8471-4fcc-a9de-8309f0f12c87"]
    }
  }'
If the agent needs to connect a browser during execution, it will trigger a needConnectMyBrowser waiting event — use task.confirmAction to select a client.
If browser.onlineList returns an empty list, no browser clients are online. Install and enable the Manus Browser Extension first.

Complete flow

1. GET  /v2/browser.onlineList   → Get available browser client_id (optional)
2. POST /v2/task.create          → Create task, optionally pass connectors
3. GET  /v2/task.listMessages    → Poll for events
   ├─ agent_status=running       → Keep polling
   ├─ agent_status=waiting       → Check waiting_for_event_type
   │   ├─ messageAskUser         → POST /v2/task.sendMessage
   │   ├─ needConnectMyBrowser   → POST /v2/task.confirmAction (select browser)
   │   └─ Other types            → POST /v2/task.confirmAction (confirm/reject)
   ├─ agent_status=stopped       → Task complete, read results
   └─ agent_status=error         → Task failed, read error details