# Pagos y notas de crédito

> Registre los pagos de sus facturas PPD con complementos de pago y los descuentos o devoluciones con notas de crédito.

## Complementos de pago

Una factura PPD (a crédito o en parcialidades) se cobra con un complemento de pago (CFDI tipo P) por cada pago que recibe. El SAT pide timbrarlo a más tardar el quinto día natural del mes siguiente al del pago.

Usted solo dice qué facturas paga y cuánto de cada una. Fiscalisto calcula el número de parcialidad, el saldo anterior y el insoluto, y los impuestos de cada factura en proporción.

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/payments \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" \
  -H "Idempotency-Key: pago-SPEI-2026102400123" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_form": "03",
    "operation_number": "SPEI-2026102400123",
    "documents": [{ "invoice": "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg", "amount": 2900 }],
    "send_email": true
  }'
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

const invoice = await fiscalisto.payments.create({
  payment_form: "03",
  operation_number: "SPEI-2026102400123",
  documents: [
    {
      invoice: "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
      amount: 2900,
    },
  ],
  send_email: true,
}, { idempotencyKey: "pago-SPEI-2026102400123" });
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

invoice = fiscalisto.payments.create({
    "payment_form": "03",
    "operation_number": "SPEI-2026102400123",
    "documents": [
        {
            "invoice": "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
            "amount": 2900,
        },
    ],
    "send_email": True,
}, idempotency_key="pago-SPEI-2026102400123")
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

