# Get branding upload URL

Get a pre-signed upload URL for a branding image.

Source: https://statusdashboard.com/docs/api/status-dashboards/dashboards/branding/upload-url

`POST /app/dashboards/{id}/branding/upload-url`

Returns a short-lived pre-signed URL for uploading a branding image (header logo, main logo, favicon, or email logo) to tenant asset storage. Use this endpoint, then pass the returned `assetUrl` and `s3Key` to [Update branding](/docs/api/status-dashboards/dashboards/branding/update).

***

## Path parameters
| Parameter | Description                |
| --------- | -------------------------- |
| `id`      | The UUID of the dashboard. |

***

## Request
See [API Basics](/docs/api) for required headers.

### Request body
| Field         | Type   | Description                                                                                  |
| ------------- | ------ | -------------------------------------------------------------------------------------------- |
| `assetType`   | string | The branding slot to upload for. One of `headerLogo`, `mainLogo`, `favicon`, or `emailLogo`. |
| `contentType` | string | MIME type of the file being uploaded. Must be one of the allowed types (see below).          |

#### Allowed content types
| MIME type       | Format |
| --------------- | ------ |
| `image/png`     | PNG    |
| `image/jpeg`    | JPEG   |
| `image/gif`     | GIF    |
| `image/webp`    | WebP   |
| `image/svg+xml` | SVG    |
| `image/x-icon`  | ICO    |

***

## Sample request
```bash
curl -X POST https://api.statusdashboard.com/app/dashboards/a1b2c3d4-e5f6-7890-abcd-ef1234567890/branding/upload-url \
  -H "Authorization: Bearer bcf847abf5c6:def456" \
  -H "Content-Type: application/json" \
  -d '{
    "assetType": "mainLogo",
    "contentType": "image/png"
  }'
```

## Sample response
**Status: `200 OK`**

```json
{
  "uploadUrl": "https://upload.statusdashboard.com/tenant-assets/org-id/dash-id/mainLogo.png?signature=...",
  "assetUrl": "https://assets.statusdashboard.com/tenant-assets/org-id/dash-id/mainLogo.png",
  "s3Key": "tenant-assets/org-id/dash-id/mainLogo.png"
}
```

| Field       | Description                                                                                                                                                                                                                               |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `uploadUrl` | Pre-signed upload URL. Upload the image file directly to this URL using an HTTP `PUT` request with the `Content-Type` header matching what you specified. Expires in **5 minutes**.                                                       |
| `assetUrl`  | Public URL that will serve the uploaded image once the PUT completes. Pass this as `headerLogoUrl`, `mainLogoUrl`, `faviconUrl`, or `emailLogoUrl` in an [Update dashboard](/docs/api/status-dashboards/dashboards/branding/update) call. |
| `s3Key`     | Storage key for the uploaded asset. Pass this as `headerLogoKey`, `mainLogoKey`, `faviconKey`, or `emailLogoKey` alongside the URL in the update call.                                                                                    |

***

## Uploading the file
After receiving the response, upload the image with a `PUT` request directly to `uploadUrl`:

```bash
curl -X PUT "<uploadUrl>" \
  -H "Content-Type: image/png" \
  --data-binary @logo.png
```

The `Content-Type` header must match exactly what you specified in the request body. The pre-signed URL is signed for that specific content type.

Once the upload completes, call [Update branding](/docs/api/status-dashboards/dashboards/branding/update) with both the URL and key to save the branding and enable future cleanup:

```bash
curl -X PUT https://api.statusdashboard.com/app/dashboards/a1b2c3d4-e5f6-7890-abcd-ef1234567890/branding \
  -H "Authorization: Bearer bcf847abf5c6:def456" \
  -H "Content-Type: application/json" \
  -d '{
    "mainLogoUrl": "https://assets.statusdashboard.com/tenant-assets/org-id/dash-id/mainLogo.png",
    "mainLogoKey": "tenant-assets/org-id/dash-id/mainLogo.png"
  }'
```

***

## Error responses
| Status | When                                                                 |
| ------ | -------------------------------------------------------------------- |
| `400`  | Missing or invalid `assetType` or `contentType`.                     |
| `403`  | Insufficient permissions, or the required feature is not enabled.    |
| `404`  | Dashboard not found or does not belong to the caller's organization. |
