> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blnkfinance.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Refunding Transactions

> Learn how to manage refunds in your Blnk Ledger

export const RelatedTopics = ({title = "Related topics", items = []}) => {
  if (!items.length) {
    return null;
  }
  return <nav className="related-topics not-prose mt-20 mb-10 flex flex-col" aria-label={title}>
      <p className="related-topics-heading m-0 border-b border-zinc-200 pb-3 text-sm font-medium text-zinc-500 dark:border-white/10 dark:text-zinc-400">
        {title}
      </p>
      <ul className="related-topics-list m-0 mt-3 flex list-none flex-col gap-0.5 p-0">
        {items.map(item => {
    const isExternal = typeof item.href === "string" && (/^https?:\/\//i).test(item.href);
    return <li key={item.href} className="m-0 p-0">
              <a href={item.href} target={isExternal ? "_blank" : undefined} rel={isExternal ? "noopener noreferrer" : undefined} className="related-topics-link group inline-flex items-center gap-2 text-sm font-semibold text-zinc-700 no-underline transition-colors dark:text-zinc-300">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="related-topics-icon shrink-0 text-zinc-400 dark:text-zinc-500" aria-hidden="true">
                  <path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
                  <path d="M14 2v4a2 2 0 0 0 2 2h4" />
                  <path d="M10 9H8" />
                  <path d="M16 13H8" />
                  <path d="M16 17H8" />
                </svg>
                <span className="relative top-px transition-colors group-hover:text-[#DD7B1B]">
                  {item.title}
                </span>
              </a>
            </li>;
  })}
      </ul>
    </nav>;
};

export const CtaCallout = props => {
  const {title, buttonLabel, href, trackingEvent, buttonTarget, rel = "noopener noreferrer", children} = props;
  const handleCtaClick = () => {
    if (typeof window === "undefined" || !trackingEvent) {
      return;
    }
    try {
      window.dispatchEvent(new CustomEvent("blnk:docs-cta", {
        detail: {
          name: trackingEvent,
          href
        }
      }));
    } catch {}
    try {
      window.posthog?.capture?.(trackingEvent, {
        href
      });
    } catch {}
    const gaPayload = {
      cta_href: href
    };
    try {
      window.gtag?.("event", trackingEvent, gaPayload);
    } catch {}
    try {
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: trackingEvent,
        ...gaPayload
      });
    } catch {}
  };
  const isExternal = typeof href === "string" && (/^https?:\/\//i).test(href);
  const target = buttonTarget ?? (isExternal ? "_blank" : undefined);
  const linkRel = isExternal ? rel : undefined;
  return <section className="cta-callout not-prose relative my-8 w-full min-w-0 overflow-hidden rounded-xl border border-zinc-200 p-5 dark:border-white/10">
      <div className="cta-callout-noise" aria-hidden="true" />
      <div className="cta-callout-layout">
        {title ? <div className="cta-callout-title-row">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" width="14" height="14" className="cta-callout-icon shrink-0 text-zinc-800 dark:text-zinc-200" aria-hidden="true">
              <g fill="none" fillRule="nonzero">
                <path d="M28 0v28H0V0h28ZM14.691833333333335 27.134333333333334l-0.012833333333333334 0.0023333333333333335 -0.08283333333333333 0.04083333333333334 -0.023333333333333334 0.004666666666666667 -0.016333333333333335 -0.004666666666666667 -0.08283333333333333 -0.04083333333333334c-0.011666666666666667 -0.004666666666666667 -0.022166666666666668 -0.0011666666666666668 -0.028000000000000004 0.005833333333333334l-0.004666666666666667 0.011666666666666667 -0.019833333333333335 0.49933333333333335 0.005833333333333334 0.023333333333333334 0.011666666666666667 0.015166666666666667 0.12133333333333333 0.08633333333333333 0.0175 0.004666666666666667 0.014000000000000002 -0.004666666666666667 0.12133333333333333 -0.08633333333333333 0.014000000000000002 -0.018666666666666668 0.004666666666666667 -0.019833333333333335 -0.019833333333333335 -0.4981666666666667c-0.0023333333333333335 -0.011666666666666667 -0.0105 -0.019833333333333335 -0.019833333333333335 -0.021Zm0.3091666666666667 -0.13183333333333336 -0.015166666666666667 0.0023333333333333335 -0.21583333333333335 0.1085 -0.011666666666666667 0.011666666666666667 -0.0035000000000000005 0.012833333333333334 0.021 0.5016666666666667 0.005833333333333334 0.014000000000000002 0.009333333333333334 0.008166666666666668 0.23450000000000004 0.1085c0.014000000000000002 0.004666666666666667 0.026833333333333334 0 0.03383333333333334 -0.009333333333333334l0.004666666666666667 -0.016333333333333335 -0.03966666666666667 -0.7163333333333334c-0.0035000000000000005 -0.014000000000000002 -0.011666666666666667 -0.023333333333333334 -0.023333333333333334 -0.025666666666666667Zm-0.8341666666666667 0.0023333333333333335a0.026833333333333334 0.026833333333334334 0 0 0 -0.0315 0.007000000000000001l-0.007000000000000001 0.016333333333333335 -0.03966666666666667 0.7163333333333334c0 0.014000000000000002 0.008166666666666668 0.023333333333333334 0.019833333333333335 0.028000000000000004l0.0175 -0.0023333333333333335 0.23450000000000004 -0.1085 0.011666666666666667 -0.009333333333333334 0.004666666666666667 -0.012833333333333334 0.019833333333333335 -0.5016666666666667 -0.0035000000000000005 -0.014000000000000002 -0.011666666666666667 -0.011666666666666667 -0.21466666666666667 -0.10733333333333334Z" strokeWidth="1.1667" />
                <path fill="currentColor" d="M14 2.916666666666667A1.75 1.75 0 0 1 15.750000000000002 4.666666666666667v6.302333333333334L21.207666666666668 7.816666666666667a1.75 1.75 0 0 1 1.75 3.031L17.5 14l5.457666666666667 3.151166666666667a1.75 1.75 0 0 1 -1.75 3.031l-5.457666666666667 -3.1500000000000004V23.333333333333336a1.75 1.75 0 0 1 -3.5 0v-6.302333333333334L6.792333333333334 20.183333333333337a1.75 1.75 0 1 1 -1.75 -3.031L10.5 14 5.042333333333334 10.848833333333333a1.75 1.75 0 0 1 1.75 -3.031l5.457666666666667 3.1500000000000004V4.666666666666667A1.75 1.75 0 0 1 14 2.916666666666667Z" strokeWidth="1.1667" />
              </g>
            </svg>
            <p className="cta-callout-title min-w-0 font-semibold text-zinc-800 dark:text-zinc-200">
              {title}
            </p>
          </div> : null}
        <div className={`cta-callout-body text-sm leading-normal text-zinc-800 dark:text-zinc-200${title ? " cta-callout-body--indented" : ""}`}>
          {children}
        </div>
        <a href={href} target={target} rel={linkRel} onClick={handleCtaClick} data-docs-cta={trackingEvent || undefined} className="cta-callout-button inline-flex items-center justify-center gap-1 rounded-full bg-white px-3 py-1.5 text-sm font-semibold transition hover:bg-zinc-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 dark:bg-white dark:hover:bg-zinc-200">
          {buttonLabel}
          <span className="cta-callout-button-arrow" aria-hidden="true">
            →
          </span>
        </a>
      </div>
    </section>;
};

