Skip to main content
The event log stays lightweight because it never embeds file bytes. When inline media enters the conversation, the bytes are stored as an artifact (art_…) and the persisted event carries a media_ref block pointing at it:
In the dashboard, artifacts appear as downloadable cards or attachment chips on the conversation timeline; rendering your own timeline means resolving each media_ref with the two endpoints on this page. Model context identifies conversation attachments by their public artifact_id, allowing an agent with download_file to copy one to an attached machine using path: "/artifacts/<artifact_id>" and a machine destination.

Artifacts uploaded by an agent

A successful upload_file result contains the path as structured data and a media_ref for presentation. Use the artifact ID from the final component of the path with the metadata and content endpoints below. The relevant fields in the resulting event look like this:

Get artifact metadata

Fetch the descriptor first when you need to decide how to render or whether to download:
digest is a content hash — useful for caching and deduplication on your side: if you’ve already stored that digest, skip the download.
Full schema and playground: Get artifact.

Download the content

The content endpoint returns the raw bytes with the artifact’s content type:
Content is immutable — the same artifact ID always yields the same bytes, so responses are safe to cache indefinitely.
Full schema and playground: Get artifact content.

Where artifacts come from

There’s no general-purpose public endpoint for creating artifacts; they’re created during agent interactions.

Next

Streaming events

Where media_ref blocks appear in each event kind

Sending input

Attach files to your messages