> ## 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.

# Bulk Commit & Void Inflight

> Commit or void multiple independently-created inflight transactions in one request.

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>;
};

<Info>Available in version 0.14.2 and later.</Info>

Use the bulk inflight endpoints to commit or void many independently-created inflight transactions in one request. For a single inflight transaction, use the [Update inflight API](/reference/update-inflight) instead.

**Important distinction:** Bulk inflight updates are for multiple individual transactions. If you created inflight transactions through the [Bulk transactions API](/reference/bulk-transactions), commit them using that batch's `batch_id` via the single update endpoint, not the bulk inflight endpoints.

***

## Bulk commit

To bulk commit in one request, use:

```text Bulk commit inflight theme={"system"}
POST /transactions/inflight/bulk/commit
```

Each request accepts a maximum of **100** items in the `transactions` array.

<Tabs>
  <Tab title="Using the queue" icon="clock">
    <Info>From Blnk Core 0.15.0, bulk commit and void go through the queue by default.</Info>

    When using the queue, Blnk validates each inflight transaction and enqueues a commit job. The response returns immediately; the `queued` status means the job is queued, not committed. Parents stay INFLIGHT until workers create APPLIED children.

    Per item results:

    | Status   | Code             | Meaning                                     |
    | :------- | :--------------- | :------------------------------------------ |
    | `queued` | `QUEUED`         | New commit job added.                       |
    | `queued` | `ALREADY_QUEUED` | Has already been queued; duplicate skipped. |

    <Note>Failures are per-item. One does not block the batch.</Note>

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/transactions/inflight/bulk/commit" \
        -H "X-blnk-key: <api-key>" \
        -H "Content-Type: application/json" \
        -d '{
          "transactions": [
            {
              "transaction_id": "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94"
            },
            {
              "transaction_id": "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
              "precise_amount": 4000
            }
          ]
        }'
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.bulkCommitInflight({
        transactions: [
          {
            transaction_id: 'txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94',
          },
          {
            transaction_id: 'txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30',
            precise_amount: 4000,
          },
        ],
      });
      ```

      ```go Go wrap theme={"system"}
      result, resp, err := client.Transaction.BulkCommitInflight(blnkgo.BulkCommitInflightRequest{
        Transactions: []blnkgo.BulkCommitInflightItem{
          {
            TransactionID: "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
          },
          {
            TransactionID: "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
            PreciseAmount: 4000,
          },
        },
      })
      ```
    </CodeGroup>

    ```json 200 Queued wrap theme={"system"}
    {
      "succeeded": 2,
      "failed": 0,
      "results": [
        {
          "transaction_id": "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
          "status": "queued",
          "code": "QUEUED"
        },
        {
          "transaction_id": "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
          "status": "queued",
          "code": "ALREADY_QUEUED"
        }
      ]
    }
    ```

    The worker later creates `APPLIED` child records for each committed item. Verify outcomes with [webhooks or polling](/transactions/inflight/updating-inflight#verify-with-webhooks) - same as single commit and void.
  </Tab>

  <Tab title="Skipped queue" icon="bolt">
    Set `skip_queue: true` to process each item immediately. The response reflects the final outcome for each inflight transaction.

    Per item results:

    | Status      | Code                | Meaning                                                                                  |
    | :---------- | :------------------ | :--------------------------------------------------------------------------------------- |
    | `succeeded` | -                   | Inflight committed in this response.                                                     |
    | `failed`    | `NOT_FOUND`         | Transaction ID does not exist.                                                           |
    | `failed`    | `ALREADY_COMMITTED` | Inflight was already committed.                                                          |
    | `failed`    | `ALREADY_VOIDED`    | Inflight was already voided.                                                             |
    | `failed`    | `NOT_INFLIGHT`      | Transaction is not in `INFLIGHT` status.                                                 |
    | `failed`    | `INVALID_AMOUNT`    | Partial commit amount exceeds the remaining inflight amount.                             |
    | `failed`    | `LOCKED`            | Concurrent operation on the same transaction (for example duplicate IDs in one request). |
    | `failed`    | `INTERNAL_ERROR`    | Unexpected server failure for this item.                                                 |

    <Note>Failures are per-item. One does not block the batch.</Note>

    <CodeGroup>
      ```bash cURL wrap {5} theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/transactions/inflight/bulk/commit" \
        -H "X-blnk-key: <api-key>" \
        -H "Content-Type: application/json" \
        -d '{
          "skip_queue": true,
          "transactions": [
            {
              "transaction_id": "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94"
            },
            {
              "transaction_id": "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
              "precise_amount": 4000
            }
          ]
        }'
      ```

      ```typescript TypeScript wrap {2} theme={"system"}
      const response = await blnk.Transactions.bulkCommitInflight({
        skip_queue: true,
        transactions: [
          {
            transaction_id: 'txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94',
          },
          {
            transaction_id: 'txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30',
            precise_amount: 4000,
          },
        ],
      });
      ```
    </CodeGroup>

    ```json 200 Skipped queue wrap theme={"system"}
    {
      "succeeded": 2,
      "failed": 0,
      "results": [
        {
          "transaction_id": "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
          "status": "succeeded"
        },
        {
          "transaction_id": "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
          "status": "succeeded"
        }
      ]
    }
    ```
  </Tab>
</Tabs>

***

## Bulk void

To bulk void in one request, use:

```text Bulk void inflight theme={"system"}
POST /transactions/inflight/bulk/void
```

Bulk void expects a `transaction_ids` array, not the `transactions` shape used by bulk commit.

Each request accepts a maximum of **100** IDs in the `transaction_ids` array.

<Tabs>
  <Tab title="Using the queue" icon="clock">
    By default, Blnk uses the queue to process each item. The response returns immediately; the `queued` status means the job is queued, not committed. Parents stay INFLIGHT until workers create APPLIED children.

    Per item results:

    | Status   | Code             | Meaning                                     |
    | :------- | :--------------- | :------------------------------------------ |
    | `queued` | `QUEUED`         | New void job added.                         |
    | `queued` | `ALREADY_QUEUED` | Has already been queued; duplicate skipped. |

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/transactions/inflight/bulk/void" \
        -H "X-blnk-key: <api-key>" \
        -H "Content-Type: application/json" \
        -d '{
          "transaction_ids": [
            "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
            "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30"
          ]
        }'
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.bulkVoidInflight({
        transaction_ids: [
          'txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94',
          'txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30',
        ],
      });
      ```

      ```go Go wrap theme={"system"}
      result, resp, err := client.Transaction.BulkVoidInflight(blnkgo.BulkVoidInflightRequest{
        TransactionIDs: []string{
          "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
          "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
        },
      })
      ```
    </CodeGroup>

    ```json 200 Queued wrap theme={"system"}
    {
      "succeeded": 2,
      "failed": 0,
      "results": [
        {
          "transaction_id": "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
          "status": "queued",
          "code": "QUEUED"
        },
        {
          "transaction_id": "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
          "status": "queued",
          "code": "QUEUED"
        }
      ]
    }
    ```
  </Tab>

  <Tab title="Skipped queue" icon="bolt">
    Set `skip_queue: true` to process each item immediately. The response reflects the final outcome for each inflight transaction.

    Bulk void expects a `transaction_ids` array (not the `transactions` shape used by bulk commit).

    Per item results:

    | Status      | Code                | Meaning                                                                                  |
    | :---------- | :------------------ | :--------------------------------------------------------------------------------------- |
    | `succeeded` | -                   | Inflight voided in this response.                                                        |
    | `failed`    | `NOT_FOUND`         | Transaction ID does not exist.                                                           |
    | `failed`    | `ALREADY_COMMITTED` | Inflight was already committed.                                                          |
    | `failed`    | `ALREADY_VOIDED`    | Inflight was already voided.                                                             |
    | `failed`    | `NOT_INFLIGHT`      | Transaction is not in `INFLIGHT` status.                                                 |
    | `failed`    | `LOCKED`            | Concurrent operation on the same transaction (for example duplicate IDs in one request). |
    | `failed`    | `INTERNAL_ERROR`    | Unexpected server failure for this item.                                                 |

    <Note>Failures are per-item. One does not block the batch.</Note>

    <CodeGroup>
      ```bash cURL wrap {5} theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/transactions/inflight/bulk/void" \
        -H "X-blnk-key: <api-key>" \
        -H "Content-Type: application/json" \
        -d '{
          "skip_queue": true,
          "transaction_ids": [
            "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
            "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30"
          ]
        }'
      ```

      ```typescript TypeScript wrap {2} theme={"system"}
      const response = await blnk.Transactions.bulkVoidInflight({
        skip_queue: true,
        transaction_ids: [
          'txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94',
          'txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30',
        ],
      });
      ```
    </CodeGroup>

    ```json 200 Skipped queue wrap theme={"system"}
    {
      "succeeded": 2,
      "failed": 0,
      "results": [
        {
          "transaction_id": "txn_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94",
          "status": "succeeded"
        },
        {
          "transaction_id": "txn_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
          "status": "succeeded"
        }
      ]
    }
    ```
  </Tab>
