Transfer Lifecycle
How a transfer's status changes after you create it, and when it expires.
After you create a transfer, its status changes as Harbor processes it. Follow the changes by retrieving the transfer, or subscribe to the transfer.status.* webhook events.
Transfer Status
The current status is in the transfer's status field. Some statuses also have a sub_status with more detail, otherwise it's null. For example, an on-ramp transfer waiting for the Customer's wire:
{
"data": {
"uuid": "transfer_19nl6HpytqmSjZN5KFVGJ1tQdxfy1XfLtxAv7vCe",
"object": "transfer",
"status": "pending_customer_transfer_start",
"sub_status": null,
"type": "on-ramp",
...,
"created_at": "2026-10-06T01:29:06+00:00",
"updated_at": "2026-10-06T01:29:08+00:00"
}
}For what each status means, see Status Definitions.

Status of Transfer
Transfer Expiration
If Harbor doesn't receive the funds in time, the transfer expires. Its status changes to expired, and the transfer.status.expired webhook event is sent.
- Paid in fiat (on-ramp): expires 3 to 4 days after it's created.
- Paid in stablecoins (off-ramp, on-chain): expires at the time in
crypto_pay_in_expired_at.
{
"data": {
"uuid": "transfer_A2voLGf6qn0tqInXa761zX4AFQoKfoDDAr8jg9S9",
"status": "expired",
"type": "off-ramp",
...,
"crypto_pay_in_expired_at": "2026-09-16T10:09:03+00:00",
"created_at": "2026-09-16T09:19:14+00:00",
"updated_at": "2026-09-16T10:23:42+00:00"
}
}Notes
- Fiat transfers are checked for expiration once a day, at 00:00 UTC. That's why they expire between 3 and 4 days after they're created.
- The transfer's deadline is 10 minutes earlier than the one on the quote. For example, if the quote says 10:30, the transfer expires at 10:20. Use the transfer's
crypto_pay_in_expired_at, not the quote. - Transfers can't be edited or deleted. If you created a transfer with the wrong details, don't fund it. It expires on its own. Then create a new quote and a new transfer with the correct details.
Updated about 3 hours ago
Did this page help you?