---
title: "Sign Company Logo Upload"
method: POST
path: "/voice/sharing/{agentId}/company-logo/sign"
tags: ["Voice Agent Sharing"]
---

# Sign Company Logo Upload

`POST /voice/sharing/{agentId}/company-logo/sign`

## Request

- Base URL: `https://api.speakai.co/v1`
- URL: `https://api.speakai.co/v1/voice/sharing/{agentId}/company-logo/sign`
- Auth: API key in header `x-speakai-key` and API key in header `x-access-token`

### Sign Company Logo Upload

Requires the OWNER or ADMIN role. Issues a presigned S3 URL for uploading a widget company logo -- you upload the file bytes directly to S3 with a PUT request, then persist the returned companyLogoUrl by calling Update Widget Config yourself. This endpoint does not update the agent.

## Path parameters

- `agentId` string, required

## Request body

- object
  - `contentType` 'image/png' | 'image/jpeg' | 'image/webp' | 'image/svg+xml', required: Required.

## Response `200`

OK

- object
  - `status` 'success'
  - `data` object
    - `uploadUrl` string: Presigned S3 PUT URL, valid briefly. PUT the file's bytes here directly with the same contentType.
    - `companyLogoUrl` string, nullable: The public CDN URL the file will be reachable at once uploaded. Save this via Update Widget Config's companyLogoUrl -- uploading here does not update the agent by itself.
    - `key` string: The S3 object key the file was signed for.

## Other responses

- `400`: Validation failed
- `403`: Caller's role is not OWNER or ADMIN
- `404`: Agent not found

---

[API](https://skmtc.dev/speakai/apis/speak-ai-api.md) · [All operations](https://skmtc.dev/speakai/apis/speak-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/speakai/apis/speak-ai-api/revisions/52d777e6d46e?raw)
