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

# e6data documentation

> Product guides and references for Query Engine, Ingest Engine, AgentFlow and Platform.

export const HomeFooter = ({links = []}) => <div className="e6-home-footer" role="contentinfo">
    <span>© e6data</span>
    {links.map(l => <a key={l.href} href={l.href}>{l.title}</a>)}
  </div>;

export const ProductChips = ({label, items = []}) => <div className="e6-chips" role="navigation" aria-label="Jump to a product">
    <span className="e6-chips-label">{label}</span>
    {items.map(i => <a key={i.href} className="e6-chip" href={i.href}>{i.title}</a>)}
  </div>;

export const BandItem = ({label, title, desc, href}) => <a href={href}>
    <span className="e6-band-label">{label}</span>
    <span className="e6-band-title">{title}</span>
    <span className="e6-band-desc">{desc}</span>
  </a>;

export const Plane = ({title, cols = 3, children}) => <div className="e6-plane">
    <h3>{title}</h3>
    <div className="e6-plane-grid" style={{
  "--cols": cols
}}>{children}</div>
  </div>;

export const PlatformStrip = ({href, label, name, desc, path}) => <a className="e6-platform-strip" href={href}>
    <span className="e6-eyebrow">{label}</span>
    <span className="e6-strip-name">{name}</span>
    <span className="e6-product-desc">{desc}</span>
    <span className="e6-path">{path}</span>
  </a>;

export const ProductCard = ({name, desc, path, href, badge}) => <a href={href} className="e6-product">
    <span className="e6-product-name">
      {name}
      {badge ? <span className="e6-eyebrow e6-eyebrow--quiet">{badge}</span> : null}
    </span>
    <span className="e6-product-desc">{desc}</span>
    <span className="e6-path">{path}</span>
  </a>;

export const ModeCard = ({label, title, desc, links = [], all}) => <div className="e6-mode">
    <span className="e6-eyebrow">{label}</span>
    <h3>{title}</h3>
    <p>{desc}</p>
    {links.map(l => <a key={l.href + l.title} href={l.href} className="e6-mode-link">
        <span>{l.title}</span>
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.6" aria-hidden="true">
          <path d="M6 3.5L10.5 8 6 12.5" />
        </svg>
      </a>)}
    {all ? <a href={all.href} className="e6-mode-link e6-mode-link--all">
        <span>{all.title}</span>
      </a> : null}
  </div>;

