# Upload desktop app icons

Source: https://www.tracktimer.app/docs/upload-activity-app-icons

Store the key owner's app icons, rendered on their Mac, so activity shows familiar icons without a third-party logo service.

`POST /api/v1/activity/app-icons`

Required scope: `activity:classify`

## Request

POST https://www.tracktimer.app/api/v1/activity/app-icons with Authorization: Bearer YOUR_API_KEY and Content-Type: application/json. Send 1–12 icons. Each has a bundleId, a macOS bundle identifier of 1–255 letters, digits, periods, hyphens, or underscores that starts with a letter or digit, and png, the base64-encoded image. Each decoded PNG must start with the PNG signature, be square from 16 to 256 pixels, and be at most 48 KB; 64 × 64 works well. The complete body is limited to 1048576 bytes. Unknown fields are rejected.

Upload the bundle IDs a [sync response](https://www.tracktimer.app/docs/sync-activity) lists in missingApplicationIcons. Uploading a bundle ID again replaces its icon, so repeating a request is safe.

```json
{"icons":[{"bundleId":"com.apple.Terminal","png":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGUlEQVR42mP4H2P6nxLMMGrAqAGjBgwXAwDdfo8f7oZ/xwAAAABJRU5ErkJggg=="}]}
```

## Response — 200

```json
{"saved":1}
```

saved counts the distinct bundle IDs stored.

## Privacy and errors

Icons are stored for the key's user and workspace, and only that person sees them in My Time. TrackTimer never requests app icons or logos from a third party. Authentication/scope failures return 401/403; malformed JSON, invalid bundle IDs, or icons that are not square 16–256 pixel PNGs of at most 48 KB return 400; oversized bodies return 413; non-JSON content returns 415; shared rate limits return 429. Retry transport and 5xx failures with bounded backoff. See [authentication](https://www.tracktimer.app/docs/authentication) and [errors and retries](https://www.tracktimer.app/docs/errors-and-retries).

Examples use illustrative IDs and data. Use the values returned by your own workspace. [Review error handling and retry behavior.](https://www.tracktimer.app/docs/errors-and-retries)
