Skip to main content
Questions or issues? Contact us at api-support@manus.ai. Manus agents can build web apps — see the Webapp feature for what the product can do. When an agent builds a site inside a task, it produces a website with its own version history and a hosted URL once published. The website.* endpoints manage those websites:
To have an agent build a website, create a task with task.create. Once the session has a website attached, the endpoints on this page take over.To have an agent edit a website it built earlier, see Edit a website in a new task.

Quickstart: publish a site

After the agent has built something (the task’s session now has a website), deploy it with one call and poll for the live URL:
Deployment is asynchronous — website.publish returns immediately while the deploy runs in the background. The response does not echo visibility. Read website.status.visibility after the publish request to confirm the effective value.

Other common flows

Ship an updated build. After the agent makes more changes (new checkpoints), call website.publish again — it always deploys the latest checkpoint. There is no way to pin an older checkpoint via this API. Pass visibility again on every republish when the site is not public; omitting it resets the site to public. Publish for the owner and invited collaborators only. Pass "visibility": "private" when publishing:
Browse version history.
Read the top-level title for the website’s current display title. Match each data[].version_id against published_version_id in the same response to find which checkpoint is currently live. The title is website-level metadata and does not belong to an individual checkpoint. Change metadata without redeploying.
Pass any supported fields — omitted fields are left unchanged. This does not trigger a new deployment, only a configuration update and a CDN refresh; it works even before the site has ever been published. Take a site offline. There is no public unpublish endpoint at this time. If you need to take a site down, contact api-support@manus.ai.

Edit a website in a new task

To have an agent change an existing website, create a new task with the top-level website field next to your instruction. This works the same way as attaching the website in the Manus app: the new task opens the website and edits it.
website.id is the same ID the website.* endpoints call website_id — read it from website.status or website.publish. If you only know the task that built the website, call website.status with that task_id. Do not use the id from artifact.list: it identifies the Library item and is not always the website ID. When the task finishes, call website.publish with the website ID to deploy the edits, unless auto_publish is enabled for the website. If the site is not public, pass its visibility again; omitting it resets the site to public (see Ship an updated build above). Rules for the website field:
  • Include an instruction. message.content must contain non-empty text that describes the change: a plain string or a non-empty text part. A hidden text part also counts (see Hidden application context). A request with a website but no instruction is rejected, because the agent would not know what to change.
  • task.create only. task.sendMessage has no website field. The task stays attached to the website, so follow-up messages only need the instruction.
  • One website, always edited. website takes a single website, and there is no reference-only mode.
  • Not a content part. Do not put the website inside message.content; a {"type": "website"} content part is rejected.
  • Web websites you own. website.id must be a web website owned by the authorized user. Mobile apps and games are not accepted here. A Standard OAuth client with only the create_task scope can use only websites whose source task it created — the same boundary as message.task_references.

Reference

Anatomy of a website

Locating a website

All four endpoints accept either task_id or website_id — exactly one must be provided:
Passing both task_id and website_id — or neither — returns 400 invalid_argument. A session is expected to contain exactly one website; if more exist, the first is used.

Website access

Website access is evaluated for the user represented by the API key or OAuth token. The website owner can read and write it. Other callers inherit access from the website’s source task: read access allows website.status and website.listCheckpoints, while write access allows website.publish and website.update. For website.*, OAuth client scopes and client identity do not further restrict which websites the authorized user can access. This differs from task.*: a standard client with only create_task can operate a website whose source task was not created by that client, provided the authorized user has the required website access. A request returns 403 permission_denied when the authorized user lacks the required access.

Site URLs

When a site is published, website.status returns site_urls — an array of every hostname the site can be reached on, ordered from default to most specific:
  1. Space URL — https://{space_id}.manus.space. Always present for a published site.
  2. Sub-domain URL — https://{sub_domain}.manus.space. Only when the owner has configured a sub-domain.
  3. Custom domains — https://{custom_domain} for each active custom domain bound by the owner.
For a simple “open the site” flow, site_urls[0] is enough — it’s always the space URL. The array is empty whenever publish_status is not published.

Publish states

Checkpoint status vs. publish state

A checkpoint’s own status (pending / success / failed / unspecified) only says whether the snapshot was generated successfully — a success checkpoint is not automatically live. To find the live version, compare website.status.version_id (or website.listCheckpoints.published_version_id) against data[].version_id.

Visibility

Sites may additionally cap the maximum visibility they accept — for example, a team-only site cannot be set to public. Requests that exceed the allowed visibility return 403 permission_denied.

website.publish vs. website.update

Errors