Ensembl REST API
Free Ensembl REST API with no key: genome assemblies, gene and transcript lookups, sequences, variants and cross-species comparative genomics. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Ensembl REST API?
The Ensembl REST API is a free, key-free genomics API from EMBL-EBI. It provides gene, transcript and protein lookups, genomic sequences, variant and phenotype data, and comparative genomics across hundreds of vertebrate and other species.
Ensembl is one of the two main genome annotation resources in biology, and its REST API exposes essentially all of it. That includes the parts that are hard to do yourself: mapping coordinates between genome assemblies, retrieving orthologues and paralogues across species, and pulling variant consequence predictions through the VEP endpoint.
The endpoint below lists every species Ensembl carries and is the sensible starting point, because it tells you the exact assembly and `name` string each subsequent call expects. Also note the content negotiation model: Ensembl defaults to XML, so either send an `Accept: application/json` header or append `?content-type=application/json` as the example does. Forgetting this is the single most common first mistake with this API.
Quick facts
- Base URL
https://rest.ensembl.org- Authentication
- No API key or account. EMBL-EBI asks that automated users identify themselves with a contact address in the User-Agent.
- Rate limit
- 15 requests per second per IP, reported in `X-RateLimit-*` headers. POST endpoints accept batches and are the intended route for bulk work.
- Pricing
- Free. Ensembl data is released under a no-restriction open licence.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Ensembl REST API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. List every species in the current Ensembl release
GET https://rest.ensembl.org/info/species?content-type=application/json
curl 'https://rest.ensembl.org/info/species?content-type=application/json'const res = await fetch("https://rest.ensembl.org/info/species?content-type=application/json");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://rest.ensembl.org/info/species?content-type=application/json", timeout=20)
res.raise_for_status()
print(res.json()){
"species": [
{
"assembly": "Lepidothrix_coronata-1.0",
"common_name": "blue-crowned manakin",
"display_name": "Blue-crowned manakin",
"aliases": [],
"strain_collection": null,
"name": "lepidothrix_coronata",
"strain": null,
"taxon_id": "321398",
"accession": "GCA_001604755.1",
"release": 116,
"groups": [
"core",
"rnaseq",
"otherfeatures"
],
"division": "EnsemblVertebrates"
},
{
"strain_collection": null,
"common_name": "yellow-billed parrot",
"assembly": "ASM394721v1",
"display_name": "Yellow-billed parrot",
"aliases": [],
"accession": "GCA_003947215.1",
"groups": [
"core",
"rnaseq"
],
"release": 116,
"division": "EnsemblVertebrates",
"name": "amazona_collaria",
"strain": null,
"taxon_id": "241587"
},
{
"groups": [
"otherfeatures",
"rnaseq",
"core"
],
"division": "EnsemblVertebrates",
"release": 116,
"accession": "GCA_021556685.1",
"strain": "SHRSP/BbbUtx",
"name": "rattus_norvegicus_shrspbbbutx",
"taxon_id": "10116",
"strain_collection": null,
"assembly": "UTH_Rnor_SHRSP_BbbUtx_1.0",
"common_name": "Norway rat",
"display_name": "Rat - SHRSP/BbbUtx",
"aliases": []
},
{
"groups": [
"core",
"otherfeatures"
],
"division": "EnsemblVertebrates",
"release": 116,
"accession": "GCA_000151885.2",
"strain": nParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
content-type | query | Optional | Response format, since Ensembl defaults to XML. Use `application/json`, or send the equivalent `Accept` header. application/json |
species | path segment | Optional | Species name in Ensembl's lowercase underscore form, as returned by this endpoint. homo_sapiens |
id | path segment | Optional | A stable Ensembl identifier for a gene, transcript or protein. ENSG00000157764 |
expand | query | Optional | On lookup endpoints, include child objects such as transcripts and exons. 1 |
division | query | Optional | Restrict to one Ensembl division, for example `EnsemblVertebrates` or `EnsemblPlants`. EnsemblVertebrates |
Response fields
species[].namestring- The species identifier used by every other endpoint — lowercase with underscores, such as `homo_sapiens`.
species[].assemblystring- Genome assembly name. Coordinates are only meaningful relative to a specific assembly, so record this alongside any positions you store.
species[].accessionstring- INSDC assembly accession, which pins the exact assembly version.
species[].taxon_idstring- NCBI taxonomy identifier, useful for joining to other databases.
species[].releaseinteger- Ensembl release number the record belongs to.
species[].groupsarray- Which databases exist for the species — `core`, `variation`, `compara`, `rnaseq` and others. A missing group means those endpoints will not work for that species.
species[].divisionstring- Which Ensembl division the species belongs to.
What you can build with the Ensembl REST API
- Resolve a gene symbol to Ensembl identifiers and genomic coordinates
- Retrieve genomic, cDNA or protein sequence for a region or transcript
- Predict the consequences of variants with the VEP endpoint
- Find orthologues of a gene in other species for comparative analysis
Common errors and how to fix them
400
Unknown species, identifier or malformed region string.
Fix: Species names are lowercase with underscores. Regions use `chromosome:start..end` — a hyphen instead of the double dot fails.
429
Rate limit of 15 requests per second exceeded.
Fix: Read `X-RateLimit-Reset` and back off. Use the POST batch endpoints for bulk lookups rather than looping.
XML instead of JSON
No content type was negotiated.
Fix: Ensembl defaults to XML. Send `Accept: application/json` or add `?content-type=application/json`.
Ensembl REST API — frequently asked questions
Is the Ensembl REST API free?
Yes, free with no API key or registration. EMBL-EBI asks only that heavy automated users identify themselves with a contact address in the User-Agent header.
Why does Ensembl return XML instead of JSON?
XML is the default. Add `?content-type=application/json` to the query string or send an `Accept: application/json` header, and every endpoint returns JSON instead.
How do I find the right species name?
Call the species info endpoint. It returns the exact `name` string — lowercase with underscores, such as `homo_sapiens` — that every other endpoint expects, along with the assembly each species is annotated against.
What are the rate limits?
15 requests per second per IP, reported in `X-RateLimit-*` response headers. For bulk work use the POST variants of the lookup and sequence endpoints, which accept arrays of identifiers in a single call.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
Unified Diff Generator
Compare two texts and generate a real unified diff patch with @@ hunk headers and configurable context, ready to save as .patch and apply with git apply.
Ensembl REST is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.