---
title: "Confirm a signed-URL logo upload"
method: POST
path: "/organizations/{organization_id}/logo/confirm-upload"
tags: ["Organizations"]
---

# Confirm a signed-URL logo upload

`POST /organizations/{organization_id}/logo/confirm-upload`

Record an uploaded logo, replacing any existing one of that variant.

The storage path is recomputed server-side from ``organization_id``, the
content type, and the variant; a client-supplied path is never trusted.
Returns the updated organization so the client can refresh its cache without
a follow-up read.

## Path parameters

- `organization_id` string, required

## Query parameters

- `variant` 'light' | 'dark' — Which of an organization's two marks an operation addresses. Both are optional and each falls back to the other when rendering, so the variant selects a slot rather than asserting one exists. A ``StrEnum`` so the value doubles as the ``?variant=`` query-param string.

## Request body

- ConfirmLogoUploadRequest — Record a logo that has been uploaded to its signed URL.
  - `content_type` string, required — MIME type used for the upload. Must match the initiate request, since it determines the path the object was written to.

## Response `200`

Successful Response

- Organization — Pydantic model for an organization.
  - `id` string, required
  - `name` string, required
  - `slug` string, required
  - `usage_limit` union — Monthly usage limit
    - object
    - string
  - `nav_config` object, nullable — Per-organization nav config: { '<key>': { 'show': bool, 'disabled': bool, 'badgeLabel': str | None, 'badgeTooltip': str | None } }
  - `plotting_preferences` string, nullable — Free-text markdown describing how this organization wants the battery agent to format plots; injected into the agent's system prompt each turn. None means not set (nothing is injected).
  - `logo_path` string, nullable — Storage object path of the light-mode organization logo, or None when unset. Not a URL: the bucket is private, so clients fetch the image from GET /organizations/{id}/logo, which returns a signed URL. Set via POST /organizations/{id}/logo, not via PATCH.
  - `logo_path_dark` string, nullable — Storage object path of the dark-mode organization logo, or None when unset. Optional: dark mode falls back to `logo_path` when this is None, and light mode falls back to this when `logo_path` is None. Set via POST /organizations/{id}/logo?variant=dark.
  - `user_organization_roles` UserOrganizationRole[], nullable — List of user organization roles
    - `user_id` string, nullable
    - `users` UsersResponse
      - `id` string, required
      - `email` string, nullable
    - `organization_id` string, required
    - `organization_role_id` string, nullable
    - `organization_roles` OrganizationRole
      - `name` string, required
      - `id` string, nullable
      - `created_at` string, date-time, nullable
      - `updated_at` string, date-time, nullable
      - `organization_role_permissions` object[], nullable — The permissions for the organization role.
    - `deactivated_at` string, date-time, nullable
  - `created_at` string, date-time, nullable — Timestamp of creation
  - `updated_at` string, date-time, nullable — Timestamp of last update

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/ionworks/apis/fastapi.md) · [All operations](https://skmtc.dev/ionworks/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc.dev/ionworks/apis/fastapi/revisions/8ed5440390f0?raw)
