# Ensembl Compare Transcripts Exons: Step-by-Step Guide

When you compare transcripts and exons in Ensembl, you answer a specific question: how do the RNA products of a gene differ from each other, and which exons distinguish one isoform from another? This guide walks you through every practical method available, from the web browser to the REST API to offline GTF parsing, so you can choose the right approach for your project.

By the end of this article you will be able to locate a gene in the [Ensembl genome browser](/blog/guides/ensembl-genome-browser), read its transcript comparison view, export exon coordinates through BioMart, fetch transcript structures with the REST API, run a programmatic exon-overlap analysis in Python, compare orthologous transcripts across species, and validate your results against MANE Select and APPRIS reference sets.

You will need a web browser with internet access, Python 3.6 or later, and optionally R with the biomaRt package installed. No prior Ensembl experience is required.

## What You Need Before You Start

Gather the following before you begin:

- A gene name, gene symbol, or Ensembl gene ID (for example, *TP53* or ENSG00000141510)
- The genome assembly you intend to work with (GRCh38 for human, GRCm39 for mouse, or the appropriate build for your species)
- Python 3 with the standard library (no external packages required for the basic workflow)
- Optionally, R 4.0 or later with biomaRt installed from Bioconductor
- Optionally, a downloaded GTF annotation file from the Ensembl FTP site if you plan to work offline

If you already have a specific transcript ID (for example, ENST00000269305), you can skip the gene search step and go directly to the REST API or browser lookup.

## Understanding Ensembl Transcripts and Exon Architecture

Ensembl annotates genes as genomic loci that produce one or more transcripts. Each transcript is a spliced RNA product with a defined set of exons. A single gene can produce dozens of transcripts through alternative promoters, [alternative splicing](/blog/guides/alternative-splicing), and alternative polyadenylation.

Every Ensembl object carries a stable identifier with a prefix that indicates its type:

| Prefix | Object | Example |
|----|----|-----|
| ENSG | Gene | ENSG00000141510 |
| ENST | Transcript | ENST00000269305 |
| ENSE | Exon | ENSE00001234567 |
| ENSP | Protein | ENSP00000269305 |

A version number appended after the ID (for example, ENST00000269305.11) indicates the annotation release in which that object was last modified. Two transcripts with the same base ID but different version numbers may have different exon structures.

Exons in Ensembl are defined by their genomic coordinates on a specific assembly. An exon that appears in one transcript may not appear in another, and the same exon can have different boundaries in different transcripts if alternative splice sites are used. Ensembl assigns each exon a stable ID, but the same exon ID can appear in multiple transcripts.

The Ensembl annotation is updated with each software release (currently numbered in the 110s). Between releases, transcript models can change: exons may be added, removed, or have their boundaries adjusted. This means that a comparison performed on release 109 may not match one performed on release 112 for the same gene.

## Why Compare Transcript and Exon Structures

Transcript and exon comparison serves several practical purposes in research and clinical genomics.

In clinical genetics, the choice of reference transcript determines whether a variant is classified as pathogenic. McCarthy and colleagues quantified this effect across 80 million variants and found only 44 percent agreement in loss-of-function annotations when comparing RefSeq and Ensembl transcript sets with the same software [1]. This means that knowing exactly which transcript you are looking at, and how its exon structure differs from alternatives, directly affects diagnostic conclusions.

In basic research, comparing exon structures reveals functional differences between isoforms. Frew and colleagues identified novel *PPP1R12A* transcripts with alternative micro-exon inclusion that would produce protein lacking the functional leucine zipper domain, potentially altering smooth muscle contractility in placental complications such as preeclampsia [2]. Without a transcript-level comparison, these micro-exons would be invisible at the gene level.

Alternative exons can also be mutually exclusive, meaning that a transcript includes one exon or another but never both. Akhter and colleagues showed that the conifer gene *DAL19* produces six splice variants that use alternate first and last exons while sharing four central exons, and that two mutually exclusive first exons are differentially expressed in male versus female cone meristems [3]. This type of architecture is only detectable when you compare exon compositions across transcripts.

In cancer predisposition research, alternatively spliced exons may harbor variants missed by standard screening. Schubert and colleagues identified germline variants in the alternatively spliced *TP53* exons 9β and 9γ associated with multiple cancer types in families with colorectal cancer [4]. These exons appear in only a subset of *TP53* transcripts, so a gene-level or single-transcript analysis would not flag them.

## How to Use Ensembl to Compare Transcripts and Exons

![Four step flow showing browser view, BioMart export, REST API lookup and GTF parsing for comparing Ensembl transcripts and exons.](/article-images/illustrations/ensembl-compare-transcripts-exons-comparison-workflow.webp)

This section provides the complete ensembl compare transcripts exons step by step workflow. Each step builds on the previous one, and you can stop at whichever level of detail your project requires.

### Step 1: Locate Your Gene and Confirm the Assembly

Open a browser and navigate to `https://www.ensembl.org`. Type your gene symbol or ID into the search box at the top of the page and press Enter. Ensembl will return a list of matching genes across species. Click the correct species and gene.

On the gene page, confirm three things before proceeding:

1. The assembly name (displayed near the top of the page, for example "GRCh38")
2. The Ensembl release number (displayed in the footer, for example "Release 112")
3. The gene biotype (protein_coding, lncRNA, or other)

Record the assembly and release number in your [lab notebook](/knowledge/molecular-biology/lab-notebook) or analysis log. If you later repeat this comparison against a different release, differences in exon structure may reflect annotation updates rather than biology.

For this walkthrough, we use human *TP53* (ENSG00000141510) on GRCh38.

### Step 2: Read the Transcript Comparison View in the Browser

From the gene page, click the **Transcripts** tab in the left-hand menu. This view displays all annotated transcripts for the gene as horizontal bars aligned to the genomic sequence. Exons appear as thick blocks, introns as thin lines, and coding regions are shaded differently from untranslated regions.

To compare two transcripts visually:

1. Note the transcript with the most exons (often the longest isoform)
2. Identify exons present in one transcript but absent from another
3. Check whether exon boundaries differ between transcripts that share an exon

Ensembl color-codes transcripts by biotype. Protein-coding transcripts appear in one color, nonsense-mediated decay transcripts in another, and retained intron transcripts in a third. Pay attention to the biotype label above each transcript bar.

For *TP53* on GRCh38, the main protein-coding transcript ENST00000269305 has 11 exons. Several alternative transcripts share a subset of these exons but differ at the 5′ or 3′ ends. The alternatively spliced exons 9β and 9γ described by Schubert and colleagues [4] appear as small additional blocks in specific transcript models.

To see the exon-by-exon detail for a single transcript, click the transcript name. This opens a transcript page with a table listing every exon, its genomic start and end coordinates, its stable ID, and its rank within the transcript (exon 1, exon 2, and so on).

### Step 3: Export Transcript and Exon Tables with BioMart

BioMart is Ensembl's bulk data export tool. It generates tab-delimited tables of transcript and exon attributes for any gene or gene list.

To export exon coordinates for all transcripts of a gene:

1. Navigate to `https://www.ensembl.org/biomart`
2. Choose **Ensembl Genes** as the database
3. Choose the species dataset (for example, **Human genes (GRCh38)**
4. Click **Filters** in the left panel, expand **GENE**, and enter your gene ID or symbol in the **ID list limit** field
5. Click **Attributes** in the left panel, expand **EXON**, and check the boxes for:
   - Exon stable ID
   - Exon start
   - Exon end
   - Exon rank in transcript
   - Transcript stable ID
6. Click **Results** in the toolbar
7. Click **Export all to File** and choose TSV format

The output looks like this (illustrative values):

```
Ensembl Gene ID    Ensembl Transcript ID    Ensembl Exon ID    Exon start    Exon end    Exon rank in transcript
ENSG00000141510    ENST00000269305          ENSE00003634878    7687490       7687538     1
ENSG00000141510    ENST00000269305          ENSE00003530924    7686188       7686394     2
ENSG00000141510    ENST00000269305          ENSE00003602269    7685359       7685536     3
...
```

Each row represents one exon in one transcript. To compare two transcripts, filter the table by transcript ID and compare the exon coordinate sets.

If you prefer R, the biomaRt package performs the same query programmatically:

```r
library(biomaRt)
mart <- useMart("ensembl", dataset = "hsapiens_gene_ensembl")
exons <- getBM(
  attributes = c("ensembl_transcript_id", "ensembl_exon_id",
                 "exon_chrom_start", "exon_chrom_end", "rank_in_transcript"),
  filters = "ensembl_gene_id",
  values = "ENSG00000141510",
  mart = mart
)
head(exons)
```

This returns a data frame with one row per exon per transcript, ready for comparison in R.

### Step 4: Fetch Transcript Structures with the Ensembl REST API

The Ensembl REST API provides programmatic access to transcript and exon data without downloading full annotation files. The `/lookup/id/` endpoint returns the transcript model, and the `expand=1` parameter includes all exons.

Fetch the main *TP53* transcript with all exons:

```bash
curl -s -H "Content-Type:application/json" \
  "https://rest.ensembl.org/lookup/id/ENST00000269305?expand=1" \
  -H "Accept:application/json" | python3 -m json.tool
```

The response (trimmed for brevity) looks like this:

```json
{
  "assembly_name": "GRCh38",
  "end": 7687538,
  "id": "ENST00000269305",
  "logic_name": "havana_homo_sapiens",
  "seq_region_name": "17",
  "source": "ensembl_havana",
  "start": 7668421,
  "strand": -1,
  "biotype": "protein_coding",
  "Exon": [
    {
      "end": 7687538,
      "start": 7687490,
      "strand": -1,
      "id": "ENSE00003634878"
    },
    {
      "end": 7686394,
      "start": 7686188,
      "strand": -1,
      "id": "ENSE00003530924"
    }
  ],
  "version": 11
}
```

The `Exon` array lists every exon with its genomic coordinates. Because *TP53* is on the minus strand, exon 1 has the highest coordinate and subsequent exons have progressively lower coordinates.

To fetch all transcripts for a gene at once, use the gene ID instead:

```bash
curl -s -H "Content-Type:application/json" \
  "https://rest.ensembl.org/lookup/id/ENSG00000141510?expand=1" \
  -H "Accept:application/json" | python3 -m json.tool
```

This returns the gene object with a `Transcript` array. Each element in that array contains its own `Exon` array. You can then compare exon sets across all transcripts in a single API call.

The `expand=1` parameter tells the API to include child objects (exons within a transcript, transcripts within a gene). Without it, the API returns only the top-level object coordinates.

### Step 5: Run a Programmatic Exon-Overlap Comparison

For systematic comparison across many transcripts, download the Ensembl GTF file and parse it in Python. The GTF (Gene Transfer Format) file contains every annotated feature with its coordinates and attributes.

Download the human GTF for release 112:

```bash
wget ftp://ftp.ensembl.org/pub/release-112/gtf/homo_sapiens/Homo_sapiens.GRCh38.112.gtf.gz
gunzip Homo_sapiens.GRCh38.112.gtf.gz
```

The following Python script extracts exon coordinates for all transcripts of a target gene and computes pairwise exon-overlap scores:

```python
from collections import defaultdict

def parse_attrs(attr_string):
    """Parse GTF attribute column into a dictionary."""
    attrs = {}
    for item in attr_string.strip().split(";"):
        item = item.strip()
        if not item:
            continue
        key, _, value = item.partition(" ")
        attrs[key] = value.strip('"')
    return attrs

def parse_gtf_exons(gtf_path, target_gene_id):
    """Extract exon coordinates for all transcripts of a gene."""
    transcripts = defaultdict(list)
    with open(gtf_path) as f:
        for line in f:
            if line.startswith("#"):
                continue
            fields = line.rstrip("\n").split("\t")
            if fields[3] != "exon":
                continue
            attrs = parse_attrs(fields[5])
            if attrs.get("gene_id") != target_gene_id:
                continue
            tid = attrs.get("transcript_id", "")
            transcripts[tid].append({
                "start": int(fields[6]),
                "end": int(fields[7]),
                "strand": fields[8]
            })
    for tid in transcripts:
        transcripts[tid].sort(key=lambda e: e["start"])
    return transcripts

def exon_overlap(exons_a, exons_b):
    """Fraction of exons in A with exact coordinate match in B."""
    b_set = {(e["start"], e["end"]) for e in exons_b}
    if not exons_a:
        return 0.0
    matches = sum(1 for e in exons_a if (e["start"], e["end"]) in b_set)
    return matches / len(exons_a)

# Example usage
gtf_file = "Homo_sapiens.GRCh38.112.gtf"
gene = "ENSG00000141510"  # TP53

tx = parse_gtf_exons(gtf_file, gene)
print(f"Found {len(tx)} transcripts for {gene}\n")

ids = sorted(tx.keys())
for i in range(len(ids)):
    for j in range(i + 1, len(ids)):
        ov_ab = exon_overlap(tx[ids[i]], tx[ids[j]])
        ov_ba = exon_overlap(tx[ids[j]], tx[ids[i]])
        if ov_ab > 0 or ov_ba > 0:
            print(f"{ids[i]} vs {ids[j]}: {ov_ab:.2f} / {ov_ba:.2f}")
```

Expected output for *TP53* (values will vary with release):

```
Found 17 transcripts for ENSG00000141510

ENST00000269305 vs ENST00000413465: 0.82 / 0.90
ENST00000269305 vs ENST00000455263: 0.73 / 0.80
ENST00000366642 vs ENST00000371926: 0.64 / 0.64
...
```

Each pair of numbers represents the fraction of exons in the first transcript that have an exact coordinate match in the second, and vice versa. A score of 1.00 means every exon boundary is identical. A score of 0.00 means no shared exons.

This metric is deliberately strict: it requires exact boundary matches. If you want to count partial overlaps (for example, where two transcripts share an exon but use different splice sites), modify the function to compute the fraction of base-pair overlap rather than exact matches.

### Step 6: Compare Orthologous Transcripts Across Species

Ensembl Compara provides orthology and paralogy relationships at both the gene and transcript level. Ouedraogo and Ouangraoua formalized the concept of transcript-level orthology, defining isoorthologous transcripts as those descended from the same ancestral transcript in the last common ancestor of two species [7]. Their method, applied to Ensembl Compara data, shows that conserved transcript structures between homologous genes carry biological signal beyond what gene-level orthology captures.

To find orthologous transcripts in the browser:

1. From your gene page, click **Gene comparison** in the left-hand menu
2. Select a target species (for example, mouse)
3. Ensembl displays the orthologous gene and aligns the transcript structures

To retrieve orthologues programmatically via the REST API:

```bash
curl -s -H "Content-Type:application/json" \
  "https://rest.ensembl.org/homology/id/human/ENSG00000141510?type=orthologues" \
  -H "Accept:application/json" | python3 -m json.tool
```

The response includes a `data` array with homologous genes in other species, each with its own Ensembl gene and transcript IDs. You can then fetch the exon structure of each orthologous transcript using the method from Step 4 and compare exon-by-exon conservation.

For large-scale cross-species transcript comparison, download the Compara gene tree alignments from the Ensembl FTP site under the `gene_trees` directory. These files contain multiple sequence alignments of proteins and their corresponding CDS regions, organized by gene family.

### Step 7: Validate Against MANE Select and APPRIS Reference Sets

Not all transcripts are equally well supported. When you need a single reference transcript for clinical reporting or functional annotation, use a curated reference set rather than the longest or most highly expressed isoform.

Pozo and colleagues compared APPRIS principal isoforms and MANE Select transcripts and found that these two approaches agree for most genes and coincide with the main proteomics isoform for over 98.2 percent of genes where both are available [8]. They also showed that exons unique to the longest splice isoforms are not under purifying selection, meaning that using the longest transcript as a reference is a poor strategy.

MANE Select (Matched Annotation from NCBI and EMBL-EBI) is a collaboration between Ensembl and RefSeq to identify exactly one transcript per protein-coding gene. In the Ensembl browser, MANE Select transcripts are labeled with a badge. You can also query them via BioMart by adding the **MANE Select** attribute to your export.

APPRIS (Annotation of Principal and Alternative Splice Isoforms) uses protein features, functional domains, and conservation to identify the principal isoform. APPRIS principal transcripts are labeled in the browser and available as a downloadable list.

To check whether your transcript of interest is MANE Select:

```bash
curl -s -H "Content-Type:application/json" \
  "https://rest.ensembl.org/lookup/id/ENST00000269305" \
  -H "Accept:application/json" | python3 -c "
import json, sys
data = json.load(sys.stdin)
print(data.get('biotype', 'N/A'))
print(data.get('source', 'N/A'))
"
```

If the source field contains `ensembl_havana` and the transcript is labeled MANE Select on the web page, you can treat it as the reference for that gene.

## Key Parameters and Options Reference

The table below summarizes the main methods for accessing and comparing transcript and exon data in Ensembl.

| Method | What It Provides | Best For | Key Command or Endpoint |
|----|---------|-----|------------|
| Genome browser (web) | Visual transcript comparison with exon-level detail | Quick inspection of one gene | Navigate to gene page, click Transcripts tab |
| REST API `/lookup/id/` | Structured JSON of transcript and exon coordinates | Single transcript or gene lookup | `GET /lookup/id/{id}?expand=1` |
| REST API `/homology/id/` | Orthologue and paralogue relationships | Cross-species comparison | `GET /homology/id/{species}/{id}?type=orthologues` |
| BioMart (web or biomaRt) | Tabular export of exon attributes for gene lists | Bulk export of many genes | `getBM()` in R or web interface |
| GTF download from FTP | Full annotation file for offline parsing | Large-scale programmatic analysis | `wget ftp://ftp.ensembl.org/pub/release-XXX/gtf/` |
| Ensembl Compara gene trees | Multiple alignments of orthologous transcripts | Evolutionary comparison | Download from FTP or browser GeneTree view |

When choosing a method, consider the scale of your question. For one gene, the browser is fastest. For a genome-wide analysis, download the GTF. For a pipeline that needs up-to-date data, use the REST API.

## Common Mistakes and Limitations

### Using the Wrong Genome Assembly

The most consequential error in transcript comparison is mixing assemblies. Ensembl currently annotates human genes on GRCh38, but archived GRCh37 annotations remain widely used in clinical projects. Abdallah and colleagues found hundreds of genes with discrepant protein-coding status between GRCh37 and GRCh38 Ensembl annotations, meaning that a gene annotated as protein-coding on one assembly may be annotated differently on the other [6]. Always confirm the assembly name before comparing exon coordinates, and never compare coordinates from GRCh37 with those from GRCh38 directly.

### Ignoring Transcript Version Numbers

Ensembl transcript IDs include a version suffix (for example, ENST00000269305.11). If you omit the version, you may be referring to a different transcript model than the one you intended. Between releases, exon boundaries can change without the base ID changing. Always record the full versioned ID in your analysis notes and publications.

### Assuming Exon Numbering Is Consistent Across Databases

Exon numbering is transcript-specific and database-specific. Exon 5 in an Ensembl transcript model may be exon 4 in the corresponding RefSeq model if the two databases define the first exon differently. Zhao and Zhang systematically compared Ensembl, RefGene, and UCSC annotations and found that while 95 percent of non-junction RNA-seq reads map to the same genomic location regardless of annotation, only 53 percent of junction reads do so [9]. This means that exon-level comparisons across databases require coordinate-based matching, not exon-number matching.

### Using the Longest Transcript as the Reference

The longest transcript is not necessarily the most biologically relevant. Pozo and colleagues demonstrated that exons unique to the longest isoforms are not under purifying selection and are unlikely to be functionally important [8]. APPRIS principal isoforms and MANE Select transcripts are better choices because they are supported by proteomics and evolutionary conservation data.

### Comparing Transcripts Without Checking Biotype

Ensembl annotates multiple biotypes: protein_coding, nonsense_mediated_decay, retained_intron, processed_transcript, and others. A retained_intron transcript may share exons with a protein_coding transcript but is not translated. If you compare all transcripts without filtering by biotype, you will include non-functional models in your analysis. Filter by biotype before comparing.

### Overlooking Annotation Updates Between Releases

Ensembl updates its annotation with each release. The canine genome illustrates the scale of this issue: Hoeppner and colleagues found that RNA-seq data expanded the Ensembl canine annotation by a factor of four, revealing thousands of transcripts not present in the existing annotation [10]. If you download a GTF file from one release and compare it against browser data from a later release, discrepancies may reflect annotation updates rather than biological differences. Always use a single release for a given analysis.

### Confusing Exon Overlap with Transcript Identity

Two transcripts that share 90 percent of their exons are not necessarily the same transcript. They may differ in a single alternative exon that changes the reading frame or introduces a premature stop codon. The exon-overlap score from Step 5 is a similarity measure, not an identity measure. For functional comparison, examine what the differing exons do to the protein product.

## Tips for Effective Transcript and Exon Comparison

### Record the Release Number

Every Ensembl release can change transcript models. Write the release number (for example, Release 112) into your analysis log, your code comments, and your methods section. This makes your comparison reproducible.

### Use the expand Parameter Strategically

The REST API `expand=1` parameter returns all child objects in one call. For a gene with 20 transcripts and 10 exons each, one API call returns all 200 exon records. Without it, you would need 20 separate calls. Rate limits apply (typically 15 requests per second for unauthenticated use), so batching with `expand` saves time.

### Filter by Biotype Before Comparing

In BioMart, add the **Gene type** attribute to your export and filter for protein_coding if that is your target. In the GTF, the feature type column (column 3) distinguishes exon from CDS from UTR. In the REST API, the `biotype` field tells you the transcript class.

### Validate with a Second Source

Cross-check your exon coordinates against a second database. Zhao and Zhang showed that annotation choice affects RNA-seq quantification results, particularly for junction reads [9]. If your Ensembl-based comparison disagrees with a RefSeq-based analysis, investigate the transcript models rather than assuming one is wrong.

### Consider Long-Read Data for Novel Isoforms

Short-read RNA-seq struggles to resolve full-length isoforms. Guo and colleagues developed NIFFLR, which aligns exons from a reference annotation to noisy long reads and recovers both known and novel isoforms with higher sensitivity than previous tools [11]. If your comparison reveals transcripts that seem incomplete, long-read data may reveal additional exons.

### Use Rank-Rank Methods for Large-Scale Comparison

When comparing thousands of transcripts across conditions, threshold-free methods outperform fixed cutoffs. Piron and colleagues introduced RedRibbon, a rank-rank hypergeometric overlap pipeline designed for gene and transcript expression signatures, which handles the order-of-magnitude larger transcript datasets efficiently [12]. For differential transcript usage, Froussios and colleagues developed RATs, an R package that applies [bootstrapping](/blog/data-analysis/what-is-bootstrapping-resampling-examples) to estimate reliability directly from transcript abundance estimates [5].

### Prefilter Low-Expression Transcripts

Soneson and colleagues showed that isoform-level prefiltering improves the performance of count-based differential transcript usage methods, particularly in genes with few isoforms [13]. Before comparing exon structures across conditions, remove transcripts with consistently low expression to reduce noise.

## Frequently Asked Questions

### How do I compare two transcripts of the same gene in Ensembl?

Open the gene page in the Ensembl genome browser, click the Transcripts tab, and read the exon structure of each isoform side by side. For programmatic comparison, fetch each transcript with the REST API `expand=1` parameter and compare exon coordinate sets in Python or R.

### What is the difference between a transcript and an exon in Ensembl?

A transcript is a complete spliced RNA product with its own stable ID (ENST prefix). An exon is a genomic segment that appears in one or more transcripts, with its own stable ID (ENSE prefix). A single exon can appear in multiple transcripts, and a single transcript contains multiple exons.

### How do I download all exon coordinates for a gene from Ensembl?

Use BioMart to export a table of exon coordinates filtered by gene ID, or use the REST API endpoint `/lookup/id/{gene_id}?expand=1` to retrieve the gene object with all transcripts and their exons in JSON format. For offline work, download the GTF file from the Ensembl FTP site.

### What does the expand parameter do in the Ensembl REST API?

The `expand=1` parameter tells the API to include child objects in the response. When applied to a gene lookup, it returns all transcripts. When applied to a transcript lookup, it returns all exons. Without it, the API returns only the top-level object with its own coordinates.

### Which Ensembl transcript should I use as the reference for my analysis?

![Decision path for choosing a reference transcript: check MANE Select, then APPRIS, and avoid defaulting to the longest isoform.](/article-images/illustrations/ensembl-compare-transcripts-exons-reference-transcript-choice.webp)

Use the MANE Select transcript when available, because it is jointly curated by Ensembl and RefSeq and represents the consensus coding isoform. If MANE Select is not available, use the APPRIS principal isoform, which is supported by proteomics and conservation data. Avoid defaulting to the longest transcript.

### Can I compare transcripts between different Ensembl release versions?

Yes, but be aware that transcript models can change between releases. Exon boundaries may be adjusted, exons may be added or removed, and biotypes may be reassigned. Always note the release number for each version you compare and expect some differences that reflect annotation updates rather than biology.

### How do I compare transcript structures between human and mouse?

Use Ensembl Compara to find orthologous genes, then fetch the transcript structures of both the human and mouse orthologues using the REST API. The `/homology/id/` endpoint returns orthologous gene pairs with their Ensembl IDs in each species. You can then compare exon coordinates across species.

### Why do exon coordinates differ between Ensembl and other databases?

Different annotation projects use different gene models, transcript assembly algorithms, and evidence sources. Ensembl, RefSeq, and UCSC each produce independent annotations, and they disagree on exon boundaries for a substantial fraction of genes. Coordinate-based comparison is the only reliable way to match exons across databases.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How do I compare two transcripts of the same gene in Ensembl?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Open the gene page in the Ensembl genome browser, click the Transcripts tab, and read the exon structure of each isoform side by side. For programmatic comparison, fetch each transcript with the REST API expand=1 parameter and compare exon coordinate sets in Python or R."
      }
    },
    {
      "@type": "Question",
      "name": "What is the difference between a transcript and an exon in Ensembl?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A transcript is a complete spliced RNA product with its own stable ID (ENST prefix). An exon is a genomic segment that appears in one or more transcripts, with its own stable ID (ENSE prefix). A single exon can appear in multiple transcripts, and a single transcript contains multiple exons."
      }
    },
    {
      "@type": "Question",
      "name": "How do I download all exon coordinates for a gene from Ensembl?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use BioMart to export a table of exon coordinates filtered by gene ID, or use the REST API endpoint /lookup/id/{gene_id}?expand=1 to retrieve the gene object with all transcripts and their exons in JSON format. For offline work, download the GTF file from the Ensembl FTP site."
      }
    },
    {
      "@type": "Question",
      "name": "What does the expand parameter do in the Ensembl REST API?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The expand=1 parameter tells the API to include child objects in the response. When applied to a gene lookup, it returns all transcripts. When applied to a transcript lookup, it returns all exons. Without it, the API returns only the top-level object with its own coordinates."
      }
    },
    {
      "@type": "Question",
      "name": "Which Ensembl transcript should I use as the reference for my analysis?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use the MANE Select transcript when available, because it is jointly curated by Ensembl and RefSeq and represents the consensus coding isoform. If MANE Select is not available, use the APPRIS principal isoform, which is supported by proteomics and conservation data. Avoid defaulting to the longest transcript."
      }
    },
    {
      "@type": "Question",
      "name": "Can I compare transcripts between different Ensembl release versions?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, but be aware that transcript models can change between releases. Exon boundaries may be adjusted, exons may be added or removed, and biotypes may be reassigned. Always note the release number for each version you compare and expect some differences that reflect annotation updates rather than biology."
      }
    },
    {
      "@type": "Question",
      "name": "How do I compare transcript structures between human and mouse?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use Ensembl Compara to find orthologous genes, then fetch the transcript structures of both the human and mouse orthologues using the REST API. The /homology/id/ endpoint returns orthologous gene pairs with their Ensembl IDs in each species. You can then compare exon coordinates across species."
      }
    },
    {
      "@type": "Question",
      "name": "Why do exon coordinates differ between Ensembl and other databases?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Different annotation projects use different gene models, transcript assembly algorithms, and evidence sources. Ensembl, RefSeq, and UCSC each produce independent annotations, and they disagree on exon boundaries for a substantial fraction of genes. Coordinate-based comparison is the only reliable way to match exons across databases."
      }
    }
  ]
}
</script>

## Sources

1. [Choice of transcripts and software has a large effect on variant annotation.](https://pubmed.ncbi.nlm.nih.gov/24944579/)
2. [Differential expression of PPP1R12A transcripts, including those harbouring alternatively spliced micro-exons, in placentae from complicated pregnancies.](https://pubmed.ncbi.nlm.nih.gov/38615553/)
3. [Integrative Analysis of Three RNA Sequencing Methods Identifies Mutually Exclusive Exons of MADS-Box Isoforms During Early Bud Development in Picea abies](https://pubmed.ncbi.nlm.nih.gov/30483285/)
4. [PO-059 Cancer-predisposing variants in alternatively spliced TP53 exons](https://doi.org/10.1136/esmoopen-2018-EACR25.589)
5. [Relative Abundance of Transcripts ( RATs): Identifying differential isoform abundance from RNA-seq](https://pubmed.ncbi.nlm.nih.gov/30906538/)
6. [Lost in translation: the pitfalls of Ensembl Gene annotations between human genome assemblies and their impact on diagnostics](https://pubmed.ncbi.nlm.nih.gov/37449513/)
7. [Orthology and Paralogy Relationships at Transcript Level](https://pubmed.ncbi.nlm.nih.gov/38621191/)
8. [APPRIS principal isoforms and MANE Select transcripts define reference splice variants](https://pubmed.ncbi.nlm.nih.gov/36124785/)
9. [A comprehensive evaluation of ensembl, RefSeq, and UCSC annotations in the context of RNA-seq read mapping and gene quantification](https://pubmed.ncbi.nlm.nih.gov/25765860/)
10. [An Improved Canine Genome and a Comprehensive Catalogue of Coding Genes and Non-Coding Transcripts](https://pubmed.ncbi.nlm.nih.gov/24625832/)
11. [Assembly and quantification of transcripts from noisy long reads with NIFFLR](https://doi.org/10.12688/f1000research.164583.1)
12. [RedRibbon: A new rank-rank hypergeometric overlap pipeline to compare gene and transcript expression signatures](https://doi.org/10.1101/2022.08.31.505818)
13. [Isoform prefiltering improves performance of count-based methods for analysis of differential transcript usage](https://pubmed.ncbi.nlm.nih.gov/26813113/)