Skip to main content
The event log stays lightweight because it never embeds file bytes. Whenever media enters the conversation — an image you attach to an input, a PDF a tool produces, a chart the model generates — the bytes are stored as an artifact (art_…) and the event carries a media_ref block pointing at it:
In the dashboard, artifacts appear as downloadable attachment chips on the conversation timeline; rendering your own timeline means resolving each media_ref with the two endpoints on this page.

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 endpoint to create an artifact directly — they exist only as a side effect of the conversation, which keeps every artifact traceable to the event that introduced it.

Next

Streaming events

Where media_ref blocks appear in each event kind

Sending input

Attach files to your messages