---
title: "List uploaded media"
method: GET
path: "/v1/media"
tags: ["Media"]
---

# List uploaded media

`GET /v1/media`

## Request

- Base URL: `https://api.letmepost.dev`
- URL: `https://api.letmepost.dev/v1/media`
- Auth: HTTP bearer

Cursor-paginated. Scoped to the caller's organization, and (when the key is profile-scoped) to that profile. Org-wide keys may narrow with `?profileId=`.

## Query parameters

- `profileId` string, uuid
- `limit` integer
- `cursor` string

## Response `200`

Page of media uploads.

- MediaListResponse
  - `data` object[], required
    - `id` string, required
    - `url` string, uri, required
    - `contentType` string, required
    - `sizeBytes` integer, required
    - `sha256` string, required
    - `createdAt` string, date-time, required
    - `profileId` string
  - `nextCursor` string, nullable

## Other responses

- `400`: `validation_failed` — request body or query parameters didn't match the schema. Rules surfaced include `body.json`, `targets.required`, `targets.max`, `mode_conflict`, `targets.options.platform_mismatch`, `targets.account.platform_mismatch`, `target.account.not_connected`, `target.account.ambiguous`, `scheduledAt.future`, `scheduledAt.no_first_comment`, `scheduledAt.no_bluesky_reply`.
- `401`: `unauthenticated` — missing or invalid Bearer key.
- `404`: `not_found` — the resource does not exist in the caller's organization (or, for profile-scoped keys, in the caller's profile).
- `429`: `rate_limited` — too many requests. Inspect `X-RateLimit-Limit` (static ceiling) and the IETF-draft `RateLimit-*` headers (sliding-window remaining/reset) before retrying.

---

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