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

# POST /convert/from-url

> Convierte documentos desde una URL firmada.

# POST /convert/from-url

Convierte un documento desde una URL firmada. Es la ruta recomendada para documentos ya guardados en S3, Supabase Storage, Cloudflare R2, GCS o Azure Blob: la API descarga el documento directamente, sin que tu servidor reenvíe los bytes.

## JSON body

```json theme={null}
{
  "url": "https://storage.example.com/signed/informe.pdf",
  "filename": "informe.pdf",
  "input_format": "auto",
  "mode": "fast",
  "clean": true,
  "response_format": "markdown"
}
```

<ParamField body="url" type="string" required>
  URL firmada del documento. Debe ser `https`.
</ParamField>

<ParamField body="filename" type="string" default="document.pdf">
  Nombre del documento; ayuda a detectar el formato.
</ParamField>

<ParamField body="input_format" type="enum" default="auto">
  `pdf`, `docx`, `csv`, `txt`, `xlsx`, `pptx`, `zip` o `auto`.
</ParamField>

<ParamField body="mode" type="enum" default="fast" />

<ParamField body="clean" type="boolean" default="true">
  Limpia el Markdown de salida.
</ParamField>

<ParamField body="response_format" type="enum" default="markdown">
  `markdown` o `json`.
</ParamField>

<ParamField body="output_url" type="string">
  URL PUT prefirmada de **tu** storage/CDN (BYOS). Si la das, la API sube ahi el Markdown convertido y responde un JSON pequeno con `output_url`, en vez de devolver el Markdown completo por la respuesta. Reduce el tiempo de Lambda vivo y el ancho de banda de salida desde el backend.
</ParamField>

<ParamField body="output_encoding" type="enum" default="identity">
  Compresion del Markdown subido a `output_url`: `identity`, `gzip` o `zstd`. `zstd` (nivel `ZSTD_OUTPUT_LEVEL`, def 1) = transferencia server-to-server rapida con descompresion en streaming.
</ParamField>

<Note />

## Tamano: sin limite de raw upload

A diferencia de [`/convert/raw`](/docs/public/es/api/convert-raw), `from-url` **no** aplica el limite de upload crudo (`RAW_UPLOAD_MAX_BYTES`, 12 MB). La API descarga el documento desde tu storage hasta `FETCH_MAX_BYTES` (500 MB por defecto). Es la ruta correcta para PDFs grandes. Ver [Raw vs storage URL](/docs/public/es/performance/raw-vs-from-url).

## Ejemplos

<CodeGroup>
  ```bash curl (JSON) theme={null}
  curl -X POST "https://api.markpdf.tech/convert/from-url" \
    -H "x-api-key: TU_API_KEY" \
    -H "content-type: application/json" \
    -d @payload.json
  ```

  ```bash curl (query) theme={null}
  curl -X POST "https://api.markpdf.tech/convert/from-url?url=https%3A%2F%2Fstorage.example.com%2Fsigned.pdf&filename=informe.pdf" \
    -H "x-api-key: TU_API_KEY"
  ```

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

  r = httpx.post(
      "https://api.markpdf.tech/convert/from-url",
      headers={"x-api-key": "TU_API_KEY"},
      json={
          "url": "https://storage.example.com/signed/informe.pdf",
          "filename": "informe.pdf",
          "mode": "fast",
      },
      timeout=300,
  )
  print(r.text)
  ```
</CodeGroup>

<Note>
  Si un parámetro llega por query y por body a la vez, gana el de query. Ver [Parámetros](/docs/public/es/api/parameters).
</Note>

## Seguridad (anti-SSRF)

La URL se valida antes de descargarla y la validación se repite justo antes de conectar (anti DNS-rebinding):

* **Esquema**: solo los de `ALLOWED_FETCH_SCHEMES` (`https` por defecto).
* **Hosts**: si fijas `ALLOWED_FETCH_HOSTS` (allowlist de tus buckets), solo esos hosts se aceptan. Es la protección máxima y la recomendada en producción.
* **Puertos**: solo los de `ALLOWED_FETCH_PORTS` (`80,443` por defecto), para que una URL no pueda golpear servicios internos en puertos raros (Redis 6379, MySQL 3306, paneles 8080…).
* **Direcciones internas**: se rechazan loopback, privadas, link-local y reservadas (`http://localhost`, `169.254.169.254`, IPs privadas, `[::1]`…).
* **Credenciales en la URL**: una URL con `user:pass@host` se rechaza.
* **Revalidación**: con `FETCH_REVALIDATE_BEFORE_CONNECT=true` el host se vuelve a resolver y validar antes de cada conexión, cerrando la ventana TOCTOU.

Usa siempre URLs firmadas y de corta duración. Ver [Seguridad](/docs/public/es/security).
