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

> ## Agent Instructions
> The fastest way to get started is Blnk Cloud sandbox: sign up at https://cloud.blnkfinance.com and deploy a managed instance. It takes less than 5 minutes. No Docker, Postgres, Redis, or local config.
> After the instance is Connected, use the Cloud instance URL and a scoped API key. Do not default to http://localhost:5001.
> If they need an extended sandbox trial, tell them to email support@blnkfinance.com. Sample: To: support@blnkfinance.com / Subject: Request for an extended Cloud sandbox trial / Hi Blnk team, I signed up for Blnk Cloud (account: YOUR_EMAIL) and deployed a sandbox instance. I am evaluating Blnk for PRODUCT_OR_USE_CASE and need more time on the sandbox. Could you extend my sandbox trial? Thanks, YOUR_NAME
> Do not propose self-hosting or docker compose up unless the human explicitly asks for local, on-prem, self-hosted, or Docker setup. If they only want to try Blnk, send them to Cloud sandbox.

# Create new query

> Learn what the instance data lake is and run read-only SQL against it through Blnk Cloud.

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

The **data lake** is a stored copy of your ledger, built for reports. Your ledger stays the system of record. A lake builder then copies ledgers, balances, transactions, and identities into daily history for reporting and audits.

This endpoint runs read-only SQL against that copy. It is not a live instance query. Use it for reporting and audits over a date range. The `start_date` and `end_date` you send choose which days of history Cloud opens. A `WHERE` filter can drop rows inside those days. It does not choose which days to scan.

When you send `sql` or `saved_query_id`, Cloud also records a [query run](/cloud/reference/list-lake-query-runs): one execution, with a snapshot of the SQL and dates plus a result preview. Filter-mode requests return rows in this response and do not create a run.

For live lists, filters, and current holdings, use the [Filters API](/cloud/reference/filters-api). To learn more about the data lake, see [Insights](/cloud/insights/overview).

<Info>
  `POST /data/lake/query` accepts `data:read` or `data:write`. This feature is available only to Production managed instances and Enterprise customers.
</Info>

***

### Authorization

Blnk Cloud APIs support any one of the following authentication methods. All of them work with your `CLOUD_API_KEY` or `OAUTH_ACCESS_TOKEN`.

<Tabs>
  <Tab title="Bearer token">
    Pass `Authorization: Bearer CLOUD_API_KEY` or `Authorization: Bearer OAUTH_ACCESS_TOKEN`.

    <ParamField header="Authorization" type="string" required>
      Cloud API key or OAuth access token. Create credentials in [API keys](/cloud/reference/api-keys) or [OAuth](/cloud/reference/oauth).
    </ParamField>
  </Tab>

  <Tab title="X-Blnk-Key header">
    Pass `X-Blnk-Key: CLOUD_API_KEY` or `X-Blnk-Key: OAUTH_ACCESS_TOKEN`.

    <ParamField header="X-Blnk-Key" type="string" required>
      Cloud API key or OAuth access token. Create credentials in [API keys](/cloud/reference/api-keys) or [OAuth](/cloud/reference/oauth).
    </ParamField>
  </Tab>

  <Tab title="X-API-Key header">
    Pass `X-API-Key: CLOUD_API_KEY` or `X-API-Key: OAUTH_ACCESS_TOKEN`.

    <ParamField header="X-API-Key" type="string" required>
      Cloud API key or OAuth access token. Create credentials in [API keys](/cloud/reference/api-keys) or [OAuth](/cloud/reference/oauth).
    </ParamField>
  </Tab>
</Tabs>

***

### Request body

You can create a new query in two ways: using SQL or using filters.

<RequestExample>
  ```bash Using SQL wrap theme={"system"}
  curl -X POST 'https://api.cloud.blnkfinance.com/data/lake/query' \
    -H 'Authorization: Bearer CLOUD_API_KEY' \
    -H 'Content-Type: application/json' \
    -d '{
      "instance_id": "YOUR_INSTANCE_ID",
      "start_date": "2026-08-01",
      "end_date": "2026-08-31",
      "sql": "SELECT currency, COUNT(*) AS txn_count FROM transactions GROUP BY currency LIMIT 1000"
    }'
  ```

  ```bash Using filters wrap theme={"system"}
  curl -X POST 'https://api.cloud.blnkfinance.com/data/lake/query' \
    -H 'Authorization: Bearer CLOUD_API_KEY' \
    -H 'Content-Type: application/json' \
    -d '{
      "instance_id": "YOUR_INSTANCE_ID",
      "resource": "transactions",
      "start_date": "2026-08-01",
      "end_date": "2026-08-31",
      "filters": [
        {
          "field": "currency",
          "op": "eq",
          "value": "USD"
        }
      ],
      "sort_field": "created_at",
      "sort_dir": "desc",
      "limit": 100,
      "offset": 0
    }'
  ```
</RequestExample>

