> gtex-database

Query GTEx (Genotype-Tissue Expression) portal for tissue-specific gene expression, eQTLs (expression quantitative trait loci), and sQTLs. Essential for linking GWAS variants to gene regulation, understanding tissue-specific expression, and interpreting non-coding variant effects.

fetch
$curl "https://skillshub.wtf/K-Dense-AI/claude-scientific-skills/gtex-database?format=md"
SKILL.mdgtex-database

GTEx Database

Overview

The Genotype-Tissue Expression (GTEx) project provides a comprehensive resource for studying tissue-specific gene expression and genetic regulation across 54 non-diseased human tissues from nearly 1,000 individuals. GTEx v10 (the latest release) enables researchers to understand how genetic variants regulate gene expression (eQTLs) and splicing (sQTLs) in a tissue-specific manner, which is critical for interpreting GWAS loci and identifying regulatory mechanisms.

Key resources:

When to Use This Skill

Use GTEx when:

  • GWAS locus interpretation: Identifying which gene a non-coding GWAS variant regulates via eQTLs
  • Tissue-specific expression: Comparing gene expression levels across 54 human tissues
  • eQTL colocalization: Testing if a GWAS signal and an eQTL signal share the same causal variant
  • Multi-tissue eQTL analysis: Finding variants that regulate expression in multiple tissues
  • Splicing QTLs (sQTLs): Identifying variants that affect splicing ratios
  • Tissue specificity analysis: Determining which tissues express a gene of interest
  • Gene expression exploration: Retrieving normalized expression levels (TPM) per tissue

Core Capabilities

1. GTEx REST API v2

Base URL: https://gtexportal.org/api/v2/

The API returns JSON and does not require authentication. All endpoints support pagination.

import requests

BASE_URL = "https://gtexportal.org/api/v2"

def gtex_get(endpoint, params=None):
    """Make a GET request to the GTEx API."""
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params, headers={"Accept": "application/json"})
    response.raise_for_status()
    return response.json()

2. Gene Expression by Tissue

import requests
import pandas as pd

def get_gene_expression_by_tissue(gene_id_or_symbol, dataset_id="gtex_v10"):
    """Get median gene expression across all tissues."""
    url = "https://gtexportal.org/api/v2/expression/medianGeneExpression"
    params = {
        "gencodeId": gene_id_or_symbol,
        "datasetId": dataset_id,
        "itemsPerPage": 100
    }
    response = requests.get(url, params=params)
    data = response.json()

    records = data.get("data", [])
    df = pd.DataFrame(records)
    if not df.empty:
        df = df[["tissueSiteDetailId", "tissueSiteDetail", "median", "unit"]].sort_values(
            "median", ascending=False
        )
    return df

# Example: get expression of APOE across tissues
df = get_gene_expression_by_tissue("ENSG00000130203.10")  # APOE GENCODE ID
# Or use gene symbol (some endpoints accept both)
print(df.head(10))
# Output: tissue name, median TPM, sorted by highest expression

3. eQTL Lookup

import requests
import pandas as pd

def query_eqtl(gene_id, tissue_id=None, dataset_id="gtex_v10"):
    """Query significant eQTLs for a gene, optionally filtered by tissue."""
    url = "https://gtexportal.org/api/v2/association/singleTissueEqtl"
    params = {
        "gencodeId": gene_id,
        "datasetId": dataset_id,
        "itemsPerPage": 250
    }
    if tissue_id:
        params["tissueSiteDetailId"] = tissue_id

    all_results = []
    page = 0
    while True:
        params["page"] = page
        response = requests.get(url, params=params)
        data = response.json()
        results = data.get("data", [])
        if not results:
            break
        all_results.extend(results)
        if len(results) < params["itemsPerPage"]:
            break
        page += 1

    df = pd.DataFrame(all_results)
    if not df.empty:
        df = df.sort_values("pval", ascending=True)
    return df

