---
title: "Post a mission update (title, markdown body, kind)"
method: POST
path: "/preview/missions/{name}/updates"
tags: ["missions"]
---

# Post a mission update (title, markdown body, kind)

`POST /preview/missions/{name}/updates`

## Request

- Base URL: `https://autoresearch.sfcompute.com`
- URL: `https://autoresearch.sfcompute.com/preview/missions/{name}/updates`
- Auth: HTTP bearer

Post an update to a mission: a short title and an optional markdown body, shown as the mission's front page for the human watching. The page is org-private (sign-in, workspace visibility): posting results or job ids here is not public disclosure. Post when something a human would want to know changed - you started a sweep, you ruled something out, you found the answer, you are stuck - not on a timer. To show a picture or a clip, export the file with export_file and write ![what it shows](art-...) in the body: the artifact id is replaced with a public share link (the one public thing an update mints; unshare revokes) and the image or video plays on the page. Use kind: "alert" only when a person needs to act. Updates cannot be edited or deleted, so post a correction as a new update. Returns {update_id, url, body, embeds, warnings} - the url is a permalink worth handing to a human, and the body reads back with the artifact ids already substituted.

## Path parameters

- `name` string, required: The mission this update is about (from open_mission). An update is ABOUT a mission, so unlike the create verbs there is no unattributed case and no dated catch-all.

## Query parameters

- `workspace` string

## Request body

- object
  - `body` string, nullable: The detail, as markdown. Paragraphs, ## headings, bold, italic, `code`, fenced code blocks, lists, quotes, links, and pipe tables render; anything else shows as its own literal text. Write ![what it shows](art-...) to put an exported image, video, or audio clip inline - the artifact id becomes a public share link (unshare revokes it). A marker inside a code fence stays literal and publishes nothing.
  - `kind` string, nullable: "note" (the default) or "alert". Use "alert" only when a person needs to act - you are blocked, or you found something that changes what they want. It is the one signal the platform cannot derive on its own, so spending it on progress makes it useless.
  - `title` string, required: The headline: one line, plain text, up to 200 characters. What changed, in the words a human would use - "Run 7 is the best LoRA so far", not "update 4".

## Response `200`

The capability's JSON result.

- Result: The capability's result: the same object the MCP tool returns as structuredContent. Resources carry an `object` type discriminator and an immutable id; money is integer micro-dollars in `*_usd_micros` fields.
  - `object` string: The resource type, when the result is one resource.

## Other responses

- `400`: Malformed request: bad JSON, a parameter that does not parse, or a value outside its range. Code `invalid`.
- `401`: No bearer token, or one this API cannot verify. Code `unauthenticated`.
- `403`: Authenticated, but the token's scopes or the account's role do not reach this operation. The message names the scope word to request. Code `forbidden`.
- `404`: No such route. Code `not_found`; the body names the OpenAPI document.
- `422`: A well-formed request the platform declined: no such node, a cap reached, a state that forbids the move. The message says which, and what to do instead. Code `refused`.
- `429`: Over this door's per-customer budget. Wait `Retry-After` seconds. Code `rate_limited`.
- `500`: Our fault. Retry; if it persists, quote the request-id. Code `internal`.

---

[API](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api.md) · [All operations](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api/revisions/f88dcb70ac6c?raw)
