Skip to main content

Reporting, refunds & disputes

Everything on this page is TPA-scoped: pass the target TPA as account 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 a card 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:
The same block ships inside every 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 in refunds.list() shortly after:

Disputes

List & retrieve

evidenceDueBy is a hard deadline — a dispute with no response is lost automatically. Poll disputes.list({ status: 'needs_response' }) or subscribe to dispute.opened webhooks.

Contest (submit evidence)

Text fields plus inline base64 files (max 5 files × 4MB; PDF/JPEG/PNG):
Provider quirks (enforced server-side, surfaced as 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

Supported on Stripe and Adyen. Tilled has no accept API — conceding = not responding before the deadline (the call returns 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.

Balance & ledger (recap)

Covered in depth on Payouts, balances & fees: