# How to Download Gene and Transcript Sequences from Ensembl

By the end of this guide you will be able to download Ensembl transcript sequences for a single gene, a batch of identifiers, or an entire genome, in the sequence type you actually need (cDNA, coding sequence, peptide, or genomic DNA with untranslated regions included). You will also know how to pull older release versions for reproducible analyses and how to diagnose the errors that most often stop these downloads.

To follow along, you need:

- A terminal with `curl` and `wget` installed (both ship with macOS, Linux, and Windows Subsystem for Linux).
- Python 3 or R for the scripted and bulk methods. R requires the Bioconductor package `biomaRt` for the example in this article.
- A text editor to save identifier lists.
- Roughly 2 to 30 GB of free disk space if you plan to download whole-genome FASTA files and annotation files for one species.

Ensembl is the right starting point for this task because its sequence data feed a large share of published genomics work. Studies have pulled protein-coding sequences, full-length transcripts, and 5' UTR sequences directly from Ensembl for downstream analyses such as GC content and [gene expression](/blog/guides/gene-expression) correlations [1]. Whole transcriptome resources have been built on Ensembl annotations spanning hundreds of eukaryotic species [2]. Web-based RNA-seq analysis pipelines for agricultural species pair Ensembl genomic sequences with annotation files to support read mapping and quantification [3]. The methods below reproduce exactly that kind of retrieval, at scales from one sequence to one genome.

## Ensembl Identifiers and Sequence Types, Defined

![Decision path asking whether the identifier is a gene, transcript or protein, then which sequence type to request from Ensembl.](/article-images/illustrations/download-ensembl-transcript-sequences-id-type-triage.webp)

Before you download anything, understand what you are asking for. Every Ensembl identifier starts with ENS followed by a species code and a type letter. The three you will meet most often are:

- **ENSG** (gene). A stable identifier for a gene locus. Example: ENSG00000142148 is the human TP53 gene.
- **ENST** (transcript). A stable identifier for one splice isoform. Example: ENST00000269305 is the canonical protein-coding transcript of TP53. A single gene can have many transcripts.
- **ENSP** (protein). The peptide product of a protein-coding transcript.

[Alternative splicing](/blog/guides/alternative-splicing) matters here. Genes commonly produce several distinct transcripts, and databases built specifically to study transcript conservation document this isoform complexity across hundreds of annotated species [2]. When you request "the sequence for gene X," Ensembl has to decide which isoform you mean, so it is almost always better to request transcripts explicitly.

Ensembl also distinguishes sequence types, and choosing the wrong one is the most common mistake in this workflow:

| Term | Definition | Typical use |
|--|--|--|
| Genomic sequence | The raw chromosome region containing the gene, introns included | Promoter and variant analysis, read mapping |
| cDNA | The mature, spliced transcript, exons joined, UTRs included | Primer design, transcript alignment |
| CDS | The coding sequence only, from start to stop codon, UTRs excluded | Codon analysis, protein prediction checks |
| Peptide | The translated [protein sequence](/blog/guides/protein-sequence) | BLASTp, domain searches, protein modeling |
| ncRNA transcript | The sequence of a non-coding RNA transcript | miRNA and lncRNA studies |

FASTA is the plain-text format you will receive. It begins with a header line starting with `>`, followed by the sequence on subsequent lines.

## Method 1: Download Sequences Through the Ensembl Genome Browser

If you are just learning how to use Ensembl, the genome browser is the friendliest entry point, and this walkthrough doubles as a short Ensembl [genome browser tutorial](/blog/guides/genome-browsers-for-researchers-a-guide-to-inspecting-genomic-evidence). Single-gene websites also link out to Ensembl directly, so researchers collecting candidate genes from curated resources often end up on an Ensembl gene page through exactly this route [4].

Follow these steps for the human TP53 transcript:

