Bulk metadata exports
BEDbase publishes a monthly snapshot of the metadata corpus as Apache Parquet files on S3. This is the supported way to get the whole corpus in bulk; you do not need to page through the API.
Where the exports live
Artifacts are published under the snapshot/ prefix of the public storage bucket,
served over HTTPS at https://data2.bedbase.org/:
https://data2.bedbase.org/snapshot/bedbase_metadata_2026_08_03.parquet
https://data2.bedbase.org/snapshot/bedbase_bedsets_2026_08_03.parquet
https://data2.bedbase.org/snapshot/bedbase_bedset_membership_2026_08_03.parquet
https://data2.bedbase.org/snapshot/manifest_2026_08_03.json
Each run publishes:
| File | Contents |
|---|---|
bedbase_metadata_<date>.parquet |
One row per BED record: the bed table left-joined with bed_metadata. Denormalized descriptive metadata (genome, assay, cell type, tissue, target, sample/experiment ids, …). Per-file statistics are not included in this export. |
bedbase_bedsets_<date>.parquet |
One row per bedset. |
bedbase_bedset_membership_<date>.parquet |
The bedfile ↔ bedset relation (bedset_id, bedfile_id). |
manifest_<date>.json |
Verifiable build metadata (see below). |
Filenames are dated and immutable
Every filename carries its build date (YYYY_MM_DD). A published file is never
overwritten, and there is no latest alias. Do not construct or hardcode a
filename. Instead, discover the current snapshot through the index endpoint:
GET https://api.bedbase.org/v1/exports
It returns the index newest-first, with file_path already rewritten to an
absolute https://data2.bedbase.org/ URL:
{
"count": 8,
"results": [
{
"file_path": "https://data2.bedbase.org/snapshot/bedbase_metadata_2026_09_01.parquet",
"file_type": "metadata",
"creation_date": "2026-09-01T00:49:48.355278Z",
"record_count": 663721,
"file_size": 52850770,
"checksum": "…sha256…",
"schema_version": 1
}
]
}
The newest row is first; take the first metadata entry to find the current
snapshot. The same artifacts are also listed as GA4GH DRS objects at
GET https://api.bedbase.org/v1/objects/exports.
Retention
Snapshots are published monthly. Monthly snapshots are retained for the trailing 12 months; older snapshots are thinned to quarterly (the 1st of January, April, July, and October), which are kept permanently. For a durable, citable reference, prefer a quarterly snapshot.
The manifest
manifest_<date>.json makes a snapshot verifiable:
{
"schema_version": 1,
"build_started": "2026-08-03T22:18:11.356975+00:00",
"build_ended": "2026-08-03T22:28:48.207622+00:00",
"source_database": "bedbase",
"files": [
{"name": "bedbase_metadata_2026_08_03.parquet",
"file_type": "metadata", "rows": 663242,
"bytes": 52754000, "sha256": "…"}
]
}
rows is the number of rows actually written to each file (not a separately
queried count), and each sha256 matches its file on disk, so you can verify a
download end-to-end.
Querying with DuckDB
Parquet plus open CORS and HTTP range requests means you can query a snapshot directly over HTTPS (no download, no server) from the DuckDB CLI or DuckDB-WASM in a browser.
Try it today with DuckDB, no download or pagination needed:
SELECT *
FROM read_parquet('https://data2.bedbase.org/snapshot/bedbase_metadata_2026_08_03.parquet')
WHERE assay = 'ChIP-seq' AND genome_alias = 'hg38';
DuckDB reads only the byte ranges it needs, so a filtered query does not transfer the whole file.
How it is produced
A monthly databio/bedbase-loader
GitHub Action (export_metadata.yml) runs bedboss snapshot new, which streams
the tables straight from PostgreSQL as unordered sequential scans through
server-side cursors (bed left-joined with bed_metadata), writes
zstd-compressed Parquet, checks row counts against a pre-scan count(*), and
refuses to publish a partial artifact (more than 1% of rows missing, by default).
bbconf then uploads the files and records them in the index. The read runs in a
single REPEATABLE READ transaction, so each snapshot is internally consistent.