On this page
Use Parquet in a Browser or DuckDB
Use the dataset’s copied access instructions to read hosted Parquet. MiniUp provides a stable access URL for tools and a browser grant URL for browser apps; browser code should obtain a fresh download URL on each load.
Find the correct dataset URLs
- Open Dashboard → your Site → Parquet and select the published dataset.
- Open Use this data and its data/API or advanced usage instructions.
- Copy the exact Stable access endpoint or Browser grant endpoint for your workflow.
- Verify dataset access for the intended caller. Do not guess endpoints or reuse an expired download URL.
The following examples use placeholders for values copied from that UI. The access and browser grant URLs are public usage contracts; temporary download URLs should not be saved in app code.
Read Parquet with DuckDB
For a publicly readable dataset, replace the URL below with its stable access endpoint:
INSTALL httpfs;
LOAD httpfs;
SELECT *
FROM read_parquet('https://example.com/COPIED_STABLE_ACCESS_URL')
LIMIT 25;Use exact schema names. For example, after confirming region and revenue exist, select region, sum(revenue) and group by region instead of downloading all rows into a chart.
Load a dataset with DuckDB-Wasm
This browser example uses the setup shown by MiniUp. Replace COPIED_BROWSER_GRANT_URL with the dataset’s browser grant URL, add <pre id="status">Loading…</pre> to your HTML, and run this as a module script.
import * as duckdb from "https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm/+esm";
const status = document.querySelector("#status");
let db, connection, workerUrl;
try {
const bundle = await duckdb.selectBundle(duckdb.getJsDelivrBundles());
workerUrl = URL.createObjectURL(new Blob(
[`importScripts(${JSON.stringify(bundle.mainWorker)});`],
{ type: "text/javascript" }
));
db = new duckdb.AsyncDuckDB(new duckdb.ConsoleLogger(), new Worker(workerUrl));
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
await db.open({ path: ":memory:" });
connection = await db.connect();
const grant = await fetch("COPIED_BROWSER_GRANT_URL", {
method: "POST", cache: "no-store"
});
if (!grant.ok) throw new Error(`Dataset access failed (${grant.status})`);
const { url } = await grant.json();
const response = await fetch(url, { cache: "no-store" });
if (!response.ok) throw new Error(`Download failed (${response.status})`);
await db.registerFileBuffer("data.parquet", new Uint8Array(await response.arrayBuffer()));
const result = await connection.query("SELECT * FROM read_parquet('data.parquet') LIMIT 25");
status.textContent = result.numRows ? result.toString() : "No records found.";
} catch (error) {
status.textContent = error.message;
} finally {
await connection?.close();
await db?.terminate();
if (workerUrl) URL.revokeObjectURL(workerUrl);
}Understand size and access limitations
This example downloads the file into browser memory before querying it. A bounded SQL result does not make that initial download smaller. Use appropriately sized datasets, precomputed summaries, or the supported layer/query workflow for larger maps. Avoid rendering every record at once.
A 401 or 403 requires reviewing dataset access and the calling Site. If a temporary URL expires, request a fresh grant. Never add private credentials to frontend code to work around a denied request.