Prepaid TTS refunds: QA auto-refund vs unused packs — Audra

Audra's refund behavior has two distinct layers that get conflated: automatic per-render refunds when quality assurance fails, and the human-reviewed refund path for unused prepaid packs. Knowing which layer applies is the difference between 'check your balance' and 'email us'.

Layer 1: QA-gated auto-refunds (no request needed)

Every render goes through reserve → render → QA → finalize. Your credits reserve at render start, but they only finalize after automated QA passes — checks for silence gaps, corrupt output, and audio that is suspiciously short for the character count. When a render fails QA, the reserved characters return to your balance automatically. There is no form and no waiting period; the refund is the default outcome of a failed gate.

How you observe it: refunds appear as restored credits_chars on your next GET /v2/usage poll — there is no separate refund line item in v1. In code, the response carries an X-QA-Passed header on speech responses, so you can log gate outcomes per render and reconcile your usage polling against them. A QA-failed render in a long pipeline is not an error state; it is a retried render with the same Idempotency-Key that bills at most once.

Layer 2: pack refunds (human, 7-day window)

Checking before you escalate

Before writing support, poll GET /v2/usage: if credits_chars is higher than you expected, you likely already received a QA auto-refund. If usage shows a render consumed characters but your pipeline never got audio, check the status page (/status) and the render's X-QA-Passed value before assuming a billing error — those two checks resolve most refund questions without an email round-trip. Full billing mechanics are at /refund and /blog/tts-api-billing-qa-gated.