alterlab-ensembl — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-ensembl (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Access and query the Ensembl genome database, a comprehensive resource for vertebrate genomic data maintained by EMBL-EBI. The database provides gene annotations, sequences, variants, regulatory information, and comparative genomics data for over 250 species. Current release is 116 (April 2026).
Heads-up (verified June 2026): Release 116 is the final release served by the classic REST API at https://rest.ensembl.org. The endpoint stays online with no announced sunset date but receives no further data updates; Ensembl's new platform replaces it with GraphQL and GA4GH refget for sequence access. For current research the REST API documented here still works; plan migration for long-lived pipelines.
This skill should be used when:
Query gene data by symbol, Ensembl ID, or external database identifiers.
Common operations:
Using the ensembl_rest package:
from ensembl_rest import EnsemblClient
client = EnsemblClient()
# Look up gene by symbol
gene_data = client.symbol_lookup(
species='human',
symbol='BRCA2'
)
# Get detailed gene information (method is lookup, NOT lookup_id)
gene_info = client.lookup(
'ENSG00000139618', # BRCA2 Ensembl ID
expand=True
)Direct REST API (no package):
import requests
server = "https://rest.ensembl.org"
# Symbol lookup
response = requests.get(
f"{server}/lookup/symbol/homo_sapiens/BRCA2",
headers={"Content-Type": "application/json"}
)
gene_data = response.json()Fetch genomic, transcript, or protein sequences in various formats (JSON, FASTA, plain text).
Operations:
Example:
# Using ensembl_rest package
sequence = client.sequence_id(
id='ENSG00000139618', # Gene ID
content_type='application/json'
)
# Get sequence for a genomic region
region_seq = client.sequence_region(
species='human',
region='7:140424943-140624564' # chromosome:start-end
)Query genetic variation data and predict variant consequences using the Variant Effect Predictor (VEP).
Capabilities:
VEP example:
# Predict variant consequences (GET variant is vep_hgvs_get; POST batch is vep_hgvs_post)
vep_result = client.vep_hgvs_get(
species='human',
hgvs_notation='ENST00000380152.7:c.803C>T'
)
# Query variant by rsID
variant = client.variation_id(
species='human',
id='rs699'
)Perform cross-species comparisons to identify orthologs, paralogs, and evolutionary relationships.
Operations:
Example:
# Find orthologs for a human gene
orthologs = client.homology_ensemblgene(
id='ENSG00000139618', # Human BRCA2
target_species='mouse'
)
# Get gene tree
gene_tree = client.genetree_member_symbol(
species='human',
symbol='BRCA2'
)Find all genomic features (genes, transcripts, regulatory elements) in a specific region.
Use cases:
Example:
# Find all features in a region
features = client.overlap_region(
species='human',
region='7:140424943-140624564',
feature='gene'
)Convert coordinates between different genome assemblies (e.g., GRCh37 to GRCh38).
Important: Use https://grch37.rest.ensembl.org for GRCh37/hg19 queries and https://rest.ensembl.org for current assemblies.
Example:
from ensembl_rest import AssemblyMapper
# Map coordinates from GRCh37 to GRCh38.
# AssemblyMapper prefetches the whole-assembly mapping on init (slow once,
# then fast for repeated point lookups). map() takes a single position.
mapper = AssemblyMapper(
from_assembly='GRCh37',
to_assembly='GRCh38',
species='human'
)
mapped_pos = mapper.map(chrom='7', pos=140453136)
# For one-off lookups, the direct REST endpoint is simpler:
# GET /map/human/GRCh37/7:140453136..140453136/GRCh38The Ensembl REST API has rate limits. Follow these practices:
Retry-After header and waitAlways implement proper error handling:
import requests
import time
def query_ensembl(endpoint, params=None, max_retries=3):
server = "https://rest.ensembl.org"
headers = {"Content-Type": "application/json"}
for attempt in range(max_retries):
response = requests.get(
f"{server}{endpoint}",
headers=headers,
params=params
)
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
# Rate limited - wait and retry
retry_after = int(response.headers.get('Retry-After', 1))
time.sleep(retry_after)
else:
response.raise_for_status()
raise Exception(f"Failed after {max_retries} attempts")uv pip install 'ensembl_rest==0.3.4' # latest release: Oct 2023The ensembl_rest package (Ad115/EnsemblRest) wraps the REST endpoints, but it is a thin, unmaintained-since-2023 wrapper. The bundled scripts/ensembl_query.py uses plain requests instead and is the recommended path — it adds rate limiting and retry handling the package lacks.
Method-naming gotcha: the package auto-generates each method name from the last segment of the endpoint's documentation URL, which is often reversed from the REST path. This trips people up:
| REST endpoint | EnsemblClient method |
|---|---|
GET /lookup/symbol/... | symbol_lookup |
GET /lookup/id/... | lookup (NOT lookup_id) |
GET /info/assembly/... | assembly_info (NOT info_assembly) |
GET /info/species | species |
GET /vep/:species/hgvs/... | vep_hgvs_get (POST batch: vep_hgvs_post) |
GET /sequence/id/... | sequence_id |
GET /homology/id/... | homology_ensemblgene |
When unsure, prefer the direct REST call — the path is unambiguous.
No installation needed - use standard HTTP libraries like requests:
uv pip install requestsapi_endpoints.md: Comprehensive documentation of all 17 API endpoint categories with examples and parametersensembl_query.py: Reusable Python script for common Ensembl queries with built-in rate limiting and error handlingTo query available species and assemblies:
# List all available species (method is species, for GET /info/species)
species_list = client.species()
# Get assembly information for a species (method is assembly_info, for GET /info/assembly/:species)
assembly_info = client.assembly_info(species='human')Common species identifiers:
homo_sapiens or humanmus_musculus or mousedanio_rerio or zebrafishdrosophila_melanogaster~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.