# Example: Find eQTLs for PCSK9
df = query_eqtl("ENSG00000169174.14")
print(df[["snpId", "tissueSiteDetailId", "slope", "pval", "gencodeId"]].head(20))

4. Single-Tissue eQTL by Variant

import requests

def query_variant_eqtl(variant_id, tissue_id=None, dataset_id="gtex_v10"):
    """Get all eQTL associations for a specific variant."""
    url = "https://gtexportal.org/api/v2/association/singleTissueEqtl"
    params = {
        "variantId": variant_id,  # e.g., "chr1_55516888_G_GA_b38"
        "datasetId": dataset_id,
        "itemsPerPage": 250
    }
    if tissue_id:
        params["tissueSiteDetailId"] = tissue_id

    response = requests.get(url, params=params)
    return response.json()

# GTEx variant ID format: chr{chrom}_{pos}_{ref}_{alt}_b38
# Example: "chr17_43094692_G_A_b38"

5. Multi-Tissue eQTL (eGenes)

import requests

def get_egenes(tissue_id, dataset_id="gtex_v10"):
    """Get all eGenes (genes with at least one significant eQTL) in a tissue."""
    url = "https://gtexportal.org/api/v2/association/egene"
    params = {
        "tissueSiteDetailId": tissue_id,
        "datasetId": dataset_id,
        "itemsPerPage": 500
    }

    all_egenes = []
    page = 0
    while True:
        params["page"] = page
        response = requests.get(url, params=params)
        data = response.json()
        batch = data.get("data", [])
        if not batch:
            break
        all_egenes.extend(batch)
        if len(batch) < params["itemsPerPage"]:
            break
        page += 1
    return all_egenes

# Example: all eGenes in whole blood
egenes = get_egenes("Whole_Blood")
print(f"Found {len(egenes)} eGenes in Whole Blood")

6. Tissue List

import requests

def get_tissues(dataset_id="gtex_v10"):
    """Get all available tissues with metadata."""
    url = "https://gtexportal.org/api/v2/dataset/tissueSiteDetail"
    params = {"datasetId": dataset_id, "itemsPerPage": 100}
    response = requests.get(url, params=params)
    return response.json()["data"]

tissues = get_tissues()
# Key fields: tissueSiteDetailId, tissueSiteDetail, colorHex, samplingSite
# Common tissue IDs:
# Whole_Blood, Brain_Cortex, Liver, Kidney_Cortex, Heart_Left_Ventricle,
# Lung, Muscle_Skeletal, Adipose_Subcutaneous, Colon_Transverse, ...

7. sQTL (Splicing QTLs)

import requests

def query_sqtl(gene_id, tissue_id=None, dataset_id="gtex_v10"):
    """Query significant sQTLs for a gene."""
    url = "https://gtexportal.org/api/v2/association/singleTissueSqtl"
    params = {
        "gencodeId": gene_id,
        "datasetId": dataset_id,
        "itemsPerPage": 250
    }
    if tissue_id:
        params["tissueSiteDetailId"] = tissue_id

    response = requests.get(url, params=params)
    return response.json()

Query Workflows

Workflow 1: Interpreting a GWAS Variant via eQTLs

  1. Identify the GWAS variant (rs ID or chromosome position)
  2. Convert to GTEx variant ID format (chr{chrom}_{pos}_{ref}_{alt}_b38)
  3. Query all eQTL associations for that variant across tissues
  4. Check effect direction: is the GWAS risk allele the same as the eQTL effect allele?
  5. Prioritize tissues: select tissues biologically relevant to the disease
  6. Consider colocalization using coloc (R package) with full summary statistics
import requests, pandas as pd

def interpret_gwas_variant(variant_id, dataset_id="gtex_v10"):
    """Find all genes regulated by a GWAS variant."""
    url = "https://gtexportal.org/api/v2/association/singleTissueEqtl"
    params = {"variantId": variant_id, "datasetId": dataset_id, "itemsPerPage": 500}
    response = requests.get(url, params=params)
    data = response.json()

    df = pd.DataFrame(data.get("data", []))
    if df.empty:
        return df
    return df[["geneSymbol", "tissueSiteDetailId", "slope", "pval", "maf"]].sort_values("pval")

