> ## Documentation Index
> Fetch the complete documentation index at: https://docs.postclean.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Enviar para URL assinada

> Recebe um arquivo numa URL assinada de uso único, gerada pela ferramenta MCP `request-media-upload-tool`. Não usa chave de API: a assinatura autoriza o pedido. Envie o arquivo como `multipart/form-data` no campo `media`, por exemplo `curl -F media=@lancamento.jpg "<upload_url>"`. A URL funciona uma única vez e até expirar (15 minutos por padrão); um segundo envio para ela devolve `409`. O `upload_token` devolvido é usado depois como item de mídia, igual a um token de `POST /uploads`, e vale 24 horas. Arquivos aceitos: imagens JPEG, PNG, GIF e WebP (também HEIC e HEIF quando o servidor consegue convertê-los, e nesse caso são salvos como JPEG), vídeos MP4 e MOV e documentos PDF. Limites de tamanho: 10 MB por imagem (e no máximo 8192 x 8192 pixels, cerca de 67 megapixels), 1 GB por vídeo e 100 MB por PDF. Cada rede aplica seus próprios limites, em geral menores, quando o post é agendado ou publicado (veja `GET /content-types`). Um arquivo que o servidor não consegue ler devolve `422` só com `message`: `Unable to read uploaded file.`



## OpenAPI

````yaml /openapi.json post /uploads/{token}
openapi: 3.1.0
info:
  title: PostClean API
  version: 2.0.0
  description: >-
    API REST do PostClean. Autentique com uma chave de API do workspace, enviada
    como token Bearer no cabeçalho `Authorization`.
servers:
  - url: https://post.chatclean.com.br/api
    description: PostClean
security:
  - bearerAuth: []
tags:
  - name: Posts
    description: Criar, ler, atualizar, excluir e pré-visualizar posts.
  - name: Post notes
    description: Notas internas de um post, visíveis aos membros do workspace.
  - name: Approvals
    description: Aprovar ou rejeitar posts que aguardam aprovação.
  - name: Recurrence
    description: Fazer um post se repetir numa frequência.
  - name: Media and uploads
    description: Enviar arquivos e anexar mídia aos posts.
  - name: Social accounts
    description: Contas sociais conectadas e as opções de cada rede.
  - name: Channels
    description: Horários de postagem e fila de um canal.
  - name: Ideas
    description: Ideias do quadro Criar.
  - name: Idea stages
    description: As colunas (etapas) do quadro de ideias.
  - name: Analytics
    description: Métricas do workspace e dos canais.
  - name: Labels
    description: Etiquetas para organizar posts e ideias.
  - name: Signatures
    description: Textos reutilizáveis para adicionar aos posts.
  - name: Workspace
    description: O workspace ao qual a chave de API pertence.
  - name: API keys
    description: Chaves de API pessoais deste workspace.
  - name: Webhooks
    description: Webhooks de saída e os registros de entrega.
  - name: Repurposes
    description: Automações que republicam vídeos postados fora do PostClean.
  - name: Platform
    description: Recursos de cada plataforma e tipos de conteúdo.
paths:
  /uploads/{token}:
    post:
      tags:
        - Media and uploads
      summary: Enviar para URL assinada
      description: >-
        Recebe um arquivo numa URL assinada de uso único, gerada pela ferramenta
        MCP `request-media-upload-tool`. Não usa chave de API: a assinatura
        autoriza o pedido. Envie o arquivo como `multipart/form-data` no campo
        `media`, por exemplo `curl -F media=@lancamento.jpg "<upload_url>"`. A
        URL funciona uma única vez e até expirar (15 minutos por padrão); um
        segundo envio para ela devolve `409`. O `upload_token` devolvido é usado
        depois como item de mídia, igual a um token de `POST /uploads`, e vale
        24 horas. Arquivos aceitos: imagens JPEG, PNG, GIF e WebP (também HEIC e
        HEIF quando o servidor consegue convertê-los, e nesse caso são salvos
        como JPEG), vídeos MP4 e MOV e documentos PDF. Limites de tamanho: 10 MB
        por imagem (e no máximo 8192 x 8192 pixels, cerca de 67 megapixels), 1
        GB por vídeo e 100 MB por PDF. Cada rede aplica seus próprios limites,
        em geral menores, quando o post é agendado ou publicado (veja `GET
        /content-types`). Um arquivo que o servidor não consegue ler devolve
        `422` só com `message`: `Unable to read uploaded file.`
      operationId: uploadToSignedUrl
      parameters:
        - name: token
          in: path
          required: true
          description: Token do upload, parte da URL assinada.
          schema:
            type: string
            format: uuid
          example: 4f6c2b1e-8d3a-4e5f-9a7b-1c2d3e4f5a6b
        - name: workspace_id
          in: query
          required: true
          description: Workspace do upload, parte da URL assinada.
          schema:
            type: string
            format: uuid
        - name: expires
          in: query
          required: true
          description: Expiração da URL (timestamp Unix), parte da URL assinada.
          schema:
            type: integer
        - name: signature
          in: query
          required: true
          description: Assinatura, parte da URL assinada.
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - media
              properties:
                media:
                  type: string
                  format: binary
                  description: O arquivo, no campo `media`.
      responses:
        '201':
          description: O arquivo salvo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignedUpload'
              example:
                upload_token: 4f6c2b1e-8d3a-4e5f-9a7b-1c2d3e4f5a6b
                media_id: 9d3c1f30-8a9b-4c0d-9e1f-2a3b4c5d6e7f
                type: image
                mime_type: image/jpeg
                original_filename: lancamento.jpg
        '403':
          description: A assinatura é inválida ou a URL expirou.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              example:
                message: Invalid signature.
        '404':
          description: O workspace desta URL não existe mais.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '409':
          description: Esta URL já foi usada. O corpo traz `message` vazio.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
              example:
                message: ''
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          description: >-
            Envios demais. Limites: 60 por minuto por workspace e 1200 por
            minuto por endereço IP.
          headers:
            Retry-After:
              description: Segundos de espera antes de tentar de novo.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorBody'
      security: []
components:
  schemas:
    SignedUpload:
      type: object
      properties:
        upload_token:
          type: string
          format: uuid
          description: Token para usar como `media[].upload_token` (o mesmo da URL).
        media_id:
          type: string
          format: uuid
          description: Id da mídia salva.
        type:
          type: string
          enum:
            - image
            - video
            - document
          description: Tipo da mídia.
        mime_type:
          type: string
          description: Tipo MIME do arquivo salvo.
        original_filename:
          type: string
          description: Nome original do arquivo.
      description: Um arquivo recebido por uma URL assinada.
    ErrorBody:
      type: object
      properties:
        message:
          type: string
      description: Corpo de erro com uma mensagem.
    RateLimitErrorBody:
      type: object
      properties:
        name:
          type: string
          const: rate_limit_exceeded
        message:
          type: string
          examples:
            - Rate limit exceeded. Please retry after 30 seconds.
      description: Corpo devolvido quando o limite de requisições é excedido.
    ValidationErrorBody:
      type: object
      properties:
        message:
          type: string
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
      description: Corpo de erro de validação. `errors` traz as mensagens por campo.
  responses:
    ValidationError:
      description: A validação falhou. Cada campo com erro aparece em `errors`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ValidationErrorBody'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Chave de API do workspace, criada em Configurações > Chaves de API.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.