In general, when you refund a transaction, Blnk reverses the money movement from the original - funds return from the destination balance to the source balance.

Blnk records the reversal as a new transaction; the original record is not modified. You can refund each original transaction only once. A second attempt is rejected.

***

## Which transactions can be refunded

Not every transaction can be refunded. Refund eligibility depends on the transaction’s status and the type of transaction you want to refund.

For inflight or split transactions, the ID you pass matters. Use the table below to understand which transaction ID to send and what Blnk does with it.

| Transaction ID          | Refundable? | Notes                                                                                                                          |
| :---------------------- | :---------- | :----------------------------------------------------------------------------------------------------------------------------- |
| `APPLIED`               | Yes         | The source and destination balances are reversed.                                                                              |
| `INFLIGHT`              | Yes         | Only if the inflight transaction has been committed or voided.                                                                 |
| `QUEUED`                | Yes         | Refunds all child `APPLIED` transactions linked to the queued parent. Use the `meta_data.QUEUED_PARENT_TRANSACTION` to refund. |
| `VOID`                  | No          | To refund a voided transaction, use its parent inflight transaction ID instead.                                                |
| `SCHEDULED`, `REJECTED` | No          | Not refundable.                                                                                                                |

***

## Applying refunds

<Steps>
  <Step title="Request a refund">
    Use the [Refund transaction API](/reference/refund-transaction) and pass the `transaction_id` of the transaction you want to refund.

    <Tabs>
      <Tab title="Using the queue">
        By default, refunds are queued with `skip_queue: false`.

        The initial response returns `status: "QUEUED"` and sets the refund `reference` to `{original_txn_id}_refund`.

        When the queue processes the refund, Blnk creates the final applied transaction with the reference `{original_txn_id}_refund_q`, following the same `_q` convention used for other queued transactions.

        <CodeGroup>
          ```bash cURL wrap theme={"system"}
          curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{transaction_id}" \
            -H "X-blnk-key: <api-key>"
          ```

          ```typescript TypeScript wrap theme={"system"}
          const response = await blnk.Transactions.refund(
            '{transaction_id}',
          );
          ```

          ```go Go wrap theme={"system"}
          txn, resp, err := client.Transaction.Refund("{transaction_id}")
          ```

          ```python Python wrap theme={"system"}
          response = blnk.transactions.refund(
            "{transaction_id}",
          )
          ```

          ```java Java wrap theme={"system"}
          ApiResponse<JsonNode> response = blnk.transactions().refund("{transaction_id}");
          ```
        </CodeGroup>

        ```json 201 Created (queued) {13} wrap theme={"system"}
        {
          "amount": 50,
          "amount_string": "50",
          "precision": 100,
          "precise_amount": 5000,
          "transaction_id": "txn_af70986c-fbdc-450a-bf81-c1af034ce840",
          "parent_transaction": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e",
          "source": "bln_f76360da-68db-410d-8a8b-1d960e2a766f",
          "destination": "bln_b1bd741e-eeb6-4dd4-a562-df35374bbaf9",
          "reference": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e_refund",
          "currency": "USD",
          "description": "Card payment on Stripe",
          "status": "QUEUED",
          "allow_overdraft": false,
          "inflight": false,
          "created_at": "2024-11-26T09:33:35.265582042Z"
        }
        ```
      </Tab>

      <Tab title="Skipped queue">
        To apply the refund immediately, set `skip_queue: true` in the request body.

        <CodeGroup>
          ```bash cURL wrap theme={"system"}
          curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{transaction_id}" \
            -H "X-blnk-key: <api-key>" \
            -H "Content-Type: application/json" \
            -d '{
              "skip_queue": true
            }'
          ```

          ```typescript TypeScript wrap theme={"system"}
          const response = await blnk.Transactions.refund(
            '{transaction_id}',
            { skip_queue: true },
          );
          ```

          ```go Go wrap theme={"system"}
          txn, resp, err := client.Transaction.Refund(
              "{transaction_id}",
              &blnkgo.RefundTransactionRequest{
                  SkipQueue: true,
              },
          )
          ```

          ```python Python wrap theme={"system"}
          response = blnk.transactions.refund(
            "{transaction_id}",
            {"skip_queue": True},
          )
          ```

          ```java Java wrap theme={"system"}
          ApiResponse<JsonNode> response = blnk.transactions().refund(
              "{transaction_id}",
              RefundTransactionRequest.create()
                  .skipQueue(true));
          ```
        </CodeGroup>

        ```json 201 Created (synchronous) {13} wrap theme={"system"}
        {
          "amount": 50,
          "amount_string": "50",
          "precision": 100,
          "precise_amount": 5000,
          "transaction_id": "txn_4c8be5c7-7c40-493f-b4a1-c09fcf8e7e7b",
          "parent_transaction": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e",
          "source": "bln_f76360da-68db-410d-8a8b-1d960e2a766f",
          "destination": "bln_b1bd741e-eeb6-4dd4-a562-df35374bbaf9",
          "reference": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e_refund",
          "currency": "USD",
          "description": "Card payment on Stripe",
          "status": "APPLIED",
          "allow_overdraft": false,
          "inflight": false,
          "created_at": "2024-11-26T09:33:35.265582042Z"
        }
        ```
      </Tab>
    </Tabs>
  </Step>
