Clients for seqout.org, which aggregates study metadata from GEO, SRA, ENA, DDBJ, ArrayExpress, GEA and GSA.
Seqout searches every database, resolves an accession to its records in every archive, accesses harmonised sample metadata, and reads GEO supplementary files as counts matrices.
The CLI searches metadata and downloads data files.
Install using uv:
uv tool install "seqout @ git+https://github.com/saketlab/seqout.git#subdirectory=python"or using pip:
pip install "git+https://github.com/saketlab/seqout.git#subdirectory=python"seqout search "liver cancer scRNA" --organism "Homo sapiens"
seqout show GSE151530
seqout download GSE151530Learn more about the CLI here: https://seqout.org/cli/python/cli
Install using uv:
uv add "seqout @ git+https://github.com/saketlab/seqout.git#subdirectory=python"or using pip:
pip install "git+https://github.com/saketlab/seqout.git#subdirectory=python"and use in your scripts:
from seqout import connect
sq = connect()
sq.seqout_search("liver cancer scRNA", organism="Homo sapiens")
sq.seqout_get("GSE151530").samplesLearn more here: seqout.org/cli/python
Install using pak:
pak::pak("saketlab/seqout/R")or via r-universe
library(seqout)
dataset <- SeqoutGet("GSE151530")
samples <- dataset$samples
results <- SeqoutSearch("liver cancer scRNA", organism = "Homo sapiens")
# Opt in to Parquet for SQL over the whole database
con <- SeqoutConnect("parquet")
Query("SELECT count(*) FROM unified_metadata WHERE n_samples >= 10", con = con)Learn more here: seqout.org/cli/R
The Python and R clients fetch counts, cell-level metadata, and sample-level metadata from one accession.
Supplementary files are grouped into units that read as one matrix: a 10x triplet,
a CellRanger .h5, an .h5ad, an .rds or a table. The manifest resolves them
without downloading anything, and the donor covariates come from the same
accession.
from seqout import SeqoutListCounts
counts = SeqoutListCounts("GSE297547")
counts.manifest() # units found, nothing downloaded yet
m = counts.matrix(sample="GSM8994520") # genes x cells, obs carries the donor
adata = counts.anndata() # every sample, concatenated
counts.design # sample-level covariatescounts <- SeqoutListCounts("GSE297547")
SeqoutUnits(counts) # units found, nothing downloaded yet
obj <- Seqout2Seurat(counts, sample = "GSM8994520") # Seurat object, obs as meta.data
CountsSamples(counts, min_cell_count = 1000)Found a bug or have a feature request? Please use GitHub Issues.
If Seqout helped your research, cite:
@misc{seqout,
author = {Mukherjee, Aniruddha and Reddy, Mukesh and Choudhary, Saket},
title = {Seqout: metadata harmonisation for genomics dataset discovery},
year = {2026},
url = {https://seqout.org},
}