1. Open **https://www.ensembl.org** and type `TP53` into the search box. Select the human gene from the results.
2. On the gene page, scroll to the **Transcripts** table. Each row is one isoform with its own ENST identifier.
3. Click the transcript ID you want (for example ENST00000269305).
4. In the left-hand menu, click **Sequence**. You can then choose **cDNA**, **CDS**, **Peptide**, or **Genomic sequence**. The genomic view lets you add flanking sequence, such as 5 kb upstream or downstream, with one click.
5. Click **Download sequence** (or **Export data** on the gene page) and save the FASTA file.

The saved file looks like this, with the header followed by the sequence broken into fixed-width lines:

```
>ENST00000269305 cdna:ensembl chromosome:GRCh38:17:7668421:7687550:1 gene:ENSG00000142148 gene_biotype:protein_coding transcript_biotype:protein_coding gene_symbol:TP53
ATGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCCCCTCTGC...
```

The exact header content varies by release and sequence type. The useful parts are the identifier, the assembly name (GRCh38 for the current human assembly), and the gene symbol, which let you audit what you downloaded.

**When to use this method.** One gene, one transcript, a quick visual check. For anything larger, use the methods below.

## Method 2: Download Many Sequences with BioMart

BioMart is Ensembl's batch query tool. It handles tens to tens of thousands of records through a web form and returns FASTA directly. BioMart sits on top of the same annotation infrastructure that third-party interfaces use, which is why tools built on Ensembl data, from cancer gene catalogs to expression resources, can expose Ensembl identifiers and links to their users [4] [5].

Step by step:

1. Go to **https://www.ensembl.org/biomart**.
2. Under **Choose Database**, select **Ensembl Genes**. Under **Choose Dataset**, select your species, for example **Homo sapiens genes**.
3. Under **Filters**, expand **GENE**, then paste your identifier list into the ID box. You can paste ENSG gene IDs, ENST transcript IDs, or HGNC gene symbols. Ensembl applies the filter before generating output, so only matching records are returned.
4. Under **Attributes**, click **Sequences**, then select **cDNA** (or CDS, peptide, or genomic with flanks). Check the boxes for the identifiers you want in the FASTA header, such as **Ensembl Transcript ID** and **Associated Gene Name**.
5. Click **Results**, set the output to **FASTA**, and click **Go** to download.

The result is a multi-record FASTA file:

```
>ENST00000269305 TP53
ATGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCCCCTCTGC...
>ENST00000456328 TP53
...
```

**Tips for BioMart.** Always include the transcript ID in your attributes even if you also export gene symbols, because symbols change over time while stable IDs persist. If you work with gene lists drawn from published signatures, standardized Ensembl identifiers make your results comparable to other studies, which is precisely why curated signature databases map their gene lists to Ensembl identifiers with a traceable mapping history [6].

## Method 3: Download Ensembl Transcript Sequences Step by Step with the REST API

For scripted, repeatable retrieval, the Ensembl REST API is the workhorse. The endpoint is public, requires no key for moderate use, and returns plain text FASTA on request.

### Step 1. Retrieve one transcript sequence

The `/sequence/id` endpoint accepts any stable identifier and returns the sequence type you request with the `type` parameter:

```bash
curl "https://rest.ensembl.org/sequence/id/ENST00000269305?type=cdna&content-type=text/plain"
```

Expected output:

```
>ENST00000269305.10 cdna:ensembl chromosome:GRCh38...
ATGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCCCCTCTGC...
```

The `type` parameter accepts these values:

| type value | What you get |
|--|--|
| `cdna` | Spliced transcript with UTRs |
| `cds` | Coding sequence only |
| `protein` | Translated peptide |
| `genomic` | Genomic sequence of the transcript span, introns included |

Two optional parameters extend the genomic sequence beyond the transcript boundaries: `expand_5prime` and `expand_3prime`, each taking a number of bases. To grab a transcript plus 1,000 bases upstream and 200 bases downstream:

```bash
curl "https://rest.ensembl.org/sequence/id/ENST00000269305?type=genomic&expand_5prime=1000&expand_3prime=200&content-type=text/plain"
```

### Step 2. Retrieve a sequence by genomic coordinate

![Worked calculation adding 1000 bases upstream and 200 bases downstream to the TP53 transcript span 7668421 to 7687550 on GRCh38.](/article-images/illustrations/download-ensembl-transcript-sequences-flank-expand-calc.webp)

