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

# Enfileirar download

> Cria job assíncrono de download. Retorna 202 com job_id.
Requer escopo media:download.
Máximo 2 jobs simultâneos (queued + processing) por projeto.




## OpenAPI

````yaml /openapi.yaml post /media/download
openapi: 3.1.0
info:
  title: Shappire Media API
  version: 1.0.0
  description: >
    API pública para resolver metadados de mídia e enfileirar downloads
    assíncronos.


    - Base URL produção: `https://api.shappire.tools/v1`

    - Autenticação: `X-API-Key` (recomendado) ou `Authorization: Bearer`

    - Envelope de sucesso: `{ "data": ... }`

    - Envelope de erro: `{ "error": { "code", "message", "request_id" } }`

    - YouTube não é suportado (bloqueio de IP de servidor)
servers:
  - url: https://api.shappire.tools/v1
    description: Production
  - url: http://localhost:8080/v1
    description: Local development
security:
  - ApiKeyAuth: []
  - BearerAuth: []
tags:
  - name: Health
    description: Status da API
  - name: Platforms
    description: Plataformas suportadas
  - name: Media
    description: Resolução e download de mídia
  - name: Jobs
    description: Consulta de jobs assíncronos
paths:
  /media/download:
    post:
      tags:
        - Media
      summary: Enfileirar download
      description: |
        Cria job assíncrono de download. Retorna 202 com job_id.
        Requer escopo media:download.
        Máximo 2 jobs simultâneos (queued + processing) por projeto.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MediaDownloadRequest'
      responses:
        '202':
          description: Job queued
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaDownloadResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Missing scope media:download
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          description: media_id not found or expired
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '422':
          description: Validation error or unsupported format
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate, daily or concurrency limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
components:
  schemas:
    MediaDownloadRequest:
      type: object
      required:
        - format
      properties:
        url:
          type: string
          format: uri
          maxLength: 2048
          description: URL direta (alternativa ao media_id)
        media_id:
          type: string
          minLength: 8
          maxLength: 64
          description: Valor de data.id retornado pelo resolve
        format:
          type: string
          minLength: 1
          maxLength: 64
          description: ID do formato (ex. video_best, audio_best)
    MediaDownloadResponse:
      type: object
      properties:
        data:
          type: object
          properties:
            job_id:
              type: string
              example: job_x9y8z7
            status:
              type: string
              enum:
                - queued
    ErrorEnvelope:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Código estável para lógica do integrador
            message:
              type: string
              description: Mensagem legível (inglês)
            request_id:
              type: string
              description: ID de correlação — também em header X-Request-Id
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Chave de API no formato shp_live_... (produção) ou shp_test_...
        (desenvolvimento)
    BearerAuth:
      type: http
      scheme: bearer
      description: Alternativa compatível — envie a chave como Bearer token

````