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

> Handle bulk transactions in your Blnk Ledger.

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

<Note>
  If you're using the auto-provisioned `Enterprise Core` instance included with your Production License deployment, set the base URL to: `https://ENTERPRISE_PUBLIC_URL/core`.

  If you're connecting to a different Core instance, use the publicly accessible base URL for that instance instead.
</Note>

### Authorization

If set, the API uses an API key for authentication. Include the following header in your requests: `X-blnk-key: <api-key>`.

Replace `<api-key>` with your secret API key. Ensure the key is kept secure and not exposed in public repositories or client-side code.

See also: [Scoped API keys](/api-keys/overview) and [Secure your Blnk server](/advanced/secure-blnk).

### Body

<ParamField body="atomic" type="boolean" required>
  When `true`, either all transactions succeed or all fail. When `false`, transactions are processed independently.
</ParamField>

<ParamField body="inflight" type="boolean" required>
  When `true`, transactions are created in `INFLIGHT` status and require a separate commit. When `false`, transactions are applied immediately.
</ParamField>

<ParamField body="run_async" type="boolean" default="false">
  When `true`, processing happens in the background and results are delivered via webhook. When `false` or not provided, processing happens synchronously and results are returned in the response.
</ParamField>

<ParamField body="skip_queue" type="boolean" default="false">
  When `true`, transactions bypass the queue and are processed inline in the request. Duplicate-reference handling differs from the default queued path. See [Duplicate references](/transactions/bulk-transactions#duplicate-references).
</ParamField>

<ParamField body="transactions" type="object[]" required>
  An array of transaction objects. Max number of transactions allowed is 10,000.

  ```json Sample transaction object theme={"system"}
  {
    "precise_amount": 35890,
    "precision": 100,
    "reference": "unique_reference_1",
    "description": "Transaction description",
    "currency": "USD",
    "source": "@source_account",
    "destination": "@destination_account",
    "allow_overdraft": true
  }
  ```
</ParamField>

### Response

<ResponseField name="batch_id" type="string" required>
  Identifier for the bulk batch. Use this value as `parent_transaction` when [searching for child transactions](/transactions/bulk-transactions#retrieving-transactions-in-a-batch), or when [committing or voiding](/transactions/bulk-transactions#commit-or-void-bulk-inflight) an inflight batch.
</ResponseField>

<ResponseField name="status" type="string" required>
  When `run_async` is `false`, `applied` means the bulk request was accepted. With default queueing (`skip_queue: false`), children are processed asynchronously - `applied` does not mean every child is already `APPLIED` on balances. With `skip_queue: true`, children are processed inline before the response returns. Value is `inflight` when `inflight: true`. When `run_async` is `true`, value is `processing`.
</ResponseField>

<ResponseField name="transaction_count" type="integer">
  Number of transactions in the request. Present on successful synchronous responses. On the default queued path, this reflects items submitted, not necessarily rows created - see [Duplicate references](/transactions/bulk-transactions#duplicate-references).
</ResponseField>

<ResponseField name="message" type="string">
  Human-readable status message. Included on the immediate response when `run_async` is `true` (for example, confirming that background processing started).
</ResponseField>

<ResponseExample>
  ```json 200 theme={"system"}
  {
    "batch_id": "bulk_c62f200b-905f-4983-a349-cadd279234aa",
    "status": "applied",
    "transaction_count": 4
  }
  ```

  ```json 400 theme={"system"}
  {
    "error": "transactions cannot be empty",
    "error_detail": {
      "code": "TXN_BULK_EMPTY",
      "message": "transactions cannot be empty"
    }
  }
  ```

  ```json 400 theme={"system"}
  {
    "error": "too many transactions; max is 10000",
    "error_detail": {
      "code": "TXN_BULK_LIMIT_EXCEEDED",
      "message": "too many transactions; max is 10000"
    }
  }
  ```

  ```json 400 theme={"system"}
  {
    "error_detail": {
      "code": "TXN_VALIDATION_ERROR",
      "message": "transactions[1]: currency: cannot be blank; destination: either destination or destinations is required, not both.",
      "details": {
        "index": 1
      }
    },
    "errors": "transactions[1]: currency: cannot be blank; destination: either destination or destinations is required, not both."
  }
  ```

  ```json 409 theme={"system"}
  {
    "batch_id": "bulk_305873c0-518a-470c-bf3a-bc3f3e0b562c",
    "error": "failed to queue transaction 2 (Reference: sqdup-17372-existing, Source: bln_b4819533-9570-4770-a1a0-25c191da0557, Destination: bln_34111155-4015-4e84-bf7c-13a60794bf0b, Amount: 4.00): transaction validation failed: reference sqdup-17372-existing has already been used. All transactions in this batch have been refunded.",
    "error_detail": {
      "code": "TXN_DUPLICATE_REFERENCE",
      "message": "failed to queue transaction 2 (Reference: sqdup-17372-existing, Source: bln_b4819533-9570-4770-a1a0-25c191da0557, Destination: bln_34111155-4015-4e84-bf7c-13a60794bf0b, Amount: 4.00): transaction validation failed: reference sqdup-17372-existing has already been used. All transactions in this batch have been refunded."
    }
  }
  ```
</ResponseExample>

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