metabolomicshub-cross-repository-dataset-search
Find public metabolomics studies across repositories that do not share a search
interface, and know which studies your filters threw away for want of metadata
rather than for want of a match.
When this applies
A reanalysis, a benchmark or a meta-analysis needs studies matching some
combination of organism, instrument, polarity and file format. Those studies sit
in MetaboLights (EBI), Metabolomics Workbench (NIH) and GNPS/MassIVE, each with
its own accession scheme, metadata vocabulary and API. MetabolomicsHub indexes
all three behind one query.
The index is not uniform, and that is the thing this skill exists to handle. Each
repository populates a different subset of the searchable fields, so a filter can
exclude an entire repository for having no value in a field rather than the wrong
value. The result still looks like a search result.
The service
Base URL https://www.metabolomicshub.org/api/submission/v0_1. The bare
/api/ path is not a route. The endpoints below need no credentials; the
submission and identifier endpoints on the same base do.
| endpoint |
method |
use |
/search/fields |
GET |
the searchable field list and, per field, the operators it accepts |
/search/datasets |
POST |
keyword search |
/search/advanced/datasets |
POST |
clause-based search, returns facets |
/search/advanced/datasets/example |
GET |
a worked request body for every clause kind |
/search/advanced/datasets/export |
POST |
the result set as a file |
/server-info |
GET |
index version and the schema profiles in force |
Procedure
State the selection criteria before searching. Organism, sample matrix,
instrument or instrument family, polarity, and the file formats the downstream
pipeline can read. They are the inclusion criteria of whatever you are
building; deciding them after seeing the hits is how a convenience sample
becomes a claim.
Read /search/fields rather than guessing field names. It returns each
field's target (DATASET or METABOLITE), value type and permitted
operators. The list is versioned with the index and is the only authority on
what is filterable today.
Express the query as clauses. POST /search/advanced/datasets takes
{version, query_text, inter_field_combiner, clauses, where, page, sort},
with page shaped {current, size}. The clause kinds are terms,
compare, parameter_pair, characteristic_pair and descriptor.
Polarity is not a top-level field: it arrives as a parameter_pair with
type_name: "scan polarity". GET /search/advanced/datasets/example
returns a body exercising each kind, which is quicker to adapt than the
schema.
Filter on open raw formats after the query, not inside it. No field
indexes file format, so no clause can express it. Each returned study instead
carries a files block with extensions — a list of {extension, count}
pairs — and you filter on that client-side. A study whose raw data is
vendor-only cannot be reprocessed without the vendor's converter, and on some
platforms not at all; prefer .mzml and treat vendor-only as a study-level
exclusion unless conversion has been verified.
Measure what each filter excluded before trusting it. Re-run the query
with the filter removed, facet both runs by dataset_repository, and compare
per repository. A filter that takes one repository to zero has selected on
metadata availability, not on science. Record the comparison; it is part of
the cohort's description.
Record the accession, the repository and the MetabolomicsHub id for every
retained study, not just the count. A dataset list without accessions
cannot be re-run by anyone else.
Field coverage is repository-dependent
Facet totals for the whole index, observed 2026-08-21 against index v0.0.1
(6,796 datasets). Re-measure before relying on them; the index is growing.
| repository |
datasets |
MS instrument |
chromatography |
parameters |
omics type |
| Metabolomics Workbench |
3,703 |
populated |
populated |
populated |
none |
| MetaboLights |
2,593 |
populated |
populated |
populated |
populated |
| GNPS/MassIVE |
500 |
none |
none |
none |
none |
Two consequences worth stating plainly, because both are silent:
- Any instrument or polarity filter drops all 500 GNPS/MassIVE studies, which
carry no structured instrument or parameter metadata in this index.
facet_omics_types is populated only by MetaboLights: filtering
facet_omics_types = Metabolomics returned 2,331 studies, and adding
dataset_repository = metabolights returned the same 2,331. The filter is a
repository filter wearing an omics label.
Every dataset in the index is currently legacy profile, so the fields the MS
profile adds — dataset_mhd_identifier, sample_runs_count, subjects_count —
are not yet usable as filters.
Metabolite-level search
Four fields target METABOLITE rather than DATASET: metabolite_name,
metabolite_accession, metabolite_identifier_accession and
metabolite_identifier_source. They answer "which public studies report this
compound", which is a different question from "which studies used this
instrument" and is not reachable from the repositories' own search interfaces.
The same coverage caveat applies: a study that reported no metabolite table is
absent from the answer.
Verification
- Every retained study resolves at its home repository by accession.
- The instrument and polarity recorded by the hub agree with the study's own
record; where they disagree, the repository is authoritative.
- The extensions counted in
files.extensions are actually present in the
study's file listing.
- Each filter's per-repository exclusion has been measured, not assumed.
Limitations
- Coverage is bounded by what the participating repositories have submitted, so
a negative result is not evidence of absence.
- The common model normalises heterogeneous metadata, and normalisation loses
detail. For anything the analysis depends on, read the study's own record.
- Instrument strings originate as free text in the source repositories. The
facet groups them, but two spellings of one instrument can remain two buckets.
- The index version is reported by
/server-info and the field list moves with
it. Pin both in the methods section of anything you publish from this.
1---2name: metabolomicshub-cross-repository-dataset-search3description: Use when assembling a reanalysis or meta-analysis cohort from public metabolomics studies held in MetaboLights, Metabolomics Workbench and GNPS/MassIVE, and the instrument, polarity or open-format filters have to be honest about which repositories they silently exclude.4license: CC-BY-4.05---67# metabolomicshub-cross-repository-dataset-search89Find public metabolomics studies across repositories that do not share a search10interface, and know which studies your filters threw away for want of metadata11rather than for want of a match.1213## When this applies1415A reanalysis, a benchmark or a meta-analysis needs studies matching some16combination of organism, instrument, polarity and file format. Those studies sit17in MetaboLights (EBI), Metabolomics Workbench (NIH) and GNPS/MassIVE, each with18its own accession scheme, metadata vocabulary and API. MetabolomicsHub indexes19all three behind one query.2021The index is not uniform, and that is the thing this skill exists to handle. Each22repository populates a different subset of the searchable fields, so a filter can23exclude an entire repository for having no value in a field rather than the wrong24value. The result still looks like a search result.2526## The service2728Base URL `https://www.metabolomicshub.org/api/submission/v0_1`. The bare29`/api/` path is not a route. The endpoints below need no credentials; the30submission and identifier endpoints on the same base do.3132| endpoint | method | use |33| --- | --- | --- |34| `/search/fields` | GET | the searchable field list and, per field, the operators it accepts |35| `/search/datasets` | POST | keyword search |36| `/search/advanced/datasets` | POST | clause-based search, returns facets |37| `/search/advanced/datasets/example` | GET | a worked request body for every clause kind |38| `/search/advanced/datasets/export` | POST | the result set as a file |39| `/server-info` | GET | index version and the schema profiles in force |4041## Procedure42431. **State the selection criteria before searching.** Organism, sample matrix,44 instrument or instrument family, polarity, and the file formats the downstream45 pipeline can read. They are the inclusion criteria of whatever you are46 building; deciding them after seeing the hits is how a convenience sample47 becomes a claim.48492. **Read `/search/fields` rather than guessing field names.** It returns each50 field's target (`DATASET` or `METABOLITE`), value type and permitted51 operators. The list is versioned with the index and is the only authority on52 what is filterable today.53543. **Express the query as clauses.** `POST /search/advanced/datasets` takes55 `{version, query_text, inter_field_combiner, clauses, where, page, sort}`,56 with `page` shaped `{current, size}`. The clause kinds are `terms`,57 `compare`, `parameter_pair`, `characteristic_pair` and `descriptor`.58 Polarity is not a top-level field: it arrives as a `parameter_pair` with59 `type_name: "scan polarity"`. `GET /search/advanced/datasets/example`60 returns a body exercising each kind, which is quicker to adapt than the61 schema.62634. **Filter on open raw formats after the query, not inside it.** No field64 indexes file format, so no clause can express it. Each returned study instead65 carries a `files` block with `extensions` — a list of `{extension, count}`66 pairs — and you filter on that client-side. A study whose raw data is67 vendor-only cannot be reprocessed without the vendor's converter, and on some68 platforms not at all; prefer `.mzml` and treat vendor-only as a study-level69 exclusion unless conversion has been verified.70715. **Measure what each filter excluded before trusting it.** Re-run the query72 with the filter removed, facet both runs by `dataset_repository`, and compare73 per repository. A filter that takes one repository to zero has selected on74 metadata availability, not on science. Record the comparison; it is part of75 the cohort's description.76776. **Record the accession, the repository and the MetabolomicsHub id for every78 retained study**, not just the count. A dataset list without accessions79 cannot be re-run by anyone else.8081## Field coverage is repository-dependent8283Facet totals for the whole index, observed 2026-08-21 against index v0.0.184(6,796 datasets). Re-measure before relying on them; the index is growing.8586| repository | datasets | MS instrument | chromatography | parameters | omics type |87| --- | --- | --- | --- | --- | --- |88| Metabolomics Workbench | 3,703 | populated | populated | populated | **none** |89| MetaboLights | 2,593 | populated | populated | populated | populated |90| GNPS/MassIVE | 500 | **none** | **none** | **none** | **none** |9192Two consequences worth stating plainly, because both are silent:9394- Any instrument or polarity filter drops all 500 GNPS/MassIVE studies, which95 carry no structured instrument or parameter metadata in this index.96- `facet_omics_types` is populated only by MetaboLights: filtering97 `facet_omics_types = Metabolomics` returned 2,331 studies, and adding98 `dataset_repository = metabolights` returned the same 2,331. The filter is a99 repository filter wearing an omics label.100101Every dataset in the index is currently `legacy` profile, so the fields the MS102profile adds — `dataset_mhd_identifier`, `sample_runs_count`, `subjects_count` —103are not yet usable as filters.104105## Metabolite-level search106107Four fields target `METABOLITE` rather than `DATASET`: `metabolite_name`,108`metabolite_accession`, `metabolite_identifier_accession` and109`metabolite_identifier_source`. They answer "which public studies report this110compound", which is a different question from "which studies used this111instrument" and is not reachable from the repositories' own search interfaces.112The same coverage caveat applies: a study that reported no metabolite table is113absent from the answer.114115## Verification116117- Every retained study resolves at its home repository by accession.118- The instrument and polarity recorded by the hub agree with the study's own119 record; where they disagree, the repository is authoritative.120- The extensions counted in `files.extensions` are actually present in the121 study's file listing.122- Each filter's per-repository exclusion has been measured, not assumed.123124## Limitations125126- Coverage is bounded by what the participating repositories have submitted, so127 a negative result is not evidence of absence.128- The common model normalises heterogeneous metadata, and normalisation loses129 detail. For anything the analysis depends on, read the study's own record.130- Instrument strings originate as free text in the source repositories. The131 facet groups them, but two spellings of one instrument can remain two buckets.132- The index version is reported by `/server-info` and the field list moves with133 it. Pin both in the methods section of anything you publish from this.