The `/sequence/region` endpoint returns sequence for any region of any assembly. The coordinate format is `chromosome:start-end:strand`:

```bash
curl "https://rest.ensembl.org/sequence/region/human/17:7668421-7668500:1?content-type=text/plain"
```

The header reflects the requested coordinates, and the body is the sequence for that window. Coordinates are assembly specific, so this exact request refers to GRCh38. If your coordinates come from a GRCh37-based analysis, use the GRCh37 REST service instead by replacing the host with `https://grch37.rest.ensembl.org`.

### Step 3. Batch retrieval with POST

Anonymous REST clients are limited to roughly 55 requests per minute. Retrieving 5,000 transcripts one request at a time will hit that ceiling within minutes. The documented workaround is batch POST: you can send a few hundred identifiers per request and receive all sequences in one response.

```bash
curl -X POST \
  -H "Content-Type: application/json" \
  -H "Accept: text/x-fasta" \
  -d '{"ids": ["ENST00000269305", "ENST00000456328"], "type": "cdna"}' \
  "https://rest.ensembl.org/sequence/id"
```

For larger jobs, a small Python script with a retry on rate limiting is more reliable:

```python
import json
import time
import urllib.request
import urllib.error

SERVER = "https://rest.ensembl.org"
ids = ["ENST00000269305", "ENST00000456328"]

payload = json.dumps({"ids": ids, "type": "cdna"}).encode()
req = urllib.request.Request(
    SERVER + "/sequence/id",
    data=payload,
    headers={"Content-Type": "application/json", "Accept": "text/x-fasta"}
)

for attempt in range(5):
    try:
        with urllib.request.urlopen(req) as response:
            print(response.read().decode())
        break
    except urllib.error.HTTPError as err:
        if err.code == 429:
            print("Rate limited. Waiting 60 seconds.")
            time.sleep(60)
        else:
            raise
```

Expected output is a FASTA block with one record per identifier:

```
>ENST00000269305.10 cdna:ensembl chromosome:GRCh38...
ATGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCCCCTCTGC...
>ENST00000456328.2 cdna:ensembl chromosome:GRCh38...
...
```

This is the pattern used by large-scale sequence retrieval tools that query Ensembl programmatically, an approach popularized by dedicated applications that pull whole-gene, exonic, intronic, and UTR sequences for multi-genome comparative work [7].

## Method 4: Download Whole-Genome Sequence Files over FTP

When you need every transcript of a species, or the genome itself for alignment, do not request sequences one at a time. Ensembl publishes complete FASTA and annotation files on its FTP server, organized by release number and species. The release numbering is versioned so that analyses stay reproducible, and major derived resources pin themselves to specific releases, for example transcript conservation databases built on Ensembl version 111 [2].

The file you want depends on the sequence type:

| Directory | Contents | File name pattern |
|--|--|--|
| `fasta/<species>/dna/` | Genomic sequence, primary assembly or full set with patches and scaffolds | `Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz` |
| `fasta/<species>/cdna/` | All spliced transcripts with UTRs | `Homo_sapiens.GRCh38.cdna.all.fa.gz` |
| `fasta/<species>/ncrna/` | Non-coding RNA transcripts | `Homo_sapiens.GRCh38.ncrna.fa.gz` |
| `fasta/<species>/pep/` | Translated peptides | `Homo_sapiens.GRCh38.pep.all.fa.gz` |
| `gtf/<species>/` | Gene annotation in GTF format | `Homo_sapiens.GRCh38.111.gtf.gz` |

Download the complete human transcriptome (cDNA) for release 111 with one command:

```bash
wget https://ftp.ensembl.org/pub/release-111/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz
```

Inspect the top of the file without decompressing it to disk:

```bash
zcat Homo_sapiens.GRCh38.cdna.all.fa.gz | head
```

Every download directory contains a `CHECKSUMS` file. Verify integrity before you build an analysis on the data:

```bash
md5sum Homo_sapiens.GRCh38.cdna.all.fa.gz
```

