status. It starts at scheduled when you create it and ends in one of three terminal states: completed, failed, or canceled.
Statuses
How the status changes
Paper checks
Paper checks behave differently from electronic payments, because Melio can’t know the payment is complete until the payee deposits the check and it clears. Checks stayin-progress until they clear. The steps inside in-progress are for illustration only and aren’t returned by the API.
- A check stays
in-progressuntil it clears. Depending on mailing time and when the payee deposits it, that can take days or weeks. A long-runningin-progresscheck is normal, not an error. - A check becomes
completedonly after it’s deposited and cleared. Mailing or delivering the check does not complete the payment. - An issued check can be voided while it’s
in-progress. See Editing and canceling. - Uncashed checks are canceled after 90 days. If the payee doesn’t deposit the check within 90 days, it’s canceled and the amount is automatically refunded to the originating account.
- Tracking. Check tracking details are available on the payment object. Fetch
GET /payments/{id}to see them.
Editing and canceling
Editing requires the payment to bescheduled. Once it is in-progress, PATCH /payments/{id} is rejected with 409 PAYMENT_NOT_EDITABLE.
Canceling is also limited to scheduled, with one exception: a paper check that has been issued but has not yet cleared. Canceling that voids the check and refunds the originating account.
A voided check ends in
failed, the same status as other failures such as insufficient funds. The payment doesn’t currently indicate that the failure came from a void, so keep track of the voids you request on your side.Risk review
A payment being reviewed staysscheduled the whole time; there is no separate review status. If the review is approved it proceeds as normal. If it is not, the payment is not sent and moves to failed.
Payment events are notifications, not snapshots.
api.payment.updated fires on every change but carries no payment body, so fetch GET /payments/{id} to read the current status.