</Tabs>

***

## Error handling

<Info>
  Structured errors are available from Blnk Core 0.15.0 and later.
</Info>

Bulk inflight endpoints return `400` when the request body fails validation before processing starts. Per-item failures return `200` with `failed` entries in `results[]`; one failed item does not block the batch.

<Tabs>
  <Tab title="Request validation">
    | Code                      | When it happens                                                                             |
    | :------------------------ | :------------------------------------------------------------------------------------------ |
    | `TXN_BULK_EMPTY`          | `transactions` or `transaction_ids` is missing, empty, or the wrong shape for the endpoint. |
    | `TXN_BULK_LIMIT_EXCEEDED` | More than **100** items in one bulk commit or void request.                                 |

    Bulk commit expects a `transactions` array. Bulk void expects `transaction_ids`. Sending the wrong shape returns `TXN_BULK_EMPTY` because unrecognized fields are dropped.

    ```json 400 Bad Request wrap theme={"system"}
    {
      "error_detail": {
        "code": "TXN_BULK_EMPTY",
        "message": "transactions array is required and cannot be empty"
      },
      "errors": "transactions array is required and cannot be empty"
    }
    ```

    To resolve the error:

    | Code                      | What to do                                                                                     |
    | :------------------------ | :--------------------------------------------------------------------------------------------- |
    | `TXN_BULK_EMPTY`          | Add at least one item. Use `transactions` for bulk commit and `transaction_ids` for bulk void. |
    | `TXN_BULK_LIMIT_EXCEEDED` | Split the request into batches of 100 or fewer items.                                          |
  </Tab>

  <Tab title="Per-item results">
    On the default queued path, `ALREADY_QUEUED` counts toward `succeeded` (idempotent success, not a new queue job). On the skipped-queue path, per-item `failed` codes such as `NOT_FOUND`, `ALREADY_COMMITTED`, `ALREADY_VOIDED`, `NOT_INFLIGHT`, and `INVALID_AMOUNT` are listed in the tabs above.
  </Tab>
</Tabs>

Single inflight commit and void errors like `TXN_COMMIT_AMOUNT_EXCEEDED` apply when you use [Update inflight](/reference/update-inflight) instead of these bulk endpoints.

See [Commit & void inflight - Error handling](/transactions/inflight/updating-inflight#error-handling) and [API error codes](/advanced/error-codes).

***

## Related docs

<CardGroup cols={2}>
  <Card title="Commit & void inflight" icon="circle-check" href="/transactions/inflight/updating-inflight">
    Single commit, void, and verify flows.
  </Card>

  <Card title="Bulk transactions" icon="layers" href="/transactions/bulk-transactions">
    Batch inflight create and commit by batch\_id.
  </Card>

  <Card title="Create inflight" icon="plane" href="/transactions/inflight/creating-inflight">
    Record an inflight transaction.
  </Card>

  <Card title="API error codes" icon="triangle-alert" href="/advanced/error-codes">
    Bulk and inflight error codes.
  </Card>
</CardGroup>

***

## 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>