Compare the returned hash with the corresponding entry in `CHECKSUMS`. A mismatch means the transfer was corrupted, and you should re-download before proceeding.

Two practical notes on releases. First, release numbers advance continuously, and transcript content changes between them, so record the release number in your methods section. Second, non-vertebrate species live on Ensembl Genomes, a complementary project that extends the same interfaces to bacteria, plants, fungi, metazoa, and protists, and that had scaled to thousands of bacterial genomes on its own release schedule [8]. For those species, use the Ensembl Genomes FTP site and expect its release numbers to differ from the vertebrate Ensembl numbers.

## Method 5: Retrieval Inside R with biomaRt

If your analysis lives in R, the Bioconductor package `biomaRt` queries the same BioMart service directly, which keeps sequence retrieval inside your pipeline rather than in a browser session:

```r
library(biomaRt)

ensembl <- useEnsembl(biomart = "genes", dataset = "hsapiens_gene_ensembl")

tx <- getSequence(
  id = c("ENST00000269305", "ENST00000456328"),
  type = "ensembl_transcript_id",
  seqType = "cdna",
  mart = ensembl
)

head(tx)
```

Expected output is a data frame with two columns:

```
  ensembl_transcript_id                   cdna
1      ENST00000269305  ATGGAGGAGCCGCAGTCAG...
2      ENST00000456328  ...
```

To pin a specific release for reproducibility, request it through the version argument:

```r
ensembl111 <- useEnsembl(
  biomart = "genes",
  dataset = "hsapiens_gene_ensembl",
  version = 111
)
```

The returned data frame writes cleanly to FASTA with Bioconductor functions, or you can keep it as a table for downstream join operations against expression data. This kind of integration is common in applied workflows: annotation resources for livestock and poultry species combine Ensembl and NCBI gene models side by side so researchers can compare prediction pipelines against experimental expression data [5].

## Method 6: Regulatory and Intronic Sequences with RSAT retrieve-ensembl-seq

Standard Ensembl interfaces do not, in one step, hand you a promoter, a set of introns, or a redundancy-filtered selection of exons. The retrieve-ensembl-seq application, part of the Regulatory Sequence Analysis Tools (RSAT) suite, fills that gap. You supply Ensembl identifiers or gene names, and the tool returns upstream, downstream, intronic, exonic, UTR, or whole-gene sequences, with a multiple-organism mode that fetches homologous sequences at any taxonomic level [7].

Two of its filters solve problems that flat downloads create. The first masks coding fragments, which is useful when you want to study only the non-coding portion of a transcript set. The second avoids sequence redundancy for genes with multiple transcripts, so a gene with five isoforms does not contribute the same shared exon five times to your dataset [7]. Because the tool is integrated into the RSAT suite, retrieved sequences can be piped straight into motif discovery and other regulatory sequence analyses without leaving the platform [7].

This capability matters for promoter studies. Sequence features such as GC content in 5' UTRs have documented relationships with expression patterns, and such analyses depend on correctly segmented UTR and upstream sequences rather than whole-gene genomic blocks [1].

## Choosing the Right Method

| Method | Best for | Practical scale | Output |
|--|--|--|--|
| Genome browser | One sequence, visual inspection | 1 to a few records | FASTA file |
| BioMart | Filtered batch queries through a web form | Tens to tens of thousands | FASTA or table |
| REST API | Scripted pipelines, coordinate queries | Tens to hundreds per call | FASTA, JSON, or text |
| FTP | Whole genomes, complete transcriptomes, annotation | Millions of records | Compressed FASTA and GTF |
| biomaRt | R-native pipelines | Hundreds to thousands | R data frame |
| RSAT retrieve-ensembl-seq | Promoters, introns, UTRs, redundancy filtering | Gene lists per organism | FASTA with custom features |

A useful heuristic: browser for looking, BioMart or biomaRt for lists, REST for scripts, FTP for genomes.

## Common Mistakes and Limitations

These are the errors that cost people the most time, along with exact messages and fixes.

