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

# Referencia

> Clases, métodos y opciones de cliente Bun.

\#Referencia

## `MarkpdfClient`

```ts theme={null}
import { MarkpdfClient } from "@markpdf/bun";

const client = new MarkpdfClient({
  apiKey: "YOUR_API_KEY",                 // o Bun.env.MARKPDF_API_KEY
  baseUrl: "https://api.markpdf.tech", // optional, production default
  timeoutMs: 300_000,                   // default 300000 (5 min)
  maxRetries: 2,                        // reintentos en 429/5xx
  autoPoll: true,                       // default true, ver Streaming y async
});
```

<ParamField body="apiKey" type="string" required>
  Su clave API. Si no lo aprueba, el cliente lee `Bun.env.MARKPDF_API_KEY`.
</ParamField>

<ParamField body="baseUrl" type="string" default="https://api.markpdf.tech">
  URL base de API.
</ParamField>

<ParamField body="timeoutMs" type="number" default="300000">
  Tiempo de espera por solicitud en milisegundos.
</ParamField>

<ParamField body="maxRetries" type="number" default="2">
  Reintentos automáticos con retroceso exponencial en `429` y `5xx`.
</ParamField>

<ParamField body="autoPoll" type="boolean" default="true">
  Si el servidor responde `202` (backends saturados), automáticamente sondea `GET /jobs/{id}`. Se puede sobrescribir mediante llamada.
</ParamField>

## Métodos

Todos aceptan las mismas opciones que los [parámetros de consulta de API](/docs/public/es/api/parameters), en camelCase.

### `convertFile`

```ts theme={null}
client.convertFile(
  path: string,
  options?: {
    inputFormat?: InputFormat;   // default "auto"
    mode?: ConvertMode;          // default "fast"
    engine?: Engine;             // default "auto"
    clean?: boolean;             // default true
    imageOcr?: boolean;          // default false
    hybridOcr?: boolean;         // default false
    responseFormat?: "markdown" | "json"; // default "markdown"
    pages?: string;
    outputUrl?: string;
    outputEncoding?: "identity" | "gzip" | "zstd";
    outputHeadUrl?: string;
    autoPoll?: boolean;
  }
): Promise<string | ConversionResult>
```

Abre `path` con `Bun.file(path)` y lo pasa como cuerpo de `POST /convert/raw`: Bun transmite el archivo directamente al socket, sin pasar por un `Buffer` intermedio. El `filename` se infiere del nombre base de `path`.

### `convertBytes`

```ts theme={null}
client.convertBytes(
  data: Uint8Array | ArrayBuffer | Blob,
  filename: string,
  options?: { /* mismas opciones que convertFile */ }
): Promise<string | ConversionResult>
```

Igual que `convertFile`, pero para datos ya cargados en la memoria (por ejemplo, el cuerpo de un `Request` entrante).

### `convertFromUrl`

```ts theme={null}
client.convertFromUrl(
  url: string,
  filename?: string,
  options?: { /* mismas opciones que convertFile */ }
): Promise<string | ConversionResult>
```

Llama a `POST /convert/from-url`.

### `convertStream`

```ts theme={null}
client.convertStream(
  path: string,
  options?: {
    inputFormat?: InputFormat;
    clean?: boolean;
    slim?: boolean;                     // default true
    streamSlimStrategy?: "off" | "sampled" | "full"; // default "sampled"
  }
): AsyncGenerator<string>
```

Generador asíncrono que emite fragmentos de Markdown a medida que llegan desde `POST /convert/stream`, leyendo el archivo con `Bun.file(path)`. Consulte [Transmisión y asíncrono](/docs/public/es/sdks/bun/streaming-and-async).

### `pdfIndex`

```ts theme={null}
client.pdfIndex(url: string, filename?: string): Promise<PdfSpine>
```

Llame a `POST /pdf/index`. Devuelve el lomo escrito.

```ts theme={null}
const spine = await client.pdfIndex("https://bucket.example.com/report.pdf?sig=...");
for (const section of spine.sections) {
  console.log(section.page, section.level, section.text);
}
```

### `getJob`

```ts theme={null}
client.getJob(jobId: string): Promise<JobStatus>
```

Consulta manualmente `GET /jobs/{id}`.

### `waitForJob`

```ts theme={null}
client.waitForJob(
  jobId: string,
  options?: { pollIntervalMs?: number; timeoutMs?: number }
): Promise<JobStatus>
```

Sondea `GET /jobs/{id}` hasta que el estado sea `completed` o `failed`, o hasta que se agote `timeoutMs`. Usado internamente por `autoPoll: true`.

## Tipos

### `ConversionResult`

```ts theme={null}
interface ConversionResult {
  markdown: string;
  filename: string;
  inputFormat: string;
  engine: string;
  sizeBytes: number;
  markdownBytes: number;
  tokenSavedEstimate: number;
  timings: {
    convertMs: number;
    cleanMs: number;
    totalWorkerMs: number;
    uploadMs: number;
    totalRequestMs: number;
  };
}
```

### `PdfSpine`

```ts theme={null}
interface PdfSpine {
  pageCount: number;
  inputBytes: number;
  fontModel: { bodySize: number; headingSizes: number[] };
  sections: Array<{ page: number; level: number; text: string }>;
  repeatedHeadersFooters: string[];
  pages: Array<{ page: number; chars: number; firstLine: string; headings: unknown[] }>;
  pagesTruncated: boolean;
  estimatedTokensFull: number;
  estimatedTokensSpineOnly: number;
}
```

### `JobStatus`

```ts theme={null}
interface JobStatus {
  jobId: string;
  status: "queued" | "processing" | "completed" | "failed";
  body?: string | Record<string, unknown>;
  error?: string;
}
```

Todos los tipos se exportan desde `@markpdf/bun`:

```ts theme={null}
import type { ConversionResult, PdfSpine, JobStatus, ConvertMode } from "@markpdf/bun";
```