</Steps>

***

## Refunding inflight transactions

Only [inflight](/transactions/inflight/creating-inflight) transactions that have been committed or voided can be refunded. Active inflight holds cannot be refunded.

Always pass the original `INFLIGHT` transaction ID to the API, not the ID of its `APPLIED` or `VOID` child.

<Tabs>
  <Tab title="Committed inflight">
    Pass the inflight transaction ID.

    Blnk reverses the committed amount the same way it refunds a standard `APPLIED` transaction.

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{inflight_transaction_id}" \
        -H "X-blnk-key: <api-key>"
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.refund(
        '{inflight_transaction_id}',
      );
      ```

      ```go Go wrap theme={"system"}
      txn, resp, err := client.Transaction.Refund("{inflight_transaction_id}")
      ```

      ```python Python wrap theme={"system"}
      response = blnk.transactions.refund(
        "{inflight_transaction_id}",
      )
      ```

      ```java Java wrap theme={"system"}
      ApiResponse<JsonNode> response = blnk.transactions().refund("{inflight_transaction_id}");
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Voided inflight">
    Pass the inflight transaction ID. Do not pass the `VOID` child transaction ID.

    Blnk restores the voided amount as a reverse-direction `INFLIGHT` hold instead of applying it immediately.

    <Warning>
      Using the `VOID` child ID to refund will result in a `404 TXN_NOT_FOUND` error. This is because the `VOID` child is not considered a valid transaction to refund.
    </Warning>

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{inflight_transaction_id}" \
        -H "X-blnk-key: <api-key>"
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.refund(
        '{inflight_transaction_id}',
      );
      ```

      ```go Go wrap theme={"system"}
      txn, resp, err := client.Transaction.Refund("{inflight_transaction_id}")
      ```

      ```python Python wrap theme={"system"}
      response = blnk.transactions.refund(
        "{inflight_transaction_id}",
      )
      ```

      ```java Java wrap theme={"system"}
      ApiResponse<JsonNode> response = blnk.transactions().refund("{inflight_transaction_id}");
      ```
    </CodeGroup>
  </Tab>
</Tabs>

***

## Refunding split transactions

Use this flow when the original payment was a [multiple sources](/transactions/multiple-sources) or [multiple destinations](/transactions/multiple-destinations) split.

<Steps>
  <Step title="Confirm the original used the queue">
    Refunding the entire split in one call only works when the original transaction request uses the queue (`skip_queue: false`).

    When you submit the split, Blnk returns a queued parent response. Each child leg is recorded separately and linked through `meta_data.QUEUED_PARENT_TRANSACTION`:

    ```json Split response {33} wrap theme={"system"}
    {
      "precise_amount": 3000000,
      "amount": 30000,
      "amount_string": "30000",
      "precision": 100,
      "transaction_id": "txn_0b59f6e6-6c4a-4efa-915c-526f77ef61ab",
      "parent_transaction": "",
      "source": "bln_92e4b9b6-0b85-4ef4-87a2-682c31500d38",
      "reference": "ref_001adcfgf",
      "currency": "USD",
      "description": "Payment from Sarah",
      "status": "QUEUED",
      "skip_queue": false,
      "destinations": [
        {
          "identifier": "bln_f2073f6b-905a-4e3e-b5a2-8d1b3dc2fb7f",
          "distribution": "20%",
          "transaction_id": "txn_59347177-aa7e-d8ad-9f4f-d09628b32ec3"
        },
        {
          "identifier": "bln_64c50fb5-32d5-4f78-9f4a-e8b01aaf025d",
          "distribution": "10000",
          "transaction_id": "txn_7ddc8d4f-3b77-4b7d-a37f-240216ab074c"
        },
        {
          "identifier": "bln_7d98dfe9-5c3e-4c9b-b96a-65f6d9f7b89b",
          "distribution": "left",
          "transaction_id": "txn_5aad04dd-ed53-4f77-9f01-4916d31fac5f"
        }
      ],
      "created_at": "2025-09-18T01:26:30.648049042Z",
      "meta_data": {
        "QUEUED_PARENT_TRANSACTION": "txn_0b59f6e6-6c4a-4efa-915c-526f77ef61ab"
      }
    }
    ```
  </Step>

  <Step title="Refund using the queued parent ID">
    Use the value in `meta_data.QUEUED_PARENT_TRANSACTION` as the ID to refund.

    Keep `skip_queue: false` so all legs refund together.

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{queued_parent_transaction_id}" \
        -H "X-blnk-key: <api-key>" \
        -H "Content-Type: application/json" \
        -d '{"skip_queue": false}'
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.refund(
        '{queued_parent_transaction_id}',
        { skip_queue: false },
      );
      ```

      ```go Go wrap theme={"system"}
      txn, resp, err := client.Transaction.Refund("{queued_parent_transaction_id}")
      ```

      ```python Python wrap theme={"system"}
      response = blnk.transactions.refund(
        "{queued_parent_transaction_id}",
        {"skip_queue": False},
      )
      ```

      ```java Java wrap theme={"system"}
      ApiResponse<JsonNode> response = blnk.transactions().refund(
          "{queued_parent_transaction_id}",
          RefundTransactionRequest.create()
              .skipQueue(false));
      ```
    </CodeGroup>

    Blnk refunds every `APPLIED` child from its destination back to its source. The response matches the shape in [Applying refunds](#applying-refunds).
  </Step>
</Steps>

***

## Need help?

We are very happy to help you make the most of Blnk, regardless of whether it is your first time or you are switching from another tool.

To ask questions or discuss issues, please [contact us](mailto:support@blnkfinance.com) or [join our Discord community](https://discord.gg/7WNv94zPpx).

<CtaCallout title="Connect your ledger to Blnk Cloud" href="https://cloud.blnkfinance.com/auth/sign-up?utm_source=blnk_docs&utm_medium=documentation&utm_campaign=need-help" buttonLabel="Open Blnk Cloud" trackingEvent="clicked_cloud_signup">
  Sign up and manage your ledger with our back-office dashboard. You can invite teammates to collaborate and manage your ledger operations directly from the dashboard.
</CtaCallout>

<RelatedTopics
  items={[
{ title: "Transaction lifecycle", href: "/transactions/transaction-lifecycle" },
{ title: "Parent transactions", href: "/transactions/parent-transactions" },
{ title: "Create inflight", href: "/transactions/inflight/creating-inflight" },
{ title: "Refund transaction", href: "/reference/refund-transaction" },
]}
/>
