# Ejemplos

Fuente: https://wire.ia.br/documentation/es/api/exemplos

> Código listo en curl, JavaScript y Python, desde la primera solicitud hasta una automatización completa.



Todos los ejemplos leen el token y el ID de la cuenta de variables de entorno:

```bash
export PAPER_TOKEN="paper_…"
export PAPER_CUENTA="3f2a…"
```

## Un cliente mínimo [#un-cliente-mínimo]

<Tabs items="['JavaScript', 'Python', 'curl']">
  <Tab value="JavaScript">
    ```js
    // Node 18+ o navegador. Sin dependencias.
    const BASE = 'https://wire.ia.br/api/v1';

    async function paper(path, { method = 'GET', body, intentos = 4 } = {}) {
      for (let i = 0; ; i++) {
        const res = await fetch(BASE + path, {
          method,
          headers: {
            Authorization: `Bearer ${process.env.PAPER_TOKEN}`,
            'X-Paper-Account': process.env.PAPER_CUENTA,
            'Accept-Language': 'es',
            ...(body ? { 'Content-Type': 'application/json' } : {}),
          },
          body: body ? JSON.stringify(body) : undefined,
        });
        if (res.ok) return res.status === 204 ? null : res.json();
        const { error } = await res.json().catch(() => ({ error: res.statusText }));
        const vale = [429, 500, 502, 503].includes(res.status) && i < intentos;
        if (!vale) throw new Error(`${res.status}: ${error}`);
        await new Promise((r) => setTimeout(r, 2000 * 2 ** i));
      }
    }

    const yo = await paper('/me');
    console.log(`Conectado como ${yo.conta.nome}, token ${yo.token.tipo}`);
    ```
  </Tab>

  <Tab value="Python">
    ```python
    # Python 3.9+. Necesita: pip install requests
    import os, time, requests

    BASE = "https://wire.ia.br/api/v1"
    SESION = requests.Session()
    SESION.headers.update({
        "Authorization": f"Bearer {os.environ['PAPER_TOKEN']}",
        "X-Paper-Account": os.environ["PAPER_CUENTA"],
        "Accept-Language": "es",
    })

    def paper(ruta, metodo="GET", json=None, intentos=4):
        for i in range(intentos + 1):
            res = SESION.request(metodo, BASE + ruta, json=json, timeout=30)
            if res.ok:
                return res.json() if res.content else None
            if res.status_code not in (429, 500, 502, 503) or i == intentos:
                raise RuntimeError(f"{res.status_code}: {res.json().get('error')}")
            time.sleep(2 * 2 ** i)

    yo = paper("/me")
    print(f"Conectado como {yo['conta']['nome']}, token {yo['token']['tipo']}")
    ```
  </Tab>

  <Tab value="curl">
    ```bash
    paper() {
      curl -sS "https://wire.ia.br/api/v1$1" \
        -H "Authorization: Bearer $PAPER_TOKEN" \
        -H "X-Paper-Account: $PAPER_CUENTA" \
        -H "Accept-Language: es" \
        -H "Content-Type: application/json" "${@:2}"
    }

    paper /me
    paper /vaults
    ```
  </Tab>
</Tabs>

## Crear la página del día [#crear-la-página-del-día]

Crea una página con la fecha de hoy en una carpeta "Diario del script", si todavía no existe.

