Webhooks allow you to receive real-time notifications when important events occur in your Manus tasks. When you register a webhook, Manus will send HTTP POST requests to your specified callback URL whenever these events are triggered.
For a single task, you’ll receive webhooks in this order:
Onetask_created event when the task is first created
Multipletask_progress events as the task executes and updates its plan (optional, may vary)
Onetask_stopped event when the task finishes or needs input
Each webhook delivery contains a specific event type identifier and a structured payload with relevant task information. Your endpoint will receive these as standard HTTP POST requests that you can process like any other API call.
Always validate webhook payloads in your application. Consider implementing signature verification or other security measures to ensure requests are coming from Manus.
When it triggers: Immediately after a new task is successfully created.Why it’s useful: Allows you to track task creation in your own systems, send confirmation emails, or update dashboards in real-time.Payload Schema:
When it triggers: Multiple times during task execution as the task updates its plan or makes progress.Why it’s useful: Enables real-time progress tracking, allowing you to show live updates to users or monitor task execution in detail.Payload Schema:
Field
Type
Required
Description
event_id
string
Yes
Unique identifier for this webhook event
event_type
string
Yes
Always "task_progress" for this event
task_id
string
Yes
Unique identifier for the task
progress_type
string
Yes
Type of progress update (e.g., "plan_update")
message
string
Yes
Description of the current progress or plan step
Progress Type Values:
"plan_update": Task has updated its execution plan with a new step
Example Payload:
Copy
Ask AI
{ "event_id": "task_progress_TeBim6FDQf9peS52xHtAyh_1764187289", "event_type": "task_progress", "progress_detail": { "task_id": "TeBim6FDQf9peS52xHtAyh", "progress_type": "plan_update", "message": "Generate the TypeScript \"hello world\" function code." }}
When it triggers: When a task reaches a stopping point - either because it completed successfully or needs user input to proceed.Why it’s useful: Essential for knowing when your tasks finish and what the outcome was. Enables automated workflows based on task completion.Payload Schema:
Field
Type
Required
Description
event_id
string
Yes
Unique identifier for this webhook event
event_type
string
Yes
Always "task_stopped" for this event
task_id
string
Yes
Unique identifier for the task
task_title
string
Yes
Human-readable title of the task
task_url
string
Yes
Direct URL to view the task in Manus app
message
string
Yes
Status message from the task execution
attachments
array
No
List of files generated by the task
stop_reason
string
Yes
Why the task stopped: "finish" or "ask"
Stop Reason Values:
"finish": Task completed successfully and has final results
"ask": Task paused and requires user input or confirmation to continue
{ "event_id": "task_created_task_abc123", "event_type": "task_stopped", "task_detail": { "task_id": "task_abc123", "task_title": "Book restaurant reservation", "task_url": "https://manus.im/app/task_abc123", "message": "I found several restaurants with availability for your requested date and time. Which option would you prefer? 1) Bistro Milano - 7:00 PM, 2) Garden Terrace - 7:30 PM, 3) The Blue Door - 8:00 PM", "attachments": [], "stop_reason": "ask" }}
# Example webhook handler in Python/Flask@app.route('/manus-webhook', methods=['POST'])def handle_webhook(): data = request.json # Update task status in your database update_task_status( task_id=data['task_id'], status='completed' if data['stop_reason'] == 'finish' else 'waiting', message=data['message'] ) return '', 200