# info.summary
Host a custom sender icon and get back a permanent HTTPS URL.

# info.description
Notifications sent through the Notify! gateway can carry a custom sender icon, supplied as an `icon` URL. This service hosts those images so you do not have to.

Upload a PNG and you receive a permanent public URL to pass as `icon` on any `/notify/{deviceId}` call. Uploaded icons are never deleted, so a URL pasted into a script or automation keeps resolving.

The browser UI at the service root resizes images to 128x128 PNG before uploading; the API accepts any image under the size limit.

# servers[].description
Original host. Permanent: no Notify! hostname is ever retired, so URLs issued here keep resolving forever.

# paths./upload.post.description
Accepts a `multipart/form-data` body with a single `file` field and returns the public URL of the stored image.

No authentication is required. The request body is bounded before it is parsed, so an oversized upload is rejected with `413` rather than buffered.

# paths./upload.post.requestBody.content.multipart/form-data.schema.properties.file.description
The image to host. Must be at most 512000 bytes (500 KB). PNG is recommended; the browser UI converts to PNG before upload.

# paths./upload.post.responses.200.description
Stored. The `url` is permanent and safe to paste into a script.

# paths./upload.post.responses.400.description
No `file` field was supplied, the body was not valid multipart, or the file exceeded 500 KB.

# paths./upload.post.responses.413.description
The request body exceeded the accepted size before parsing. Returned for an oversized `Content-Length` and for a chunked body that runs past the limit mid-stream.

# paths./upload.post.responses.429.description
Too many uploads from this address. Wait and retry.

# paths./upload.post.responses.429.content.application/json.example.error
Rate limit exceeded. Maximum 5 uploads per minute. Please wait before uploading again.

# paths./icons/{filename}.get.description
Serves a previously uploaded image. This is the URL returned by `POST /upload`, and the one to pass as the `icon` parameter when sending a notification.

# paths./icons/{filename}.get.parameters[].description
The stored object name, as returned in `filename` (without the `icons/` prefix, which is part of the path).

# components.schemas.UploadResult.properties.url.description
The permanent public URL. Pass this as the `icon` parameter on a notification send.

# components.schemas.UploadResult.properties.filename.description
Stored object name, including its `icons/` prefix.