**1. Confusing gene, transcript, and protein identifiers.** Pasting an ENSG into an endpoint that expects an ENST returns an error or, worse, a sequence you did not intend. The REST endpoint for an invalid identifier returns HTTP 404 with a body like:

```
{"error": "Resource not found."}
```

Check the third character of your identifier: G means gene, T means transcript, P means protein. When you need to convert between them, query Ensembl annotations rather than guessing, and remember that one gene ID maps to many transcript IDs.

**2. Mixing identifiers across databases.** Ensembl, RefSeq, and NCBI Gene IDs are different systems, and probes or primers designed against one can mislead when remapped against another. This problem is well documented in the microarray literature, where integrating transcript data from RefSeq, GenBank, and Ensembl into a single annotation changed probe specificity and meaningfully altered which genes were detected in expression analyses [9]. Resources that compare NCBI and Ensembl gene models for the same species show the predictions do differ, which is why the source of your identifiers belongs in your methods [5].

**3. Downloading the wrong sequence type.** Requesting `cdna` when you wanted `cds` silently inflates your sequences with UTRs, and requesting `genomic` when you wanted `cdna` drags in every intron. Always open the first few records of the output and check the header, which names the sequence type explicitly.

**4. Ignoring release versions.** A transcript ID from an old paper may have been retired or superseded. Current release IDs carry a version suffix in FASTA headers, for example `ENST00000269305.10`, where the number after the dot is the version. If a paper says "TP53 transcript ENST00000269305" without a version, the sequence you download today may differ from the one the authors analyzed. Use **archive.ensembl.org** or a versioned BioMart query to reproduce historical downloads.

**5. Assembly mismatches in coordinate queries.** A region query is only as good as its assembly. Human GRCh37 and GRCh38 coordinates for the same locus differ, and passing GRCh37 coordinates to the default GRCh38 service returns the wrong stretch of chromosome with no warning. Check which assembly your coordinates came from before you query, and use the GRCh37 REST host when needed.

**6. Hitting rate limits.** Sequential single-ID loops over thousands of identifiers fail with HTTP 429. Batch your requests into POST calls, add a `time.sleep` between calls when iterating, and cache responses to disk so reruns do not re-fetch everything.

**7. Duplicating shared sequence across isoforms.** If you concatenate cDNA sequences for every transcript of every gene, exons shared by multiple isoforms appear multiple times. For motif discovery or k-mer counting, this duplication biases your results. Either work at the gene level with whole-gene genomic sequence, or use a redundancy filter such as the one built into RSAT's retrieval tool [7].

**8. Forgetting non-vertebrate species.** Queries for plants, fungi, bacteria, and many invertebrate metazoa belong on Ensembl Genomes, not the vertebrate site, and the two projects number their releases independently [8]. A command that works for human on `ftp.ensembl.org` needs the Ensembl Genomes host and its own release number for rice or yeast.

**9. Trusting empty output.** A query that returns no error but also no sequence usually means the region or ID exists in the database but has no sequence of the requested type, for example a pseudogene transcript asked for a peptide. Read the response headers and body, not just the exit code.

**10. Not recording provenance.** The species, assembly, release number, and retrieval date define your dataset. Analyses that skip this step cannot be reproduced, and cross-resource comparisons, such as mapping published gene signatures back to Ensembl identifiers with full traceability, depend on knowing exactly which identifiers and release were used [6].

## How to Check That Your Download Is Correct

Run three quick checks on any sequence file before analysis.

First, count the records and compare with what you requested:

```bash
grep -c ">" transcripts.fa
```

Second, get sequence lengths to catch truncated records:

```bash
awk '/^>/{if (n) print name, n
  name = $0
  n = 0
  next
}
{ n = n + length($0) }
END { if (n) print name, n }' transcripts.fa
```

Or, if you have `seqkit` installed:

```bash
seqkit stats transcripts.fa
```

Third, spot-check one record against the browser. Copy the identifier from a FASTA header, paste it into the Ensembl search box, open the transcript's sequence view, and confirm the first and last 30 bases match your file. A Python check with Biopython automates the length audit:

