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

# Scrape

> Extraia conteúdo de qualquer URL pública em Markdown, JSON estruturado ou HTML bruto.

# Scrape

O endpoint `POST /scrape` executa scraping síncrono em uma URL e retorna o
conteúdo nos formatos solicitados. O motor anti-bot nativo do Messora evade
proteções automaticamente.

## Endpoint

```
POST /scrape
```

## Autenticação

Header `X-API-Key` obrigatório. Veja [Autenticação](/pt-BR/authentication).

## Parâmetros

<ParamField body="url" type="string" required>
  URL pública a ser raspada. URLs internas (RFC1918, loopback, metadata cloud) são rejeitadas pelo SSRF guard.
</ParamField>

<ParamField body="formats" type="string[]" default="[&#x22;markdown&#x22;]">
  Formatos de saída desejados. Valores aceitos: `markdown`, `json`, `raw`.
</ParamField>

<ParamField body="json_schema" type="object">
  Schema JSON para extração estruturada. **Obrigatório** quando `formats` inclui `json`.
</ParamField>

<ParamField body="json_prompt" type="string">
  Prompt de contexto para guiar a extração estruturada (usado junto com `json_schema`).
</ParamField>

<ParamField body="render_js" type="boolean" default="false">
  Se `true`, renderiza JavaScript antes da extração (headless browser).
</ParamField>

<ParamField body="only_main_content" type="boolean" default="false">
  Se `true`, extrai apenas o conteúdo principal da página, removendo navegação, rodapés e sidebars.
</ParamField>

<ParamField body="timeout" type="integer" default="60">
  Tempo máximo de espera em segundos (1–180).
</ParamField>

<ParamField body="wait_for" type="integer">
  Tempo adicional em milissegundos para aguardar após o carregamento (útil com `render_js`).
</ParamField>

<ParamField body="tags" type="string[]">
  Tags de atribuição para o registro de uso (até 10 tags).
</ParamField>

## Custo

| Formato                       | Créditos                |
| ----------------------------- | ----------------------- |
| `markdown` ou `raw`           | 1 crédito por página    |
| `json` (extração estruturada) | 10 créditos por request |

<Note>
  Falhas (`blocked_antibot`, `timeout`, `extraction_failed`) **não** consomem créditos.
</Note>

## Exemplo

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.messora.dev/scrape \
    -H "Content-Type: application/json" \
    -H "X-API-Key: YOUR_API_KEY" \
    -d '{
      "url": "https://example.com",
      "formats": ["markdown"],
      "only_main_content": true
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://api.messora.dev/scrape",
      headers={
          "Content-Type": "application/json",
          "X-API-Key": "YOUR_API_KEY",
      },
      json={
          "url": "https://example.com",
          "formats": ["markdown"],
          "only_main_content": True,
      },
  )

  data = response.json()
  print(data["markdown"])
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.messora.dev/scrape", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-API-Key": "YOUR_API_KEY",
    },
    body: JSON.stringify({
      url: "https://example.com",
      formats: ["markdown"],
      only_main_content: true,
    }),
  });

  const data = await response.json();
  console.log(data.markdown);
  ```
</CodeGroup>

## Resposta de sucesso

```json theme={null}
{
  "success": true,
  "scrape_status": "success",
  "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...",
  "credits_used": 1,
  "remaining_credits": 99
}
```

## Extração estruturada (JSON)

Para extrair dados estruturados, inclua `json` nos `formats` e forneça um `json_schema`:

```bash theme={null}
curl -X POST https://api.messora.dev/scrape \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "url": "https://example.com/produto",
    "formats": ["json"],
    "json_schema": {
      "type": "object",
      "properties": {
        "titulo": {"type": "string"},
        "preco": {"type": "number"},
        "disponivel": {"type": "boolean"}
      },
      "required": ["titulo", "preco"]
    }
  }'
```

<Warning>
  Extração estruturada consome **10 créditos** por request (independente do resultado).
</Warning>

## Status da resposta

| `scrape_status`     | Significado                   | Créditos cobrados |
| ------------------- | ----------------------------- | ----------------- |
| `success`           | Conteúdo extraído com sucesso | Sim               |
| `blocked_antibot`   | Alvo bloqueou a extração      | Não               |
| `timeout`           | Tempo limite excedido         | Não               |
| `extraction_failed` | Falha na extração do conteúdo | Não               |

## Erros

| HTTP Status | Descrição                                                                             |
| ----------- | ------------------------------------------------------------------------------------- |
| `401`       | `X-API-Key` ausente                                                                   |
| `403`       | API key inválida ou revogada                                                          |
| `422`       | URL interna (SSRF), parâmetros inválidos, ou `json_schema` ausente com formato `json` |
| `429`       | Rate limit excedido (10 req/min)                                                      |
