<!-- Generated from the canonical OpenPost public page. Do not edit this build artifact. -->

Title: Upload media
Description: Upload files safely with the TypeScript SDK and attach them to Publications.
Canonical: https://docs.openpo.st/automate/sdk/media
Source: [https://docs.openpo.st/automate/sdk/media](https://docs.openpo.st/automate/sdk/media)

# Upload media

`media.upload()` handles the OpenPost upload-session flow. It reserves the media record, sends the bytes to the returned storage target, and completes the record.

```ts
const bytes = new Uint8Array(await Bun.file("cover.png").arrayBuffer());

const asset = await openpost.media.upload({
  workspaceId: openpost.workspaceId(),
  file: bytes,
  filename: "cover.png",
  mimeType: "image/png",
  altText: "Product import screen with the completed file list",
});
```

External storage targets receive only the upload headers returned by OpenPost. The SDK never sends your OpenPost bearer token to another origin.

Attach the returned ID when you create a Publication:

```ts
const draft = await openpost.publications.create({
  workspace_id: openpost.workspaceId(),
  title: "Import walkthrough",
  content_profile: "image_post",
  source_text: "The new import flow is live.",
  social_account_ids: ["acc_linkedin"],
  media: [
    {
      media_id: asset.id,
      alt_text: "Product import screen with the completed file list",
    },
  ],
});
```

Use `media.list(workspaceId)` to inspect the library and `media.remove(id)` to remove an unused item. OpenPost still applies workspace quotas, file validation, provider limits, and media processing after the bytes arrive.
