# How to Use Enrichr for Gene Set Enrichment Analysis (No Coding Needed)

You have a list of genes from an RNA-seq experiment, a CRISPR screen or a proteomics run, and you want to know what biology they share. Enrichr is a free web tool from the Ma'ayan Lab that answers that question by comparing your gene list against hundreds of libraries of annotated gene sets and reporting which ones overlap more than expected by chance [1]. It is one of the fastest ways to go from a column of gene symbols to a ranked list of pathways, Gene Ontology terms and transcription factor targets, and you never have to open a terminal.

By the end of this tutorial you will be able to paste or upload a gene list, choose the right libraries, read the four scores Enrichr reports, export a table for a figure or supplement, and recognize the mistakes that produce misleading results. You will also see a complete worked example with real numbers so you know what a clean result looks like.

## Quick Answer

- Go to https://maayanlab.cloud/Enrichr/ and paste your gene symbols into the text box, one per line [1][2].
- Add a short description so you can tell saved or shared analyses apart later [2].
- Submit crisp sets (each gene either in or out). Do not submit fuzzy membership values unless you know exactly what you are doing [2].
- Pick libraries from the categories on the results page: Pathways, Ontologies, Transcription, Diseases/Drugs and others [2].
- Read the adjusted p-value (q-value) for significance and the combined score for ranking [2].
- Export the table with "Export entries to table" and record the exact library name and the date you ran it [2].

## Step 1: Prepare Your Gene List

Enrichr expects Entrez gene symbols, one per line [2]. A plain text file with a single column works, and so does a copy-paste from Excel. If your upstream tool gave you Ensembl IDs, convert them to symbols first. The same applies to mouse symbols if you plan to use the human Enrichr site: check that your identifiers match the species of the libraries you select.

Keep the list to the genes you actually want to test. Enrichr is an over-representation tool, so it asks a cutoff-based question: given this set of genes, which annotated sets contain more of them than expected? Very long lists tend to return broad terms that are hard to interpret.

If you are comparing two conditions and want a quick sense of overlap before enrichment, the [Venn Diagram Maker](/tools/venn-diagram-maker) on this site shows how your lists overlap.

## Step 2: Submit the List and Add a Background If Needed

Paste your symbols into the input box on the Enrichr home page, or upload a text file. Add a description in the field provided. That description is what you will see in your saved analyses and in any link you share, so make it specific: "IFN-stimulated genes, A549, 24h" beats "list1" [2].

The input page now supports a background, a feature added in June 2023 and available through both the web interface and the API [1][2]. Without a custom background, Enrichr's odds ratio calculation assumes a universe of 20,000 genes [2]. That default is reasonable for a genome-wide experiment. It is not reasonable for a targeted panel. If your experiment only assayed 500 genes, a term can look enriched simply because your panel was biased toward it. Supply your panel genes as the background in that case.

For non-computational users, the Enrichr help is explicit: submit crisp sets, where each gene is either present or absent [2]. Fuzzy sets with membership values between 0 and 1 are supported, but a wrongly transformed fuzzy set produces erroneous results.

## Step 3: Choose Libraries

Results are grouped into gene-set library categories. On 2026-10-01 the datasetStatistics endpoint listed 228 libraries across 8 categories: Transcription, Pathways, Ontologies, Diseases/Drugs, Cell Types, Misc, Legacy and Crowd [2]. You do not need all of them. A sensible starting set for a human experiment:

- **Pathways:** Reactome_Pathways_2024 (2,105 terms), KEGG_2026 (352 terms), WikiPathways_2024_Human (829 terms) [2]
- **Ontologies:** GO_Biological_Process_2026 (5,954 terms), GO_Molecular_Function_2026 (1,394 terms), GO_Cellular_Component_2026 (510 terms) [2]
- **Hallmark gene sets:** MSigDB_Hallmark_2020 (50 terms), useful when you want broad, non-redundant themes [2]
- **Regulation:** ChEA_2022 for transcription factor targets, CellMarker_2024 for cell type markers [2]

Library versions matter. Reactome_2022, KEGG_2021_Human and GO_Biological_Process_2023 have moved to the Legacy category but remain available [2]. Legacy libraries are not wrong, they are just older. Whichever you choose, write the exact library name in your methods section. "GO enrichment" is not enough when GO_Biological_Process_2023 and GO_Biological_Process_2026 can give different term lists.

## Step 4: Read the Four Scores

Enrichr reports a p-value, a q-value, a rank (z-score) and a combined score for every term [2].

