# Explicar un depósito sin factura

`POST https://api.fiscalisto.com/v1/bank_transactions/{id}/classify`

Un depósito que ninguna factura explica: venta (aún sin facturar), prestamo, traspaso o devolucion. El SAT puede presumir ingreso un depósito sin explicar (CFF art. 59 fr. III).

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `id` | ruta | sí | El id del objeto. |
| `Idempotency-Key` | encabezado |  | Opcional (los SDK la mandan solos). Si la respuesta se pierde, repita la solicitud con el mismo valor durante 24 horas: contesta lo mismo, con idempotent-replayed: true, y no lo hace dos veces (ni crea, ni manda correos, ni cobra). |

## Cuerpo

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `classification` | `venta`, `prestamo`, `traspaso`, `devolucion` | sí | venta (una venta que aún no se factura), prestamo, traspaso (entre cuentas propias) o devolucion. |
| `note` | string |  | Una nota para su equipo (de dónde vino, por qué). (hasta 500 caracteres) |

Ejemplo:

```json
{
  "classification": "traspaso",
  "note": "De la cuenta de ahorro"
}
```

## Con el SDK de TypeScript

```ts
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

const bankTransaction = await fiscalisto.bankTransactions.classify("btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx", {
  classification: "traspaso",
  note: "De la cuenta de ahorro",
}, { idempotencyKey: "pedido-A-1042" });
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

bank_transaction = fiscalisto.bank_transactions.classify("btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx", {
    "classification": "traspaso",
    "note": "De la cuenta de ahorro",
}, idempotency_key="pedido-A-1042")
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

$bankTransaction = $fiscalisto->bankTransactions->classify('btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx', [
    'classification' => 'traspaso',
    'note' => 'De la cuenta de ahorro',
], ['idempotency_key' => 'pedido-A-1042']);
```

## Con el SDK de .NET

```csharp
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var bankTransaction = await fiscalisto.BankTransactions.ClassifyAsync("btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx", new ClassifyBankTransactionParams
{
    Classification = "traspaso",
    Note = "De la cuenta de ahorro",
}, new RequestOptions { IdempotencyKey = "pedido-A-1042" });
```

## Con el SDK de Go

```go
package main

import (
	"context"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	bankTransaction, err := client.BankTransactions.Classify(ctx, "btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx", &fiscalisto.ClassifyBankTransactionParams{
		Classification: "traspaso",
		Note:           fiscalisto.String("De la cuenta de ahorro"),
	}, fiscalisto.WithIdempotencyKey("pedido-A-1042"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(bankTransaction.ID)
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.RequestOptions;
import com.fiscalisto.model.ClassifyBankTransactionParams;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var bankTransaction = fiscalisto.bankTransactions().classify("btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx", new ClassifyBankTransactionParams()
        .setClassification("traspaso")
        .setNote("De la cuenta de ahorro"), RequestOptions.idempotencyKey("pedido-A-1042"));
System.out.println(bankTransaction.getId());
```

## Respuesta 200

Correcto.

Un objeto `BankTransaction`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `id` | string | sí | Identificador del objeto, con su prefijo (iss_, inv_, ret_, cus_, prd_, emp_, bat_, brn_, whs_, stm_, adj_, evt_, whe_). |
| `livemode` | boolean | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `object` | `"bank_transaction"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `issuer` | string | sí | El emisor. |
| `date` | string | sí | El día del depósito (AAAA-MM-DD). |
| `amount` | number | sí | Lo depositado, en pesos. |
| `description` | string | sí | El concepto del banco. |
| `reference` | string o null | sí | La referencia o clave de rastreo, o null. |
| `account` | string o null | sí | Los últimos 4 dígitos de la cuenta, o null. |
| `payer_tax_id` | string o null | sí | El RFC de quien depositó, si se sabe. |
| `status` | `open`, `matched`, `classified` | sí | open (sin conciliar), matched (pagó facturas) o classified (no es de una factura). |
| `classification` | `venta`, `prestamo`, `traspaso`, `devolucion` o null | sí | classified: venta (aún sin facturar), prestamo, traspaso o devolucion; si no, null. |
| `note` | string o null | sí | Una nota al clasificarlo, o null. |
| `invoices` | arreglo de string | sí | Las facturas (inv_…) que pagó, si está conciliado. |
| `payment` | string o null | sí | El complemento de pago (inv_…) timbrado con él, o null. |
| `suggested_match` | objeto o null | sí | Si está abierto, las facturas que parece pagar (por monto, RFC, folio en el concepto y fecha): invoices, lo que toca a cada una (amounts), method, confidence (high o medium) y por qué (reasons). null si ninguna encaja. |
| `suggested_match.invoices` | arreglo de string | sí | Las facturas, como el cuerpo de POST /v1/invoices, con reference opcional. |
| `suggested_match.amounts` | objeto | sí | Lo que el depósito pagaría de cada factura (por inv_…). |
| `suggested_match.method` | `PPD`, `PUE` | sí | egreso (la factura completa y después una nota de crédito por el anticipo, opción A) o remanente (la factura solo por lo que falta, opción B). |
| `suggested_match.confidence` | `high`, `medium` | sí | high (el monto y además el RFC, el nombre o el folio coinciden) o medium (revíselo antes). |
| `suggested_match.reasons` | arreglo de string | sí | Por qué se sugiere, en palabras. |
| `created_at` | string (date-time) o null | sí | Cuándo se mandó. |

```json
{
  "id": "btx_OufpKqnrvx9p9Rt4sLm2XyT5uBcW8sKdLx",
  "object": "bank_transaction",
  "livemode": false,
  "issuer": "iss_OufpKqnrvx9p",
  "date": "2026-10-24",
  "amount": 5800,
  "description": "SPEI RECIBIDO INMOBILIARIA CVA · ICV060329BY0",
  "reference": "F-1024",
  "account": "4821",
  "payer_tax_id": "ICV060329BY0",
  "status": "open",
  "classification": null,
  "note": null,
  "invoices": [],
  "payment": null,
  "suggested_match": {
    "invoices": [
      "inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN"
    ],
    "amounts": {
      "inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN": 5800
    },
    "method": "PUE",
    "confidence": "high",
    "reasons": [
      "Mismo monto",
      "RFC del cliente en el concepto"
    ]
  },
  "created_at": "2026-10-25T09:00:00-06:00"
}
```

## Errores

Puede responder 400, 401, 403, 404, 429, 500 con el cuerpo de error de siempre; cada código está en https://fiscalisto.com/docs/api/errores.md.
