Reporting, refunds & disputes
Everything on this page is TPA-scoped: pass the target TPA asaccount and authenticate with any processing key authorized for it (partner key, merchant key, or a TPA-pinned key). Works identically on tagada.processing.* (direct merchants) and tagada.partners.processing.* (partners) — same endpoints, authorization is derived from the key.
Requires @tagadapay/node-sdk ≥ 3.7.0.
Charges
List
Retrieve (full detail)
charges.retrieve() returns everything the list omits — payment method and scheme variant, 3DS outcome, auth code, billing country, the cumulative refunded amount, and the Tagada CRM identifiers so you can deep-link a charge back to its order and customer:
Card intelligence (BIN metadata)
Every charge detail carries acard block resolved from Tagada’s own BIN-enrichment data — the same fields no matter which acquirer processed the charge (Adyen, Stripe, …). Use it for commercial-card surcharging and risk decisions:
charge.* webhook payload (event.data.object.card), so you can react in real time without an extra API call. card is null when the charge has no BIN or the BIN is unknown to us; individual fields are null when that attribute isn’t known.
Refunds
Issue a refund
Full or partial, through the TPA’s acquirer — the same engine as the dashboard. The call validates against the remaining refundable amount, so you can never over-refund:List confirmed refunds
The response above means the provider accepted the refund. The confirmed row (webhook-backfilled) appears inrefunds.list() shortly after:
Disputes
List & retrieve
Contest (submit evidence)
Text fields plus inline base64 files (max 5 files × 4MB; PDF/JPEG/PNG):400):
- Stripe — supports drafts (
submit: false), combined evidence capped at 4.5MB. - Adyen — document-only (your text fields are rendered into a PDF), rejects PNG, PDFs capped at 2MB. One-shot.
- Tilled — evidence only, one-shot.
Concede
422 there).
Per-TPA stats
tpas.getStats() gives you the KPIs merchants ask for, over a sliding window (days: 1–365, default 30) — volumes and counts by outcome, total fees, authorization rate, average ticket, and a daily series for charting:
authRateBps is succeeded / (succeeded + failed) in basis points (9000 = 90%); it is null when the window has no attempts. averageTicketMinor is null when nothing succeeded.
Building a partner-wide overview? Loop
tpas.list() and call getStats() per TPA — stats are always computed per TPA, in the TPA’s processing currency.