The **p-value** comes from Fisher's exact test, which is the hypergeometric test for this setup [2]. It answers: if I drew this many genes at random from the background, how often would I get this much overlap with the term?

The **q-value** is the Benjamini-Hochberg adjusted p-value, correcting for the fact that you tested hundreds or thousands of terms at once [2]. This is the number to use for significance. In the bar chart view, a bar appears gray if the term does not meet the 0.05 cutoff before correction [2].

The **odds ratio** measures effect size. The help gives the formula as oddsRatio = (a*d) / max(b*c, 1), where a is the number of overlapping genes, b is the annotated set genes not in your input, c is your input genes not in the annotated set, and d is the 20,000 genes (or your background size) minus the annotated set minus the input set plus the overlap [2].

The **combined score** is c = -log(p) * oddsRatio [2]. Enrichr describes it as a compromise between the two scores, and it gave the best rankings in the platform's benchmarks [2]. On a live run, the combined score matched -ln(p) times the odds ratio using the natural log: -ln(8.16e-34) x 4357.7 = 332,030 against a reported 332,008. Treat the combined score as a ranking aid. It has no significance threshold. Significance comes from the adjusted p-value.

## Step 5: Explore and Export Results

The bar graph view encodes two things at once: bar length shows significance, and brighter color means more significant [2]. Click the graph to re-sort by a different score, and use the image-format buttons at the top right to export it [2].

The table view is where you will spend most of your time. Sort by term, p-value, z-score or combined score, filter with the search box, and hover a row to see which of your genes overlap that term [2]. When you have what you need, click "Export entries to table" for a tab-delimited file you can open in Excel or read into R [2].

Grid and network views exist, but they are not available for every library. The grid shows only the top 10 terms by combined score [2]. The share icon produces a temporary link to your analysis. A free account lets you save sets permanently [2]. The Find A Gene tab answers the reverse question: which library terms contain a gene you care about [2].

## Worked Example

Take 15 interferon-stimulated genes: ISG15, IFIT1, IFIT2, IFIT3, MX1, OAS1, OAS2, RSAD2, IFI44, IFI6, STAT1, IRF7, IFITM1, BST2, XAF1. Paste them one per line on the web page and submit.

Against Reactome_Pathways_2024, the top three terms were:

| Term | Overlap | p-value | Adjusted p | Combined score |
|---|---|---|---|---|
| Interferon Alpha Beta Signaling | 14/15 | 8.2e-34 | 8.0e-32 | 332,008 |
| Interferon Signaling | 14/15 | not shown | 5.8e-24 | not shown |
| Cytokine Signaling in Immune System | 14/15 | not shown | 7.4e-18 | not shown |

Against GO_Biological_Process_2026, the top three were Defense Response to Virus (GO:0051607, 13 genes, adjusted p = 2.3e-22), Negative Regulation of Viral Process (GO:0048525, 9 genes, adjusted p = 1.5e-17) and Negative Regulation of Viral Genome Replication (GO:0045071, 8 genes, adjusted p = 2.6e-16).

MSigDB_Hallmark_2020 returned Interferon Gamma Response (12 genes, adjusted p = 2.9e-21) and Interferon Alpha Response (10 genes, adjusted p = 5.9e-20). KEGG_2026 returned Hepatitis C (7 genes, adjusted p = 3.7e-10), Influenza A (6 genes, 3.0e-08) and Measles (5 genes, 5.0e-07).

Two things to notice. First, broad parent terms such as Immune System and Cytokine Signaling also rank high, because a specific term like Interferon Alpha Beta Signaling sits inside them. That is expected, not a sign that your analysis is broken. Second, KEGG returns virus infection pathways because these ISGs are shared across many viral responses. The result tells you the genes are interferon-responsive. It does not tell you which virus the cells saw, or that they saw one at all. These values came from a default run with no custom background and will shift slightly as libraries update.

## Step 6: Reproduce the Analysis Without the Web Interface

You do not need to code for a single analysis, but you may want to script it for a paper. The Enrichr API takes two calls. First, POST your newline-separated list to the addList endpoint:

```bash
curl -X POST https://maayanlab.cloud/Enrichr/addList \
  -F "list=ISG15
IFIT1
MX1
STAT1" \
  -F "description=IFN panel"
```

The response is JSON containing a userListId and a shortId [2]. Then retrieve results for a library, replacing the userListId below with the one you received:

```bash
curl "https://maayanlab.cloud/Enrichr/enrich?userListId=138988667&backgroundType=Reactome_Pathways_2024"
```

