API reference

Held funds

  • 3 endpoints

While the organization holds a member's funds (their space's trustedAt absent, Members and held funds), their payments are paid to the organization's wallet, and each is a line of the member's held funds (they sell no subscription meanwhile: Checkout sessions, fundsHeld). The organization's fee on them is withheld (Members and held funds § The organization fee on held funds).

List every member's held funds#

GET /members/held-funds

What the organization owes each of its members in the request's mode (the members owed something, removed ones included), the longest held first, in one page: one item per member, as their held funds total it (GET /members/:userUuid/held-funds).

Auth
X-API-Key: an admin key
On-Behalf-Of
Refused: the admin role is needed
Idempotency-Key
Ignored
Success
200
Request

request.sh

curl https://api.qbitflow.app/v2/members/held-funds \  -H "X-API-Key: $QBITFLOW_API_KEY"# 200: an array of MemberHeldFunds
// What the organization holds for its members (their payments while untrusted), the longest// held first.const all = await client.members.listHeldFunds();for (const owed of all) {	console.log(`${owed.userUuid}: ${owed.totalUsd} USD owed over ${owed.count} lines`);} const held = await client.members.getHeldFunds(memberUuid);for (const ledger of held.ledgers) {	// owed: what the line counts for in a release (negative for a refund).	console.log(		`  ${ledger.type} ${ledger.owed} ${ledger.currency.symbol} (${ledger.owedUsd} USD)`	);}console.log(`held for this member: ${held.totalUsd} USD`);
# Every member you hold funds for, the longest held first.for summary in client.members.list_held_funds():    print(summary.user_uuid, f"{summary.total_usd} USD over {summary.count} lines") held = client.members.get_held_funds(member_uuid)  # one member, line by lineprint(f"owed to the seller: {held.total_usd} USD over {len(held.ledgers)} lines")
// What the organization holds for its members (their payments while untrusted).// The longest held first.all, err := client.Members.ListHeldFunds(ctx)if err != nil {	log.Fatal(err)}for _, s := range all {	fmt.Printf("%s: %s USD over %d lines\n", s.UserUUID, s.TotalUSD, s.Count)} held, err := client.Members.GetHeldFunds(ctx, memberUUID)if err != nil {	log.Fatal(err)}fmt.Printf("owed to %s: %s USD over %d lines\n", memberUUID, held.TotalUSD, len(held.Ledgers))
foreach ($client->members->listHeldFunds() as $owed) { // every member you owe, the longest held first	echo "{$owed->userUuid}: {$owed->totalUsd} USD over {$owed->count} lines\n";} $held = $client->members->getHeldFunds($memberUuid);printf("Owed to %s: %s USD over %d lines\n", $memberUuid, $held->totalUsd, count($held->ledgers));

Response

A page: { "items": MemberHeldFunds[], "hasMore": …, "nextCursor"?: … }. Pass nextCursor back as cursor for the next page; it is absent when hasMore is false.

  • userUuidstring

    The member (GET /members/:userUuid; a removed member still owed too)

  • totalUsdstring

    What the organization owes them, in USD, a decimal string, as their held funds' totalUsd (GET /members/:userUuid/held-funds): "0" or negative when refunds cancel out the payments

  • countinteger

    Their lines not settled: payments held, refunds of them

  • oldestAtstring

    Their oldest line not settled: how long the organization has held funds for them

Errors

The common codes only, as any route (what each means):

Get a member's held funds#

GET /members/:userUuid/held-funds

What the organization holds for a member in the request's mode: the payments not paid out yet (the merchant share the contracts paid), the refunds sent of them (negative lines), and their total in USD.

Auth
X-API-Key: an admin key
On-Behalf-Of
Refused: the admin role is needed
Idempotency-Key
Ignored
Success
200
Request

request.sh

curl "https://api.qbitflow.app/v2/members/$MEMBER_UUID/held-funds" \  -H "X-API-Key: $QBITFLOW_API_KEY"# 200: a HeldFunds
// What the organization holds for its members (their payments while untrusted), the longest// held first.const all = await client.members.listHeldFunds();for (const owed of all) {	console.log(`${owed.userUuid}: ${owed.totalUsd} USD owed over ${owed.count} lines`);} const held = await client.members.getHeldFunds(memberUuid);for (const ledger of held.ledgers) {	// owed: what the line counts for in a release (negative for a refund).	console.log(		`  ${ledger.type} ${ledger.owed} ${ledger.currency.symbol} (${ledger.owedUsd} USD)`	);}console.log(`held for this member: ${held.totalUsd} USD`);
# Every member you hold funds for, the longest held first.for summary in client.members.list_held_funds():    print(summary.user_uuid, f"{summary.total_usd} USD over {summary.count} lines") held = client.members.get_held_funds(member_uuid)  # one member, line by lineprint(f"owed to the seller: {held.total_usd} USD over {len(held.ledgers)} lines")
// What the organization holds for its members (their payments while untrusted).// The longest held first.all, err := client.Members.ListHeldFunds(ctx)if err != nil {	log.Fatal(err)}for _, s := range all {	fmt.Printf("%s: %s USD over %d lines\n", s.UserUUID, s.TotalUSD, s.Count)} held, err := client.Members.GetHeldFunds(ctx, memberUUID)if err != nil {	log.Fatal(err)}fmt.Printf("owed to %s: %s USD over %d lines\n", memberUUID, held.TotalUSD, len(held.Ledgers))
foreach ($client->members->listHeldFunds() as $owed) { // every member you owe, the longest held first	echo "{$owed->userUuid}: {$owed->totalUsd} USD over {$owed->count} lines\n";} $held = $client->members->getHeldFunds($memberUuid);printf("Owed to %s: %s USD over %d lines\n", $memberUuid, $held->totalUsd, count($held->ledgers));

Path parameters

  • userUuidstringRequired

    The member (GET /members/:userUuid; a member removed from this mode is still found: what was held when they left is still owed)

Response

A HeldFunds.

  • ledgersarray of LedgerEntry

    The lines not settled yet, oldest first: the payments held (positive), and the refunds sent of them (negative, type refund, each naming the payment it refunds). [] when nothing is held

    11 fields of each LedgerEntry
    • txUuidstring

      The line's transaction: the payment (pay@…) or the refund (refund@…)

    • typestring

      payment or refund

      One of:

      • paymentA payment made to the member while the organization held their funds
      • refundA refund the organization sent of one of them
    • descriptionstring

      What the line is, in words: "Payment pay@…" or "Refund of payment pay@…"

    • refundedTxUuidstringOptional

      A refund line: the payment it refunds (its own line, in these held funds or released with it). Absent on the other lines

    • amountUsdstring

      A payment: what the customer paid, in USD, a decimal string. A refund: what it sent back to the customer, in USD (positive: owedUsd is its negative)

    • settlementSettlementOptional

      A payment: its fees and split (the member was owed settlement.split.merchant when it was held; the organization's fee withheld is settlement.organizationFee, its rate, and settlement.split.organization). Absent on a refund line

      5 fields of Settlement
      • feePercentnumber

        QBitFlow's fee on this payment, in bps (1 % = 100 bps), deducted from the amount paid. Written as feePercent, a percent string

      • organizationFeeOrganizationFeeOptional

        The organization's fee on its member's payment (a marketplace's commission), paid to the organization's wallet. It is taken from what remains after QBitFlow's fee (contracts SPEC §4.1): organization = (amount - QBitFlow's fee) × its rate, and the member receives the rest. While the organization holds the member's funds, it is withheld from what the organization owes them instead of paid on-chain. Absent: none

        2 fields of OrganizationFee
        • addressstringOptional

          The organization's wallet that receives the fee (only for the merchant)

          Only for the resource's owner

        • feePercentnumber

          The organization's fee, in bps, taken from what remains after the platform fee. Written as feePercent, a percent string

      • referralFeeReferralFeeOptional

        The referrer's share of QBitFlow's fee. Absent: none

        2 fields of ReferralFee
        • addressstringOptional

          The referrer's wallet that receives the fee (only for the merchant)

          Only for the resource's owner

        • feePercentnumber

          The referrer's share of the platform fee, in bps (2000 = 20 % of it). Written as feePercent, a percent string

      • splitSplitOptional

        How the contracts split what the payer paid. For a payment the organization held for its member, the organization's fee was withheld from the member's share (not paid on-chain): the split is the one a direct payment would have had. Absent on records made before the split was recorded

        5 fields of Split
        • platformTokenAmount

          QBitFlow's fee (the referrer's share not included)

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • organizationTokenAmountOptional

          The organization's fee; absent without one

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • referralTokenAmountOptional

          The referrer's share of QBitFlow's fee; absent without one

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • merchantTokenAmount

          What the merchant received (the member, for a member's payment), net of every fee

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • networkFeeTokenAmountOptional

          NetworkFee is the network fee the payer paid on top of the amount, in the payment's currency: the gas refund the contracts took in the token (their GasRefundProcessed event), or, for a payment in a chain's native coin, the fee of the transaction the payer's wallet paid (its gas and, on Base, its L1 data fee), bounded by what QBitFlow prepared. Not the transaction's own cost to its sender (transaction.fee). Absent on records made before it was recorded ("0" once recorded as none)

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

      • transactionSettlementTransactionOptional

        The transaction that paid it. Absent before its confirmation

        6 fields of SettlementTransaction
        • blockNumberstring

          The block (Ethereum, Base) or slot (Solana) it landed in, a string of digits

        • blockTimestringOptional

          When its block was produced (UTC); when it was recorded if the chain's node didn't give it. Absent only on records made before it was recorded

        • gasUsedintegerOptional

          The gas it consumed (Ethereum, Base). Absent on Solana

        • feeTokenAmount

          What the transaction cost its sender, in the chain's native coin (ETH, SOL; its currency is the payment currency's chain): its gas and, on Base, its L1 data fee. amountUsd at nativePriceUsd

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • l1FeeTokenAmountOptional

          The part of fee that paid Base's L1 data fee, in the native coin. Absent off Base, and on transactions recorded before it was

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • nativePriceUsdstringOptional

          NativePriceUSD is the USD price of the chain's native coin when the transaction was recorded (what its fee cost in USD). Absent when the price wasn't available then

    • currencyIdinteger

      The currency paid (and refunded), written as the currency object under currency (GET /currencies/:id)

    • owedstring

      What the line counts for in a release, in the currency's units, exact (owedMinUnits / 10^decimals), a decimal string: a payment's merchant share (settlement.split.merchant), or minus what a refund sent back (negative: everything the customer got back, the organization's, QBitFlow's and the network fees included). In heldFunds.released: what it counted for in that release

    • owedMinUnitsstring

      The same in the currency's smallest unit, a string of digits (negative for a refund)

    • owedUsdstring

      The same in USD, at the payment's time, a decimal string (negative for a refund)

    • createdAtstring

      When the line was recorded: the payment's confirmation, or the refund's

  • totalUsdstring

    What the organization owes the member, in USD, a decimal string: the sum of the lines' owedUsd, payments (each one's settlement.split.merchant.amountUsd: the member's net, the organization's fee withheld) less refunds (everything each sent back to the customer). A release pays it, converted at the release's price. "0" or negative when refunds cancel out the payments: nothing to send, the held funds are closed instead (POST /members/:userUuid/held-funds/close), the organization absorbing the difference

Get your held funds#

GET /held-funds

What the organization holds for the request's space, in its mode: the payments held for the member, and the refunds sent of them (negative lines). No lines and a total of "0" when it pays them directly, has released everything, or for the organization's own space. Owners and admins read a member's with GET /members/:userUuid/held-funds.

Auth
X-API-Key: any key
On-Behalf-Of
Honored: acts in the member's space
Idempotency-Key
Ignored
Success
200
Request

request.sh

curl https://api.qbitflow.app/v2/held-funds \  -H "X-API-Key: $QBITFLOW_API_KEY"# 200: a HeldFunds
// With a member's key, or a client.onBehalfOf(memberUuid) client. Empty for the organization.const held = await client.members.getOwnHeldFunds();console.log(`held for me: ${held.totalUsd} USD over ${held.ledgers.length} lines`);
# With a member's key, or a client acting on behalf of the member.held = client.members.get_own_held_funds()print(f"held for me: {held.total_usd} USD over {len(held.ledgers)} lines")
// As the member: with their own key, or the organization's acting for them.own, err := client.OnBehalfOf(memberUUID).Members.GetOwnHeldFunds(ctx)if err != nil {	log.Fatal(err)}fmt.Printf("held for me: %s USD over %d lines\n", own.TotalUSD, len(own.Ledgers))
// With a member's key (or a client from $client->onBehalfOf($memberUuid)):$held = $client->members->getOwnHeldFunds();printf("Held for me: %s USD over %d lines\n", $held->totalUsd, count($held->ledgers));

Response

A HeldFunds.

  • ledgersarray of LedgerEntry

    The lines not settled yet, oldest first: the payments held (positive), and the refunds sent of them (negative, type refund, each naming the payment it refunds). [] when nothing is held

    11 fields of each LedgerEntry
    • txUuidstring

      The line's transaction: the payment (pay@…) or the refund (refund@…)

    • typestring

      payment or refund

      One of:

      • paymentA payment made to the member while the organization held their funds
      • refundA refund the organization sent of one of them
    • descriptionstring

      What the line is, in words: "Payment pay@…" or "Refund of payment pay@…"

    • refundedTxUuidstringOptional

      A refund line: the payment it refunds (its own line, in these held funds or released with it). Absent on the other lines

    • amountUsdstring

      A payment: what the customer paid, in USD, a decimal string. A refund: what it sent back to the customer, in USD (positive: owedUsd is its negative)

    • settlementSettlementOptional

      A payment: its fees and split (the member was owed settlement.split.merchant when it was held; the organization's fee withheld is settlement.organizationFee, its rate, and settlement.split.organization). Absent on a refund line

      5 fields of Settlement
      • feePercentnumber

        QBitFlow's fee on this payment, in bps (1 % = 100 bps), deducted from the amount paid. Written as feePercent, a percent string

      • organizationFeeOrganizationFeeOptional

        The organization's fee on its member's payment (a marketplace's commission), paid to the organization's wallet. It is taken from what remains after QBitFlow's fee (contracts SPEC §4.1): organization = (amount - QBitFlow's fee) × its rate, and the member receives the rest. While the organization holds the member's funds, it is withheld from what the organization owes them instead of paid on-chain. Absent: none

        2 fields of OrganizationFee
        • addressstringOptional

          The organization's wallet that receives the fee (only for the merchant)

          Only for the resource's owner

        • feePercentnumber

          The organization's fee, in bps, taken from what remains after the platform fee. Written as feePercent, a percent string

      • referralFeeReferralFeeOptional

        The referrer's share of QBitFlow's fee. Absent: none

        2 fields of ReferralFee
        • addressstringOptional

          The referrer's wallet that receives the fee (only for the merchant)

          Only for the resource's owner

        • feePercentnumber

          The referrer's share of the platform fee, in bps (2000 = 20 % of it). Written as feePercent, a percent string

      • splitSplitOptional

        How the contracts split what the payer paid. For a payment the organization held for its member, the organization's fee was withheld from the member's share (not paid on-chain): the split is the one a direct payment would have had. Absent on records made before the split was recorded

        5 fields of Split
        • platformTokenAmount

          QBitFlow's fee (the referrer's share not included)

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • organizationTokenAmountOptional

          The organization's fee; absent without one

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • referralTokenAmountOptional

          The referrer's share of QBitFlow's fee; absent without one

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • merchantTokenAmount

          What the merchant received (the member, for a member's payment), net of every fee

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • networkFeeTokenAmountOptional

          NetworkFee is the network fee the payer paid on top of the amount, in the payment's currency: the gas refund the contracts took in the token (their GasRefundProcessed event), or, for a payment in a chain's native coin, the fee of the transaction the payer's wallet paid (its gas and, on Base, its L1 data fee), bounded by what QBitFlow prepared. Not the transaction's own cost to its sender (transaction.fee). Absent on records made before it was recorded ("0" once recorded as none)

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

      • transactionSettlementTransactionOptional

        The transaction that paid it. Absent before its confirmation

        6 fields of SettlementTransaction
        • blockNumberstring

          The block (Ethereum, Base) or slot (Solana) it landed in, a string of digits

        • blockTimestringOptional

          When its block was produced (UTC); when it was recorded if the chain's node didn't give it. Absent only on records made before it was recorded

        • gasUsedintegerOptional

          The gas it consumed (Ethereum, Base). Absent on Solana

        • feeTokenAmount

          What the transaction cost its sender, in the chain's native coin (ETH, SOL; its currency is the payment currency's chain): its gas and, on Base, its L1 data fee. amountUsd at nativePriceUsd

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • l1FeeTokenAmountOptional

          The part of fee that paid Base's L1 data fee, in the native coin. Absent off Base, and on transactions recorded before it was

          3 fields of TokenAmount
          • amountstring

            In the token's units, exact: amountMinUnits / 10^decimals, a decimal string ("12.5")

          • amountMinUnitsstring

            The on-chain integer, in the token's smallest unit, a string of digits ("12500000")

          • amountUsdstringOptional

            Its value in USD, a decimal string; absent when no price was known

        • nativePriceUsdstringOptional

          NativePriceUSD is the USD price of the chain's native coin when the transaction was recorded (what its fee cost in USD). Absent when the price wasn't available then

    • currencyIdinteger

      The currency paid (and refunded), written as the currency object under currency (GET /currencies/:id)

    • owedstring

      What the line counts for in a release, in the currency's units, exact (owedMinUnits / 10^decimals), a decimal string: a payment's merchant share (settlement.split.merchant), or minus what a refund sent back (negative: everything the customer got back, the organization's, QBitFlow's and the network fees included). In heldFunds.released: what it counted for in that release

    • owedMinUnitsstring

      The same in the currency's smallest unit, a string of digits (negative for a refund)

    • owedUsdstring

      The same in USD, at the payment's time, a decimal string (negative for a refund)

    • createdAtstring

      When the line was recorded: the payment's confirmation, or the refund's

  • totalUsdstring

    What the organization owes the member, in USD, a decimal string: the sum of the lines' owedUsd, payments (each one's settlement.split.merchant.amountUsd: the member's net, the organization's fee withheld) less refunds (everything each sent back to the customer). A release pays it, converted at the release's price. "0" or negative when refunds cancel out the payments: nothing to send, the held funds are closed instead (POST /members/:userUuid/held-funds/close), the organization absorbing the difference