```python
from Bio import SeqIO

for record in SeqIO.parse("transcripts.fa", "fasta"):
    print(record.id, len(record.seq))
```

Sequences that are unexpectedly short, all N characters, or missing from the length report indicate transfer problems or identifiers with no available sequence of the requested type.

## Practical Tips for Larger Projects

- **Pin your release.** Write the release number, assembly, and download date into a README inside your data directory. Resources that other groups reuse, from transcript conservation catalogs to protein haplotype databases built on Ensembl and GENCODE annotations [10] [2], all record their source release, and yours should too.
- **Cache aggressively.** Save every API response to disk keyed by identifier and release. Re-runs then cost nothing and work offline.
- **Keep identifiers stable, keep symbols mutable.** Downstream joins should key on ENST or ENSG identifiers. Human-readable gene names belong in comments and plots.
- **Feed sequences straight into your next step.** If your end goal is motif analysis or regulatory sequence work, retrieving through RSAT avoids an intermediate export-import cycle because the tool is embedded in a broader sequence analysis suite [7].
- **Match the retrieval to the question.** RNA-seq quantification pipelines need genomic FASTA plus GTF annotation delivered as bulk files [3]. Protein-level analyses need `pep` FASTA. Promoter studies need upstream sequence with redundancy control [7]. Choosing the retrieval method to match the analysis prevents most rework.

## Frequently Asked Questions

### What is the difference between cDNA, CDS, and genomic sequence in Ensembl?

cDNA is the spliced transcript including UTRs, CDS is the coding region between the start and stop codons only, and genomic sequence is the unspliced chromosome region with introns. Pick cDNA for transcript-level work, CDS for codon-level work, and genomic for regulatory or mapping work.

### How do I download transcript sequences for a list of many genes at once?

Use BioMart in the browser, paste your identifier list into the Filters panel, select the cDNA attribute, and export FASTA. For scripts, use the REST API's POST form of `/sequence/id`, which accepts a JSON body containing your identifiers and returns all sequences in one call.

### Why does my Ensembl transcript ID return an error or nothing?

The most likely cause is an identifier type mismatch, a retired or superseded ID from an older release, or a request for a sequence type that does not exist for that transcript, such as a peptide for a non-coding RNA. Check the ID prefix, look the ID up in the browser, and try an archive release if the ID came from an older publication.

### How do I get a transcript sequence from an older Ensembl release?

Use archive.ensembl.org in the browser, or pass the release number to `useEnsembl` in biomaRt through its version argument. Record the release in your methods, because transcript content and ID versions change between releases.

### How do I download sequences for plants, fungi, or bacteria?

Use Ensembl Genomes, the companion project for non-vertebrate species, which provides the same browser, BioMart, REST, and FTP interfaces under its own host and its own independent release numbering. Download the species FASTA files from the Ensembl Genomes FTP directories for the relevant division.

### Can I download upstream promoter sequence from Ensembl?

Yes. In the genome browser, choose genomic sequence with flanking bases on the transcript page. With the REST API, add `expand_5prime` and `expand_3prime` parameters to a genomic sequence request. For dedicated promoter and upstream retrieval with masking and redundancy filters, use the RSAT retrieve-ensembl-seq tool.

### How do I avoid duplicate sequences when a gene has multiple transcripts?

Work at the gene level with whole-gene genomic sequence, or apply a redundancy filter that removes overlapping sequence shared across isoforms. RSAT's retrieval tool includes this filter explicitly for genes with multiple transcripts.

### Is there a rate limit on the Ensembl REST API?

