Skip to content

API ​

The infrastructure of nmrXiv facilitates API access, enabling software developers to interact with the data programmatically. The interactive reference is generated from OpenAPI annotations and is available at Swagger / Scalar.

All public search endpoints are read-only GET requests under /api/v1/search/. No authentication is required for public metadata search.

Search endpoints ​

EndpointMethodPurpose
/api/v1/search/catalogGETFree-text search across project, sample, and spectra names/descriptions
/api/v1/search/metadataGETStructured NMR metadata search over indexed NMRium fields
/api/v1/search/metadata/facetsGETAvailable values for metadata filters (for building UIs)
/api/v1/search/metadata/statsGETAggregate counts and distributions for indexed public spectra
/api/v1/search/compoundsPOSTStructure and compound property search

Search public samples (studies) and spectra (datasets) using denormalized NMRium acquisition metadata. Metadata is extracted from each dataset's NMRium info block into indexed columns on the datasets table.

GET /api/v1/search/metadata ​

Returns paginated studies and datasets that match the supplied criteria. At least one query parameter must be provided.

Query parameters ​

ParameterTypeIndexed fieldDescription
qstringspectra_search_textFree-text keywords (AND semantics across tokens)
solventstringspectra_solventExact solvent match (case-insensitive), e.g. CDCl3
temperaturenumberspectra_temperatureTemperature in kelvin; integer values match ±0.5 K
tube_diameterstringspectra_tube_diameterTube diameter in mm: 3, 5, or 10
nucleusstringspectra_nucleusAcquisition nucleus, e.g. 1H, 13C
proton_frequencynumberspectra_base_frequencyObserved base frequency in MHz (±0.5 MHz)
nmr_methodstringspectra_experimentExperiment / method, e.g. hsqc, 1d
pulse_sequencestringspectra_pulse_sequencePulse sequence name, e.g. zg30
number_of_scansintegerspectra_number_of_scansNumber of scans
manufacturerstringspectra_manufacturerInstrument manufacturer
instrument_modelstringspectra_probe_nameProbe name
per_pageinteger—Results per group (default 12, max 24)
studies_pageinteger—Sample results page (default 1)
datasets_pageinteger—Spectra results page (default 1)

Example ​

bash
curl -G "https://nmrxiv.org/api/v1/search/metadata" \
  --data-urlencode "solvent=CDCl3" \
  --data-urlencode "nucleus=1H" \
  --data-urlencode "proton_frequency=600" \
  --data-urlencode "per_page=12"

Response 200 ​

json
{
  "query": {
    "q": "",
    "tokens": [],
    "solvent": "CDCl3",
    "nucleus": "1H",
    "proton_frequency": 600
  },
  "studies": {
    "data": [],
    "meta": { "total": 1, "current_page": 1, "per_page": 12, "last_page": 1 }
  },
  "datasets": {
    "data": [],
    "meta": { "total": 1, "current_page": 1, "per_page": 12, "last_page": 1 }
  }
}

Error responses ​

StatusWhen
404No matching public studies or datasets
422Validation failed (e.g. no criteria supplied)

GET /api/v1/search/metadata/facets ​

Returns distinct values for each metadata filter that would yield results given the other active criteria. Use this to populate select lists or disable unavailable options in a search UI.

Accepts the same filter parameters as metadata search (except pagination). All parameters are optional; with no filters, facets reflect the full public catalog.

Example ​

bash
curl -G "https://nmrxiv.org/api/v1/search/metadata/facets" \
  --data-urlencode "solvent=CDCl3"

Response 200 ​

json
{
  "facets": {
    "solvent": ["CDCl3", "DMSO"],
    "temperature": ["294"],
    "tube_diameter": [],
    "nucleus": ["1H", "13C"],
    "proton_frequency": ["600"],
    "nmr_method": ["1d", "hsqc"],
    "pulse_sequence": ["zg30"],
    "number_of_scans": ["16"],
    "manufacturer": ["Bruker"],
    "instrument_model": ["BBO"]
  }
}

Facet keys with empty arrays indicate that no public indexed spectra currently carry that metadata.

GET /api/v1/search/metadata/stats ​

Returns aggregate statistics for public datasets with extracted NMRium metadata: totals, 1D/2D dimension breakdown, and count distributions for nucleus, solvent, experiment type, measuring frequency (MHz), manufacturer, temperature, pulse sequence, tube diameter, scans, and probe model.

Unfiltered requests are served from the persisted spectra_metadata_stats_index table (rebuilt daily). Filtered requests are computed live and include "source": "live". Use limit (default 50, max 200) to cap buckets per distribution when reading the index.

Example ​

bash
curl -G "https://nmrxiv.org/api/v1/search/metadata/stats"

Response 200 ​

json
{
  "scope": "public_indexed",
  "source": "index",
  "computed_at": "2026-07-16T00:00:00+00:00",
  "totals": {
    "spectra_indexed": 1200,
    "samples_with_indexed_spectra": 340,
    "public_spectra": 1300,
    "indexed_coverage_percent": 92.3
  },
  "distributions": {
    "dimension": [
      { "value": "1D", "count": 800 },
      { "value": "2D", "count": 400 }
    ],
    "nucleus": [
      { "value": "1H", "count": 700 },
      { "value": "13C", "count": 350 }
    ],
    "solvent": [
      { "value": "CDCl3", "count": 500 }
    ],
    "experiment": [
      { "value": "proton", "count": 400 }
    ],
    "measuring_frequency_mhz": [
      { "value": "600", "count": 650 }
    ]
  },
  "missing": {
    "dimension": 12,
    "nucleus": 3
  }
}

For terminal inspection, operators can also run:

bash
php artisan nmrxiv:index-spectra-metadata-stats
php artisan nmrxiv:spectra-metadata-stats
php artisan nmrxiv:spectra-metadata-stats --json

The index is rebuilt automatically every day via the scheduler. After deployment or bulk metadata extraction, run nmrxiv:index-spectra-metadata-stats once to populate it immediately.

GET /api/v1/search/catalog ​

Free-text search across published project, sample, and spectra names and descriptions. Requires q.

bash
curl -G "https://nmrxiv.org/api/v1/search/catalog" \
  --data-urlencode "q=caffeine"

Indexing note for operators ​

Metadata search relies on denormalized columns populated from NMRium. After deployment or bulk imports, run:

bash
php artisan migrate
php artisan nmrxiv:extract-dataset-spectra-info
php artisan nmrxiv:index-spectra-metadata-stats

Re-run with --force to refresh all datasets after extractor changes.

OpenAPI ​

Machine-readable specifications are generated with php artisan l5-swagger:generate and served at /api/documentation. Metadata operations are tagged Search with operation IDs searchMetadata, searchMetadataFacets, and searchMetadataStats.