---
title: "Upload Branding Asset"
description: "Uploads a logo or favicon as a base64 data URL. Assets are stored in S3 and the branding record is updated automatically. Requires admin role."
---

`POST /api/organization/whitelabel/branding/upload`

**Logo** types: `logo`, `logoLight`, `logoDark`: accepts PNG, JPEG, WebP, SVG (max 2 MB).
**Favicon** types: `favicon`, `faviconLight`, `faviconDark`: accepts PNG, SVG, ICO (max 512 KB).

Legacy `logo` is treated as `logoLight`, and `favicon` as `faviconLight`.

## Request Body

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `kind` | string | Yes | `logo`, `logoLight`, `logoDark`, `favicon`, `faviconLight`, `faviconDark` |
| `fileName` | string | Yes | Original file name (1-200 chars) |
| `dataUrl` | string | Yes | Base64 data URL (`data:*/*;base64,...`) |

## Example (cURL)

```bash
curl -X POST "$BASE_URL/api/organization/whitelabel/branding/upload" \
  -H "Cookie: $SESSION_COOKIE" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "logoLight",
    "fileName": "logo.svg",
    "dataUrl": "data:image/svg+xml;base64,PHN2Zy..."
  }'
```

## Response

```json
{
  "success": true,
  "uploaded": {
    "kind": "logo",
    "objectKey": "branding/org-1/logo/light/1710000000-logo.svg",
    "contentType": "image/svg+xml",
    "bytes": 1234,
    "publicUrl": "https://s3.deinkunde.com/branding/org-1/logo/light/1710000000-logo.svg?..."
  },
  "branding": {
    "productName": "Acme Monitor",
    "hideProductName": false,
    "logoUrl": "https://s3.deinkunde.com/...",
    "themePrimary": "#43B1AE",
    "updatedAt": "2026-04-15T12:00:00.000Z"
  }
}
```

## Common errors

- `400 Invalid dataUrl` when the data URL format is wrong
- `400 Unsupported contentType` when the content type is not allowed for the asset kind
- `413 File too large` when exceeding size limits
- `503 Whitelabel asset storage is not configured` when S3 is not set up

