---
title: "Upsert Source Logo"
method: PUT
path: "/api/v1/admin/source-tracker/logos/{domain}"
tags: ["source-tracker-admin"]
---

# Upsert Source Logo

`PUT /api/v1/admin/source-tracker/logos/{domain}`

Upload or replace the logo rendered for a source ``domain``.

One logo per domain, reused everywhere that domain leads on the map. SVG is
sanitized server-side before it touches S3; raster is stored as-is. The map
reads these via the public logos lookup and layers them over the static
committed manifest, so a new upload takes precedence without touching any
immutable published snapshot.

## Path parameters

- `domain` string, required

## Response `200`

Successful Response

- TrackerSourceLogoRead — A persisted, admin-managed logo for a source domain (uploaded to S3).
  - `id` string, uuid, required
  - `domain` string, required
  - `url` string, required
  - `content_type` string, required
  - `updated_at` string, date-time, required
  - `updated_by` string, uuid, nullable

## Other responses

- `400` — Invalid upload (type, size, or malformed SVG)
- `422` — Validation Error

## Changes

- **2026-09-03** `d65b8fefae34` — 1 breaking, 3 info
  - the `file` request property contentMediaType changed from `` to `application/octet-stream`
  - the `file` request property format was generalized from `binary` to no format
  - added the optional property `detail/items/ctx` to the response with the `422` status
  - added the optional property `detail/items/input` to the response with the `422` status

[Change history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/admin/source-tracker/logos/:domain/put.md)

---

[API](https://skmtc.dev/getanana/apis/cleon-api.md) · [All operations](https://skmtc.dev/getanana/apis/cleon-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/getanana/cleon-api/revisions/d65b8fefae34/schema)
