API · payments

payments operations in the OpenAPI contract that accept an API key.

Updated:

Cobros de los negocios; notificaciones autenticadas por HMAC de Mercado Pago.

GET /payments/accounts/mercadopago

Status

Lectura segura del estado, sin tokens. Scope payments:read para API keys. connection_mode es la conexión nueva que se ofrece; en países con política token es disabled mientras el interruptor de plataforma del token pegado esté apagado (F4-47). Una cuenta ya guardada se informa igual en account.

  • Authentication: API key or dashboard session
  • Scopes: payments:read

Responses

StatusDescription
200Successful Response (MercadoPagoAvailability)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
503Error (RFC 9457) (Problem)

GET /payments/accounts/mercadopago/charges

Charges

Últimos cobros electrónicos del proyecto para Finanzas → Cobros (F4-25), el más nuevo primero. Incluye cobros de cuentas ya desconectadas. Sin datos del pagador, link de pago ni referencias del proveedor. Sesión owner/manager (payments:accounts_configure); API keys con scope payments:read.

  • Authentication: API key or dashboard session
  • Scopes: payments:read

Parameters

NameInRequiredTypeDescription
limitqueryNointeger default 10

Responses

StatusDescription
200Successful Response (MercadoPagoCharges)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/bookings/{booking_id}/balance

Booking Balance

Tenant desde credencial. Scope payments:read_balance; cookie + CSRF. Bearer exige Idempotency-Key en todos los POST (máximo 128 caracteres); conflicto del ledger Bearer es 422, conflicto de dominio 409. Owner/manager; staff solo tareas asignadas (no anula ni ajusta). Sin llamadas a proveedores. Montos enteros minor units, PYG exponente 0. Clave de registro permanente; misma clave con otros datos devuelve 409. Duplicados por tarea/monto/método en ventana UTC de 5 minutos se rechazan.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
booking_idpathYesstring (uuid)

Responses

