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

# Idempotencia

> Usá Idempotency-Key para reintentar escrituras del SDK sin duplicar ventas, compras, pagos ni movimientos

Las escrituras que pueden crear duplicados requieren o aceptan `Idempotency-Key`.
En el SDK se envía como `idempotencyKey` dentro del request.

```typescript theme={null}
await lapyme.sales.create({
  idempotencyKey: `sale:shopify:${order.id}`,
  body: {
    // ...
  },
});
```

## Buenas keys

Elegí una key estable que represente la operación de negocio, no el intento.

```text theme={null}
sale:shopify:12345
purchase:vendor-bill:0001-00000042
stock-adjustment:warehouse-1:cycle-count-2026-05-24
customer:external-crm:88291
```

## Keys que conviene evitar

```text theme={null}
random UUID nuevo en cada retry
timestamp-only-2026-05-24T10:30:00Z
sale
retry-1
```

## Patrón de retry

```typescript theme={null}
import { Lapyme } from "lapyme";
import * as errors from "lapyme/models/errors";

const lapyme = new Lapyme({
  bearerAuth: process.env["LAPYME_API_KEY"] ?? "",
});

const idempotencyKey = `sale:shopify:${order.id}`;

try {
  await lapyme.sales.create({
    idempotencyKey,
    body: salePayload,
  });
} catch (error) {
  if (
    error instanceof errors.ApiErrorEnvelope &&
    error.error.retryable
  ) {
    // Reintentá la misma operación con el mismo idempotencyKey.
    await lapyme.sales.create({
      idempotencyKey,
      body: salePayload,
    });
  } else {
    throw error;
  }
}
```

<Warning>
  Si reutilizás la misma key con otro payload, la API responde
  `IDEMPOTENCY_CONFLICT`.
</Warning>
