> ## 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.

# Criar upload

> Envia um arquivo como `multipart/form-data` no campo `media`, sem post, e devolve um `upload_token`. Passe o token como item de mídia (`media[].upload_token`) em `POST /posts`, `POST /posts/batch` ou `PUT /posts/{post}`, ou em `POST /posts/{post}/media/from-upload`, antes de `expires_at`. O primeiro post que recebe o token o consome; para usar o mesmo arquivo em outro post, passe o `media[].id` daquele post. Uploads não usados são apagados depois de 24 horas. Exige permissão para criar posts no workspace (`403` caso contrário). 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 tipo fora dessa lista falha com `422` em `media`, e uma imagem acima do limite de pixels também. As mensagens de validação seguem o idioma do servidor, português no PostClean.



## OpenAPI

````yaml /openapi.json post /uploads
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:
    post:
      tags:
        - Media and uploads
      summary: Criar upload
      description: >-
        Envia um arquivo como `multipart/form-data` no campo `media`, sem post,
        e devolve um `upload_token`. Passe o token como item de mídia
        (`media[].upload_token`) em `POST /posts`, `POST /posts/batch` ou `PUT
        /posts/{post}`, ou em `POST /posts/{post}/media/from-upload`, antes de
        `expires_at`. O primeiro post que recebe o token o consome; para usar o
        mesmo arquivo em outro post, passe o `media[].id` daquele post. Uploads
        não usados são apagados depois de 24 horas. Exige permissão para criar
        posts no workspace (`403` caso contrário). 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 tipo fora dessa
        lista falha com `422` em `media`, e uma imagem acima do limite de pixels
        também. As mensagens de validação seguem o idioma do servidor, português
        no PostClean.
      operationId: createUpload
      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 upload criado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Upload'
              example:
                upload_token: 4f6c2b1e-8d3a-4e5f-9a7b-1c2d3e4f5a6b
                type: image
                mime_type: image/jpeg
                size: 482113
                original_filename: lancamento.jpg
                url: >-
                  https://example.com/medias/9d3c1f30-8a9b-4c0d-9e1f-2a3b4c5d6e7f.jpg
                expires_at: '2026-11-07T13:20:11+00:00'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  schemas:
    Upload:
      type: object
      description: >-
        Um upload temporário. Passe o `upload_token` como item de mídia antes de
        `expires_at`.
      properties:
        upload_token:
          type: string
          format: uuid
          description: Token para usar como `media[].upload_token`.
        type:
          type: string
          enum:
            - image
            - video
            - document
          description: Tipo da mídia.
        mime_type:
          type: string
          description: Tipo MIME do arquivo salvo (`image/jpeg` para HEIC convertido).
        size:
          type: integer
          description: Tamanho em bytes.
        original_filename:
          type: string
          description: Nome original do arquivo.
        url:
          type: string
          format: uri
          description: URL pública do arquivo.
        expires_at:
          type: string
          format: date-time
          description: >-
            ISO 8601. 24 horas depois do upload; uploads não usados são apagados
            depois disso.
    ErrorBody:
      type: object
      properties:
        message:
          type: string
      description: Corpo de erro com uma mensagem.
    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.
    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.
  responses:
    Unauthorized:
      description: >-
        Chave de API ausente, inválida, revogada ou expirada. Corpos possíveis:
        `Unauthenticated.` (sem chave, ou chave inválida ou revogada), `Token
        expired.` (passou do `expires_at`), `Token not found.` e `No workspace
        selected.` (a chave não está mais ligada a um workspace).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            message: Unauthenticated.
    PaymentRequired:
      description: >-
        A conta do workspace não tem assinatura ativa nem período de teste.
        Corpo: `{"message": "Active subscription required."}`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            message: Active subscription required.
    Forbidden:
      description: >-
        A requisição não é permitida. Chaves de API só funcionam para
        administradores do workspace (o dono da conta ou um membro marcado como
        administrador); fora isso, toda requisição devolve `Insufficient
        workspace permissions.`. Outros corpos: `Workspace access denied.` (o
        usuário da chave saiu do workspace), `Personal access token required.`
        (foi enviado um token OAuth do MCP) e `This action is unauthorized.`
        (por exemplo, a nota pertence a outro membro).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
    ValidationError:
      description: A validação falhou. Cada campo com erro aparece em `errors`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ValidationErrorBody'
    TooManyRequests:
      description: 'Limite de requisições excedido: 60 por minuto por workspace.'
      headers:
        Retry-After:
          description: Segundos de espera antes de tentar de novo.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitErrorBody'
          example:
            name: rate_limit_exceeded
            message: Rate limit exceeded. Please retry after 30 seconds.
  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.