# Get a brand's public image

> The media.public.get operation: GET /api/v1/public/media/{fileId} in the REST API and the media_public_get tool in the MCP server.

Returns a brand's uploaded logo or icon (type, size, SHA-256 and path) without authentication: customers see
them on checkout, the portal and in emails. Only brand images of brands in test or live mode are public; any
other file ID is `resource_not_found`.

## At a glance

- **REST:** `GET /api/v1/public/media/{fileId}`
- **MCP tool:** `media_public_get`
- **Operation ID:** `media.public.get`
- **Scope:** Brand
- **Permission:** `brands:read`
- **Risk tier:** `read`
- **Dry run:** Not supported
- **Idempotency:** Not needed (read only)
- **Modes:** Test and live
- **Authentication:** None (a public endpoint, rate-limited per IP address)
- **Since:** M13

## Request

### Path parameters

| Field    | Type        | Description                                              |
| -------- | ----------- | -------------------------------------------------------- |
| `fileId` | `file_…` ID | The image's file ID (`file_…`), as in its `/media` path. |

### Query parameters

This operation takes no query parameters.

## Response

`200 OK` with a JSON object:

| Field         | Type                                                                            | Description                                                                           |
| ------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| `id`          | `file_…` ID                                                                     |                                                                                       |
| `object`      | `"media"`                                                                       |                                                                                       |
| `kind`        | one of `org_avatar`, `entity_avatar`, `brand_logo`, `brand_icon`, `user_avatar` |                                                                                       |
| `contentType` | one of `image/png`, `image/jpeg`, `image/webp`                                  |                                                                                       |
| `size`        | integer (at least 0)                                                            |                                                                                       |
| `sha256`      | string                                                                          | Hex SHA-256 of the bytes; the route checks it.                                        |
| `url`         | string                                                                          | `/media/{fileId}/{sha256}.{ext}`, relative to the app's URL.                          |
| `visibility`  | one of `public`, `private`                                                      | `public`: anyone may load it (brand logos and icons); `private`: only who may see it. |

## Examples

### A brand's icon

```http
GET /api/v1/public/media/file_01m4tx5nj8emwbyf7y9vcf47yc
```

Response (`200`):

```json
{
  "id": "file_01m4tx5nj8emwbyf7y9vcf47yc",
  "object": "media",
  "kind": "brand_icon",
  "contentType": "image/png",
  "size": 68,
  "sha256": "63ef318d96b5d0d0ceba6e04a4e622b1158335cdc67c49e27839132c6f655058",
  "url": "/media/file_01m4tx5nj8emwbyf7y9vcf47yc/63ef318d96b5d0d0ceba6e04a4e622b1158335cdc67c49e27839132c6f655058.png",
  "visibility": "public"
}
```

## Errors

| Code                                                                                     | HTTP status | When                                                                   | What to do                                                                                           |
| ---------------------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed)   | 400         | `fileId` isn't a file ID.                                              | Fix the fields listed in `details.issues` and send the request again.                                |
| [`resource_not_found`](https://ownrecord.io/docs/reference/errors.md#resource_not_found) | 404         | There is no such brand image, or its brand isn't in test or live mode. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |

It can also return these [common errors](https://ownrecord.io/docs/reference.md#common-errors): [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`scope_required`](https://ownrecord.io/docs/reference/errors.md#scope_required), [`dry_run_not_supported`](https://ownrecord.io/docs/reference/errors.md#dry_run_not_supported), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