Errors

Edge cases

The contract's rules for these routes: Reading held funds · Refunds of held payments.

Read all 2

Reading held funds

  • GET /held-funds (auth, QBitFlow): the request's space's own held funds, in its mode, from a session or an API key (a member's key, or an organization key with On-Behalf-Of). The organization's own space holds nothing for itself: ledgers: [], totalUsd: "0".
  • GET /members/:userUuid/held-funds (owners and admins of the organization's space, its keys too): a member's, in the request's mode; a removed member's too (what was held when they left is still owed). The member themselves, or the team acting as one → 403; another organization's user → 404; a userUuid that isn't a uuid → 400 on userUuid.
  • HeldFunds: ledgers, the lines not settled, oldest first ([] when none), and totalUsd, what the organization owes the member in USD: the sum of the lines' owedUsd, exactly (a decimal string, "0" or negative when refunds cancel out the payments).
  • A line (LedgerEntry): type payment or refund; txUuid (pay@…, refund@…); description in words; currency (the catalog's object); owed / owedMinUnits / owedUsd, what it counts for in a release (in the token's units, its on-chain integer, and USD at the payment's time): a payment's merchant share as the contracts paid it (settlement.split.merchant: the organization's fee withheld), never recomputed from the fee rates; a refund's is negative (everything the refund sent back to the customer, the fees and the network fee included). amountUsd is what the customer paid (a refund line: what it sent back, positive). A payment line has its settlement; a refund line has refundedTxUuid (the payment it refunds) and no settlement.
  • A payment recorded without its on-chain split makes the read fail (500): what it owes is unknown, never counted as 0.
  • Test and live never mix: a line has the mode of its payment.
  • GET /members/held-funds (owners and admins of the organization's space, its keys too; a member, or the team acting as one → 403): the members the organization owes something, in the request's mode (removed members still owed included), the longest held first, in one page (a bounded list, pagination: hasMore: false, no limit or cursor): { userUuid, totalUsd, count, oldestAt }, each totalUsd as that member's GET /members/:userUuid/held-funds totals it, count its lines, oldestAt its oldest line.

Refunds of held payments

  • A held payment is refunded from the organization's wallet, which decides it (Refunds); once the refund is confirmed it is its own negative line of the member's held funds, linked to the payment's (refundedTxUuid): the member bears the refund, the fees and the network fee it sent back included. The payment's own line is unchanged. A refund confirmed after its payment was released (or closed) records nothing: nothing carries over.
  • Once released, a held payment can't be refunded anymore (409 held_funds_released). A refund and a release of the same member are never in flight together (refund_in_flight, held_funds_release_in_flight, held_funds_changed above), however long either is being confirmed.