| 422 | VALIDATION_ERROR | Validation Failed | Missing/invalid body fields. Also: expired quote (message includes max age). |
| 422 | INVALID_QUOTE | Invalid Quote | Quote not found, expired, or wrong type. |
| 422 | INVALID_PATH | Path is invalid | The swap route/path from the quote is invalid or unavailable. |
| 422 | ADDRESS_TO_INVALID | addressTo is invalid | Generic address validation failure. |
| 422 | ADDRESS_TO_INVALID_FOR_CHAIN | Chain-specific address validation failure. | |
| 422 | ADDRESS_FROM_INVALID | addressFrom is invalid | Missing or invalid source address (required for DEX). |
| 422 | ADDRESS_FROM_INVALID_FOR_CHAIN | Chain-specific source address validation failure. {type} is “from” or “to”. | |
| 422 | ADDRESS_TO_IN_DEPOSIT_LOG | addressTo cannot be used as it exists in deposit log | Address reuse prevention. |
| 422 | ADDRESS_TO_IS_TOKEN_ADDRESS | addressTo cannot be a token contract address | Sending to a contract address is blocked. |
| 422 | X_ADDRESS_NOT_SUPPORTED | X-Address not supported yet! | XRP X-format addresses not supported. |
| 422 | REUSED_DEPOSIT_ADDRESS | Deposit address collision detected. | |
| 422 | SWAP_AMOUNT_IS_OUT_OF_BOUNDS | Provider-level bounds exceeded at exchange time. | |
| 422 | XMR_SWAP_AMOUNT_IS_OUT_OF_BOUNDS | Private swap intermediary bounds exceeded. | |
| 422 | TOKEN_DISABLED | Token was disabled between quote and exchange. | |
| 422 | INVALID_SWAP | Unknown or disabled swap provider. | |
| 422 | ORDER_ALREADY_INITIALIZING_OR_PROCESSED | Order already INITIALIZING or processed | Duplicate exchange attempt. |
| 422 | REFUND_ADDRESS_REQUIRED_FOR_FIXED_RATE | Refund address is required for fixed rate exchanges | refundAddress was omitted when using a fixed=true quote. Always include it for fixed rate orders. |
| 422 | FIXED_RATE_QUOTE_EXPIRED | Fixed rate quote has expired | validUntil has passed, or the route lost fixed-rate capability after the quote was issued. On a private swap, either hop expiring is enough. Re-fetch a new quote. |
| 422 | VALIDATION_ERROR | The provided quote has expired, max age is {N} seconds | Quote freshness limit (60s by default), enforced separately from validUntil. Re-fetch the quote and submit immediately. |
| 422 | UNABLE_TO_CREATE_REFUND_LEG | Unable to create the refund leg | Private fixed rate only — the refund path could not be set up, so the order was not created and no funds moved. Retry, or fall back to a floating private swap. |
| 422 | ADDRESS_REFUND_INVALID_FOR_CHAIN | refundAddress is invalid for {chain} | refundAddress fails source-chain format validation, or exceeds the maximum length. |
| 422 | ADDRESS_REFUND_SANCTIONED | Refund address failed compliance screening | Collect a different refund address. |
| 403 | FIXED_RATE_NOT_ALLOWED | Fixed-rate quotes are not enabled for this partner. | Account-level toggle. Contact your Houdini representative to enable it. |
| 403 | FLOATING_RATE_NOT_ALLOWED | Floating-rate quotes are not enabled for this partner. | Account-level toggle. Contact your Houdini representative to enable it. |
| 429 | RATE_LIMIT_EXCEEDED | (same pattern as quotes) | Includes retryAfter and meta. |
| 500 | UNABLE_TO_PERFORM_EXCHANGE | Unable to perform exchange, no available paths | All providers failed during execution. |
| 503 | ANONYMOUS_DISABLED | Anonymous exchanges are temporarily disabled… | Feature flag is off. |
| 404 | NOT_FOUND | Not found | Post-creation order lookup failed (edge case). |
| 500 | INTERNAL_SERVER_ERROR | Internal Server Error | Catch-all. |