{
  "openapi": "3.1.0",
  "info": {
    "title": "NASA OSDR Biological Data API",
    "version": "2.0.0",
    "description": "Machine-readable interface for discovering biological metadata fields and values, then querying or counting datasets, assays, and samples with exact metadata filters. The semantic search endpoints help clients find candidate field names and field values, but query and count endpoints require clients to choose the actual filter terms."
  },
  "servers": [
    {
      "url": "https://visualization.osdr.nasa.gov/biodata/api"
    }
  ],
  "tags": [
    {
      "name": "dataset",
      "description": "Dataset-level entries."
    },
    {
      "name": "query",
      "description": "CSV tables of datasets, assays, or samples matching metadata filters."
    }
  ],
  "paths": {
    "/v2/datasets/": {
      "get": {
        "operationId": "listDatasets",
        "summary": "List datasets",
        "description": "Enumerates all datasets in the database in JSON format, with their accession numbers and each dataset's own REST URL",
        "tags": [
          "dataset"
        ],
        "x-request-examples": [
          {
            "summary": "List all datasets",
            "requestUrl": "/v2/datasets/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetListResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/": {
      "get": {
        "operationId": "showDataset",
        "summary": "Returns dataset metadata in JSON format, as well as REST URLs of assays and files associated with the dataset",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "Get metadata for dataset OSD-48",
            "requestUrl": "/v2/dataset/OSD-48/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetMetadataResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/files/": {
      "get": {
        "operationId": "listDatasetFiles",
        "summary": "List files for a dataset",
        "description": "Lists files under one dataset in JSON format. The response exposes the full nesting path: accession ID, then files, then file name. Each file entry includes a REST_URL for file metadata and a URL for direct file download.",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "List files for dataset OSD-48",
            "requestUrl": "/v2/dataset/OSD-48/files/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetFileListResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/file/{fileName}/": {
      "get": {
        "operationId": "showDatasetFile",
        "summary": "Get file metadata",
        "description": "Returns metadata and URLs for one file under one dataset in JSON format. The response exposes the full nesting path: accession ID, then files, then file name.",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          },
          {
            "$ref": "#/components/parameters/FileNamePathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "Get metadata for one OSD-48 file",
            "requestUrl": "/v2/dataset/OSD-48/file/GLDS-48_rna-seq_N-GC-31.tar.gz/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetFileMetadataResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/assays/": {
      "get": {
        "operationId": "listDatasetAssays",
        "summary": "List assays for a dataset",
        "description": "Lists assays under one dataset in JSON format. The response exposes the full nesting path: accession ID, then assays, then assay name. Each assay entry includes a REST_URL for assay metadata.",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "List assays for dataset OSD-48",
            "requestUrl": "/v2/dataset/OSD-48/assays/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetAssayListResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/assay/{assayName}/": {
      "get": {
        "operationId": "showDatasetAssay",
        "summary": "Get assay metadata",
        "description": "Returns metadata and related REST URLs for one assay under one dataset in JSON format. The response exposes the full nesting path: accession ID, then assays, then assay name.",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          },
          {
            "$ref": "#/components/parameters/AssayNamePathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "Get metadata for one OSD-48 assay",
            "requestUrl": "/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetAssayMetadataResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/assay/{assayName}/samples/": {
      "get": {
        "operationId": "listDatasetAssaySamples",
        "summary": "List samples for an assay",
        "description": "Lists samples under one assay under one dataset in JSON format. The response exposes the full nesting path: accession ID, then assays, then assay name, then samples, then sample name. Each sample entry includes a REST_URL for sample metadata.",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          },
          {
            "$ref": "#/components/parameters/AssayNamePathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "List samples for one OSD-48 assay",
            "requestUrl": "/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/samples/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetAssaySampleListResponse"
          }
        }
      }
    },
    "/v2/dataset/{accessionId}/assay/{assayName}/sample/{sampleName}/": {
      "get": {
        "operationId": "showDatasetAssaySample",
        "summary": "Get sample metadata",
        "description": "Returns metadata and related REST URLs for one sample under one assay under one dataset in JSON format. The response exposes the full nesting path: accession ID, then assays, then assay name, then samples, then sample name.",
        "tags": [
          "dataset"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AccessionIdPathParam"
          },
          {
            "$ref": "#/components/parameters/AssayNamePathParam"
          },
          {
            "$ref": "#/components/parameters/SampleNamePathParam"
          }
        ],
        "x-request-examples": [
          {
            "summary": "Get metadata for one OSD-48 assay sample",
            "requestUrl": "/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/sample/Mmus_C57-6J_LVR_FLT_C_Rep1_M25/"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetAssaySampleMetadataResponse"
          }
        }
      }
    },
    "/v2/query/datasets/": {
      "get": {
        "operationId": "queryDatasets",
        "summary": "Query datasets",
        "description": "Returns a tabular result set of datasets matching optional metadata filters. The default output format is csv; use the reserved format query parameter to request tsv, json.records, json.table, or json.split. To filter, add query parameters whose names are canonical metadata field paths, for example study.characteristics.organism=Mus%20musculus. Use a pipe character for OR within one field value, for example in-flight|pre-flight. A parameter present without a value adds that field as an output column without filtering. The output always includes id.accession. Any metadata field supplied in the request is also included as a column, whether it is supplied with a filter value or as a bare field selector.",
        "tags": [
          "query"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FormatQueryParam"
          }
        ],
        "x-arbitrary-query-parameters": {
          "description": "This endpoint accepts any number of dynamic metadata query parameters in addition to the reserved format parameter. Each dynamic parameter name is a canonical metadata field path returned by /v2/metadata/fields/. If the parameter has a value, it constrains the result set. If the parameter is present without a value, it adds that field as an output column without constraining the result set. Multiple valued parameters are combined as filters. A pipe character in one value expresses OR within that field, for example in-flight|pre-flight.",
          "nameSource": "/v2/metadata/fields/",
          "urlEncoding": "URL-encode field names and values. For example, 'study.factor value.tissue' becomes study.factor%20value.tissue.",
          "examples": [
            {
              "summary": "List all datasets",
              "requestUrl": "/v2/query/datasets/",
              "meaning": "Return all dataset IDs because no filters or extra output fields are requested."
            },
            {
              "summary": "Filter by one metadata value",
              "requestUrl": "/v2/query/datasets/?study.factor%20value.spaceflight=in-flight",
              "meaning": "Return datasets where study.factor value.spaceflight is in-flight."
            },
            {
              "summary": "Filter with OR plus another field",
              "requestUrl": "/v2/query/datasets/?study.factor%20value.spaceflight=in-flight|pre-flight&study.characteristics.organism=rattus%20norvegicus",
              "meaning": "Return datasets where spaceflight is in-flight OR pre-flight and organism is rattus norvegicus."
            },
            {
              "summary": "Add a column without filtering",
              "requestUrl": "/v2/query/datasets/?study.factor%20value.spaceflight",
              "meaning": "Return all datasets and include the study.factor value.spaceflight column."
            },
            {
              "summary": "Return JSON records",
              "requestUrl": "/v2/query/datasets/?study.characteristics.organism&format=json.records",
              "meaning": "Return datasets with organism values as an array of JSON row objects."
            }
          ]
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/DatasetQueryResponse"
          }
        }
      }
    },
    "/v2/query/assays/": {
      "get": {
        "operationId": "queryAssays",
        "summary": "Query assays",
        "description": "Returns a tabular result set of assays matching optional metadata filters. The default output format is csv; use the reserved format query parameter to request tsv, json.records, json.table, or json.split. To filter, add query parameters whose names are canonical metadata field paths, for example study.characteristics.organism=Mus%20musculus. Use a pipe character for OR within one field value, for example in-flight|pre-flight. A parameter present without a value adds that field as an output column without filtering. The output always includes id.accession and id.assay name. Any metadata field supplied in the request is also included as a column, whether it is supplied with a filter value or as a bare field selector.",
        "tags": [
          "query"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FormatQueryParam"
          }
        ],
        "x-arbitrary-query-parameters": {
          "description": "This endpoint accepts any number of dynamic metadata query parameters in addition to the reserved format parameter. Each dynamic parameter name is a canonical metadata field path returned by /v2/metadata/fields/. If the parameter has a value, it constrains the result set. If the parameter is present without a value, it adds that field as an output column without constraining the result set. Multiple valued parameters are combined as filters. A pipe character in one value expresses OR within that field, for example in-flight|pre-flight.",
          "nameSource": "/v2/metadata/fields/",
          "urlEncoding": "URL-encode field names and values. For example, 'study.factor value.tissue' becomes study.factor%20value.tissue.",
          "examples": [
            {
              "summary": "Filter by one metadata value",
              "requestUrl": "/v2/query/assays/?study.factor%20value.spaceflight=in-flight",
              "meaning": "Return assays where study.factor value.spaceflight is in-flight."
            },
            {
              "summary": "Filter by organism and add a column",
              "requestUrl": "/v2/query/assays/?study.characteristics.organism=rattus%20norvegicus&study.factor%20value.spaceflight",
              "meaning": "Return assays where organism is rattus norvegicus and include the study.factor value.spaceflight column."
            },
            {
              "summary": "Return TSV",
              "requestUrl": "/v2/query/assays/?study.factor%20value.spaceflight=in-flight&format=tsv",
              "meaning": "Return matching assays as a tab-separated table."
            }
          ]
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/AssayQueryResponse"
          }
        }
      }
    },
    "/v2/query/samples/": {
      "get": {
        "operationId": "querySamples",
        "summary": "Query samples",
        "description": "Returns a tabular result set of samples matching optional metadata filters. The default output format is csv; use the reserved format query parameter to request tsv, json.records, json.table, or json.split. To filter, add query parameters whose names are canonical metadata field paths, for example study.characteristics.organism=Mus%20musculus. Use a pipe character for OR within one field value, for example liver|hepatic. A parameter present without a value adds that field as an output column without filtering. The output always includes id.accession, id.assay name, and id.sample name. Any metadata field supplied in the request is also included as a column, whether it is supplied with a filter value or as a bare field selector.",
        "tags": [
          "query"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FormatQueryParam"
          }
        ],
        "x-arbitrary-query-parameters": {
          "description": "This endpoint accepts any number of dynamic metadata query parameters in addition to the reserved format parameter. Each dynamic parameter name is a canonical metadata field path returned by /v2/metadata/fields/. If the parameter has a value, it constrains the result set. If the parameter is present without a value, it adds that field as an output column without constraining the result set. Multiple valued parameters are combined as filters. A pipe character in one value expresses OR within that field, for example in-flight|pre-flight.",
          "nameSource": "/v2/metadata/fields/",
          "urlEncoding": "URL-encode field names and values. For example, 'study.factor value.tissue' becomes study.factor%20value.tissue.",
          "examples": [
            {
              "summary": "Filter by spaceflight",
              "requestUrl": "/v2/query/samples/?study.factor%20value.spaceflight=in-flight",
              "meaning": "Return samples where study.factor value.spaceflight is in-flight."
            },
            {
              "summary": "Filter mouse liver samples",
              "requestUrl": "/v2/query/samples/?study.factor%20value.tissue=liver&study.characteristics.organism=Mus%20musculus",
              "meaning": "Return samples where tissue is liver and organism is Mus musculus."
            },
            {
              "summary": "List organisms with liver data",
              "requestUrl": "/v2/query/samples/?study.factor%20value.tissue=liver&study.characteristics.organism",
              "meaning": "Return liver samples and include organism values so the client can deduplicate the organism column."
            },
            {
              "summary": "Return JSON records",
              "requestUrl": "/v2/query/samples/?study.factor%20value.tissue=liver&study.characteristics.organism=Mus%20musculus&format=json.records",
              "meaning": "Return mouse liver samples as an array of JSON row objects."
            }
          ]
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/SampleQueryResponse"
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "AccessionIdPathParam": {
        "name": "accessionId",
        "in": "path",
        "required": true,
        "description": "Accession ID of a dataset.",
        "schema": {
          "type": "string",
          "examples": [
            "OSD-1",
            "OSD-48"
          ]
        }
      },
      "FileNamePathParam": {
        "name": "fileName",
        "in": "path",
        "required": true,
        "description": "Name of a file under a dataset. URL-encode reserved characters if needed.",
        "schema": {
          "type": "string",
          "examples": [
            "GLDS-48_rna-seq_N-GC-31.tar.gz"
          ]
        }
      },
      "AssayNamePathParam": {
        "name": "assayName",
        "in": "path",
        "required": true,
        "description": "Name of an assay under a dataset. URL-encode reserved characters if needed.",
        "schema": {
          "type": "string",
          "examples": [
            "OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina"
          ]
        }
      },
      "SampleNamePathParam": {
        "name": "sampleName",
        "in": "path",
        "required": true,
        "description": "Name of a sample under an assay. URL-encode reserved characters if needed.",
        "schema": {
          "type": "string",
          "examples": [
            "Mmus_C57-6J_LVR_FLT_C_Rep1_M25"
          ]
        }
      },
      "FormatQueryParam": {
        "name": "format",
        "in": "query",
        "required": false,
        "description": "Output serialization for tabular query endpoints. Omit this parameter for the default csv output. Use json.records for LLM-friendly row objects, json.table when a schema block is useful, and json.split when compact JSON is preferred. The generic value json is not supported; choose one of the specific JSON formats.",
        "schema": {
          "type": "string",
          "default": "csv",
          "enum": [
            "csv",
            "tsv",
            "json.records",
            "json.table",
            "json.split"
          ]
        },
        "examples": {
          "csv": {
            "summary": "Comma-separated text table",
            "value": "csv"
          },
          "tsv": {
            "summary": "Tab-separated text table",
            "value": "tsv"
          },
          "jsonRecords": {
            "summary": "Array of row objects",
            "value": "json.records"
          },
          "jsonTable": {
            "summary": "Object with schema and row objects",
            "value": "json.table"
          },
          "jsonSplit": {
            "summary": "Object with columns and row arrays",
            "value": "json.split"
          }
        }
      }
    },
    "responses": {
      "DatasetListResponse": {
        "description": "An enumeration of datasets.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetListResponse"
            }
          }
        }
      },
      "DatasetMetadataResponse": {
        "description": "Metadata for one dataset.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetMetadataResponse"
            }
          }
        }
      },
      "DatasetFileListResponse": {
        "description": "Files for one dataset, nested under accession ID and files.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetFileListResponse"
            }
          }
        }
      },
      "DatasetFileMetadataResponse": {
        "description": "Metadata for one dataset file, nested under accession ID, files, and file name.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetFileMetadataResponse"
            }
          }
        }
      },
      "DatasetAssayListResponse": {
        "description": "Assays for one dataset, nested under accession ID and assays.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetAssayListResponse"
            }
          }
        }
      },
      "DatasetAssayMetadataResponse": {
        "description": "Metadata for one dataset assay, nested under accession ID, assays, and assay name.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetAssayMetadataResponse"
            }
          }
        }
      },
      "DatasetAssaySampleListResponse": {
        "description": "Samples for one dataset assay, nested under accession ID, assays, assay name, and samples.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetAssaySampleListResponse"
            }
          }
        }
      },
      "DatasetAssaySampleMetadataResponse": {
        "description": "Metadata for one dataset assay sample, nested under accession ID, assays, assay name, samples, and sample name.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DatasetAssaySampleMetadataResponse"
            }
          }
        }
      },
      "DatasetQueryResponse": {
        "description": "Tabular dataset query results. The first column is id.accession; additional columns are metadata fields supplied in the request. The response shape is selected with the format query parameter.",
        "content": {
          "text/csv": {
            "schema": {
              "$ref": "#/components/schemas/CsvTable"
            },
            "examples": {
              "spaceflightFilter": {
                "value": "id.accession,study.factor value.spaceflight\n\"OSD-174\",\"in-flight\"\n\"OSD-483\",\"In-flight\"\n\"OSD-530\",\"in-flight\"\n\"OSD-572\",\"in-flight\"\n\"OSD-573\",\"in-flight\"\n\"OSD-968\",\"in-flight\"\n"
              },
              "allDatasets": {
                "value": "id.accession\n\"OSD-1\"\n\"OSD-2\"\n\"OSD-3\"\n\"OSD-7\"\n"
              }
            }
          },
          "text/tab-separated-values": {
            "schema": {
              "$ref": "#/components/schemas/TsvTable"
            }
          },
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/QueryJsonResponse"
            }
          }
        }
      },
      "AssayQueryResponse": {
        "description": "Tabular assay query results. The first columns are id.accession and id.assay name; additional columns are metadata fields supplied in the request. The response shape is selected with the format query parameter.",
        "content": {
          "text/csv": {
            "schema": {
              "$ref": "#/components/schemas/CsvTable"
            },
            "examples": {
              "spaceflightFilter": {
                "value": "id.accession,id.assay name,study.factor value.spaceflight\n\"OSD-174\",\"OSD-174_transcription-profiling_dna-microarray_Agilent\",\"in-flight\"\n\"OSD-483\",\"GLDS-483_transcription-profiling_rna-sequencing-(rna-seq)_illumina\",\"In-flight\"\n\"OSD-530\",\"OSD-530_transcription-profiling_rna-sequencing-(rna-seq)_illumina\",\"in-flight\"\n"
              }
            }
          },
          "text/tab-separated-values": {
            "schema": {
              "$ref": "#/components/schemas/TsvTable"
            }
          },
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/QueryJsonResponse"
            }
          }
        }
      },
      "SampleQueryResponse": {
        "description": "Tabular sample query results. The first columns are id.accession, id.assay name, and id.sample name; additional columns are metadata fields supplied in the request. The response shape is selected with the format query parameter.",
        "content": {
          "text/csv": {
            "schema": {
              "$ref": "#/components/schemas/CsvTable"
            },
            "examples": {
              "spaceflightFilter": {
                "value": "id.accession,id.assay name,id.sample name,study.factor value.spaceflight\n\"OSD-174\",\"OSD-174_transcription-profiling_dna-microarray_Agilent\",\"Humanhair_inflight_10p_3\",\"in-flight\"\n\"OSD-174\",\"OSD-174_transcription-profiling_dna-microarray_Agilent\",\"Humanhair_inflight_10p_4\",\"in-flight\"\n\"OSD-483\",\"GLDS-483_transcription-profiling_rna-sequencing-(rna-seq)_illumina\",\"GSM5792298\",\"In-flight\"\n"
              }
            }
          },
          "text/tab-separated-values": {
            "schema": {
              "$ref": "#/components/schemas/TsvTable"
            }
          },
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/QueryJsonResponse"
            }
          }
        }
      }
    },
    "schemas": {
      "DatasetListResponse": {
        "type": "object",
        "description": "Dataset listing keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetListEntry"
          }
        },
        "examples": [
          {
            "OSD-1": {
              "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-1/"
            },
            "OSD-2": {
              "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-2/"
            }
          }
        ]
      },
      "DatasetListEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri",
            "description": "REST URL for this dataset's metadata."
          }
        },
        "required": [
          "REST_URL"
        ]
      },
      "DatasetMetadataResponse": {
        "type": "object",
        "description": "Dataset metadata response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetMetadataEntry"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/",
              "assays": {
                "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assays/"
              },
              "files": {
                "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/files/"
              },
              "metadata": {
                "accession": "OSD-48",
                "organism": "Mus musculus",
                "study public release date": 1450137600
              }
            }
          }
        ]
      },
      "DatasetMetadataEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri",
            "description": "REST URL for the given dataset's metadata."
          },
          "assays": {
            "$ref": "#/components/schemas/RestUrlObject",
            "description": "REST URL for the list of this dataset's assays."
          },
          "files": {
            "$ref": "#/components/schemas/RestUrlObject",
            "description": "REST URL for the list of files associated with this dataset."
          },
          "metadata": {
            "$ref": "#/components/schemas/MetadataMap",
            "description": "Dataset metadata keyed by arbitrary metadata labels. Keys and value shapes vary across datasets."
          }
        },
        "required": [
          "REST_URL",
          "assays",
          "files",
          "metadata"
        ]
      },
      "RestUrlObject": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "REST_URL"
        ]
      },
      "DatasetFileListResponse": {
        "type": "object",
        "description": "File listing response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetFileListEntry"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "files": {
                "GLDS-48_rna-seq_N-GC-31.tar.gz": {
                  "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/file/GLDS-48_rna-seq_N-GC-31.tar.gz/",
                  "URL": "https://osdr.nasa.gov/geode-py/ws/studies/OSD-48/download?source=datamanager&file=GLDS-48_rna-seq_N-GC-31.tar.gz"
                }
              }
            }
          }
        ]
      },
      "DatasetFileListEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "files": {
            "$ref": "#/components/schemas/DatasetFileSummaryMap"
          }
        },
        "required": [
          "files"
        ]
      },
      "DatasetFileSummaryMap": {
        "type": "object",
        "description": "File summaries keyed by file name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/DatasetFileSummary"
        }
      },
      "DatasetFileSummary": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri",
            "description": "REST URL for this file's metadata."
          },
          "URL": {
            "type": "string",
            "format": "uri",
            "description": "Direct download URL for this file."
          }
        },
        "required": [
          "REST_URL",
          "URL"
        ]
      },
      "DatasetFileMetadataResponse": {
        "type": "object",
        "description": "File metadata response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetFileMetadataContainer"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "files": {
                "GLDS-48_rna-seq_N-GC-31.tar.gz": {
                  "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/file/GLDS-48_rna-seq_N-GC-31.tar.gz/",
                  "URL": "https://osdr.nasa.gov/geode-py/ws/studies/OSD-48/download?source=datamanager&file=GLDS-48_rna-seq_N-GC-31.tar.gz",
                  "metadata": {
                    "category": "RNA-Seq",
                    "file_name": "GLDS-48_rna-seq_N-GC-31.tar.gz",
                    "file_size": 1210144277,
                    "restricted": false
                  }
                }
              }
            }
          }
        ]
      },
      "DatasetFileMetadataContainer": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "files": {
            "$ref": "#/components/schemas/DatasetFileMetadataMap"
          }
        },
        "required": [
          "files"
        ]
      },
      "DatasetFileMetadataMap": {
        "type": "object",
        "description": "File metadata entries keyed by file name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/DatasetFileMetadataEntry"
        }
      },
      "DatasetFileMetadataEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri",
            "description": "REST URL for this file's metadata."
          },
          "URL": {
            "type": "string",
            "format": "uri",
            "description": "Direct download URL for this file."
          },
          "metadata": {
            "$ref": "#/components/schemas/MetadataMap",
            "description": "File metadata keyed by metadata labels."
          }
        },
        "required": [
          "REST_URL",
          "URL",
          "metadata"
        ]
      },
      "DatasetAssayListResponse": {
        "type": "object",
        "description": "Assay listing response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetAssayListEntry"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "assays": {
                "OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina": {
                  "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/"
                }
              }
            }
          }
        ]
      },
      "DatasetAssayListEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "assays": {
            "$ref": "#/components/schemas/DatasetAssaySummaryMap"
          }
        },
        "required": [
          "assays"
        ]
      },
      "DatasetAssaySummaryMap": {
        "type": "object",
        "description": "Assay summaries keyed by assay name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/RestUrlObject"
        }
      },
      "DatasetAssayMetadataResponse": {
        "type": "object",
        "description": "Assay metadata response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetAssayMetadataContainer"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "assays": {
                "OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina": {
                  "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/",
                  "samples": {
                    "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/samples/"
                  },
                  "files": {
                    "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/files/"
                  },
                  "metadata": {
                    "study assay measurement type": "DNA methylation profiling",
                    "study assay technology type": "Whole Genome Bisulfite Sequencing"
                  }
                }
              }
            }
          }
        ]
      },
      "DatasetAssayMetadataContainer": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "assays": {
            "$ref": "#/components/schemas/DatasetAssayMetadataMap"
          }
        },
        "required": [
          "assays"
        ]
      },
      "DatasetAssayMetadataMap": {
        "type": "object",
        "description": "Assay metadata entries keyed by assay name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/DatasetAssayMetadataEntry"
        }
      },
      "DatasetAssayMetadataEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri",
            "description": "REST URL for this assay's metadata."
          },
          "samples": {
            "$ref": "#/components/schemas/RestUrlObject",
            "description": "REST URL for samples under this assay."
          },
          "files": {
            "$ref": "#/components/schemas/RestUrlObject",
            "description": "REST URL for files under this assay."
          },
          "metadata": {
            "$ref": "#/components/schemas/MetadataMap",
            "description": "Assay metadata keyed by metadata labels."
          }
        },
        "required": [
          "REST_URL",
          "samples",
          "files",
          "metadata"
        ]
      },
      "DatasetAssaySampleListResponse": {
        "type": "object",
        "description": "Sample listing response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetAssaySampleListContainer"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "assays": {
                "OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina": {
                  "samples": {
                    "Mmus_C57-6J_LVR_FLT_C_Rep1_M25": {
                      "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/sample/Mmus_C57-6J_LVR_FLT_C_Rep1_M25/"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "DatasetAssaySampleListContainer": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "assays": {
            "$ref": "#/components/schemas/DatasetAssaySampleListAssayMap"
          }
        },
        "required": [
          "assays"
        ]
      },
      "DatasetAssaySampleListAssayMap": {
        "type": "object",
        "description": "Assay sample-list containers keyed by assay name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/DatasetAssaySampleListEntry"
        }
      },
      "DatasetAssaySampleListEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "samples": {
            "$ref": "#/components/schemas/DatasetSampleSummaryMap"
          }
        },
        "required": [
          "samples"
        ]
      },
      "DatasetSampleSummaryMap": {
        "type": "object",
        "description": "Sample summaries keyed by sample name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/RestUrlObject"
        }
      },
      "DatasetAssaySampleMetadataResponse": {
        "type": "object",
        "description": "Sample metadata response keyed by dataset accession ID.",
        "additionalProperties": false,
        "patternProperties": {
          "^OSD-[0-9]+$": {
            "$ref": "#/components/schemas/DatasetAssaySampleMetadataContainer"
          }
        },
        "minProperties": 1,
        "maxProperties": 1,
        "examples": [
          {
            "OSD-48": {
              "assays": {
                "OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina": {
                  "samples": {
                    "Mmus_C57-6J_LVR_FLT_C_Rep1_M25": {
                      "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/sample/Mmus_C57-6J_LVR_FLT_C_Rep1_M25/",
                      "files": {
                        "REST_URL": "https://visualization.osdr.nasa.gov/biodata/api/v2/dataset/OSD-48/assay/OSD-48_dna-methylation-profiling_whole-genome-bisulfite-sequencing_Illumina/sample/Mmus_C57-6J_LVR_FLT_C_Rep1_M25/files/"
                      },
                      "metadata": {
                        "id": {
                          "accession": "OSD-48",
                          "sample name": "Mmus_C57-6J_LVR_FLT_C_Rep1_M25"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "DatasetAssaySampleMetadataContainer": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "assays": {
            "$ref": "#/components/schemas/DatasetAssaySampleMetadataAssayMap"
          }
        },
        "required": [
          "assays"
        ]
      },
      "DatasetAssaySampleMetadataAssayMap": {
        "type": "object",
        "description": "Assay sample-metadata containers keyed by assay name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/DatasetAssaySampleMetadataAssayEntry"
        }
      },
      "DatasetAssaySampleMetadataAssayEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "samples": {
            "$ref": "#/components/schemas/DatasetAssaySampleMetadataMap"
          }
        },
        "required": [
          "samples"
        ]
      },
      "DatasetAssaySampleMetadataMap": {
        "type": "object",
        "description": "Sample metadata entries keyed by sample name.",
        "additionalProperties": {
          "$ref": "#/components/schemas/DatasetAssaySampleMetadataEntry"
        }
      },
      "DatasetAssaySampleMetadataEntry": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "REST_URL": {
            "type": "string",
            "format": "uri",
            "description": "REST URL for this sample's metadata."
          },
          "files": {
            "$ref": "#/components/schemas/RestUrlObject",
            "description": "REST URL for files under this sample."
          },
          "metadata": {
            "$ref": "#/components/schemas/MetadataMap",
            "description": "Sample metadata keyed by metadata labels."
          }
        },
        "required": [
          "REST_URL",
          "files",
          "metadata"
        ]
      },
      "MetadataMap": {
        "type": "object",
        "description": "Metadata keyed by arbitrary metadata labels.",
        "additionalProperties": {
          "$ref": "#/components/schemas/MetadataValue"
        }
      },
      "MetadataValue": {
        "description": "A metadata value. Values may be scalar, arrays, or nested objects depending on the endpoint and metadata key.",
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "type": "null"
          },
          {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MetadataValue"
            }
          },
          {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/MetadataValue"
            }
          }
        ]
      },
      "CsvTable": {
        "type": "string",
        "description": "CSV data with a header row. Columns are dynamic and depend on the endpoint and requested metadata fields."
      },
      "TsvTable": {
        "type": "string",
        "description": "TSV data with a header row. Columns are dynamic and depend on the endpoint and requested metadata fields."
      },
      "QueryCell": {
        "description": "One cell in a tabular query result.",
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "type": "null"
          }
        ]
      },
      "QueryRecord": {
        "type": "object",
        "description": "One row keyed by output column name. Column names are dynamic and include identifier fields plus requested metadata fields.",
        "additionalProperties": {
          "$ref": "#/components/schemas/QueryCell"
        }
      },
      "QueryJsonRecords": {
        "type": "array",
        "description": "format=json.records: an array of row objects keyed by output column name.",
        "items": {
          "$ref": "#/components/schemas/QueryRecord"
        }
      },
      "QueryJsonTableField": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "name": {
            "type": "string",
            "description": "Output column name."
          },
          "type": {
            "type": "string",
            "description": "Column value type, such as string or number."
          }
        },
        "required": [
          "name",
          "type"
        ]
      },
      "QueryJsonTableSchema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QueryJsonTableField"
            }
          }
        },
        "required": [
          "fields"
        ]
      },
      "QueryJsonTable": {
        "type": "object",
        "description": "format=json.table: an object with a schema block and row objects.",
        "additionalProperties": false,
        "properties": {
          "schema": {
            "$ref": "#/components/schemas/QueryJsonTableSchema"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QueryRecord"
            }
          }
        },
        "required": [
          "schema",
          "data"
        ]
      },
      "QueryJsonSplit": {
        "type": "object",
        "description": "format=json.split: an object with column names and row arrays.",
        "additionalProperties": false,
        "properties": {
          "columns": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "data": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/QueryCell"
              }
            }
          }
        },
        "required": [
          "columns",
          "data"
        ]
      },
      "QueryJsonResponse": {
        "description": "JSON response for tabular query endpoints. The exact shape is selected by format=json.records, format=json.table, or format=json.split.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/QueryJsonRecords"
          },
          {
            "$ref": "#/components/schemas/QueryJsonTable"
          },
          {
            "$ref": "#/components/schemas/QueryJsonSplit"
          }
        ]
      }
    }
  }
}