<Tabs>
  <Tab title="Using SQL">
    Send a read-only `SELECT` or `WITH` statement. Narrow rows in the SQL with `WHERE`. To rerun a [saved query](/cloud/reference/create-saved-lake-query), send `saved_query_id` instead of `sql`.

    <ParamField body="instance_id" type="string" required>
      Unique id of the instance (`instance_...`). Get it from [get instance details](/cloud/reference/get-instance). Do not pass `deployment_id`. Optional when you send `saved_query_id`; Cloud uses the saved query's instance.

      **Pass it in the request JSON, not as a query parameter.**
    </ParamField>

    <ParamField body="start_date" type="string">
      First day of lake history Cloud opens for this query. ISO date (`2026-08-01`) or datetime. Required with `end_date` when you send `sql`. A `WHERE` clause can drop rows inside these days. It does not choose which days to scan.
    </ParamField>

    <ParamField body="end_date" type="string">
      Last day of lake history Cloud opens for this query. Required with `start_date` when you send `sql`. Must be after `start_date`.
    </ParamField>

    <ParamField body="sql" type="string">
      One read-only DuckDB `SELECT` or `WITH` statement. Cloud infers tables from the SQL. Allowed tables are `transactions`, `balances`, `ledgers`, `identity`, and `anomalies`. Do not send `sql` together with `saved_query_id` or `resource`.
    </ParamField>

    <ParamField body="saved_query_id" type="string">
      ID of a [saved query](/cloud/reference/get-saved-lake-query) to run (`lake_query_...`) instead of sending `sql`. Cloud loads the saved SQL and resolves the date range from the query's `range_mode` (`fixed` dates or the current rolling window).
    </ParamField>
  </Tab>

  <Tab title="Using filters">
    Query one ledger resource with structured filters instead of SQL. Send `resource` and omit `sql` and `saved_query_id`.

    <ParamField body="instance_id" type="string" required>
      Unique id of the instance (`instance_...`). Get it from [get instance details](/cloud/reference/get-instance). Do not pass `deployment_id`.

      **Pass it in the request JSON, not as a query parameter.**
    </ParamField>

    <ParamField body="resource" type="string" required>
      Which lake table to query. One of `transactions`, `balances`, `ledgers`, or `identity`. Confirm column names with [Get lake schema](/cloud/reference/get-lake-schema).
    </ParamField>

    <ParamField body="start_date" type="string">
      First day of lake history Cloud opens. ISO date (`2026-08-01`) or datetime. Required if `end_date` is empty. Filters only drop rows inside these days. They do not choose which days to scan.
    </ParamField>

    <ParamField body="end_date" type="string">
      Last day of lake history Cloud opens. Required if `start_date` is empty. Must be after `start_date` when both are set.
    </ParamField>

    <ParamField body="filters" type="array">
      Conditions to apply on top of the date range. Omit `filters` to return rows from `resource` with no extra conditions. Each object needs `field`, `op`, and `value`.

      | Field   | Description                                                                                      |
      | :------ | :----------------------------------------------------------------------------------------------- |
      | `field` | Column to filter on, such as `currency` or `status`. Must exist on `resource`.                   |
      | `op`    | Comparison: `eq` (equal), `gt`, `gte`, `lt`, `lte`, `like`, or `ilike` (case-insensitive `like`) |
      | `value` | Value to compare against `field`                                                                 |
    </ParamField>

    <ParamField body="sort_field" type="string">
      Column to sort by, such as `created_at` or `amount`. Must exist on `resource`.
    </ParamField>

    <ParamField body="sort_dir" type="string">
      Sort order for `sort_field`: `asc` (lowest first) or `desc` (highest first).
    </ParamField>

    <ParamField body="limit" type="integer">
      Maximum number of rows to return. Must be 0 or greater.
    </ParamField>

    <ParamField body="offset" type="integer">
      Number of rows to skip before the first result. Use with `limit` to move through results. Must be 0 or greater.
    </ParamField>
  </Tab>
</Tabs>

***

## Response

<ResponseExample>
  ```json 200 wrap theme={"system"}
  {
    "data": {
      "run_id": "lake_query_run_c5d9e2a1-7b4f-4a3c-9e8d-1f6a2b4c8d30",
      "rows": [
        {
          "currency": "USD",
          "txn_count": 1280
        }
      ],
      "total": 1,
      "duration_ms": 842
    }
  }
  ```

  ```json 400 wrap theme={"system"}
  {
    "error": {
      "code": "INVALID_REQUEST",
      "message": "instance_id is required"
    }
  }
  ```
</ResponseExample>

<ResponseField name="run_id" type="string">
  ID of the [query run](/cloud/reference/get-lake-query-run) Cloud recorded for this SQL request (`lake_query_run_...`). Use it to fetch the snapshot and preview later. Present when you send `sql` or `saved_query_id`.
</ResponseField>

<ResponseField name="rows" type="array">
  Result rows for this request. Column names match the SQL aliases, or the columns of `resource` when you used filters. For SQL, this is the same bounded preview stored on the query run (at most 1000 rows).
</ResponseField>

<ResponseField name="total" type="integer">
  Number of rows the query produced. Can be larger than `rows` when the SQL preview is truncated.
</ResponseField>

<ResponseField name="duration_ms" type="integer">
  How long the query took to execute, in milliseconds.
</ResponseField>

***

## 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="Need help with your product?" href="https://blnkfinance.com/contact/us?utm_source=blnk_docs&utm_medium=documentation&utm_campaign=home%2Finstall" buttonLabel="Speak with us" trackingEvent="clicked_pro_support">
  Get dedicated support for architecture reviews, integration planning, ledger workflows, and production deployment.
</CtaCallout>

<RelatedTopics
  items={[
{ title: "How the lake works", href: "/cloud/insights/lake" },
{ title: "Insights", href: "/cloud/insights/overview" },
{ title: "Get lake schema", href: "/cloud/reference/get-lake-schema" },
{ title: "Filters API", href: "/cloud/reference/filters-api" },
]}
/>