<Tabs items="['JavaScript', 'Python']">
  <Tab value="JavaScript">
    ```js
    const hoy = new Date().toISOString().slice(0, 10);
    const paginas = await paper('/vaults/principal/pages');

    let carpeta = paginas.find((p) => p.kind === 'pasta' && p.title === 'Diario del script');
    if (!carpeta) {
      carpeta = await paper('/vaults/principal/pages', {
        method: 'POST',
        body: { title: 'Diario del script', kind: 'pasta' },
      });
    }

    if (!paginas.some((p) => p.parentId === carpeta.id && p.title === hoy)) {
      await paper('/vaults/principal/pages', {
        method: 'POST',
        body: {
          title: hoy,
          parentId: carpeta.id,
          markdown: `## Para hoy\n\n- [ ] \n\n## Notas\n`,
        },
      });
    }
    ```
  </Tab>

  <Tab value="Python">
    ```python
    from datetime import date

    hoy = date.today().isoformat()
    paginas = paper("/vaults/principal/pages")

    carpeta = next((p for p in paginas if p["kind"] == "pasta" and p["title"] == "Diario del script"), None)
    if carpeta is None:
        carpeta = paper("/vaults/principal/pages", "POST", {"title": "Diario del script", "kind": "pasta"})

    if not any(p["parentId"] == carpeta["id"] and p["title"] == hoy for p in paginas):
        paper("/vaults/principal/pages", "POST", {
            "title": hoy,
            "parentId": carpeta["id"],
            "markdown": "## Para hoy\n\n- [ ] \n\n## Notas\n",
        })
    ```
  </Tab>
</Tabs>

## Agregar a una página [#agregar-a-una-página]

```bash
paper /vaults/principal/pages/pa1k2m3n4o5p -X PATCH \
  -d '{"append": "- [ ] Llamar al proveedor @2026-10-07 10:00"}'
```

## Leer todo el contenido de una carpeta para una IA [#leer-todo-el-contenido-de-una-carpeta-para-una-ia]

```python
def texto_de_la_carpeta(boveda, carpeta_id):
    partes = []
    for p in paper(f"/vaults/{boveda}/pages?parent={carpeta_id}"):
        if p["kind"] == "pagina" and not p.get("locked"):
            pagina = paper(f"/vaults/{boveda}/pages/{p['id']}")
            partes.append(f"# {pagina['title']}\n\n{pagina['markdown']}")
    return "\n\n---\n\n".join(partes)
```

Las carpetas con muchas páginas gastan una solicitud por página. Para 60 páginas o más, reparte las lecturas a lo largo de unos minutos.

## Crear un evento a partir de una tarea [#crear-un-evento-a-partir-de-una-tarea]

```js
await paper('/calendar/events', {
  method: 'POST',
  body: { title: 'Llamar al proveedor', date: '2026-10-07', time: '10:00', durationMinutes: 15 },
});
```

## Enviar una imagen y ponerla en una página [#enviar-una-imagen-y-ponerla-en-una-página]

```bash
RESPUESTA=$(curl -sS -X POST "https://wire.ia.br/api/v1/vaults/principal/files?name=grafico.png" \
  -H "Authorization: Bearer $PAPER_TOKEN" \
  -H "X-Paper-Account: $PAPER_CUENTA" \
  -H "Content-Type: image/png" \
  --data-binary @grafico.png)

MD=$(echo "$RESPUESTA" | jq -r .markdown)
paper /vaults/principal/pages/pa1k2m3n4o5p -X PATCH -d "$(jq -n --arg md "$MD" '{append: $md}')"
```

## Una herramienta para un agente (Claude, OpenAI y otros) [#una-herramienta-para-un-agente-claude-openai-y-otros]

Una definición de herramienta en formato JSON Schema, que la mayoría de los modelos acepta:

```json
{
  "name": "paper_agregar",
  "description": "Agrega texto en Markdown al final de una página del cuaderno Paper de la persona.",
  "input_schema": {
    "type": "object",
    "properties": {
      "boveda": { "type": "string", "description": "Id de la bóveda, de GET /vaults" },
      "pagina": { "type": "string", "description": "Id de la página, de GET /vaults/{boveda}/pages" },
      "texto": { "type": "string", "description": "Markdown a agregar" }
    },
    "required": ["boveda", "pagina", "texto"]
  }
}
```

Al ejecutar, llama a `PATCH /vaults/{boveda}/pages/{pagina}` con `{"append": texto}`.
