Vas a lograr registrar un pago con POST /v1/payments sin duplicarlo en un reintento, y leer y conciliar los pagos que ya existen en Mozart.
Registrar un pago por la API requiere una clave con el scope write (ver Autenticación). Sin ese scope, POST /v1/payments responde 403 forbidden.

Registrar un pago

Campos del body

Idempotencia por externalId

externalId es tu clave de idempotencia: identificá cada pago de tu lado con un valor propio (el id de tu transacción, por ejemplo) y mandalo siempre que registres ese pago.
1

Primer request

Un externalId nuevo para esa cartera crea el pago y responde 201.
2

Reintento con el mismo externalId

Si volvés a mandar el mismo externalId en la misma cartera —por un timeout, un reintento automático de tu lado, lo que sea— la API no crea un segundo pago: responde 200 con el pago que ya existía.
3

Mismo externalId con otro cuerpo

Si el externalId ya existe en esa cartera pero el cuerpo es distinto (monto, moneda, fecha, deudor, deuda, método o referencia), la API no devuelve el pago anterior ni crea uno nuevo: responde 409 idempotency_conflict. Usá un externalId nuevo para un pago distinto.
La idempotencia es por portfolioId + externalId. El mismo externalId en dos carteras distintas crea dos pagos: no es una clave global.

Errores típicos

Ver Paginación, errores y límites para el formato completo del sobre de error.

Ejemplos por lenguaje

Otras formas en que se registra un pago

POST /v1/payments no es la única fuente: un pago también se registra manualmente desde el panel de Mozart, por un link de cobro (pay.mozarth.com), o lo trae el importador de carteras cuando una deuda llega al archivo ya parcialmente pagada. Los tres caminos se leen igual por GET /v1/payments.

Leer pagos

paymentMethod es uno de transfer, cash, collection_network, deposit, card, check u other.

Promesas de pago

GET /v1/promises lista los compromisos de pago futuro. Cuando una promesa se cumple, queda vinculada al pago que la cumplió:
status de una promesa es uno de pending, partial, fulfilled, broken o cancelled.

Conciliación con tus propios registros

La forma confiable de conciliar una promesa con el pago que la cumplió es el vínculo directo por id: promise.paymentId apunta al id del pago correspondiente (y, a la inversa, payment.promiseId apunta a la promesa que ese pago cumplió). Si además necesitás cruzar un pago contra tu propio sistema, usá reference para lo que ya venías registrando manualmente, o externalId para lo que registrás vos mismo por POST /v1/payments: es la clave que elegiste y vuelve en el campo externalId del pago (null en los pagos que no se cargaron por ese endpoint). promise.paymentReference es el mismo tipo de dato visto desde la promesa. reference es texto libre y opcional: puede venir vacío, así que no lo uses como única clave de conciliación si tu proceso lo necesita sin excepciones.

Siguiente paso

Seguí con Carga de cartera para cargar deudores y deudas por la API.