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

# Registrar una transacción

> Receta completa: de la cuenta a un gasto categorizado, sin duplicar.

Objetivo: registrar un gasto en una cuenta, con categoría, de forma segura ante reintentos.

<Steps>
  <Step title="Encuentra (o crea) la cuenta">
    ```bash theme={null}
    curl https://api.finzaria.com/v1/accounts \
      -H "Authorization: Bearer $FINZARIA_API_KEY"
    ```

    Toma el `id` de la cuenta que quieres afectar. Si no tienes ninguna, créala con
    `POST /v1/accounts`.
  </Step>

  <Step title="Registra el gasto">
    La categoría va como **ruta** y se crea al vuelo si no existe. Manda un `Idempotency-Key` para no
    duplicar si reintentas.

    <CodeGroup>
      ```bash curl theme={null}
      curl https://api.finzaria.com/v1/transactions \
        -H "Authorization: Bearer $FINZARIA_API_KEY" \
        -H "Content-Type: application/json" \
        -H "Idempotency-Key: $(uuidgen)" \
        -d '{
          "type": "expense",
          "amount": "150.50",
          "date": "2026-07-14",
          "description": "Súper Chedraui",
          "accountId": "ACCOUNT_ID",
          "category": "Gastos / Comida / Súper"
        }'
      ```

      ```javascript Node.js theme={null}
      import { randomUUID } from "node:crypto"

      const res = await fetch("https://api.finzaria.com/v1/transactions", {
        method: "POST",
        headers: {
          Authorization: `Bearer ${process.env.FINZARIA_API_KEY}`,
          "Content-Type": "application/json",
          "Idempotency-Key": randomUUID(),
        },
        body: JSON.stringify({
          type: "expense",
          amount: "150.50",
          date: "2026-07-14",
          description: "Súper Chedraui",
          accountId: process.env.ACCOUNT_ID,
          category: "Gastos / Comida / Súper",
        }),
      })
      const txn = await res.json()
      ```
    </CodeGroup>
  </Step>

  <Step title="Confirma">
    La respuesta trae la transacción creada (con su `category` resuelta y su `emoji`) y el saldo de la
    cuenta ya quedó ajustado. Si mandas una descripción con una [regla](/guias/conceptos/reglas)
    asociada y **sin** categoría, se categoriza sola.
  </Step>
</Steps>

<Tip>
  ¿Ingreso en vez de gasto? Cambia `type` a `income` y usa una categoría de ingreso
  ("Ingresos / Nómina"). ¿Deuda o traspaso? Ver [tipos de transacción](/guias/conceptos/transacciones).
</Tip>