Yes, anonymous clients are limited to roughly 55 requests per minute, and exceeding the limit returns an HTTP 429 response. Use batch POST requests of up to a few hundred identifiers, add waits between calls in scripts, and cache responses so repeated runs do not refetch the same data.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the difference between cDNA, CDS, and genomic sequence in Ensembl?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "cDNA is the spliced transcript including UTRs, CDS is the coding region between the start and stop codons only, and genomic sequence is the unspliced chromosome region with introns. Pick cDNA for transcript-level work, CDS for codon-level work, and genomic for regulatory or mapping work."
      }
    },
    {
      "@type": "Question",
      "name": "How do I download transcript sequences for a list of many genes at once?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use BioMart in the browser, paste your identifier list into the Filters panel, select the cDNA attribute, and export FASTA. For scripts, use the REST API's POST form of /sequence/id, which accepts a JSON body containing your identifiers and returns all sequences in one call."
      }
    },
    {
      "@type": "Question",
      "name": "Why does my Ensembl transcript ID return an error or nothing?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The most likely cause is an identifier type mismatch, a retired or superseded ID from an older release, or a request for a sequence type that does not exist for that transcript, such as a peptide for a non-coding RNA. Check the ID prefix, look the ID up in the browser, and try an archive release if the ID came from an older publication."
      }
    },
    {
      "@type": "Question",
      "name": "How do I get a transcript sequence from an older Ensembl release?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use archive.ensembl.org in the browser, or pass the release number to useEnsembl in biomaRt through its version argument. Record the release in your methods, because transcript content and ID versions change between releases."
      }
    },
    {
      "@type": "Question",
      "name": "How do I download sequences for plants, fungi, or bacteria?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use Ensembl Genomes, the companion project for non-vertebrate species, which provides the same browser, BioMart, REST, and FTP interfaces under its own host and its own independent release numbering. Download the species FASTA files from the Ensembl Genomes FTP directories for the relevant division."
      }
    },
    {
      "@type": "Question",
      "name": "Can I download upstream promoter sequence from Ensembl?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes. In the genome browser, choose genomic sequence with flanking bases on the transcript page. With the REST API, add expand_5prime and expand_3prime parameters to a genomic sequence request. For dedicated promoter and upstream retrieval with masking and redundancy filters, use the RSAT retrieve-ensembl-seq tool."
      }
    },
    {
      "@type": "Question",
      "name": "How do I avoid duplicate sequences when a gene has multiple transcripts?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Work at the gene level with whole-gene genomic sequence, or apply a redundancy filter that removes overlapping sequence shared across isoforms. RSAT's retrieval tool includes this filter explicitly for genes with multiple transcripts."
      }
    },
    {
      "@type": "Question",
      "name": "Is there a rate limit on the Ensembl REST API?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, anonymous clients are limited to roughly 55 requests per minute, and exceeding the limit returns an HTTP 429 response. Use batch POST requests of up to a few hundred identifiers, add waits between calls in scripts, and cache responses so repeated runs do not refetch the same data."
      }
    }
  ]
}
</script>

## Sources

1. [Impact of GC content on gene expression pattern in chicken.](https://pubmed.ncbi.nlm.nih.gov/23557030/)
2. [TranscriptDB: a transcript-centric database to study eukaryotic transcript conservation and evolution.](https://pubmed.ncbi.nlm.nih.gov/39530236/)
3. [Web-based bioinformatics workflows for end-to-end RNA-seq data computation and analysis in agricultural animal species.](https://pubmed.ncbi.nlm.nih.gov/27678198/)
4. [CancerGenes: a gene selection resource for cancer genome projects.](https://pubmed.ncbi.nlm.nih.gov/17088289/)
5. [Chickspress: a resource for chicken gene expression.](https://pubmed.ncbi.nlm.nih.gov/31210271/)
6. [GeneSigDB--a curated database of gene expression signatures.](https://pubmed.ncbi.nlm.nih.gov/19934259/)
7. [Retrieve-ensembl-seq: user-friendly and large-scale retrieval of single or multi-genome sequences from Ensembl.](https://pubmed.ncbi.nlm.nih.gov/19720677/)
8. [Ensembl Genomes 2013: scaling up access to genome-wide data.](https://pubmed.ncbi.nlm.nih.gov/24163254/)
9. [Integrating multiple genome annotation databases improves the interpretation of microarray gene expression data.](https://pubmed.ncbi.nlm.nih.gov/20089164/)
10. [HapScoreDB: a database of protein language model functional scores for haplotype-resolved protein sequences.](https://pubmed.ncbi.nlm.nih.gov/41261743/)