# Get digital sign upload URL

Get a pre-signed upload URL for a per-sign logo.

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

`POST /app/dashboards/{id}/digital-signs/upload-url`

Returns a short-lived pre-signed URL for uploading a per-sign logo to tenant asset storage.

***

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

***

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

### Request body
| Field         | Type   | Description                                                                         |
| ------------- | ------ | ----------------------------------------------------------------------------------- |
| `signId`      | string | UUID of the sign the logo belongs to.                                               |
| `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    |

***

## Sample request
```bash
curl -X POST https://api.statusdashboard.com/app/dashboards/a1b2c3d4-e5f6-7890-abcd-ef1234567890/digital-signs/upload-url \
  -H "Authorization: Bearer bcf847abf5c6:def456" \
  -H "Content-Type: application/json" \
  -d '{
    "signId": "550e8400-e29b-41d4-a716-446655440000",
    "contentType": "image/png"
  }'
```

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

```json
{
  "uploadUrl": "https://upload.statusdashboard.com/tenant-assets/org-id/dash-id/digital-signs/sign-id/logo.png?signature=...",
  "assetUrl": "https://assets.statusdashboard.com/tenant-assets/org-id/dash-id/digital-signs/sign-id/logo.png",
  "s3Key": "tenant-assets/org-id/dash-id/digital-signs/sign-id/logo.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 `logoUrl` on the sign in an [Update digital signs](/docs/api/status-dashboards/dashboards/digital-signs/update) call. |
| `s3Key`     | Storage key for the uploaded asset. Pass this as `logoKey` alongside `logoUrl` on the same sign 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 @sign-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 digital signs](/docs/api/status-dashboards/dashboards/digital-signs/update) with both `logoKey` and `logoUrl` on the sign. Send the full `signs` array on every save:

```bash
curl -X PUT https://api.statusdashboard.com/app/dashboards/a1b2c3d4-e5f6-7890-abcd-ef1234567890/digital-signs \
  -H "Authorization: Bearer bcf847abf5c6:def456" \
  -H "Content-Type: application/json" \
  -d '{
    "signs": [
      {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "path": "noc-lobby",
        "enabled": true,
        "title": "NOC Overview",
        "compact": false,
        "darkMode": false,
        "logoKey": "tenant-assets/org-id/dash-id/digital-signs/sign-id/logo.png",
        "logoUrl": "https://assets.statusdashboard.com/tenant-assets/org-id/dash-id/digital-signs/sign-id/logo.png",
        "groups": { "enabled": false, "items": [] },
        "components": {}
      }
    ]
  }'
```

***

## Error responses
| Status | When                                                                 |
| ------ | -------------------------------------------------------------------- |
| `400`  | Missing or invalid `signId` 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. |