Each term comes back with Rank, Term name, P-value, Odds ratio, Combined score, Overlapping genes, Adjusted p-value, Old p-value and Old adjusted p-value [2]. Related endpoints include /Enrichr/view to retrieve a list, /Enrichr/genemap?gene=AKT1&json=true to find terms containing a gene, and /Enrichr/export to download results as text [2]. A custom background goes through the Speedrichr API at https://maayanlab.cloud/speedrichr: /api/addList, then /api/addbackground, then POST /api/backgroundenrich with userListId, backgroundid and backgroundType. Speedrichr IDs are not persistent, so save your output [2].

In R, the enrichR package (version 3.4, published 2025-02-02, requires R >= 3.5.0) wraps the same service [3]. As of October 2026, check the CRAN page for the current release before you build a pipeline around it.

```r
install.packages("enrichR")
library(enrichR)
setEnrichrSite("Enrichr")
dbs <- listEnrichrDbs()
enriched <- enrichr(genes, c("GO_Biological_Process_2023"))
```

Pass `background = my_background` to use a custom universe, and add `include_overlap = TRUE` to restore the Overlap column for background runs [3]. The package also connects to FlyEnrichr, WormEnrichr, YeastEnrichr, FishEnrichr and OxEnrichr through `listEnrichrSites()` and `setEnrichrSite()`, and `plotEnrich()` draws a bar plot while `printEnrich()` exports to text or Excel with `outFile = "excel"` [3]. Note that the vignette examples use GO_*_2023 libraries, which now sit in the Legacy category [2][3].

In Python, GSEApy installs with `pip install gseapy` or `conda install gseapy` [4]:

```python
import gseapy as gp
gp.get_library_name()
res = gp.enrichr(gene_list=genes,
                 gene_sets=['MSigDB_Hallmark_2020', 'KEGG_2021_Human'],
                 organism='human', outdir=None)
```

The `organism` argument accepts 'Mouse', 'Yeast', 'Fly', 'Fish' and 'Worm', and a background argument is optional [4].

## Common Mistakes and How to Fix Them

- **Every bar is gray.** No term met the 0.05 cutoff even before correction [2]. Your list may be too short, too heterogeneous, or drawn from a system the libraries do not cover well.
- **The top hit is something vague like "Immune System."** Broad parent terms contain the specific terms you care about, so they rank high whenever the specific ones do. Read down the table for the informative child terms and report those.
- **A disease pathway tops the list and you are tempted to interpret it literally.** KEGG infection pathways share interferon and cytokine genes. A hit for Influenza A in an interferon panel reflects shared biology, not an infection.
- **The same term appears under three different names.** Reactome, KEGG and GO overlap. That is redundancy between databases, not independent replication.
- **Results changed between two runs of the same list.** Library versions update. KEGG_2021_Human became KEGG_2026, and older versions moved to Legacy [2]. Record the library name and the date.
- **The page looks broken after an update.** The Enrichr FAQ recommends a hard refresh with Ctrl+F5, Shift+F5 or Command+F5, and the Report bug button accepts your input file and screenshots [2].
- **enrichR fails behind a campus proxy.** Set `options(RCurlOptions = list(proxy = ..., proxyport = ...))` and the package will route through httr::use_proxy() [3].
- **You submitted fuzzy membership values and the output looks strange.** The help recommends crisp sets for non-computational users because a wrongly transformed fuzzy set gives erroneous results [2]. Re-upload with 0/1 membership.

## Limitations

Enrichr is an over-representation tool. It tests a cutoff-based gene list against annotated sets and asks whether the overlap is larger than chance [2]. It cannot see genes that fell just below your cutoff, and it cannot use the ranking of all genes. GSEA takes a different approach: it uses a ranked list of every gene and asks whether predefined sets are enriched at either end of the ranking with a running-sum statistic [5][9]. Subramanian and colleagues introduced it in 2005 and showed it could find pathways shared by two lung cancer survival studies where single-gene analysis found little similarity [9]. If your question is about subtle, coordinated shifts across a whole pathway, GSEA is usually the better fit. If you have a clear gene list and want fast annotation, Enrichr is.

The default odds ratio assumes a 20,000-gene universe [2]. For small targeted panels, supply a background or the effect sizes will be inflated. The combined score is a ranking heuristic, not a test statistic, so do not apply a cutoff to it. Library contents change on their own schedule, and the platform announced library updates on October 17, 2025 [1]. The home page reported more than 100 million gene set queries from over a million unique users as of September 2025 [1]. The enrichR CRAN page showed issues needing fixes before 2026-10-09, so the package may be archived or updated shortly after this article; check before relying on it in a pipeline [3]. Finally, the human Enrichr libraries were not verified for mouse symbol handling, so use the organism-specific sites or the organism options in enrichR and GSEApy for non-human work [3][4].