export const HeroSearch = ({placeholder}) => {
  const [query, setQuery] = useState("");
  const [pages, setPages] = useState(null);
  const [open, setOpen] = useState(false);
  const [active, setActive] = useState(0);
  const boxRef = useRef(null);
  const PRODUCTS = [["/query/", "Query Engine"], ["/ingest/", "Ingest Engine"], ["/agentflow/", "AgentFlow"], ["/platform/", "Platform"], ["/api-reference/", "API reference"], ["/get-started/", "Get started"], ["/release-notes", "Release notes"]];
  const load = () => {
    if (pages) return;
    fetch("/llms.txt").then(r => r.ok ? r.text() : "").then(txt => {
      const out = [];
      const re = /^- \[([^\]]+)\]\(([^)]+)\)(?::\s*(.*))?$/gm;
      let m;
      while (m = re.exec(txt)) {
        let path = m[2].replace(/^https?:\/\/[^/]+/, "").replace(/\.md$/, "").replace(/\/index$/, "") || "/";
        if (path === "/index") path = "/";
        const prod = (PRODUCTS.find(([pre]) => path === pre.replace(/\/$/, "") || path.startsWith(pre)) || [null, ""])[1];
        out.push({
          title: m[1],
          path,
          desc: m[3] || "",
          product: prod
        });
      }
      setPages(out);
    }).catch(() => setPages([]));
  };
  const results = useMemo(() => {
    const q = query.trim().toLowerCase();
    if (!q || !pages) return [];
    const words = q.split(/\s+/).filter(Boolean);
    const scored = [];
    for (const p of pages) {
      const t = p.title.toLowerCase(), d = p.desc.toLowerCase(), u = p.path.toLowerCase();
      let score = 0, all = true;
      for (const w of words) {
        let s = 0;
        if (t.startsWith(w)) s += 6;
        if (t.includes(w)) s += 4;
        if (u.includes(w)) s += 2;
        if (d.includes(w)) s += 1;
        if (!s) all = false;
        score += s;
      }
      if (t === q) score += 10;
      if (all && score) scored.push([score, p]);
    }
    scored.sort((a, b) => b[0] - a[0] || a[1].title.length - b[1].title.length);
    return scored.slice(0, 8).map(x => x[1]);
  }, [query, pages]);
  useEffect(() => {
    const onDoc = e => {
      if (boxRef.current && !boxRef.current.contains(e.target)) setOpen(false);
    };
    document.addEventListener("mousedown", onDoc);
    return () => document.removeEventListener("mousedown", onDoc);
  }, []);
  const fullSearch = () => {
    setOpen(false);
    const entry = document.getElementById("search-bar-entry") || document.getElementById("search-bar-entry-mobile");
    if (!entry) return;
    entry.click();
    const q = query;
    let tries = 0;
    const fill = () => {
      const input = document.getElementById("search-input");
      if (input) {
        const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
        setter.call(input, q);
        input.dispatchEvent(new Event("input", {
          bubbles: true
        }));
      } else if (tries++ < 20) {
        setTimeout(fill, 50);
      }
    };
    setTimeout(fill, 50);
  };
  const go = i => {
    if (i < results.length) window.location.href = results[i].path; else fullSearch();
  };
  const onKey = e => {
    const n = results.length + (query.trim() ? 1 : 0);
    if (e.key === "ArrowDown") {
      e.preventDefault();
      setOpen(true);
      setActive(a => n ? (a + 1) % n : 0);
    } else if (e.key === "ArrowUp") {
      e.preventDefault();
      setActive(a => n ? (a - 1 + n) % n : 0);
    } else if (e.key === "Enter") {
      e.preventDefault();
      if (query.trim()) go(active);
    } else if (e.key === "Escape") {
      setOpen(false);
      e.currentTarget.blur();
    }
  };
  const showPanel = open && query.trim().length > 0;
  return <div className="e6-hsearch" ref={boxRef}>
      <div className="e6-search">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" aria-hidden="true">
          <circle cx="11" cy="11" r="7" /><path d="M20 20l-3.5-3.5" />
        </svg>
        <input type="search" className="e6-search-input" placeholder={placeholder} aria-label="Search all products" role="combobox" aria-expanded={showPanel} aria-controls="e6-hsearch-results" autoComplete="off" value={query} onFocus={() => {
    load();
    setOpen(true);
  }} onChange={e => {
    load();
    setQuery(e.target.value);
    setActive(0);
    setOpen(true);
  }} onKeyDown={onKey} />
        <button type="button" className="e6-search-btn" onClick={() => query.trim() ? go(active) : fullSearch()}>Search</button>
      </div>
      {showPanel ? <ul className="e6-hsearch-results" id="e6-hsearch-results" role="listbox">
          {pages === null ? <li className="e6-hsearch-empty">Loading…</li> : null}
          {pages !== null && results.length === 0 ? <li className="e6-hsearch-empty">No page titles match. Try the full-text search below.</li> : null}
          {results.map((r, i) => <li key={r.path} role="option" aria-selected={i === active}>
              <a href={r.path} className={i === active ? "e6-hsearch-item is-active" : "e6-hsearch-item"} onMouseEnter={() => setActive(i)}>
                <span className="e6-hsearch-meta">{r.product}</span>
                <span className="e6-hsearch-title">{r.title}</span>
                {r.desc ? <span className="e6-hsearch-desc">{r.desc}</span> : null}
              </a>
            </li>)}
          <li role="option" aria-selected={active === results.length}>
            <button type="button" className={active === results.length ? "e6-hsearch-item e6-hsearch-all is-active" : "e6-hsearch-item e6-hsearch-all"} onMouseEnter={() => setActive(results.length)} onClick={fullSearch}>
              Search all docs for “{query.trim()}” <kbd>Enter</kbd>
            </button>
          </li>
        </ul> : null}
    </div>;
};

export const Eyebrow = ({children, quiet}) => <span className={quiet ? "e6-eyebrow e6-eyebrow--quiet" : "e6-eyebrow"}>{children}</span>;

