# Recibir el historial de convivencia

`GET /v1/connections/:id/history`

Al conectar un número por convivencia, antes de abrir la ventana de Meta, el negocio contesta si quiere que le entreguemos el historial de sus conversaciones: **hasta 6 meses, los mensajes de las dos partes, sin grupos**. El historial sigue en su teléfono: no se borra ni se mueve nada de ahí. Si contesta que sí, lo pedimos a Meta (se puede una sola vez, al conectar; Meta también le pregunta en la app si lo comparte), lo guardamos **cifrado hasta 7 días** y te lo entregamos de dos formas, lo primero que pase:

· **Por webhook:** eventos `history.batch` con hasta 500 mensajes cada uno (en la forma de Meta, como `message.received`, con `contact` y `direction`), firmados igual que los demás, y un `history.completed` cuando no queda nada. Van por una cola aparte que no demora tus mensajes en vivo: un historial grande puede tardar horas.
· **Por la API**, si todavía no tenés webhook: GET /v1/connections/{id}/history te da las tandas en orden (`limit` 1 a 5, `after` = el `nextCursor` anterior). Leer no borra: cuando guardaste una tanda, confirmala con POST /v1/connections/{id}/history/{batchId}/ack.

Cada tanda **se borra apenas se entrega** (tu 2xx o tu confirmación); lo que no se entrega se borra a los 7 días igual. No cuenta como tráfico ni consume cuota. Si el negocio contestó que no, no pedimos nada a Meta. Si un día nos quedáramos sin espacio, dejamos de guardar historial nuevo y te avisamos con `history.dropped`.

## Ejemplos

### cURL

```bash
# 1) read a page (reading does NOT delete)
curl "https://api.waiaconnect.com/v1/connections/conn_…/history?limit=1" -H "Authorization: Bearer wc_live_YOUR_API_KEY"
# → { "data": [ { "batchId": "hb_…", "count": 500, "messages": [ … ] } ], "hasMore": true, "nextCursor": 1 }

# 2) once you stored it, confirm it → deleted from WAIA Connect at once
curl -X POST "https://api.waiaconnect.com/v1/connections/conn_…/history/hb_…/ack" -H "Authorization: Bearer wc_live_YOUR_API_KEY"
# 3) next page: ?after=1 (the nextCursor) — until hasMore is false
```

### Node.js

```javascript
const H = { "Authorization": "Bearer wc_live_YOUR_API_KEY" };
let after = 0, hasMore = true;
while (hasMore) {
  const page = await (await fetch(`https://api.waiaconnect.com/v1/connections/conn_…/history?limit=1&after=${after}`, { headers: H })).json();
  for (const batch of page.data) {
    await saveMessages(batch.messages);            // your storage; dedupe on batch.batchId
    await fetch(`https://api.waiaconnect.com/v1/connections/conn_…/history/${batch.batchId}/ack`, { method: "POST", headers: H });
  }
  hasMore = page.hasMore;
  after = page.nextCursor;
}
```

### PHP

```php
<?php
$h = ["Authorization: Bearer wc_live_YOUR_API_KEY"];
$after = 0;
do {
  $ch = curl_init("https://api.waiaconnect.com/v1/connections/conn_…/history?limit=1&after=" . $after);
  curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $h]);
  $page = json_decode(curl_exec($ch), true);
  foreach ($page["data"] as $batch) {
    save_messages($batch["messages"]); // your storage; dedupe on batchId
    $ack = curl_init("https://api.waiaconnect.com/v1/connections/conn_…/history/" . $batch["batchId"] . "/ack");
    curl_setopt_array($ack, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $h]);
    curl_exec($ack);
  }
  $after = $page["nextCursor"];
} while ($page["hasMore"]);
```

### Python

```python
import requests
H = {"Authorization": "Bearer wc_live_YOUR_API_KEY"}
after, has_more = 0, True
while has_more:
    page = requests.get("https://api.waiaconnect.com/v1/connections/conn_…/history", headers=H, params={"limit": 1, "after": after}).json()
    for batch in page["data"]:
        save_messages(batch["messages"])  # your storage; dedupe on batchId
        requests.post(f"https://api.waiaconnect.com/v1/connections/conn_…/history/{batch['batchId']}/ack", headers=H)
    has_more, after = page["hasMore"], page["nextCursor"]
```

## Notas

- **Deduplicá por `batchId`**: una tanda puede llegarte dos veces (por ejemplo, si reiniciamos en medio de una entrega).
- Si integrás con enlaces de alta, mandá `historyDelivery: true|false` al crear el enlace si ya le preguntaste a tu cliente; si no, la página se lo pregunta.
- `history.synced` sigue llegando como resumen de cada tanda de Meta (`progress: 100` = Meta terminó).