$invoice = $fiscalisto->payments->create([
    'payment_form' => '03',
    'operation_number' => 'SPEI-2026102400123',
    'documents' => [
        [
            'invoice' => 'inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg',
            'amount' => 2900,
        ],
    ],
    'send_email' => true,
], ['idempotency_key' => 'pago-SPEI-2026102400123']);
```

```go tab="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()

	invoice, err := client.Payments.Create(ctx, &fiscalisto.CreatePaymentParams{
		PaymentForm:     "03",
		OperationNumber: fiscalisto.String("SPEI-2026102400123"),
		Documents: []fiscalisto.CreatePaymentParamsDocument{
			{
				Invoice: "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
				Amount:  2900,
			},
		},
		SendEmail: fiscalisto.Bool(true),
	}, fiscalisto.WithIdempotencyKey("pago-SPEI-2026102400123"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(invoice.ID)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.RequestOptions;
import com.fiscalisto.model.CreatePaymentParams;
import com.fiscalisto.model.CreatePaymentParamsDocument;
import java.util.List;

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

var invoice = fiscalisto.payments().create(new CreatePaymentParams()
        .setPaymentForm("03")
        .setOperationNumber("SPEI-2026102400123")
        .setDocuments(List.of(
                new CreatePaymentParamsDocument()
                        .setInvoice("inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg")
                        .setAmount(2900)
        ))
        .setSendEmail(true), RequestOptions.idempotencyKey("pago-SPEI-2026102400123"));
System.out.println(invoice.getId());
```

```csharp tab="C#"
using Fiscalisto;

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

var invoice = await fiscalisto.Payments.CreateAsync(new CreatePaymentParams
{
    PaymentForm = "03",
    OperationNumber = "SPEI-2026102400123",
    Documents = new()
    {
        new()
        {
            Invoice = "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
            Amount = 2900,
        },
    },
    SendEmail = true,
}, new RequestOptions { IdempotencyKey = "pago-SPEI-2026102400123" });
```

- `documents` acepta hasta 100 facturas del mismo cliente, por su id o su UUID. `amount` es lo que se paga de cada una, en la moneda de la factura. Solo se pueden pagar facturas timbradas con la API.
- Sin `date`, el pago es de hoy. Si se lo pagaron otro día, mande `date` (`2026-10-20`).
- Si la factura es en dólares y le pagaron en pesos, el pago va en MXN y cada documento lleva `amount` en dólares (lo que se abona a la factura) y `received` en pesos (lo que le llegó por ella). Si le pagaron en dólares, mande `currency: "USD"` y el `exchange_rate` del día del pago.
- Si `amount` es mayor que el saldo de la factura, no se timbra: el error dice el saldo que queda.
- Si el pago es un depósito que mandó a [Conciliación bancaria](https://fiscalisto.com/docs/api/conciliacion-bancaria), mande `bank_transaction` (`btx_…`): el complemento lleva la fecha del depósito y lo deja conciliado.

La respuesta es un objeto `invoice` de `type: "P"`, con `payment` (forma, fecha, monto y cada documento con su parcialidad y saldos). Cada factura pagada baja su `amount_due` y llega `invoice.partially_paid` o `invoice.paid` ([Cuentas por cobrar](https://fiscalisto.com/docs/api/cuentas-por-cobrar)).

## Notas de crédito

Un descuento, una bonificación o una devolución sobre una factura ya timbrada va en una nota de crédito (CFDI tipo E) relacionada a ella. `amount` es antes de impuestos: Fiscalisto aplica el IVA y las retenciones de la factura en la misma proporción.

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/credit_notes \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" \
  -H "Idempotency-Key: descuento-A-1042" \
  -H "Content-Type: application/json" \
  -d '{
    "invoice": "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
    "amount": 500,
    "description": "Descuento por pronto pago",
    "payment_form": "03"
  }'
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

const invoice = await fiscalisto.creditNotes.create({
  invoice: "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
  amount: 500,
  description: "Descuento por pronto pago",
  payment_form: "03",
}, { idempotencyKey: "descuento-A-1042" });
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

invoice = fiscalisto.credit_notes.create({
    "invoice": "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
    "amount": 500,
    "description": "Descuento por pronto pago",
    "payment_form": "03",
}, idempotency_key="descuento-A-1042")
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

$invoice = $fiscalisto->creditNotes->create([
    'invoice' => 'inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg',
    'amount' => 500,
    'description' => 'Descuento por pronto pago',
    'payment_form' => '03',
], ['idempotency_key' => 'descuento-A-1042']);
```

```go tab="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()

	invoice, err := client.CreditNotes.Create(ctx, &fiscalisto.CreateCreditNoteParams{
		Invoice:     "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
		Amount:      500,
		Description: fiscalisto.String("Descuento por pronto pago"),
		PaymentForm: "03",
	}, fiscalisto.WithIdempotencyKey("descuento-A-1042"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(invoice.ID)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.RequestOptions;
import com.fiscalisto.model.CreateCreditNoteParams;

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

var invoice = fiscalisto.creditNotes().create(new CreateCreditNoteParams()
        .setInvoice("inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg")
        .setAmount(500)
        .setDescription("Descuento por pronto pago")
        .setPaymentForm("03"), RequestOptions.idempotencyKey("descuento-A-1042"));
System.out.println(invoice.getId());
```

```csharp tab="C#"
using Fiscalisto;

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

var invoice = await fiscalisto.CreditNotes.CreateAsync(new CreateCreditNoteParams
{
    Invoice = "inv_OufpKqnrvx9p0Nfbydl9jG4UNGeTYcvdrg",
    Amount = 500,
    Description = "Descuento por pronto pago",
    PaymentForm = "03",
}, new RequestOptions { IdempotencyKey = "descuento-A-1042" });
```

Por omisión la relación es `01` (nota de crédito); para una devolución de mercancía mande `"relationship": "03"`. Si la factura es PPD y todavía no se paga, una nota de crédito reduce su saldo para los complementos de pago siguientes.

## Anticipos

Si el cliente le paga antes de saber qué va a comprar, timbre la factura del anticipo con [`POST /v1/advances`](https://fiscalisto.com/docs/api/referencia/anticipos/create-advance) (`amount` es lo que pagó, con IVA). Cuando se entregue lo vendido, [`POST /v1/advances/{id}/apply`](https://fiscalisto.com/docs/api/referencia/anticipos/apply-advance) timbra la factura de la venta relacionada al anticipo, con cualquiera de las dos opciones del SAT: con `"method": "egreso"` además una nota de crédito por lo anticipado; con `"method": "remanente"` la factura solo por lo que falta pagar.
