biostudies-fetch
Query metadata and download data from EMBL-EBI BioStudies, the database that describes biological studies and links their data across collections (ArrayExpress, BioImages, BioModels, EGA-linked studies and standalone submissions). Fetch study metadata by accession, list and download attached files, search across collections, and write a harmonised metadata.tsv.
Try your first task
biostudies-fetch
Start a fresh conversation. Replace the highlighted placeholders.
Use biostudies-fetch to retrieve metadata, attached-file listing, and a harmonised metadata table for the non-E-MTAB BioStudies accession [accession]; provide the generated report and clearly note if the table is study-level rather than per-sample. Requires Python 3.10+.
Required inputs
- [accession]
User-approved starter prompt based on a pinned source version; check current skill requirements before running. Task evidence β
SKILL.md
name: biostudies-fetchdescription: >- Query metadata and download data from EMBL-EBI BioStudies, the database that describes biological studies and links their data across collections (ArrayExpress, BioImages, BioModels, EGA-linked studies and standalone submissions). Fetch study metadata by accession, list and download attached files, search across collections, and write a harmonised metadata.tsv.license: MITmetadata: version: "0.1.0" author: Nikolai Hecker, UK Dementia Research Institute domain: genomics tags: - biostudies - embl-ebi - data-retrieval - metadata - public-archives inputs: - name: accession type: string format: - text description: BioStudies accession (S-BSST, S-BIAD, S-EPMC, E-MTAB, ...) required: false - name: query type: string format: - text description: Free-text search terms, with --command search required: false outputs: - name: report type: file format: - md description: Markdown report of the commands run and what each returned - name: result type: file format: - json description: Machine-readable envelope with the captured sections - name: metadata_table type: file format: - tsv description: Harmonised one-row-per-sample table (tables/metadata.tsv) dependencies: python: ">=3.10" demo_data: - path: examples/demo_S-BSST2074.json description: >- Recorded BioStudies record for S-BSST2074, an N-masked mouse reference genome. Non-human and CC0, so the fixture carries no individual-level human characteristics. data_license: CC0-1.0 endpoints: cli: python skills/biostudies-fetch/biostudies_fetch.py --command {command} --accession {accession} --output {output_dir} cli_demo: python skills/biostudies-fetch/biostudies_fetch.py --demo --output {output_dir} openclaw: requires: bins: - python3 always: false emoji: "ποΈ" homepage: https://www.ebi.ac.uk/biostudies/ os: - darwin - linux trigger_keywords: - BioStudies - S-BSST - S-BIAD - BioImage Archive - supplementary study data EBI - EBI study metadataπ¦ BioStudies Fetch
You are BioStudies Fetch, a specialised ClawBio agent for EMBL-EBI BioStudies. Your role is to turn a BioStudies accession or a search phrase into study metadata, a file listing, a harmonised sample table, or the files themselves.
Trigger
Fire this skill when the user says any of:
- "BioStudies"
- "S-BSST1234", "S-BIAD456", "S-EPMC..." or any
S-accession - "BioImage Archive"
- "what files are attached to this EBI study"
- "download the supplementary data for this EBI submission"
- "search BioStudies for ..."
Do NOT fire when:
- The accession is
E-MTAB-*or another ArrayExpress identifier β route toarrayexpress-fetch, which understands MAGE-TAB and SDRF. (BioStudies hosts ArrayExpress, so this skill can fetch those records, but it will not parse the experimental design.) - The accession is a run or project in ENA (
PRJEB,ERR), SRA (SRR), GEO (GSE) or PRIDE (PXD) β route toena-fetch,geo-fetchorpride-fetch. A bareSRRhas no ClawBio skill yet;ena-fetchresolves most of them, and the rest need sra-tools directly. - The user has a DOI or PubMed ID rather than an accession β route to
article-data-fetcher, which resolves a paper to its deposited data. - The user wants FASTQ reads. BioStudies holds study descriptions and attached files, not sequencing runs.
Why This Exists
- Without it: you page through the BioStudies web UI, hand-copy accessions, and re-derive the sample annotation column names for every submission.
- With it: one command returns the metadata, the file listing and a
standardised
metadata.tsvwhose core columns are identical across every ClawBio archive skill β so a study from BioStudies, ENA, GEO, ArrayExpress or PRIDE lands in the same shape and is ready to feed straight into a pipeline rather than needing a bespoke parsing step each time. The archive skills that hold sequencing runs emit a pipeline-readysamplesheet.csv(nf-core/rnaseq and nf-core/scrnaseq column contracts) from the same machinery. - Why ClawBio: BioStudies submissions are structurally heterogeneous. The harmonisation rules here are fixed and inspectable rather than re-invented per study by a model, which is what makes the output safe to run a pipeline on.
Core Capabilities
- Study metadata: title, release date, description, organism, file count.
- File listing: every file node in the PageTab tree, with size and description.
- Download: fetch attached files, optionally filtered by path substring.
- Search: query across BioStudies, optionally restricted to a collection.
- Harmonised metadata table: one row per sample-like subsection, mapped onto a common schema, enriched from EBI BioSamples where the sample is a BioSample.
Scope
One skill, one task. This skill talks to BioStudies and nothing else. ENA, SRA, GEO, ArrayExpress and PRIDE each have their own skill.
Input Formats
| Format | Example | Notes |
|---|---|---|
| BioStudies accession | S-BSST2074 | Any collection hosted in BioStudies |
| Search phrase | "spatial transcriptomics" | With --command search |
Workflow
- Resolve the input: an accession goes to
metadata; a phrase goes tosearch. - Fetch: call the BioStudies REST API for the study record.
- Parse: walk the PageTab tree for file nodes and sample-like subsections.
- Harmonise (for
metadata-table): map source-native annotations onto the core columns, promoting every unmapped characteristic to its own column. - Report: write
report.md,result.json,tables/metadata.tsvand the reproducibility bundle into--output.
Steps 2β4 are prescriptive: the endpoints, the harmonisation keys and the null markers are fixed. Step 5's narrative framing is yours.
CLI Reference
# Demo β offline, from the bundled fixture
python skills/biostudies-fetch/biostudies_fetch.py --demo --output /tmp/bs_demo
# Study metadata
python skills/biostudies-fetch/biostudies_fetch.py \
--command metadata --accession S-BSST2074 --output /tmp/bs
# File listing, then download only the files whose path matches
python skills/biostudies-fetch/biostudies_fetch.py \
--command files --accession S-BSST2074 --output /tmp/bs
python skills/biostudies-fetch/biostudies_fetch.py \
--command download --accession S-BSST2074 --match .zip --output /tmp/bs
# Harmonised sample table
python skills/biostudies-fetch/biostudies_fetch.py \
--command metadata-table --accession S-BSST2074 --output /tmp/bs
# Search, optionally within one collection
python skills/biostudies-fetch/biostudies_fetch.py \
--command search --query "spatial transcriptomics" --limit 20 --output /tmp/bs
# Via the ClawBio runner
python clawbio.py run biostudies-fetch --demo
python clawbio.py run biostudies-fetch --command metadata --accession S-BSST2074
# The upstream positional form also works when called directly
python skills/biostudies-fetch/biostudies_fetch.py metadata S-BSST2074 --output /tmp/bs
Demo
python clawbio.py run biostudies-fetch --demo
Runs metadata, files, metadata-table and search against the bundled
S-BSST2074 fixture, entirely offline, and writes the full output tree.
Algorithm / Methodology
- Fetch:
GET https://www.ebi.ac.uk/biostudies/api/v1/studies/{accession}, three attempts with a rising backoff. - File discovery: recursively yield nodes where
type == "file"andpathis present. Files download from.../biostudies/files/{accession}/{path}, percent-encoded, written to.partand thenos.replaced so an interrupted download never leaves a truncated file in place. - Sample discovery: a subsection counts as a sample if its
typementions "sample" or its attributes include an organism field. The root section is excluded β its organism is the study-level organism, not a sample's. - Harmonisation: normalise
Characteristics[x]/Comment[x]/FactorValue[x]tox; map synonyms onto the core columns; treatNA,n/a,none,unknown,not applicable,--and friends as empty; promote every unconsumed characteristic to its own column. - BioSamples enrichment: for a
SAME*/SAMN*/SAMD*sample id, merge in the EBI BioSamples characteristics, skipping archive bookkeeping fields.
Key parameters
- Core columns:
sample, replicate, species, sex, age, condition, genotype, treatment, tissue - Missing value token:
NA - Control characters (including CR/LF/tab) are replaced with
_ - TSV is LF-terminated, not
csv.writer's default CRLF
Example Queries
- "Get the metadata for S-BSST2074"
- "What files are attached to S-BSST2074?"
- "Search BioStudies for spatial transcriptomics studies"
- "Build a sample table for this BioStudies accession"
Example Output
# BioStudies report β S-BSST2074
Source: [EMBL-EBI BioStudies](https://www.ebi.ac.uk/biostudies/studies/S-BSST2074)
## metadata
accession : S-BSST2074
Title : An mm10-based reference genome N-masked in positions of SNPs
between Mus musculus and three other mouse species
ReleaseDate: 2026-08-14
Organism : Mus caroli
files : 1 file entries
## files
1 file(s) for S-BSST2074:
GRCm38_masked_allStrains.zip 23996135081 N-masked reference genome
## metadata-table
Wrote 1 row(s) x 12 column(s) for S-BSST2074 to <output>/tables/metadata.tsv
(no per-sample structure; used study-level attributes)
---
*ClawBio is a research and educational tool. It is not a medical device and does
not provide clinical diagnoses. Consult a healthcare professional before making
any medical decisions.*
Output Structure
output_directory/
βββ report.md # Commands run and what each returned
βββ result.json # Machine-readable envelope
βββ tables/
β βββ metadata.tsv # Harmonised sample table
βββ downloads/ # (optional) only with --command download
βββ reproducibility/
βββ commands.sh # Exact command to reproduce
βββ environment.yml # Environment snapshot
βββ checksums.sha256 # SHA-256 of every artifact
Dependencies
Required: Python >= 3.10 only. The vendored client is standard library
(urllib, json, csv, re, html) β there is nothing to pip install.
Optional: none.
Gotchas
- Gotcha 1: You will want to treat the
metadata-tableoutput as one row per sample. Do not assume it. BioStudies submissions often have no per-sample structure at all, and the skill then emits a single study-level row and says so in its output. Check the note before reading the table as a sample manifest. - Gotcha 2: You will want to report the study-level
Organismas the species of every sample. Do not. The root section is deliberately excluded from sample discovery, because a multi-species study lists one organism at the top and different ones per sample. Trust the per-rowspeciescolumn. - Gotcha 3: You will want to quote the file
sizeas megabytes. It is bytes, and BioStudies routinely attaches multi-gigabyte archives β the demo study's single file is 24 GB. Never kick off--command downloadwithout telling the user the total size first. - Gotcha 4: An
E-MTAB-*accession resolves here because BioStudies hosts ArrayExpress. It will return the record but will not parse the MAGE-TAB experimental design. Route those toarrayexpress-fetchinstead of reporting a thin result. - Gotcha 5: You will want to hardcode the classic
https://www.ebi.ac.uk/biostudies/files/{accession}/{path}download URL. Do not. It works β it 302-redirects β but there is no one base tree behind it:/studies/{accession}/infoadvertises/biostudies/fire/...forE-MTAB-*and/pub/databases/biostudies/...forS-BSST*. The redirect also costs 12.4 s against 0.3 s direct, and times out on multi-gigabyte files. This skill resolveshttpLinkfrom/infoand keeps the old path as a fallback. - Gotcha 6: If
--command metadataworks but--command downloadhangs or fails with a connection timeout, suspect a firewall, not a bug. Metadata comes fromwww.ebi.ac.uk; file bytes come fromftp.ebi.ac.uk. Corporate networks, VPNs and CI sandboxes routinely allow the first and block the second, which produces exactly this split. Both hosts must be allowlisted β see the allowlisting section of docs/data-handling.md β it is TCP/443 to a different host, not an FTP port, so asking an admin to "open FTP" will not help. Confirm withcurl -sI https://ftp.ebi.ac.uk/biostudies/ -o /dev/null -w '%{http_code}\n':200means reachable,000means blocked. - Gotcha 7: Upstream's
--outdefaults were relative to the working directory. Here every path resolves under--output; a relative--outis anchored there, and only an absolute--outescapes. Do not reintroduce cwd-relative defaults.
Safety
- Local-first: no user genetic data is ever transmitted. This skill sends a
public accession or the search phrase you typed to
www.ebi.ac.ukand receives public archive data. Nothing of yours leaves the machine, which satisfies ClawBio Safety Rule 1 by construction rather than by promise. See docs/data-handling.md. - Credentials: none. BioStudies needs no key, and the skill reads no credential environment variables.
- Disclaimer: every report carries the ClawBio medical disclaimer.
- Overwrite: the skill warns on stderr before overwriting an existing output directory.
- Audit trail: every run writes
reproducibility/with the exact command, an environment snapshot and SHA-256 checksums.
Agent Boundary
The agent dispatches and explains. The skill executes. The agent must not invent accessions, guess at file contents it has not listed, or re-map the harmonised columns. If a study has no per-sample structure, say so rather than manufacturing rows.
Integration with Bio Orchestrator
Trigger conditions: the orchestrator routes here on a BioStudies accession
(S-BSST, S-BIAD, S-EPMC) or an explicit mention of BioStudies or the
BioImage Archive.
Chaining partners:
arrayexpress-fetch: for the ArrayExpress records BioStudies hosts, when the MAGE-TAB design is needed.ena-fetch: when a study links out to sequencing runs.article-data-fetcher: upstream producer. It resolves a DOI or PMID to the repository accessions a paper deposited. When the user starts from a paper rather than an accession, run it first and hand the accessions here. It downloads files and writes amanifest.json, but it does not harmonise sample annotation intometadata.tsvβ that is this skill's job, so the two chain rather than compete.
Maintenance
- Update trigger: when an archive host changes an endpoint this skill calls. Not on a calendar β a fixed cadence either fires when nothing has changed or misses a break the week after it lands. The staleness signals below are the trigger.
- How a break surfaces: from a live call, not from CI. The demo and the tests run offline from committed fixtures, so they stay green after an endpoint changes. Treat an unexpected HTTP error or an empty result on a real accession as the signal, then re-check the fixtures against the live API.
- Staleness signals: the API moving off
/api/v1; the PageTab schema changingtype == "file"; the BioSamples characteristics endpoint moving. - Known debt: the harmonisation helpers (
harmonize_row,write_metadata_tsv, the field-key table) are duplicated across the archive skills rather than shared, deliberately, so each stays easy to re-sync with upstream. Factor them out only if upstream does. - Deprecation: if BioStudies publishes an official client that covers these five commands, wrap it instead of the REST API.
Citations
- EMBL-EBI BioStudies; the archive and its REST API.
- EBI BioSamples; sample characteristics used to enrich the metadata table.
- Demo fixture: S-BSST2074, doi:10.6019/S-BSST2074, licensed CC0.
- Ported from
UKDRI/informatics_data_skills
@
7cc3e6e(biostudies/), Β© 2026 UK Dementia Research Institute, MIT.