<div className="e6-home">
  <section className="e6-hero">
    <div className="e6-wrap">
      <Eyebrow>Docs home</Eyebrow>

      <h1>
        e6data documentation.
        <span className="e6-accent">Product guides and references.</span>
      </h1>

      <HeroSearch placeholder="Search all products" />

      <ProductChips
        label="Go to a product:"
        items={[
  { title: "Query Engine", href: "/query" },
  { title: "Ingest Engine", href: "/ingest" },
  { title: "AgentFlow", href: "/agentflow" },
]}
      />
    </div>
  </section>

  <section className="e6-section">
    <div className="e6-wrap">
      <h2>Find what you need</h2>

      <div className="e6-modes">
        <ModeCard
          label="Tutorials"
          title="New to e6data"
          desc="Step-by-step lessons. You need no prior knowledge, and you finish with a working result."
          links={[
      { title: "Run your first query", href: "/get-started/run-your-first-query" },
      { title: "Build your first pipeline", href: "/ingest/get-started/first-pipeline" },
      { title: "Ask your first AgentFlow question", href: "/agentflow/get-started/first-answer" },
    ]}
          all={{ title: "Start with the quickstart", href: "/get-started/quickstart" }}
        />

        <ModeCard
          label="How-to guides"
          title="Doing a specific task"
          desc="Steps for one task, for people who know the basics."
          links={[
      { title: "Query e6data from Python", href: "/query/connect/python" },
      { title: "Configure role-based access", href: "/platform/identity/roles-and-permissions" },
      { title: "Deploy CloudPrem on EKS", href: "/platform/deploy/aws-cloudprem" },
    ]}
          all={{ title: "All how-to guides", href: "/query" }}
        />

        <ModeCard
          label="Reference"
          title="Looking something up"
          desc="Exact details to look up. We generate API pages from the OpenAPI spec where one exists."
          links={[
      { title: "SQL command reference", href: "/query/sql" },
      { title: "REST APIs", href: "/api-reference" },
      { title: "Configuration options", href: "/platform/reference/config" },
    ]}
          all={{ title: "All reference", href: "/api-reference" }}
        />

        <ModeCard
          label="Explanation"
          title="Learning how it works"
          desc="How the products work, and why we built them that way."
          links={[
      { title: "How the engine plans and runs a query", href: "/query/concepts/walkthrough/what-happens-when-you-run-a-query" },
      { title: "How Ingest Engine checkpoints progress", href: "/ingest/concepts/checkpointing" },
      { title: "How the products fit together", href: "/get-started/how-products-fit-together" },
    ]}
          all={{ title: "All explanations", href: "/query/concepts/architecture" }}
        />
      </div>
    </div>
  </section>

  <section className="e6-section" id="products">
    <div className="e6-wrap">
      <h2>Browse by product</h2>

      <Plane title="Products" cols={3}>
        <ProductCard name="Query Engine" desc="Run SQL on your lakehouse tables. Serverless, CloudPrem or self-managed." path="/query/" href="/query" />

        <ProductCard name="Ingest Engine" desc="Turn live data into query-ready tables." path="/ingest/" href="/ingest" />

        <ProductCard name="AgentFlow" desc="Compiled agent workflows for analytics and operational automation." path="/agentflow/" href="/agentflow" />
      </Plane>

      <PlatformStrip href="/platform" label="Across every product" name="Platform" desc="Organization, workspaces, identity, tokens and operations shared by every product." path="/platform/" />
    </div>
  </section>

  <section className="e6-section">
    <div className="e6-wrap">
      <h2>Start anywhere, combine products when you need to</h2>

      <div className="e6-band">
        <BandItem label="Platform" title="Set up your organization and workspace" desc="Connect your cloud account, storage and catalog." href="/platform" />

        <BandItem label="Query Engine" title="Query the tables you already have" desc="Point it at your existing lakehouse tables. You do not need Ingest Engine." href="/query" />

        <BandItem label="Ingest Engine" title="Turn live data into tables" desc="Add it when you want live data from databases and streams in your lakehouse." href="/ingest" />

        <BandItem label="AgentFlow" title="Build agent workflows" desc="Run agents on your data with or without the other products." href="/agentflow" />
      </div>
    </div>
  </section>

  <HomeFooter
    links={[
{ title: "GitHub", href: "https://github.com/e6data" },
{ title: "LinkedIn", href: "https://www.linkedin.com/company/e6data" },
{ title: "X", href: "https://x.com/e6data" },
{ title: "Security and trust", href: "/platform/trust" },
{ title: "Release notes", href: "/release-notes" },
{ title: "Contact support", href: "mailto:help@e6data.com" },
{ title: "Privacy policy", href: "https://e6data.com/privacy" },
{ title: "Cookie policy", href: "https://e6data.com/cookies" },
{ title: "Terms", href: "https://e6data.com/terms" },
]}
  />
</div>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.