# Example
results = interpret_gwas_variant("chr1_154453788_A_T_b38")
print(results.groupby("geneSymbol")["tissueSiteDetailId"].count().sort_values(ascending=False))

Workflow 2: Gene Expression Atlas

  1. Get median expression for a gene across all tissues
  2. Identify the primary expression site(s)
  3. Compare with disease-relevant tissues
  4. Download raw data for statistical comparisons

Workflow 3: Tissue-Specific eQTL Analysis

  1. Select tissues relevant to your disease
  2. Query all eGenes in that tissue
  3. Cross-reference with GWAS-significant loci
  4. Identify co-localized signals

Key API Endpoints

EndpointDescription
/expression/medianGeneExpressionMedian TPM by tissue for a gene
/expression/geneExpressionFull distribution of expression per tissue
/association/singleTissueEqtlSignificant eQTL associations
/association/singleTissueSqtlSignificant sQTL associations
/association/egeneeGenes in a tissue
/dataset/tissueSiteDetailAvailable tissues with metadata
/reference/geneGene metadata (GENCODE IDs, coordinates)
/variant/variantPageVariant lookup by rsID or position

Datasets Available

IDDescription
gtex_v10GTEx v10 (current; ~960 donors, 54 tissues)
gtex_v8GTEx v8 (838 donors, 49 tissues) — older but widely cited

Best Practices

  • Use GENCODE IDs (e.g., ENSG00000130203.10) for gene queries; the .version suffix matters for some endpoints
  • GTEx variant IDs use the format chr{chrom}_{pos}_{ref}_{alt}_b38 (GRCh38) — different from rs IDs
  • Handle pagination: Large queries (e.g., all eGenes) require iterating through pages
  • Tissue nomenclature: Use tissueSiteDetailId (e.g., Whole_Blood) not display names for API calls
  • FDR correction: GTEx uses FDR < 0.05 (q-value) as the significance threshold for eQTLs
  • Effect alleles: The slope field is the effect of the alternative allele; positive = higher expression with alt allele

Data Downloads (for large-scale analysis)

For genome-wide analyses, download full summary statistics rather than using the API:

# All significant eQTLs (v10)
wget https://storage.googleapis.com/adult-gtex/bulk-qtl/v10/single-tissue-cis-qtl/GTEx_Analysis_v10_eQTL.tar

# Normalized expression matrices
wget https://storage.googleapis.com/adult-gtex/bulk-gex/v10/rna-seq/GTEx_Analysis_v10_RNASeQCv2.4.2_gene_reads.gct.gz

Additional Resources

> related_skills --same-repo

> writing

Use this skill to create high-quality academic papers, literature reviews, grant proposals, clinical reports, and other research and scientific documents backed by comprehensive research and real, verifiable citations. Use this skill whenever the user asks for written output such as a report, paper...etc.

> xlsx

Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like "the xlsx in my

> scikit-learn

Machine learning in Python with scikit-learn. Use when working with supervised learning (classification, regression), unsupervised learning (clustering, dimensionality reduction), model evaluation, hyperparameter tuning, preprocessing, or building ML pipelines. Provides comprehensive reference documentation for algorithms, preprocessing techniques, pipelines, and best practices.

> pytorch-lightning

Deep learning framework (PyTorch Lightning). Organize PyTorch code into LightningModules, configure Trainers for multi-GPU/TPU, implement data pipelines, callbacks, logging (W&B, TensorBoard), distributed training (DDP, FSDP, DeepSpeed), for scalable neural network training.

┌ stats

installs/wk0
░░░░░░░░░░
github stars20.0K
██████████
first seenMar 17, 2026
└────────────

┌ repo

K-Dense-AI/claude-scientific-skills
by K-Dense-AI
└────────────

┌ tags

└────────────