> ## 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 del paquete Flutter/Dart.

\#Referencia

## `MarkpdfClient`

```dart theme={null}
final client = MarkpdfClient(
  apiKey: 'YOUR_API_KEY',
  baseUrl: 'https://api.markpdf.tech', // optional, production default
  timeout: const Duration(minutes: 5),  // default 5 minutos
  maxRetries: 2,                        // reintentos en 429/5xx
);
```

<ParamField body="apiKey" type="String" required>
  Tu tecla API.
</ParamField>

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

<ParamField body="timeout" type="Duration" default="Duration(minutes: 5)">
  Tiempo de espera por solicitud.
</ParamField>

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

## `ConvertOptions`

Clase inmutable con parámetros con nombre. Todos son opcionales y utilizan los mismos valores predeterminados que API.

```dart theme={null}
const ConvertOptions({
  InputFormat inputFormat = InputFormat.auto,
  ConversionMode mode = ConversionMode.fast,
  Engine engine = Engine.auto,
  bool clean = true,
  bool imageOcr = false,
  bool hybridOcr = false,
  ResponseFormat responseFormat = ResponseFormat.markdown,
  bool slim = true,
  String? pages,
  bool autoPoll = true,
  Duration pollInterval = const Duration(seconds: 5),
});
```

### Enumeraciones

```dart theme={null}
enum InputFormat { auto, pdf, docx, xlsx, pptx, csv, txt, zip }
enum ConversionMode { fast, ultraFast, balanced, quality, auto }
enum ResponseFormat { markdown, json }
```

Consulte [Modos](/docs/public/es/concepts/modes) y [Formatos](/docs/public/es/concepts/formats) para conocer el significado de cada valor.

## Métodos

### `convertFile`

```dart theme={null}
Future<ConvertResult> convertFile(
  File file, {
  ConvertOptions options = const ConvertOptions(),
})
```

Sube `file` por multiparte a `POST /convert`. Solo disponible en dispositivos móviles/computadoras (`dart:io`), no en Flutter Web.

### `convertBytes`

```dart theme={null}
Future<ConvertResult> convertBytes(
  Uint8List data,
  String filename, {
  ConvertOptions options = const ConvertOptions(),
})
```

Envíe `data` como cuerpo sin formato a `POST /convert/raw`. Funciona en todas las plataformas, incluida Flutter Web; es la ruta recomendada allí.

### `convertFromUrl`

```dart theme={null}
Future<ConvertResult> convertFromUrl(
  String url, {
  String? filename,
  ConvertOptions options = const ConvertOptions(),
})
```

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

### `pdfIndex`

```dart theme={null}
Future<PdfSpine> pdfIndex(String url, {String? filename})
```

Llama a `POST /pdf/index`.

```dart theme={null}
final spine = await client.pdfIndex('https://bucket.example.com/report.pdf?sig=...');
for (final section in spine.sections) {
  print('${section.page} ${section.level} ${section.text}');
}
```

### `getJob`

```dart theme={null}
Future<Job> getJob(String jobId)
```

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

### `waitForJob`

```dart theme={null}
Future<Job> waitForJob(
  String jobId, {
  Duration pollInterval = const Duration(seconds: 5),
  Duration? timeout,
})
```

Encuestas desde `GET /jobs/{id}` hasta `completed`/`failed` o hasta que se agote `timeout`.

## `ConvertResult`

Clase sellada con tres subtipos: use `is` o `switch` exhaustivo:

```dart theme={null}
sealed class ConvertResult {}

class MarkdownResult extends ConvertResult {
  final String markdown;
}

class JsonConvertResult extends ConvertResult {
  final JsonResult result;
}

class QueuedResult extends ConvertResult {
  final Job job; // ver Streaming y async
}
```

```dart theme={null}
final result = await client.convertBytes(bytes, 'report.pdf');

switch (result) {
  case MarkdownResult(:final markdown):
    print(markdown);
  case JsonConvertResult(:final result):
    print(result.markdown);
  case QueuedResult(:final job):
    print('En cola: ${job.jobId}');
}
```

## `JsonResult`

```dart theme={null}
class JsonResult {
  final String markdown;
  final String filename;
  final String inputFormat;
  final String engine;
  final int sizeBytes;
  final int markdownBytes;
  final int tokenSavedEstimate;
  final Timings timings;
}

class Timings {
  final int convertMs;
  final int cleanMs;
  final int totalWorkerMs;
  final int uploadMs;
  final int totalRequestMs;
}
```

## `PdfSpine`

```dart theme={null}
class PdfSpine {
  final int pageCount;
  final int inputBytes;
  final FontModel fontModel;
  final List<Section> sections;
  final List<String> repeatedHeadersFooters;
  final List<PageInfo> pages;
  final bool pagesTruncated;
  final int estimatedTokensFull;
  final int estimatedTokensSpineOnly;
}

class Section {
  final int page;
  final int level;
  final String text;
}
```

## `Job`

```dart theme={null}
class Job {
  final String jobId;
  final JobStatus status; // queued | processing | completed | failed
  final dynamic body;
  final String? error;
}
```
