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

# POST /batch

> Raspa até 50 URLs de forma assíncrona em uma única requisição.

## Como difere do /scrape

`/scrape` é síncrono: uma URL, uma resposta, conteúdo no corpo.
`/batch` é assíncrono: devolve `202` com um `job_id` imediatamente e distribui
o trabalho na fila. Não há resultado do lote no `202` — é preciso fazer
polling.

Use `/batch` quando você já tem a lista de URLs. Use
[`/crawl`](/pt-BR/api-reference/crawl) quando você só tem uma semente e quer
que o crawler descubra os links.

## Limites

Até **50 URLs** por requisição. Lista vazia ou acima de 50 URLs é recusada com
`422` antes de qualquer job ser criado — lote recusado nunca é cobrado.

O rate limit deste endpoint **escala com o plano** (`free` 10/min,
`starter` 60/min, `growth` 120/min, `scale` 300/min). É o único endpoint que
faz isso.

## Custo

**1 crédito por URL cujo `scrape_status` seja `success`.** URLs bloqueadas,
falhas ou recusadas por SSRF dentro do lote não são cobradas, então o
`credits_used` final pode ser menor que o número de URLs enviadas.

## Polling do resultado

```bash cURL theme={null}
# 1. enfileirar
curl -X POST https://api.messora.dev/batch \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{"urls": ["https://example.com", "https://messora.dev"], "formats": ["markdown"]}'
# → {"job_id": "550e8400-e29b-41d4-a716-446655440002"}

# 2. consultar a cada 2s até status SUCCESS ou FAILURE
curl https://api.messora.dev/jobs/550e8400-e29b-41d4-a716-446655440002 \
  -H "X-API-Key: YOUR_API_KEY"
```

Cada item de `results` traz sua própria `url`, `scrape_status` e
`credits_used`. Veja [`GET /jobs/{job_id}`](/pt-BR/api-reference/jobs) para o
contrato completo de status.


## OpenAPI

````yaml POST /batch
openapi: 3.1.0
info:
  description: >-
    ## Messora API


    Scraping com evasão anti-bot nativa. Retorna conteúdo limpo (Markdown / JSON
    estruturado / raw HTML).


    **Autenticação:** header `X-API-Key` em todas as rotas.


    **Créditos:** scrape markdown/raw = 1; JSON estruturado = 10; search = 1 por
    resultado; crawl = 1 por página bem-sucedida.
  summary: API de scraping LLM-ready com motor anti-bot nativo.
  title: Messora API
  version: 2.0.0
servers:
  - description: API pública do Messora
    url: https://api.messora.dev
security: []
paths:
  /batch:
    servers:
      - description: API pública do Messora
        url: https://api.messora.dev
    post:
      tags:
        - Scraping
      summary: Scraping de volume assíncrono (até 50 URLs)
      description: >-
        Enfileira scraping em lote de até 50 URLs e retorna `job_id`
        imediatamente. O fan-out acontece de forma assíncrona via Celery.


        - Cobrança por URL com `scrape_status: "success"` — URLs bloqueadas não
        cobram.

        - Use `GET /jobs/{job_id}` para acompanhar o progresso e obter os
        resultados.

        - **Rate limit:** escala com o plano (PLAN_LIMITS) — free 10/min,
        starter 60/min, growth 120/min, scale 300/min.
      operationId: enqueue_batch_batch_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest'
        required: true
      responses:
        '202':
          content:
            application/json:
              example:
                job_id: 550e8400-e29b-41d4-a716-446655440002
              schema:
                $ref: '#/components/schemas/BatchEnqueueResponse'
          description: Lote enfileirado. Usar GET /jobs/{job_id} para polling.
        '401':
          description: X-API-Key ausente
        '403':
          description: API key inválida ou revogada
        '422':
          description: Lista vazia, > 50 URLs ou parâmetros inválidos
        '429':
          description: Rate limit do plano excedido (PLAN_LIMITS por plano)
      security:
        - APIKeyHeader: []
components:
  schemas:
    BatchRequest:
      properties:
        formats:
          default:
            - markdown
          items:
            enum:
              - markdown
              - json
              - raw
            type: string
          title: Formats
          type: array
        urls:
          items:
            format: uri
            maxLength: 2083
            minLength: 1
            type: string
          title: Urls
          type: array
      required:
        - urls
      title: BatchRequest
      type: object
    BatchEnqueueResponse:
      description: 'Resposta 202 de `POST /batch`: só o identificador para polling.'
      properties:
        job_id:
          description: Identificador do job. Consultar em GET /jobs/{job_id}.
          title: Job Id
          type: string
      required:
        - job_id
      title: BatchEnqueueResponse
      type: object
  securitySchemes:
    APIKeyHeader:
      in: header
      name: X-API-Key
      type: apiKey

````