## Frequently Asked Questions

### What is Enrichr in one sentence?

Enrichr is a free web tool that performs gene set enrichment analysis by comparing your input gene list against annotated gene sets and reporting which ones overlap significantly [1][2]. It is maintained by the Ma'ayan Lab and requires no programming.

### Enrichr vs GSEA: which should I use?

Use Enrichr when you have a defined gene list from a cutoff and want fast annotation across many libraries. Use GSEA when you have a full ranked gene list and want to detect coordinated shifts that do not survive a cutoff [5][9]. They answer related but distinct questions, and many papers report both.

### Can I run Enrichr pathway analysis in R or Python?

Yes. The enrichR package on CRAN wraps the Enrichr API and adds plotting and export helpers [3]. GSEApy provides the same access from Python with `gp.enrichr()` and supports several organisms [4]. Both call the same web service, so results should match the website when you use the same library and background.

### What is the difference between Enrichr gene ontology libraries and pathway libraries?

The GO libraries (GO_Biological_Process_2026, GO_Molecular_Function_2026, GO_Cellular_Component_2026) describe three separate aspects of gene function: biological process, molecular function and cellular component [2]. Pathway libraries such as Reactome_Pathways_2024 and KEGG_2026 describe curated signaling and metabolic cascades [2]. Running both gives complementary views, and overlapping hits are expected.

### Do I need an account?

No. You can run analyses and share temporary links without one. A free account lets you save gene sets permanently so you can return to them later [2].

### How do I cite Enrichr?

The platform asks users to cite Chen et al. 2013, Kuleshov et al. 2016 and Xie et al. 2021 [1][6][7][8]. Include the library name and version you used, plus the date you ran the analysis.

## References

1. [Enrichr (Ma'ayan Lab)](https://maayanlab.cloud/Enrichr/)
2. [Enrichr Help Center: basics, background, API, FAQ](https://maayanlab.cloud/Enrichr/help)
3. [enrichR package on CRAN](https://cran.r-project.org/web/packages/enrichR/index.html)
4. [GSEApy documentation: Enrichr example](https://gseapy.readthedocs.io/en/latest/gseapy_example.html)
5. [GenePattern GSEAPreranked documentation](https://www.genepattern.org/modules/docs/GSEAPreranked/1/)
6. [Chen et al. 2013. Enrichr: interactive and collaborative HTML5 gene list enrichment analysis tool. BMC Bioinformatics 14:128](https://doi.org/10.1186/1471-2105-14-128)
7. [Kuleshov et al. 2016. Enrichr: a comprehensive gene set enrichment analysis web server 2016 update. Nucleic Acids Res 44:W90-W97](https://doi.org/10.1093/nar/gkw377)
8. [Xie et al. 2021. Gene Set Knowledge Discovery with Enrichr. Curr Protoc 1:e90](https://doi.org/10.1002/cpz1.90)
9. [Subramanian et al. 2005. Gene set enrichment analysis. PNAS 102:15545-15550](https://doi.org/10.1073/pnas.0506580102)

## Related Articles

- [Over-Representation Analysis (ORA) vs. Gene Set Enrichment Analysis (GSEA): Which Should You Use for Your RNA-seq Data?](/knowledge/bioinformatics/over-representation-analysis-ora-vs-gene-set-enrichment-analysis-gsea-which-should-you-use-for-your)
- [How to Perform Gene Ontology (GO) Enrichment Analysis in R: A Step-by-Step Tutorial Using clusterProfiler](/knowledge/bioinformatics/how-to-perform-gene-ontology-go-enrichment-analysis-in-r-a-step-by-step-tutorial-using-clusterprofil)
- [Reactome vs. KEGG for Pathway Analysis of RNA-seq Data: Which Database Should You Trust?](/knowledge/bioinformatics/reactome-vs-kegg-for-pathway-analysis-of-rna-seq-data-which-database-should-you-trust)
- [Gene Set Enrichment Analysis Tools: Choosing the Right One](/knowledge/bioinformatics/gene-set-enrichment-analysis-tools-choosing-the-right-one)
- [How to Install R Packages from CRAN, Bioconductor and GitHub (and Fix Install Errors)](/blog/research-skills/how-to-install-r-packages-cran-bioconductor-github)
- [How to Use Google Colab for Bioinformatics: Python, Shell Commands and Google Drive](/blog/research-skills/how-to-use-google-colab-for-bioinformatics)