Clients for seqout.org, which aggregates study metadata from GEO, SRA, ENA, DDBJ, ArrayExpress, GEA and GSA.
Seqout client can be used search across all the databases, resolve an accession to its records in every archive, access harmonised sample metadata and read GEO supplementary files as counts matrices.
Seqout can be used as a standalone CLI tool.
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"The CLI can be used for searching, inspecting metadata and downloading associated files.
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
Seqout library (both python and R) can be used to directly fetch counts, cell-level and sample-level metadata at once, i.e., you do not need to leave your programming environment.
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 SeqoutCounts
counts = SeqoutCounts("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 <- SeqoutCounts("GSE297547")
SeqoutUnits(counts) # units found, nothing downloaded yet
m <- SeqoutMatrix(counts, sample = "GSM8994520")
obj <- Seqout2Seurat(m) # 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 you have found Seqout helpful for your research, please cite us with the following:
@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},
}