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

# Cómo generar archivos de Office desde AWS Lambda con Python

> Empaqueta doconda en tu Lambda y llama a documents.create: devuelve un Word, PowerPoint o Excel con su PDF, sin librerías de Office.

Añade `doconda` al paquete de tu función Lambda y llama a `doconda.documents.create(format=..., prompt=...)` (o con tu
Markdown en `content`). La llamada espera a que el archivo esté listo y devuelve sus enlaces de descarga; con
`documents.download` tienes los bytes para guardarlos en S3 o enviarlos.

## Pasos

1. Guarda tu API key de Doconda (panel → **API keys**) como variable de entorno `DOCONDA_API_KEY` de la función, mejor
   desde un secreto que en el código.
2. Empaqueta la dependencia (Python 3.9 o superior; su única dependencia es `httpx`):
   `pip install doconda -t package/` y añade tu `lambda_function.py` al zip.
3. Escribe el handler:

```python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
from doconda import Doconda, DocondaError

doconda = Doconda()  # lee la key de DOCONDA_API_KEY


def lambda_handler(event, context):
    try:
        doc = doconda.documents.create(
            format=event.get("format", "docx"),
            content={"markdown": event["markdown"]},
        )
    except DocondaError as e:
        return {"error": e.code, "status": e.status}

    return {
        "id": doc["id"],
        "status": doc["status"],
        "outputs": doc["outputs"],
    }
```

Pruébalo con un evento como `{"format": "xlsx", "markdown": "# Presupuesto\n\n| Concepto | Importe |\n|---|---|\n| Sala | 1200 |"}`.
Para que lo escriba la IA, pasa `prompt` en vez de `content`.

Sube el *timeout* de la función: crear desde tu Markdown en calidad `fast` tarda unos segundos, pero `standard` puede
tardar varios minutos (ver [niveles de calidad](/guides/create#niveles-de-calidad)). Si no quieres que la Lambda espere,
usa `create_in_background(...)`, que responde al momento, y recibe el aviso con un webhook
(`doconda.webhooks.create(url)`).

## Qué devuelve

```json theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
{
  "id": "doc_01JAB3H8K2M7V6X5T1R0NPQ4ZW",
  "status": "ready",
  "outputs": [
    { "kind": "xlsx", "url": "https://…", "expires_at": "…" },
    { "kind": "pdf", "url": "https://…", "expires_at": "…" }
  ]
}
```

* `outputs`: el archivo y su PDF. Los enlaces caducan a los 5 minutos; `documents.outputs(id)` da otros nuevos.
* Para guardar el archivo en S3: `doconda.documents.download(doc["id"], "xlsx")` devuelve los bytes.
* `status`: `ready`, `ready_with_warnings`, `needs_review` (mira `documents.report(id)`) o `failed` (no se cobra).

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Necesito python-docx, python-pptx u openpyxl?">
    No. El SDK solo hace la llamada; recibes el archivo terminado, editable y con su PDF.
  </Accordion>

  <Accordion title="¿Reintenta si falla la red?">
    Sí: los errores de red, 429 y 5xx se reintentan solos (`max_retries=2` por defecto) antes de lanzar `DocondaError`.
  </Accordion>

  <Accordion title="¿Dónde se guardan los documentos?">
    En la Unión Europea (Irlanda), y la IA que los procesa también funciona en la UE.
  </Accordion>

  <Accordion title="¿Cuánto cuesta?">
    Pagas por documento entregado; los que fallan no se cobran. Ver [precios](/guides/account#precios).
  </Accordion>
</AccordionGroup>

## Sigue leyendo

* [SDK de Python](/sdk/python): todos los métodos.
* [Amazon Bedrock](/agents/bedrock): si la Lambda ejecuta un agente con Bedrock.
* [Quickstart](/quickstart).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.