StatusDescription
200Successful Response (BalanceView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/bookings/{booking_id}/charges

Booking Charges

Tenant desde credencial. Scope payments:read_balance. Historial de cobros de la tarea (recibos manuales asignados y cobros electrónicos), el más nuevo primero. applied_minor es la parte aplicada a esta tarea. La nota y el motivo de anulación son privados: owner/manager o quien registró el recibo. Staff solo tareas asignadas.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
booking_idpathYesstring (uuid)

Responses

StatusDescription
200Successful Response (BookingChargesView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/bookings/{booking_id}/due

Adjust Due

Tenant desde credencial. Scope payments:adjust; cookie + CSRF. Una tarea cubierta no permite ajustar el importe (409 payment_conflict, detail payment.booking_covered_by_plan); primero quitar el plan. Notas internas editables. Define (si la tarea aún no tiene valor) o ajusta el valor a cobrar, en unidad menor de la moneda del negocio (PYG y CLP enteros), con motivo obligatorio y auditoría payment.due_adjusted. Solo owner/manager. Sin valor definido, el servidor usa por defecto el total del formulario o, si no hay, el precio del catálogo del servicio al congelarlo (tareas por agendar, confirmadas, en curso y completadas). Bearer exige Idempotency-Key en todos los POST (máximo 128 caracteres). Sin llamadas a proveedores. Montos enteros minor units, PYG exponente 0. Clave de registro permanente; misma clave con otros datos devuelve 409. Duplicados por tarea/monto/método en ventana UTC de 5 minutos se rechazan.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
booking_idpathYesstring (uuid)
Idempotency-KeyheaderNostring / null (null)

Request body (required)

  • application/json: AdjustDue

Responses

StatusDescription
204Successful Response
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/bookings/{booking_id}/lines/{line_id}/expense

Registrar como gasto el costo de una línea de la tarea

FIU-472: gasto de monto costo x cantidad, categoría Insumos, vinculado a la tarea (booking_id). El staff, solo en sus tareas y sus líneas: queda por aprobar. 409 expense.line_cost_required (la línea no tiene costo) o expense.line_has_expense (ya tiene otro gasto). Reintentar con la misma clave devuelve el mismo gasto.

FIU-472 (decisión 2): el costo de la línea se registra aparte, de un toque, como gasto de monto costo x cantidad, categoría «Insumos» (supplies), proveedor y comprobante opcionales (el comprobante, con POST /payments/expenses/{id}/receipt/...), vinculado a la tarea (booking_id). Con expenses:record queda aprobado; con expenses:record_own (staff: solo sus tareas y sus líneas) queda pending_approval. API key expenses:record. Reintentar con la misma clave devuelve el mismo gasto. 409 expense.line_cost_required, expense.line_has_expense.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
booking_idpathYesstring (uuid)
line_idpathYesstring (uuid)
Idempotency-KeyheaderYesstringUUID único por operación; reintentos con la misma key devuelven el mismo resultado durante 24 h.

Request body (required)

  • application/json: LineExpenseIn

Responses

StatusDescription
201Successful Response (ExpenseView)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/bookings/{booking_id}/payment-link

Cobrar con link de Mercado Pago el saldo de una tarea

F4-20 «Cobrar». Permiso y scope payments:link (owner/manager; staff solo en sus tareas y si el dueño no apagó «El repartidor puede cobrar»); cookie + CSRF o API key. Exige Idempotency-Key. El monto es el saldo de la tarea que calcula el core (nunca lo manda quien lo pide). Un link abierto por el mismo monto se devuelve con 200 y replay=true (nunca dos links por la misma tarea y monto); con otro monto abierto, 409 payment.link_pending. El cobro queda registrado y auditado (payment.created, payment.link_requested) antes de llamar a Mercado Pago; desde el panel el link vuelve listo (pending con checkout_url), con API key lo crea el worker enseguida (created sin URL: consultar GET /payments/bookings/{booking_id}/charges). deliver=conversation además lo manda por la conversación del cliente con una plantilla del servidor (delivery=queued; repetir la misma clave no manda dos mensajes, otra clave lo reenvía). Vence a las 48 h. 409 payment.link_unavailable (sin cuenta de producción BR/AR que coincida con el proyecto), payment.link_not_chargeable (tarea sin cliente, de prueba, en espera de seña o cerrada), payment.nothing_due, payment.parts_cover_balance (las partes abiertas ya cubren el saldo). F4-92 «Cobrar una parte»: con amount_minor el link es por esa parte (part=true), con su monto fijo. Pueden quedar varias partes abiertas a la vez; la suma de los cobros abiertos de la tarea nunca supera su saldo (422 payment_part_exceeds_balance, con remaining_minor, open_minor y currency). Las partes no se reemplazan entre sí ni las anula el link del bot o un QR/Point por el saldo; sin amount_minor, el link cobra lo que queda sin parte. Reintentar con la misma Idempotency-Key devuelve la misma parte (200, replay), aunque ya se haya pagado; otra clave es otra parte aunque el monto sea igual; la misma clave con otro monto da 409 payment.idempotency_conflict. Si baja el total, la parte que ya no entra se anula (void_reason=amount_changed).

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
booking_idpathYesstring (uuid)
Idempotency-KeyheaderYesstring

Request body (required)

  • application/json: PaymentLinkInput

Responses

StatusDescription
200Ya había un link abierto por el mismo monto, o es el reintento de la misma parte (replay) (PaymentLinkView)
201Link creado (PaymentLinkView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/bookings/balances

Booking Balances

Tenant desde credencial. Scope payments:read_balance; permiso de la matriz payments:read_balance (owner, manager, staff sobre tareas asignadas; viewer no). Saldo derivado de hasta 100 tareas en una pasada (chip de las listas). Omite las tareas que no se pueden calcular y las que el rol no ve. Sin bloqueos de filas.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
idsqueryYesarray

Responses

StatusDescription
200Successful Response (BookingBalancesView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/cash

Leer caja o configuración

  • Authentication: API key or dashboard session
  • Scopes: cash:read

Parameters

NameInRequiredTypeDescription
dayqueryNostring (date)Día local del negocio; por defecto hoy

Responses

StatusDescription
200Resultado en unidades menores de la moneda del negocio (CashDay)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/cash/entries

Registrar rendición, cierre o ajuste inmutable

También exige cash:remit para rendir o cash:close para cerrar/ajustar. Staff solo lee su efectivo. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: cash:read

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstringUUID único por operación; reintentos con la misma key devuelven el mismo resultado durante 24 h.

Request body (required)

  • application/json: CashCommand

Responses

StatusDescription
201Resultado en unidades menores de la moneda del negocio (CashEntryView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/cash/settings

Leer caja o configuración

  • Authentication: API key or dashboard session
  • Scopes: cash:configure

Responses

StatusDescription
200Resultado en unidades menores de la moneda del negocio (CashAlertSettings)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

PUT /payments/cash/settings

Configurar aviso opcional de efectivo

  • Authentication: API key or dashboard session
  • Scopes: cash:configure

Request body (required)

  • application/json: CashAlertSettings

Responses

StatusDescription
200Resultado en unidades menores de la moneda del negocio (CashAlertSettings)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/charges/{charge_id}/apply-to-account

Usar un pago «a devolver» para otra deuda

Tenant desde credencial. Scope payments:adjust; cookie + CSRF; solo owner/manager. Un pago tardío electrónico separado «a devolver» (refund_due) no compensa deudas del cliente; con confirm=true pasa al saldo del cliente y desde ahí cubre sus deudas más antiguas (FIFO). Auditoría payment.applied_to_account; idempotente (repetirlo devuelve el mismo resultado). No llama a Mercado Pago ni devuelve dinero. 409 payment.not_refund_due si el cobro no está «a devolver»; 409 payment.in_mediation con un reclamo abierto en MP.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)
Idempotency-KeyheaderNostring (null)

Request body (required)

  • application/json: ApplyToAccount

Responses

StatusDescription
200Pago pasado al saldo del cliente (AppliedToAccountView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/charges/{charge_id}/cancel

Anular un cobro abierto de una tarea (link, QR o Point)

F4-92. Permiso y scope payments:link (owner/manager; staff solo en sus tareas y si el dueño no apagó «El repartidor puede cobrar», si no 403); cookie + CSRF o API key (un QR o Point, solo sesión del panel). Anula un cobro abierto de la tarea, sea una parte o el cobro por el saldo (link, QR o Point; la tarjeta no), con void_reason=charge_cancelled; en Mercado Pago se cancela en el momento y, si falla, con reintentos. Un pago verificado que llegue igual queda en revisión. Los demás cobros no cambian. Repetir sobre un cobro anulado o vencido es un no-op. 409 payment.charge_not_found (no existe, es de otro proyecto o no es visible para quien pide), payment.charge_not_open (ya pagado u otro estado final).

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)

Responses

StatusDescription
200Successful Response (PaymentLinkView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/charges/{charge_id}/fiscal

Marcador fiscal y comprobantes de un cobro

F4-85. Tenant desde credencial. Scope/permiso payments:fiscal (owner/manager). Fiuit nunca emite comprobantes; devuelve el marcador manual (not_required, pending o issued_external con número y fecha) y los comprobantes del emisor externo del negocio, si hay. Otro proyecto o un id inexistente dan 404 payment.not_found.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)

Responses

StatusDescription
200Marcador y comprobantes (ChargeFiscalView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

PUT /payments/charges/{charge_id}/fiscal

Marcar si un cobro lleva comprobante fiscal

F4-85. Tenant desde credencial. Scope/permiso payments:fiscal (owner/manager); cookie + CSRF. Idempotente (repetir lo mismo no cambia nada). Solo cobros que recibieron dinero (409 fiscal.charge_not_paid; uno anulado, 409 payment.voided); si el emisor conectado ya emitió la factura, 409 fiscal.document_issued. Fecha futura, 409 fiscal.future_date. Auditado (payment.fiscal_marked); el monto del cobro no cambia.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)

Request body (required)

  • application/json: ChargeFiscalMark

Responses

StatusDescription
200Marcador actualizado (ChargeFiscalView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/charges/{charge_id}/refunds

Devoluciones de un cobro electrónico

Tenant desde credencial. Scope/permiso payments:refund (solo owner/manager). Lo devuelto (acreditado), lo pedido en curso (pending) y lo que todavía se puede devolver (refundable_minor). Si el cobro no admite devolución desde Fiuit, refundable_minor es 0 y refund_blocked trae el motivo (cobro manual, no pagado, contracargo, reclamo abierto, devolución parcial sin monto conocido, orden QR/Point, pago sin id de Mercado Pago o cobro pasado al saldo del cliente). Otro proyecto o un id inexistente dan el mismo 409 payment.charge_not_found.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)

Responses

StatusDescription
200Devoluciones del cobro (ChargeRefundsView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/charges/{charge_id}/refunds

Devolver (total o parcial) un cobro de Mercado Pago

Tenant desde credencial. Scope/permiso payments:refund (solo owner/manager); cookie + CSRF. Exige confirm=true e Idempotency-Key. Sin amount_minor devuelve todo lo que queda. El pedido queda registrado y auditado (payment.refund_requested) antes de llamar a Mercado Pago, con la misma clave de idempotencia en cada reintento; la respuesta trae status succeeded, failed (rechazo definitivo, con aviso a owner/manager) o pending (respuesta ambigua o en proceso; el worker reintenta). Repetir la misma clave devuelve la misma devolución; con otro monto o motivo, 409 payment.idempotency_conflict. Nunca más de lo cobrado (servicio y base de datos) → 409 payment.refund_exceeds_remaining o payment.already_refunded. 409 payment.not_refundable, payment.in_mediation, payment.refund_manual_unsupported (un cobro manual se anula), payment.refund_unsupported_method (orden QR/Point, se devuelve en Mercado Pago), payment.refund_unavailable (sin id del pago en MP), payment.refund_amount_unavailable, payment.refund_plan_unsupported (paquete o club), payment.refund_applied_to_account (pasado al saldo del cliente con «Usar para otra deuda»; limitación hasta F4-56). El cobro pasa a partially_refunded o refunded; lo devuelto se descuenta del saldo de la tarea, de Financiero, de las comisiones y de la seña en estadísticas.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)
Idempotency-KeyheaderYesstring

Request body (required)

  • application/json: RefundInput

Responses

StatusDescription
201Devolución registrada (y ejecutada si el proveedor respondió) (RefundView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/commissions/adjustments

Ajustar la comisión de un día

Ajuste manual con signo y motivo, inmutable y auditado, sobre un día abierto. Un día de un período liquidado da 409 commission.period_settled (F4-77); el ajuste va en un día abierto. Owner/manager. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:adjust

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstringUUID único por operación; reintentos con la misma key devuelven el mismo resultado durante 24 h.

Request body (required)

  • application/json: CommissionAdjustmentInput

Responses

StatusDescription
201Importes en unidades menores de la moneda del negocio (CommissionAdjustmentView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/commissions/day

Día de comisiones por profesional

Cobrado por método, propinas, comisión, ajustes y diferencias de caja de cada profesional en un día local, calculado al vuelo (sin cierre diario). Staff ve solo lo suyo; owner/manager ven a todos y lo cobrado sin profesional. Los cobros de tareas completadas se atribuyen a quien tenía sus recursos al completar; mientras siga abierta, a quien los tiene hoy. Tareas no_show/cancelled/failed no generan comisión ni unattributed_minor; sus cobros permanecen como ingreso del negocio en Financiero/Caja. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:read

Parameters

NameInRequiredTypeDescription
dayqueryNostring (date)

Responses

StatusDescription
200Importes en unidades menores de la moneda del negocio (CommissionDay)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/commissions/export

Exportar comisiones (CSV)

Una fila por profesional y día, importes en unidad menor y moneda. Auditado (commission.exported). Staff solo lo propio. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:export

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
member_idqueryNostring (uuid)

Responses

StatusDescription
200CSV UTF-8 en unidades menores (string)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/commissions/report

Reporte de comisiones por período y profesional

Totales por profesional entre start y end (días locales, inclusive, hasta 366), calculados al vuelo; cada tarea cuenta una vez. Staff solo lo propio (member_id de otra persona da 403). En F4-77 los días de un período liquidado salen del asiento congelado (settlements); la comisión de una anulación o devolución se revierte en el día del cobro original y el período de la devolución lo avisa en reversals; carried_minor (dentro de adjustments_minor) corrige un período ya liquidado. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:read

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
member_idqueryNostring (uuid)

Responses

StatusDescription
200Importes en unidades menores de la moneda del negocio (CommissionReport)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/commissions/rules

Listar reglas de comisión

Staff ve las reglas generales y las suyas. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:read

Responses

StatusDescription
200Importes en unidades menores de la moneda del negocio (CommissionRules)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/commissions/rules

Crear regla de comisión

Porcentaje (rate_bp, 4000 = 40 %) o monto fijo (amount_minor, por tarea o por unidad de producto), por profesional y por servicio o producto, con o sin descontar la comisión del medio de pago, vigente desde valid_from. Dos reglas del mismo alcance que se superponen dan 409 commission.rule_overlap. Owner/manager. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:configure

Request body (required)

  • application/json: CommissionRuleInput

Responses

StatusDescription
201Importes en unidades menores de la moneda del negocio (CommissionRuleView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/commissions/rules/{rule_id}/end

Terminar una regla de comisión

Fija el último día de vigencia (inclusive). Una regla no se edita: se termina y se crea otra. Owner/manager. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:configure

Parameters

NameInRequiredTypeDescription
rule_idpathYesstring (uuid)

Request body (required)

  • application/json: CommissionRuleEnd

Responses

StatusDescription
200Importes en unidades menores de la moneda del negocio (CommissionRuleView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/commissions/settlements

Liquidaciones de comisiones de un período

F4-77. Liquidaciones que tocan start..end (días locales, inclusive, hasta 366), con los montos congelados, los ajustes automáticos que ya congelaron de otros períodos (carried_from) y lo que cada una tiene pendiente de pasar como ajuste automático al período abierto siguiente (pending_carry_minor, carry_day). Staff solo lo propio (member_id de otra persona da 403). No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:read

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
member_idqueryNostring (uuid)

Responses

StatusDescription
200Importes en unidades menores de la moneda del negocio (CommissionSettlements)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/commissions/settlements

Liquidar comisiones de una persona y un período

F4-77. Congela la comisión y los ajustes de start..end (días locales, hasta hoy) de una persona en un asiento inmutable, con motivo, autor y fecha; auditoría commission.settled y evento interno commission.settled. Idempotente por Idempotency-Key y por período; liquidar otra vez el mismo período (otra clave, otro worker) devuelve el mismo asiento; otro período que se superpone da 409 commission.period_settled; un día futuro da 409 commission.future_day. Desde entonces esos días leen el asiento. Un cambio posterior (anulación, devolución o regla retroactiva) no lo reescribe; queda como ajuste automático (carried_minor) en el primer día abierto después del período, con referencia a esta liquidación. expected es opcional y lleva moneda y componentes mostrados al confirmar; si difieren del asiento que se congelaría, responde 409 commission.amounts_changed sin escribir. Un reintento de la misma clave devuelve su asiento original. Owner/manager. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: commissions:settle

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstringUUID único por operación; reintentos con la misma key devuelven el mismo resultado durante 24 h.

Request body (required)

  • application/json: CommissionSettlementInput

Responses

StatusDescription
201Asiento congelado, en unidades menores de la moneda del negocio (CommissionSettlementView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/customers/{customer_id}/account/receipts

Customer Account Receipts

Tenant desde credencial. Permiso/scope customer_account:read (owner/manager; F4-35). Historial de cobros del cliente, también los pagos a cuenta y los anulados, el más nuevo primero y paginado. unapplied_minor es lo que no está asignado a una tarea. La nota y el motivo de anulación son privados.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
customer_idpathYesstring (uuid)
limitqueryNointeger default 25
offsetqueryNointeger default 0

Responses

StatusDescription
200Successful Response (AccountReceiptsView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/customers/{customer_id}/account/tasks

Customer Account Tasks

Tenant desde credencial. Permiso/scope customer_account:read (owner/manager; F4-35). Desglose por tarea vigente de la cuenta del cliente: a cobrar, cobrado y saldo de cada una, las más recientes primero. Paginado (limit hasta 100, offset); open_only deja solo las tareas con saldo. Staff no accede.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
customer_idpathYesstring (uuid)
limitqueryNointeger default 25
offsetqueryNointeger default 0
open_onlyqueryNoboolean default false

Responses

StatusDescription
200Successful Response (AccountTasksView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/customers/{customer_id}/balance

Customer Balance

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
customer_idpathYesstring (uuid)

Responses

StatusDescription
200Tenant desde credencial. Permiso/scope customer_balance:read (F4-35). Cuenta corriente del cliente, derivada siempre en el servidor: balance_minor = valor de las tareas vigentes menos todo lo cobrado (negativo = saldo a favor); on_account_minor = lo cobrado que no cubre una tarea vigente (pago a cuenta); debts = tareas con saldo pendiente, las más antiguas primero (hasta 50), solo con monto y fecha. Tareas canceladas, vencidas, fallidas o ausentes (no_show) no suman. Staff solo de clientes con los que trabaja; ajeno o inexistente da el mismo 403. Montos enteros en la unidad menor de la moneda (PYG y CLP sin decimales).

GET /payments/expense-categories

Listar categorías de gasto

F4-73. Las 11 categorías fijas del proyecto (se crean en el primer uso) con key estable, kind (variable, fixed, staff, tax, fee, other), su nombre fijo en el idioma del proyecto (FIU-324: no se renombran) y si están ocultas. Owner/manager o scope expenses:read.

  • Authentication: API key or dashboard session
  • Scopes: expenses:read

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseCategories)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

PATCH /payments/expense-categories/{category_id}

Ocultar o mostrar una categoría de gasto

F4-73. hidden la oculta de la carga del panel (o la vuelve a mostrar); los gastos ya cargados no cambian. FIU-324 (decisión del dueño, 2026-10-22): las categorías son fijas, no se renombran (un name en el cuerpo da 422); de ellas salen el DRE, el flujo y el informe MEI y para organizarse están las etiquetas (/payments/expense-tags). No se crean ni se borran categorías. Auditado. Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
category_idpathYesstring (uuid)

Request body (required)

  • application/json: ExpenseCategoryPatch

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseCategoryView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/expense-tags

Listar etiquetas de gastos

FIU-324. Las etiquetas libres del proyecto, las más usadas primero (después por nombre), con la categoría que recuerda cada una (la última con la que se usó: al cargar un gasto con esa etiqueta y sin category_id, se usa esa) y cuántos gastos vigentes la tienen (el staff cuenta solo los suyos). Las etiquetas se crean al usarlas en un gasto (tags). Owner/manager, staff (expenses:record_own) o scope expenses:read.

  • Authentication: API key or dashboard session
  • Scopes: expenses:read

Responses

StatusDescription
200Etiquetas de gastos del proyecto (ExpenseTags)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

PATCH /payments/expense-tags/{tag_id}

Renombrar una etiqueta de gastos

FIU-324. Nuevo nombre (1 a 40 caracteres, espacios de más se recortan). Si otra etiqueta ya tiene ese nombre sin distinguir mayúsculas, 409 expense_tag.name_taken (se unen con merge). Auditado (expense_tag.renamed). Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
tag_idpathYesstring (uuid)

Request body (required)

  • application/json: ExpenseTagPatch

Responses

StatusDescription
200Etiquetas de gastos del proyecto (ExpenseTagView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

DELETE /payments/expense-tags/{tag_id}

Borrar una etiqueta de gastos

FIU-324. La etiqueta sale de todos sus gastos y se borra; los gastos no se tocan. Auditado (expense_tag.deleted). Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
tag_idpathYesstring (uuid)

Responses

StatusDescription
200Etiquetas de gastos del proyecto (ExpenseTagDeleted)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/expense-tags/{tag_id}/merge

Unir una etiqueta en otra

FIU-324. «Uní moto con motos»: los gastos de tag_id pasan a into_id (un gasto que ya tenía las dos queda con una) y tag_id se borra. La que queda conserva su categoría recordada (si no tenía, toma la de la otra). La misma etiqueta, 409 expense_tag.merge_same; una que no existe, 404. Auditado (expense_tag.merged). Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
tag_idpathYesstring (uuid)

Request body (required)

  • application/json: ExpenseTagMerge

Responses

StatusDescription
200Etiquetas de gastos del proyecto (ExpenseTagMerged)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/expenses

Listar gastos

F4-73. Gastos del proyecto, del más reciente al más viejo (occurred_on = día local del proyecto). total_minor suma solo los aprobados del filtro, sin anulados, pendientes, rechazados ni de prueba (independiente de la página); include_voided e include_test solo los muestran y status (F4-74) deja solo ese estado. Staff (expenses:record_own, F4-74) ve solo los gastos que cargó. Un gasto sin resource_id es «General» (sin prorrateo). Importes en unidad menor de la moneda del proyecto (PYG y CLP sin decimales). Owner/manager o scope expenses:read. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: expenses:read

Parameters

NameInRequiredTypeDescription
startqueryNostring / null (null)
endqueryNostring / null (null)
category_idqueryNostring / null (null)
resource_idqueryNostring / null (null)
tag_idqueryNostring / null (null)FIU-324. Solo los gastos con esa etiqueta; total_minor pasa a ser «gastos con esta etiqueta» (un gasto puede tener varias, así que los totales de dos etiquetas no se suman).
statusqueryNostring / null (null)
include_voidedqueryNoboolean default false
include_testqueryNoboolean default false
limitqueryNointeger default 50
offsetqueryNointeger default 0

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpensePage)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/expenses

Cargar un gasto

F4-73. Gasto en unidad menor de la moneda del proyecto (currency obligatoria e igual a la del proyecto; PYG y CLP sin decimales; mismo tope por moneda que los cobros manuales). occurred_on por defecto es hoy en la zona del proyecto; no acepta fechas futuras. La categoría «Comisiones del equipo» es una línea calculada y no se carga a mano (409 expense.computed_category). Idempotency-Key obligatoria: la misma clave con el mismo cuerpo devuelve el mismo gasto; con otro cuerpo, 409 payment.idempotency_conflict. is_test se guarda pero no suma. Queda en la auditoría y emite expense.recorded. Owner/manager o scope expenses:record: queda approved. Staff (expenses:record_own, F4-74): queda pending_approval y no suma hasta que owner/manager lo aprueben. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstringUUID único por operación; reintentos con la misma key devuelven el mismo resultado durante 24 h.

Request body (required)

  • application/json: ExpenseInput

Responses

StatusDescription
201Importes en unidades menores de la moneda del proyecto (ExpenseView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/expenses/{expense_id}

Ver un gasto

F4-79. Un gasto con su estado, comprobante (si tiene), revisión y anulación; es el detalle de un movimiento expense de Movimientos. Owner/manager o scope expenses:read; staff (expenses:record_own) solo los que cargó (uno ajeno da 404, igual que uno inexistente).

  • Authentication: API key or dashboard session
  • Scopes: expenses:read

Parameters

NameInRequiredTypeDescription
expense_idpathYesstring (uuid)

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

PATCH /payments/expenses/{expense_id}

Corregir un gasto

F4-73. Solo cambian los campos presentes (null borra nota, método, beneficiario, recurso, servicio o persona). Cada cambio queda en la auditoría con el valor anterior y el nuevo (expense.updated). Un gasto anulado no se edita (409 expense.voided) ni uno rechazado (409 expense.rejected); sin cierre de período. Cada cambio queda también en el historial (GET .../edits, F4-74). Moneda, origen y is_test no cambian. Owner/manager o scope expenses:record; staff (expenses:record_own) solo los suyos mientras siguen pendientes (409 expense.not_pending; uno ajeno da 404).

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
expense_idpathYesstring (uuid)

Request body (required)

  • application/json: ExpensePatch

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/expenses/{expense_id}/approve

Aprobar un gasto pendiente

F4-74. Un gasto del staff en pending_approval pasa a approved (desde ahora suma) con revisor y fecha; emite expense.approved y queda en el historial y la auditoría. Repetir devuelve el mismo resultado. Un gasto que no está pendiente da 409 expense.not_pending; nadie aprueba lo que cargó (409 expense.self_review, también lo exige la base). Owner/manager o scope expenses:approve.

  • Authentication: API key or dashboard session
  • Scopes: expenses:approve

Parameters

NameInRequiredTypeDescription
expense_idpathYesstring (uuid)

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/expenses/{expense_id}/edits

Historial de un gasto

F4-74. Cada corrección, aprobación, rechazo o anulación del gasto, de la más vieja a la más nueva: quién (actor_type user o api_key, actor_id), cuándo y los campos que cambiaron con su valor anterior y el nuevo (ids y fechas como texto). Solo se agrega: no se edita ni se borra. Sin cierre de período. Owner/manager o scope expenses:read; staff (expenses:record_own) solo el de los gastos que cargó (uno ajeno da 404).

  • Authentication: API key or dashboard session
  • Scopes: expenses:read

Parameters

NameInRequiredTypeDescription
expense_idpathYesstring (uuid)

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseEdits)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/expenses/{expense_id}/reject

Rechazar un gasto pendiente

F4-74. Un gasto del staff en pending_approval pasa a rejected con motivo obligatorio (review_reason), revisor y fecha; emite expense.rejected y queda en el historial y la auditoría. Rechazado es final: no suma, no se corrige ni se anula (409 expense.rejected); se carga uno nuevo. Repetir con el mismo motivo devuelve el mismo resultado; con otro, 409 expense.review_conflict. Nadie rechaza lo que cargó (409 expense.self_review). Owner/manager o scope expenses:approve.

  • Authentication: API key or dashboard session
  • Scopes: expenses:approve

Parameters

NameInRequiredTypeDescription
expense_idpathYesstring (uuid)

Request body (required)

  • application/json: ExpenseReject

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/expenses/{expense_id}/void

Anular un gasto

F4-73. Un gasto nunca se borra: anular deja motivo, autor y fecha y emite expense.voided. Repetir con el mismo motivo devuelve el mismo resultado; con otro motivo, 409 payment.void_conflict. Un gasto rechazado no se anula (409 expense.rejected). Owner/manager o scope expenses:void.

  • Authentication: API key or dashboard session
  • Scopes: expenses:void

Parameters

NameInRequiredTypeDescription
expense_idpathYesstring (uuid)

Request body (required)

  • application/json: ExpenseVoid

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpenseView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/expenses/high-amount

Umbral de monto alto de la carga conversada (segunda confirmación)

F4-83. Desde cuánto un gasto cargado conversando (Wagy, MCP, bot de equipo) pide una segunda confirmación: el doble del precio mensual del plan del proyecto en su moneda (decisión del dueño, no un número fijo). Sin precio publicado para la moneda, threshold_minor es nulo y todo monto cuenta como alto. Con amount_minor responde además si ese monto alcanza el umbral (inclusive). No escribe nada. Owner/manager, staff (que carga los suyos) o scope expenses:record. El número (threshold_minor) solo lo recibe el owner o una API key que emitió el owner (rol vigente): ver el plan es solo suyo. Manager, staff y las demás keys reciben threshold_minor: null y usan high. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
amount_minorqueryNointegerMonto a comparar, en unidad menor de la moneda del proyecto (PYG y CLP sin decimales).

Responses

StatusDescription
200Umbral en unidades menores de la moneda del proyecto (ExpenseHighAmount)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/expenses/pending

Contar los gastos por aprobar

F4-74. Contador de quien aprueba: cantidad y suma de los gastos del staff en pending_approval, sin los de prueba, en unidad menor de la moneda del proyecto. Owner/manager o scope expenses:approve. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: expenses:approve

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (ExpensePending)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/accounts

Cuentas que componen el saldo actual o el crédito del Resumen

Proyección canónica F4-35, sin filtro de período. Owner/manager o scope finance:analyze; nunca staff.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
balancequeryNostring debt, credit default debt
cursorqueryNostring (null) (uuid)
limitqueryNointeger default 50

Responses

StatusDescription
200Cuentas con saldo del signo seleccionado, paginadas por cliente (FinanceAccounts)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

GET /payments/finance/availability

Finance Availability

Tenant desde credencial; unidades menores de la moneda del negocio. Staff solo recibos y caja propios. Ver docs/api/financiero.md.

  • Authentication: API key or dashboard session
  • Scopes: payments:read

Responses

StatusDescription
200Successful Response (FinanceAvailability)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

GET /payments/finance/collections

Finance Collections

F4-26. Números de cobros del período por fecha local de cobro, en la moneda y zona del proyecto: bruto, devuelto, comisión del proveedor (Mercado Pago, fee_details), comisión de Fiuit y neto; por método, servicio y día/semana; y lo estimado (completado sin ningún cobro). Solo lectura. Owner/manager o scope finance:analyze; staff/viewer cerrados. Sin anulados ni de prueba.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
service_idqueryNostring / null (null)
resource_idqueryNostring / null (null)
granularityqueryNostring day, week default day

Responses

StatusDescription
200Successful Response (Collections)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/collections/export

Finance Collections Export

F4-26. CSV de conciliación de cobros por fecha local de cobro: bruto, devuelto, comisión del proveedor (y si fue informada), comisión de Fiuit, neto e id del pago en el proveedor. Owner/manager o API key con finance:analyze y finance:export; staff/viewer cerrados. Sin anulados ni de prueba.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze, finance:export

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
service_idqueryNostring / null (null)
resource_idqueryNostring / null (null)

Responses

StatusDescription
200CSV auditado (finance.collections_exported), un cobro por fila, en streaming. Máximo 50000 filas; si las supera responde 409 finance.export_too_large antes de enviar datos. (string)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/customers

Finance Customers

Lectura de valores congelados y cuenta F4-35. Owner/manager o scope finance:analyze; staff/viewer cerrados. Importes en unidad menor, sin PII adicional. Datos actuales, estimaciones rotuladas.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
offsetqueryNointeger default 0
limitqueryNointeger default 50
at_riskqueryNoboolean default false

Responses

StatusDescription
200Successful Response (CustomerFinancePage)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/customers/{customer_id}

Finance Customer

Lectura de valores congelados y cuenta F4-35. Owner/manager o scope finance:analyze; staff/viewer cerrados. Importes en unidad menor, sin PII adicional. Datos actuales, estimaciones rotuladas.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
customer_idpathYesstring (uuid)

Responses

StatusDescription
200Successful Response (CustomerFinancePage)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/debt

Finance Debt

Lectura de valores congelados y cuenta F4-35. Owner/manager o scope finance:analyze; staff/viewer cerrados. Importes en unidad menor, sin PII adicional. Datos actuales, estimaciones rotuladas.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
offsetqueryNointeger default 0
limitqueryNointeger default 50
customer_idqueryNostring / null (null)
completed_onlyqueryNoboolean default false

Responses

StatusDescription
200Successful Response (FinanceDebt)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/export

Finance Export

Tenant desde credencial; unidades menores de la moneda del negocio. Staff solo recibos y caja propios. Ver docs/api/financiero.md.

  • Authentication: API key or dashboard session
  • Scopes: finance:export, payments:read

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
customer_idqueryNostring / null (null)
member_idqueryNostring / null (null)
methodqueryNostring / null (null)
statusqueryNostring / null (null)
kindqueryNostring / null (null)
groupqueryNostring / null (null)F4-79, chips de Movimientos: collections = cobros y caja (sin gastos ni comisiones de cobro), expenses = gastos cargados, commissions = comisiones de cobro. Sin valor: todo.
searchqueryNostring / null (null)
tag_idqueryNostring / null (null)FIU-324. Solo los gastos con esa etiqueta (cobros y comisiones no llevan etiquetas). La búsqueda (search) también encuentra gastos por el nombre de sus etiquetas.
cursorqueryNostring / null (null)
limitqueryNointeger default 50

Responses

StatusDescription
200CSV auditado con filtros, permisos y orden idénticos al libro, enviado en streaming (una sola consulta leída por lotes). Máximo 50000 filas; si las supera responde 409 finance.export_too_large antes de enviar datos. (string)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

GET /payments/finance/forecast

Finance Forecast

Lectura de valores congelados y cuenta F4-35. Owner/manager o scope finance:analyze; staff/viewer cerrados. Importes en unidad menor, sin PII adicional. Datos actuales, estimaciones rotuladas.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Responses

StatusDescription
200Successful Response (FinanceForecast)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/movements

Finance Movements

Tenant desde credencial; unidades menores de la moneda del negocio. Staff solo recibos y caja propios. Ver docs/api/financiero.md.

  • Authentication: API key or dashboard session
  • Scopes: payments:read

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
customer_idqueryNostring / null (null)
member_idqueryNostring / null (null)
methodqueryNostring / null (null)
statusqueryNostring / null (null)
kindqueryNostring / null (null)
groupqueryNostring / null (null)F4-79, chips de Movimientos: collections = cobros y caja (sin gastos ni comisiones de cobro), expenses = gastos cargados, commissions = comisiones de cobro. Sin valor: todo.
searchqueryNostring / null (null)
tag_idqueryNostring / null (null)FIU-324. Solo los gastos con esa etiqueta (cobros y comisiones no llevan etiquetas). La búsqueda (search) también encuentra gastos por el nombre de sus etiquetas.
cursorqueryNostring / null (null)
limitqueryNointeger default 50

Responses

StatusDescription
200Successful Response (FinanceMovements)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

GET /payments/finance/overview

Resumen mensual de Dinero

F4-80. Para el gráfico del Inicio: Entró / Salió / Quedó realizados de los 2 períodos anteriores y del actual (hasta hoy) y, en el actual y el siguiente, lo que falta, siempre una suma de cosas con fecha: tareas agendadas (lo ya recibido de pago o seña antes del período es «seguro»; el saldo, «previsto»), gastos recurrentes que vencen («seguros»), comisión del equipo estimada sobre esas tareas y gastos por aprobar («previstos»). period: month, week (lunes a domingo) o day (solo hoy). La comisión de cobro no se estima y los saldos por cobrar no tienen vencimiento: ambos se avisan en notes. Solo lectura. Owner/manager o scope finance:analyze; staff/viewer cerrados.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
periodqueryNostring day, week, month default month

Responses

StatusDescription
200Successful Response (FinanceOverview)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/report-evidence

Finance Report Evidence

Lectura de valores congelados y cuenta F4-35. Owner/manager o scope finance:analyze; staff/viewer cerrados. Importes en unidad menor, sin PII adicional. Datos actuales, estimaciones rotuladas.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
dimensionqueryNostring service, customer, member, method, weekday, hour, zone, channel, origin, cohort default service
keyqueryNostring / null (null)
offsetqueryNointeger default 0
limitqueryNointeger default 50

Responses

StatusDescription
200Successful Response (ReportEvidence)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/reports

Finance Reports

Lectura de valores congelados y cuenta F4-35. Owner/manager o scope finance:analyze; staff/viewer cerrados. Importes en unidad menor, sin PII adicional. Datos actuales, estimaciones rotuladas.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
dimensionqueryNostring service, customer, member, method, weekday, hour, zone, channel, origin, cohort default service
keyqueryNostring / null (null)
offsetqueryNointeger default 0
limitqueryNointeger default 50

Responses

StatusDescription
200Successful Response (FinanceReport)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/result

Resultado del período

F4-76. Resultado con base caja en la moneda y zona del proyecto: Entró (cobrado menos devuelto, misma población que finance/collections: sin anulados, de prueba, en revisión ni cobros con devolución parcial de monto desconocido), Salió (gastos aprobados + línea calculada de comisiones del equipo + línea calculada de comisiones de cobro informadas) y Quedó, con margen, vendido como dato secundario y comparación contra el período anterior. group_by period (día o semana), resource, service o category; filtros service_id y resource_id. Gastos sin recurso o servicio = «General» (key null), sin prorrateo; los ajustes manuales de comisión van al recurso de la persona ese día (por servicio, a «General»). Advertencias: missing_expenses, refund_amount_unavailable, provider_fee_unknown, resource_overlap. Solo lectura. Owner/manager o scope finance:analyze; staff/viewer cerrados. 409 finance.invalid_period.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
service_idqueryNostring / null (null)
resource_idqueryNostring / null (null)
group_byqueryNostring period, resource, service, category default period
granularityqueryNostring day, week default day

Responses

StatusDescription
200Successful Response (FinanceResult)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/result/export

Exportar el Resultado (XLSX para el contador o CSV)

F4-81. Los números del Resultado (GET /payments/finance/result) como archivo, sin recalcular. CSV: un movimiento por renglón (cobro, devolución, comisión de cobro, comisión del equipo, gasto) con kind, category, resource, service, member, customer, amount en decimales legibles y amount_minor; la suma de amount_minor es el result_minor del período. UTF-8 con BOM; separador ; y coma decimal si la moneda usa coma (BRL, ARS, CLP, COP, PYG, UYU, EUR), , y punto si no (MXN, PEN, USD). PYG y CLP sin decimales. Fechas: día local del proyecto. XLSX: hojas Resumen, Movimientos, Por categoría, Por recurso, Por servicio, Comisiones y Cobros electrónicos (bruto, comisión, neto e id del pago en Mercado Pago). Textos con = + - @ al inicio llevan apóstrofo. Owner/manager o API key con finance:analyze y finance:export; staff/viewer cerrados. receipt_url va vacío: el comprobante de cada gasto viaja en el paquete ZIP (POST /payments/finance/result/packages), donde la columna dice su archivo. PDF (F4-82): una hoja A4 con Entró, Salió y Quedó, el detalle, las 5 categorías que más salieron, los avisos y un espacio para firma; importes con el formato de la moneda (PYG con su código).

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze, finance:export

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
service_idqueryNostring / null (null)
resource_idqueryNostring / null (null)
formatqueryNostring xlsx, csv, pdf default xlsxxlsx: libro con 7 hojas; csv: solo los movimientos (UTF-8 con BOM); pdf: resumen de una hoja (Entró, Salió, Quedó, top categorías y firma, F4-82)
langqueryNostring / null (null)Idioma de hojas, encabezados del XLSX y etiquetas; por defecto, el del proyecto

Responses

StatusDescription
200Archivo auditado (finance.exported con report: result), transmitido en partes. Máximo 50000 renglones; si los supera responde 409 finance.export_too_large antes de enviar datos. El encabezado X-Export-Rows trae la cantidad de movimientos. (string)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/result/lines

Composición de un número del Resultado

F4-80. Los renglones que suman un número del Resultado (los mismos que exporta finance/result/export): cobros (income), devoluciones (refund), comisiones de cobro (payment_fee), comisiones del equipo calculadas (staff_commission) y gastos aprobados (expense), con signo y por día local. Mismos filtros que finance/result; row abre una fila de group_by (general = «General»), side el lado Entró (in) o Salió (out) y kind un renglón del DRE. total_minor suma todos los que cumplen el filtro (data trae hasta limit, más reciente primero): Entró, -Salió, Quedó o el resultado de la fila. Solo lectura. Owner/manager o scope finance:analyze; customer_name con API key solo con customer_account:read. 409 finance.invalid_period.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
service_idqueryNostring / null (null)
resource_idqueryNostring / null (null)
group_byqueryNostring period, resource, service, category default period
granularityqueryNostring day, week default day
rowqueryNostring / null (null)key de una fila de group_by (fecha, id de recurso o servicio, key de categoría); general = la fila «General» (key null). Sin row, todo el período
sidequeryNostring / null (null)in: lo que compone Entró (cobros y devoluciones); out: lo que compone Salió
kindqueryNostring / null (null)Solo un tipo de renglón (un renglón del DRE)
limitqueryNointeger default 200Renglones a devolver; el total suma todos

Responses

StatusDescription
200Successful Response (FinanceResultLines)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/result/packages

Mis paquetes para el contador

F4-82. Cada persona (o key) ve solo sus paquetes. Owner/manager o API key con finance:analyze y finance:export.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze, finance:export

Responses

StatusDescription
200Los últimos 20 paquetes de quien consulta (sesión o API key), los más nuevos primero (FinancePackages)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/finance/result/packages

Pedir el paquete ZIP para el contador del período

F4-82. Un ZIP con el XLSX de GET /payments/finance/result/export (las 7 hojas, con la columna «Comprobante» apuntando al archivo dentro del ZIP), el PDF de resumen de una hoja (format=pdf) y los comprobantes de los gastos aprobados del período, con nombre AAAA-MM-DD_<monto>_<categoria>.<ext> en la carpeta comprovantes/, comprobantes/ o receipts/ según lang. Mismos números que el Resultado, sin recalcular. Los comprobantes solo van si lo pide una sesión (owner/manager): con API key el paquete lleva XLSX y PDF (receipts_included: false). Si es chico (hasta 2000 renglones y 20 comprobantes que suman 5 MB) responde 201 listo; si no, 202 pending y lo arma el worker. Topes: 50000 renglones (409 finance.export_too_large), 1000 comprobantes y 100 MB de comprobantes (409 finance.package_too_large); un paquete abierto por persona (409 finance.package_in_progress). El archivo vence a las 48 h. Auditado (finance.exported con report: package).

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze, finance:export

Request body (required)

  • application/json: FinancePackageInput

Responses

StatusDescription
201Paquete chico, armado en el momento (status done, con download_url) (FinancePackageView)
202Paquete grande, lo arma el worker (status pending); se avisa a quien lo pidió al terminar (FinancePackageView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/result/packages/{package_id}

Estado de un paquete

F4-82. El paquete de otra persona o de otro proyecto responde 404 finance.package_not_found.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze, finance:export

Parameters

NameInRequiredTypeDescription
package_idpathYesstring (uuid)

Responses

StatusDescription
200Estado y, si está listo, un link de descarga firmado nuevo (vale 5 minutos) (FinancePackageView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/result/packages/{package_id}/download

Bajar el ZIP con el link firmado

F4-82. Usá el download_url de GET /payments/finance/result/packages/{package_id} tal cual, con la misma sesión o API key que lo pidió. Link vencido o adulterado → 403 finance.package_link_invalid; paquete vencido → 404 finance.package_expired; todavía armándose → 404 finance.package_not_ready.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze, finance:export

Parameters

NameInRequiredTypeDescription
package_idpathYesstring (uuid)
expiresqueryYesinteger
signaturequeryYesstring

Responses

StatusDescription
200El ZIP (verificado por sha256). Auditado como finance.package_downloaded. (string)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/finance/summary

Finance Summary

Tenant desde credencial; unidades menores de la moneda del negocio. Staff solo recibos y caja propios. Ver docs/api/financiero.md.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
granularityqueryNostring day, week default day
startqueryYesstring (date)
endqueryYesstring (date)

Responses

StatusDescription
200Successful Response (FinanceSummary)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

GET /payments/finance/tasks

Finance Tasks

Tenant desde credencial; unidades menores de la moneda del negocio. Staff solo recibos y caja propios. Ver docs/api/financiero.md.

  • Authentication: API key or dashboard session
  • Scopes: finance:analyze

Parameters

NameInRequiredTypeDescription
startqueryYesstring (date)
endqueryYesstring (date)
customer_idqueryNostring / null (null)
member_idqueryNostring / null (null)
methodqueryNostring / null (null)
statusqueryNostring / null (null)
kindqueryNostring / null (null)
groupqueryNostring / null (null)F4-79, chips de Movimientos: collections = cobros y caja (sin gastos ni comisiones de cobro), expenses = gastos cargados, commissions = comisiones de cobro. Sin valor: todo.
searchqueryNostring / null (null)
cursorqueryNostring / null (null)
limitqueryNointeger default 50

Responses

StatusDescription
200Successful Response (FinanceTasks)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

POST /payments/manual

Record Manual

Cobro unificado (F3-492), el único comando para registrar un pago recibido fuera de la pasarela, de una tarea o seña (allocations) o a cuenta del cliente (sin allocations); la venta y renovación de un plan lo usan por dentro. method es obligatorio (cash, card, transfer, pix, mercadopago = recibido por Mercado Pago fuera de Fiuit, other). audit_log payment.recorded guarda quién, monto, forma de pago, propósito y origen (task, account o plan). Tenant desde credencial. Scope payments:record; cookie + CSRF. Bearer exige Idempotency-Key en todos los POST (máximo 128 caracteres); conflicto del ledger Bearer es 422, conflicto de dominio 409. Owner/manager; staff solo tareas asignadas (no anula ni ajusta) y solo si el dueño no apagó «El repartidor puede cobrar» (staff_can_collect, encendido por defecto; apagado por el dueño, 403). Sin llamadas a proveedores. Montos enteros minor units, PYG exponente 0. Clave de registro permanente; misma clave con otros datos devuelve 409. Duplicados por tarea/monto/método en ventana UTC de 5 minutos se rechazan. Los cobros paid aplicados a una tarea se suman con los de pasarela; al cubrir la seña requerida, pending_payment pasa a confirmed de forma auditada e idempotente. El crédito a cuenta sin asignar no confirma. Una tarea cubierta rechaza ajustes de cobro y asignaciones manuales (409 payment_conflict, detail payment.booking_covered_by_plan); primero quitar el plan. Una tarea que queda pagada por completo con este cobro (efectivo o transferencia) también hace avanzar la etapa con la salida «Avanza sola al recibir el pago» (#1064), igual que un cobro de Mercado Pago; un pago parcial no la mueve. FIU-473 impide imputar un adicional de presupuesto sin aprobar (409 payment_conflict, detail payment.quote_pending), incluso con allow_overpayment. Se puede registrar dinero recibido sin imputarlo a esa diferencia; lo ya imputado se conserva.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstring

Request body (required)

  • application/json: RecordManual

Responses

StatusDescription
201Successful Response (ManualView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/manual/{charge_id}/allocations

Allocate Manual

Tenant desde credencial. Scope payments:record; cookie + CSRF. Bearer exige Idempotency-Key en todos los POST (máximo 128 caracteres); conflicto del ledger Bearer es 422, conflicto de dominio 409. Owner/manager; staff solo tareas asignadas (no anula ni ajusta) y solo si el dueño no apagó «El repartidor puede cobrar» (staff_can_collect, encendido por defecto; apagado por el dueño, 403). Sin llamadas a proveedores. Montos enteros minor units, PYG exponente 0. Clave de registro permanente; misma clave con otros datos devuelve 409. Duplicados por tarea/monto/método en ventana UTC de 5 minutos se rechazan. Asignar un recibo paid concilia la seña; el total manual aplicado más pasarela debe alcanzar la seña para confirmar; replay no duplica confirmación ni avisos. Una tarea cubierta rechaza ajustes de cobro y asignaciones manuales (409 payment_conflict, detail payment.booking_covered_by_plan); primero quitar el plan. En FIU-473, la imputación respeta el último presupuesto aceptado; un adicional pendiente o rechazado devuelve 409 payment_conflict con detail payment.quote_pending, incluso con allow_overpayment.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)
Idempotency-KeyheaderNostring / null (null)

Request body (required)

  • application/json: AllocationInput

Responses

StatusDescription
200Successful Response (ManualView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/manual/{charge_id}/void

Void Manual

Tenant desde credencial. Scope payments:void; cookie + CSRF. Bearer exige Idempotency-Key en todos los POST (máximo 128 caracteres); conflicto del ledger Bearer es 422, conflicto de dominio 409. Owner/manager; staff solo tareas asignadas (no anula ni ajusta). Sin llamadas a proveedores. Montos enteros minor units, PYG exponente 0. Clave de registro permanente; misma clave con otros datos devuelve 409. Duplicados por tarea/monto/método en ventana UTC de 5 minutos se rechazan. Si el total válido queda debajo de la seña, una tarea confirmed con payment_status paid vuelve a pending_payment únicamente antes de iniciar y antes de start_at (si existe). Conserva horario y capacidad, sin nuevo vencimiento; no reabre estados iniciados o terminales. Reembolso parcial sin monto conciliado impide deducir el faltante.

  • Authentication: API key or dashboard session
  • Scopes: None

Parameters

NameInRequiredTypeDescription
charge_idpathYesstring (uuid)
Idempotency-KeyheaderNostring / null (null)

Request body (required)

  • application/json: ReasonInput

Responses

StatusDescription
200Successful Response (ManualView)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/payment-links/availability

¿Se puede cobrar con link?

F4-20. Permiso y scope payments:link. Solo available y el motivo (reason, los de MercadoPagoMethodView); sin datos de la cuenta. El panel muestra «Cobrar» solo si está disponible.

  • Authentication: API key or dashboard session
  • Scopes: None

Responses

StatusDescription
200Successful Response (PaymentLinkAvailability)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)

GET /payments/recurring-expenses

Gastos que se repiten

F4-75. Los gastos recurrentes del proyecto (alquiler, sueldos fijos, servicios) con su próxima fecha (next_on, día local) y status (active, paused, ended). Owner/manager o scope expenses:read.

  • Authentication: API key or dashboard session
  • Scopes: expenses:read

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (RecurringPage)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/recurring-expenses

Crear un gasto que se repite cada semana o cada mes

F4-75. cadence weekly (day 1 lunes … 7 domingo) o monthly (day 1-31; en meses más cortos, el último día). Importe en unidad menor de la moneda del proyecto (currency obligatoria e igual; mismo tope que los gastos). starts_on por defecto hoy, como mucho un año para atrás (409 expense_recurring.starts_too_early); ends_on opcional. Cada fecha que toca carga un gasto aprobado con source: recurring y recurring_id, el mismo día (lo que ya tocaba desde starts_on se carga al crear); nunca dos veces la misma fecha, aunque haya reintentos o dos procesos a la vez. Sin nómina: un sueldo fijo es un recurrente de «Sueldos». «Comisiones del equipo» no se carga (409 expense.computed_category). Idempotency-Key obligatoria: misma clave y cuerpo devuelve el mismo recurrente; otro cuerpo, 409 payment.idempotency_conflict. Auditado. Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstring

Request body (required)

  • application/json: RecurringInput

Responses

StatusDescription
201Importes en unidades menores de la moneda del proyecto (RecurringView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

PATCH /payments/recurring-expenses/{recurring_id}

Cambiar, pausar, reanudar o terminar un gasto que se repite

F4-75. Cambia lo que viene de acá en adelante: los gastos ya cargados no se tocan (se corrigen o anulan como cualquier gasto). paused: true no genera; al reanudar sigue desde hoy (lo pausado no se recupera). Cambiar cadence o day recalcula desde hoy; ends_on termina (status: ended) y quitarlo lo retoma. Auditado con antes y después. Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
recurring_idpathYesstring (uuid)
Idempotency-KeyheaderNostring

Request body (required)

  • application/json: RecurringPatch

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (RecurringView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/recurring-expenses/{recurring_id}/skip

Saltear la próxima fecha de un gasto que se repite

F4-75. on tiene que ser la próxima fecha (next_on): pasa a la siguiente sin cargar el gasto. Repetirlo no saltea otra; una fecha posterior da 409 expense_recurring.not_next, una ya cargada 409 expense_recurring.already_recorded (se anula el gasto) y un recurrente terminado 409 expense_recurring.ended. Auditado. Owner/manager o scope expenses:record.

  • Authentication: API key or dashboard session
  • Scopes: expenses:record

Parameters

NameInRequiredTypeDescription
recurring_idpathYesstring (uuid)
Idempotency-KeyheaderNostring

Request body (required)

  • application/json: RecurringSkip

Responses

StatusDescription
200Importes en unidades menores de la moneda del proyecto (RecurringView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

GET /payments/task-margins

Margen por tarea (líneas con costo)

FIU-472: finance:analyze y, desde FIU-597, tasks:costs (por defecto solo el dueño; una API key, con payments:read_balance). Precio - costo de las líneas con costo cargado, por tarea; una tarea sin ningún costo no aparece (no se muestra 100 % de margen).

FIU-472: margen por tarea en Dinero, finance:analyze y tasks:costs (FIU-597: por defecto solo el dueño; el resto, 403). Precio menos costo de las líneas con costo cargado; una tarea sin ningún costo no aparece (nunca un 100 %). margin_bp: puntos básicos (2500 = 25,00 %).

  • Authentication: API key or dashboard session
  • Scopes: None

Responses

StatusDescription
200Successful Response (TaskMargins)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/tips

Registrar una propina

Propina para un profesional: no es venta del negocio ni base de comisión. Staff solo para sí (si el negocio permite que cobre); una API key debe indicar member_id. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: payments:record

Parameters

NameInRequiredTypeDescription
Idempotency-KeyheaderYesstringUUID único por operación; reintentos con la misma key devuelven el mismo resultado durante 24 h.

Request body (required)

  • application/json: TipInput

Responses

StatusDescription
201Importes en unidades menores de la moneda del negocio (TipView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)

POST /payments/tips/{tip_id}/void

Anular una propina

Con motivo; resta el día en que se anula. Owner/manager. No usa workspace_id externo.

  • Authentication: API key or dashboard session
  • Scopes: payments:void

Parameters

NameInRequiredTypeDescription
tip_idpathYesstring (uuid)

Request body (required)

  • application/json: ReasonInput

Responses

StatusDescription
200Importes en unidades menores de la moneda del negocio (TipView)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)