BlendFi
OfframpConcepts

Per-user, per-type lock

An end customer can only have one open offramp conversion at a time. Why, what error you receive, when the lock releases.

BlendFi limits each end customer to one open conversion per type (pix_offramp or pix_onramp) at a time. Trying to create a second offramp conversion for the same end customer while the first is open returns an error.

The rule

For any (user_id, transaction_type), at most one conversion may be in the open states: awaiting_deposit, partially_funded (transient, never observed), and standby.

The rule is permissive across directions: the same end customer can have one open onramp and one open offramp at the same time, just not two of the same type.

Why this rule exists

USDT is fungible. The deposit address is per-conversion. If an end customer had two offramps open at once, an ambiguous deposit could match more than one open operation. The rule eliminates the ambiguity at the source: each deposit has a single destination conversion.

When the lock releases

The lock releases as soon as the conversion enters a terminal state:

  • completed, failed, expired, canceled, abandoned, liquidated (transient terminal before completed/failed).

In liquidated, the lock holds only until settlement advances to completed or failed. In practice the window is seconds.

The error you receive

Calling POST /v1/quotes/:id/accept for a user_id that already has an open offramp conversion returns an error with a stable code (the full spec lands in the API reference once published). The error's request_id lets support trace the call.

Suggested handling

When you receive the lock error:

  1. Check whether the open conversion belongs to this same flow. If it is the same end customer trying to re-confirm an operation that is still valid, the correct UX is to take them back to the existing conversion's state, not create a new one.
  2. If the open conversion is old and the end customer gave up, cancel the prior one (if still in awaiting_deposit) or wait for the window to expire (expired). Then the new accept call passes.
  3. If the open conversion is in standby, decide between liquidating or waiting out the 7-day window to abandoned. See Standby and manual liquidation.

Do not try to bypass the lock

The lock is enforced at the database via a partial unique index. There is no flag to disable it, and there is no side path to create two open conversions of the same type for the same end customer. Model your UX around it.

Next steps

On this page