diff --git a/src/_zkapauthorizer/controller.py b/src/_zkapauthorizer/controller.py
index 5681bf09be888ddb4d776fd4afd0bd4fc938c6a8..89d08dfe5e8189597bee87254ea59be6ffe8ac01 100644
--- a/src/_zkapauthorizer/controller.py
+++ b/src/_zkapauthorizer/controller.py
@@ -62,14 +62,6 @@ from .model import (
 )
 
 
-class TransientRedemptionError(Exception):
-    pass
-
-
-class PermanentRedemptionError(Exception):
-    pass
-
-
 class IRedeemer(Interface):
     """
     An ``IRedeemer`` can exchange a voucher for one or more passes.
@@ -107,11 +99,8 @@ class IRedeemer(Interface):
             the redemption process.
 
         :return: A ``Deferred`` which fires with a list of ``UnblindedToken``
-            instances on successful redemption or which fails with
-            ``TransientRedemptionError`` on any error which may be resolved by
-            simply trying again later or which fails with
-            ``PermanentRedemptionError`` on any error which is definitive and
-            final.
+            instances on successful redemption or which fails with any error
+            to allow a retry to be made at some future point.
         """
 
     def tokens_to_passes(message, unblinded_tokens):
@@ -292,7 +281,7 @@ class RistrettoRedeemer(object):
             result = yield json_content(response)
         except ValueError:
             self._log.failure("Parsing redeem response failed", response=response)
-            raise TransientRedemptionError()
+            raise
 
         self._log.info("Redeemed: {public-key} {proof} {signatures}", **result)