> ## Documentation Index
> Fetch the complete documentation index at: https://proto.evodesign.org/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Ensembl

> [Ensembl](https://www.ensembl.org/) is a genome annotation resource for vertebrate and model-organism genomes, providing genes, transcripts, exons, regulatory features, cross-references, and variant annotation, maintained by [EMBL-EBI](https://www.ebi.ac.uk/). This toolkit exposes five tools over the [Ensembl REST API](https://rest.ensembl.org/), namely `ensembl-lookup` (gene record by Ensembl ID or symbol), `ensembl-sequence` (DNA, cDNA, CDS, or protein sequence), `ensembl-overlap` (features overlapping a region), `ensembl-xrefs` (external-database identifiers), and `ensembl-vep` (per-transcript variant consequences from HGVS).

<div class="page-hero"><img class="page-hero-banner" src="https://proto-bio.github.io/proto-assets/images/tool/ensembl/hero.png" alt="Ensembl" /><div class="tool-org-badges page-hero-badges"><a href="/docs/tools/organizations/embl-ebi" class="tool-org-badge" style={{background: "#007C82"}} title="EMBL-EBI"><img src="https://mintcdn.com/bio-pro/UeudeF7pW-Dj-pIN/assets/images/cached/d6be4d3bc893.png?fit=max&auto=format&n=UeudeF7pW-Dj-pIN&q=85&s=3f3eaae432293c6ed9a25a58e369baa3" alt="" class="tool-org-badge-logo" width="200" height="200" data-path="assets/images/cached/d6be4d3bc893.png" /> EMBL-EBI</a></div></div>

<Note>
  **License:** Ensembl retrieves data from the Ensembl project, distributed under the EMBL-EBI Terms of Use. Attribution to the Ensembl project is required when the data is redistributed. The client wrapper code is MIT-licensed. Please refer to [the data terms](https://www.ebi.ac.uk/about/terms-of-use/) for full terms.
</Note>

<p class="entity-disclaimer">Proto is not affiliated with EMBL-EBI. This toolkit is open source and builds on the implementation produced by this organization. Product names, logos, and trademarks are the property of their respective owners.</p>

<hr class="entity-rule" />

<input type="radio" name="tab-ensembl" id="none-ensembl" class="tab-radio-input" />

<input type="radio" name="tab-ensembl" id="github-ensembl" class="tab-radio-input" defaultChecked />

<input type="radio" name="tab-ensembl" id="website-ensembl" class="tab-radio-input" />

<input type="radio" name="tab-ensembl" id="paper-ensembl" class="tab-radio-input" />

<input type="radio" name="tab-ensembl" id="cite-ensembl" class="tab-radio-input" />

<input type="radio" name="tab-ensembl" id="source-ensembl" class="tab-radio-input" />

<input type="radio" name="tab-ensembl" id="notebook-ensembl" class="tab-radio-input" />

<input type="radio" name="tab-ensembl" id="proto-ensembl" class="tab-radio-input" />

<div class="tool-tab-bar">
  <span class="tool-tab-wrap"><label for="github-ensembl" class="tool-tab tab-open badge-github"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> GitHub</label><label for="none-ensembl" class="tool-tab tab-close badge-github"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> GitHub</label></span> <span class="tool-tab-wrap"><label for="website-ensembl" class="tool-tab tab-open badge-website"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg> Website</label><label for="none-ensembl" class="tool-tab tab-close badge-website"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg> Website</label></span> <span class="tool-tab-wrap"><label for="paper-ensembl" class="tool-tab tab-open badge-paper"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" /></svg> Publication</label><label for="none-ensembl" class="tool-tab tab-close badge-paper"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" /></svg> Publication</label></span> <span class="tool-tab-wrap"><label for="cite-ensembl" class="tool-tab tab-open badge-cite"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z" /><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z" /></svg> Cite</label><label for="none-ensembl" class="tool-tab tab-close badge-cite"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z" /><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z" /></svg> Cite</label></span> <span class="tool-tab-wrap"><label for="source-ensembl" class="tool-tab tab-open badge-source"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Tool Source</label><label for="none-ensembl" class="tool-tab tab-close badge-source"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Tool Source</label></span> <span class="tool-tab-wrap"><label for="notebook-ensembl" class="tool-tab tab-open badge-notebook"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /></svg> Open as Notebook</label><label for="none-ensembl" class="tool-tab tab-close badge-notebook"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /></svg> Open as Notebook</label></span> <span class="tool-tab-wrap"><label for="proto-ensembl" class="tool-tab tab-open badge-proto"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" /></svg> Open on Proto</label><label for="none-ensembl" class="tool-tab tab-close badge-proto"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" /></svg> Open on Proto</label></span>
</div>

<a href="https://github.com/Ensembl/ensembl-rest" target="_blank" class="tab-panel github-panel" data-tab="github-ensembl">
  <div class="gh-card-wrap">
    <img src="https://opengraph.githubassets.com/1/Ensembl/ensembl-rest" class="gh-card-img img-fallback" alt="Ensembl/ensembl-rest" />

    <div class="gh-card-fallback">
      <div class="gh-fallback-org"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> Ensembl/ensembl-rest</div>
    </div>
  </div>

  <span class="panel-goto-btn gh-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> View repo</span></span>
</a>

<a href="https://www.ensembl.org/" target="_blank" class="tab-panel website-panel" data-tab="website-ensembl">
  <div class="website-info">
    <img src="https://www.google.com/s2/favicons?domain=ensembl.org&sz=32" class="website-favicon" width="24" height="24" />

    <span class="website-url">ensembl.org</span>
  </div>

  <span class="panel-goto-btn website-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg> Visit website</span></span>
</a>

<a href="https://doi.org/10.1093/nar/gkae1071" target="_blank" class="tab-panel paper-panel" data-tab="paper-ensembl">
  <div class="paper-info">
    <div class="paper-title">Ensembl 2025</div>
    <div class="paper-meta">Sarah C. Dyer, Olanrewaju Austine-Orimoloye, ... Vianey Paola Barrera-Enriquez</div>
    <div class="paper-meta paper-venue">Nucleic Acids Research (2025)</div>
  </div>

  <span class="panel-goto-btn pub-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" /></svg> Read paper</span></span>
</a>

<div class="tab-panel cite-panel" data-tab="cite-ensembl">
  <div class="cite-code-wrap">
    ```bibtex theme={null}
    @article{dyer2025ensembl,
      title={{Ensembl} 2025},
      author={Dyer, Sarah C. and Austine-Orimoloye, Olanrewaju and Azov, Andrey G. and Barba, Matthieu and Barnes, If and Barrera-Enriquez, Vianey Paola and others},
      journal={Nucleic Acids Research},
      volume={53},
      number={D1},
      pages={D948--D957},
      year={2025},
      publisher={Oxford University Press},
      doi={10.1093/nar/gkae1071}
    }
    ```
  </div>

  <span class="panel-goto-btn cite-copy-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z" /><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z" /></svg> Copy citation</span></span>
</div>

<a href="https://github.com/evo-design/proto-tools/tree/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl" target="_blank" class="tab-panel source-panel" data-tab="source-ensembl">
  <div class="source-info">
    <img src="https://github.com/evo-design.png?size=40" class="source-avatar" width="36" height="36" />

    <span class="source-path">evo-design/proto-tools<span class="source-subpath">/proto\_tools/tools/database\_retrieval/ensembl</span></span>
  </div>

  <span class="panel-goto-btn source-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> View source</span></span>
</a>

<a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/examples/example.ipynb" target="_blank" class="tab-panel notebook-panel" data-tab="notebook-ensembl">
  <div class="notebook-info">
    <span class="notebook-icon">
      <svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
        <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" />

        <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" />
      </svg>
    </span>

    <span class="notebook-label">Open Notebook</span>
  </div>

  <span class="panel-goto-btn notebook-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /></svg> Open notebook</span></span>
</a>

<div class="tab-panel proto-panel" data-tab="proto-ensembl">
  <div class="proto-info">
    <div class="proto-cloud">
      <svg class="proto-cloud-bg" viewBox="0 0 640 512" xmlns="http://www.w3.org/2000/svg">
        <path d="M0 336c0 79.5 64.5 144 144 144H512c70.7 0 128-57.3 128-128c0-61.9-44-113.6-102.4-125.4c4.1-10.7 6.4-22.4 6.4-34.6c0-53-43-96-96-96c-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32C167.6 32 96 103.6 96 192c0 2.7 .1 5.4 .2 8.1C40.2 219.8 0 273.2 0 336z" />
      </svg>

      <img noZoom src="https://mintcdn.com/bio-pro/KVh0EKV-IKblvXR8/assets/logo/evo-logo-light.svg?fit=max&auto=format&n=KVh0EKV-IKblvXR8&q=85&s=0cb66034ba45618505501aee6ea5f5c1" class="proto-panel-logo block dark:hidden" alt="Proto" width="198" height="151" data-path="assets/logo/evo-logo-light.svg" />

      <img noZoom src="https://mintcdn.com/bio-pro/KVh0EKV-IKblvXR8/assets/logo/evo-logo-dark.svg?fit=max&auto=format&n=KVh0EKV-IKblvXR8&q=85&s=2c9e23a14635e60384a434e220788f54" class="proto-panel-logo hidden dark:block" alt="Proto" width="198" height="151" data-path="assets/logo/evo-logo-dark.svg" />
    </div>
  </div>

  <div class="proto-actions">
    <a href="https://proto.evodesign.org/tools/ensembl-lookup" target="_blank" class="proto-action-btn"><span>Ensembl Lookup</span><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" /></svg></a>
    <a href="https://proto.evodesign.org/tools/ensembl-overlap" target="_blank" class="proto-action-btn"><span>Ensembl Overlap</span><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" /></svg></a>
    <a href="https://proto.evodesign.org/tools/ensembl-sequence" target="_blank" class="proto-action-btn"><span>Ensembl Sequence</span><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" /></svg></a>
    <a href="https://proto.evodesign.org/tools/ensembl-vep" target="_blank" class="proto-action-btn"><span>Ensembl VEP</span><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" /></svg></a>
    <a href="https://proto.evodesign.org/tools/ensembl-xrefs" target="_blank" class="proto-action-btn"><span>Ensembl Xrefs</span><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" /></svg></a>
  </div>
</div>

<div class="entity-contributors"><span class="entity-contributors-label">Toolkit contributors</span><span class="entity-contributors-people"><a class="entity-contributor" href="https://github.com/bviggiano" target="_blank" rel="noopener" title="bviggiano: 9 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/21143637?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">bviggiano</span></a><a class="entity-contributor" href="https://github.com/dguo8412" target="_blank" rel="noopener" title="dguo8412: 5 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/46211285?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">dguo8412</span></a><a class="entity-contributor" href="https://github.com/leba01" target="_blank" rel="noopener" title="leba01: 1 commit"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/124846286?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">leba01</span></a></span></div>

| Function                 | Description                                                                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------------ | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `run_ensembl_lookup()`   | Look up an Ensembl gene record by Ensembl gene ID or gene symbol                                     | <a href="#api-run-ensembl-lookup" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_lookup.py#L178" target="_blank" class="func-table-btn func-source-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>     |
| `run_ensembl_overlap()`  | Fetch features overlapping an Ensembl region (default: gene; supports exon, regulatory, motif, va... | <a href="#api-run-ensembl-overlap" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_overlap.py#L177" target="_blank" class="func-table-btn func-source-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>   |
| `run_ensembl_sequence()` | Fetch DNA / cDNA / CDS / protein sequence for an Ensembl ID                                          | <a href="#api-run-ensembl-sequence" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_sequence.py#L212" target="_blank" class="func-table-btn func-source-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a> |
| `run_ensembl_vep()`      | Predict variant consequences from an HGVS notation via Ensembl's Variant Effect Predictor REST en... | <a href="#api-run-ensembl-vep" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_vep.py#L405" target="_blank" class="func-table-btn func-source-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>           |
| `run_ensembl_xrefs()`    | Fetch cross-references from an Ensembl ID to external databases                                      | <a href="#api-run-ensembl-xrefs" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_xrefs.py#L163" target="_blank" class="func-table-btn func-source-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>       |

## Background

[Ensembl](https://www.ensembl.org/) ([Dyer et al., 2025](https://doi.org/10.1093/nar/gkae1071)) is a genome annotation resource maintained by [EMBL-EBI](https://www.ebi.ac.uk/). It integrates gene and transcript models, the [Ensembl Regulatory Build](https://www.ensembl.org/info/genome/funcgen/regulatory_build.html), cross-references to external databases, and variant consequence prediction with the [Variant Effect Predictor](https://www.ensembl.org/info/docs/tools/vep/index.html) (VEP) for human and other supported species. Coordinates returned by Ensembl are 1-indexed and inclusive, to match biological residue selection conventions.

Each tool issues a single HTTP GET to the [Ensembl REST API](https://rest.ensembl.org/), whose base URL is `https://rest.ensembl.org` for the [GRCh38](https://www.ncbi.nlm.nih.gov/grc/human) assembly. Setting `assembly="GRCh37"` routes requests to `https://grch37.rest.ensembl.org` instead. The endpoints used are `/lookup/id/{id}` and `/lookup/symbol/{species}/{symbol}` for `ensembl-lookup`, `/sequence/id/{id}` for `ensembl-sequence`, `/overlap/id/{id}` for `ensembl-overlap`, `/xrefs/id/{id}` for `ensembl-xrefs`, and `/vep/{species}/hgvs/{hgvs}` for `ensembl-vep`. Responses are parsed into typed Pydantic records, with the full upstream JSON preserved alongside in a `raw_payload` field. PascalCase keys such as `Transcript`, `Exon`, and `Translation` are kept verbatim so records round-trip cleanly. Results reflect the live Ensembl database at query time rather than a fixed release snapshot.

### Learning Resources

* [Ensembl REST API documentation](https://rest.ensembl.org/) (Ensembl) - the live endpoint reference with request parameters, response shapes, and an interactive console.
* [Ensembl and the Ensembl REST API](https://www.ebi.ac.uk/training/services/ensembl) (EMBL-EBI Training) - guided courses on Ensembl data and programmatic access.

## Tools

<a name="api-run-ensembl-lookup" />

<div class="tool-section-card tool-section-card--lookup">
  ### Ensembl Lookup (`ensembl-lookup`)

  Retrieves a single gene record, either directly by Ensembl gene ID or by gene symbol scoped to a species, returning the typed `EnsemblGene` (identifier, symbol, biotype, genomic coordinates, canonical transcript) plus the source URL and raw payload. With `expand` enabled, the response includes the nested transcript, translation, and exon hierarchy.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_lookup.py#L41" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Input: EnsemblLookupInput">
      <ParamField path="ensembl_id" type="string">
        Ensembl gene ID (e.g. `ENSG...`).
      </ParamField>

      <ParamField path="symbol" type="string">
        Gene symbol (e.g. `BRCA1`).
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_lookup.py#L67" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Config: EnsemblLookupConfig">
      <ParamField path="species" type="enum" default="homo_sapiens">
        Species slug used when `symbol` is the input. Default `homo_sapiens`.

        Available options: `homo_sapiens`, `mus_musculus`, `rattus_norvegicus`, `danio_rerio`, `saccharomyces_cerevisiae`
      </ParamField>

      <ParamField path="assembly" type="enum" default="GRCh38">
        Genome assembly. `GRCh38` (default) calls `rest.ensembl.org`; `GRCh37` calls `grch37.rest.ensembl.org`.

        Available options: `GRCh38`, `GRCh37`
      </ParamField>

      <ParamField path="expand" type="boolean" default="False">
        Include transcripts, translations, and exons in the response. Default `False` matches Ensembl REST.
      </ParamField>

      <ParamField path="mane" type="boolean" default="False">
        Include MANE Select annotations (`/lookup/id` only; requires `expand=True`).
      </ParamField>

      <ParamField path="phenotypes" type="boolean" default="False">
        Include phenotype annotations on gene records (`/lookup/id` only).
      </ParamField>

      <ParamField path="utr" type="boolean" default="False">
        Include UTR coordinates per transcript (`/lookup/id` only; requires `expand=True`).
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_lookup.py#L114" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Output: EnsemblLookupOutput">
      <ResponseField name="result" type="EnsemblGene" required>
        The looked-up gene record.

        <Expandable title="EnsemblGene">
          <ResponseField name="id" type="string" required>
            Ensembl gene ID (ENSG...).
          </ResponseField>

          <ResponseField name="display_name" type="string">
            Human-readable gene symbol (e.g. 'BRCA1').
          </ResponseField>

          <ResponseField name="description" type="string">
            Free-text description.
          </ResponseField>

          <ResponseField name="biotype" type="string" required>
            Gene biotype (protein\_coding, lncRNA, ...).
          </ResponseField>

          <ResponseField name="species" type="string" required>
            Species slug (e.g. 'homo\_sapiens').
          </ResponseField>

          <ResponseField name="seq_region_name" type="string" required>
            Chromosome / contig name.
          </ResponseField>

          <ResponseField name="start" type="integer" required>
            1-indexed inclusive genomic start.
          </ResponseField>

          <ResponseField name="end" type="integer" required>
            1-indexed inclusive genomic end.
          </ResponseField>

          <ResponseField name="strand" type="integer" required>
            +1 or -1.
          </ResponseField>

          <ResponseField name="assembly_name" type="string" required>
            Genome assembly name.
          </ResponseField>

          <ResponseField name="canonical_transcript" type="string">
            Canonical transcript ID with version.
          </ResponseField>

          <ResponseField name="Transcript" type="List[EnsemblTranscript]">
            Transcripts (PascalCase preserved from API); empty when `expand=False`.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="source_url" type="string" required>
        Final Ensembl REST URL that was hit.
      </ResponseField>

      <ResponseField name="raw_payload" type="Dict[string, any]">
        Raw API JSON.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  Use this to resolve a gene of interest as the entry point of nearly any Ensembl workflow. Convert a gene symbol such as `BRCA1` into its stable Ensembl gene ID, read off the canonical transcript and genomic coordinates for downstream transcriptomics, GWAS annotation, or sequence retrieval with [`ensembl-sequence`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl), or expand the transcript-and-exon hierarchy for splice-isoform analysis. The returned gene ID also feeds [`ensembl-overlap`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl) and [`ensembl-xrefs`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl).

  #### Usage Tips

  * **Provide exactly one of `ensembl_id` or `symbol`.** Supplying both or neither raises a validation error. A symbol lookup also requires `config.species` to disambiguate.
  * **Nested transcripts and exons are absent unless `expand` is set.** The default matches Ensembl REST and returns the gene record only, so request expansion explicitly when you need the transcript or exon hierarchy.
  * **`mane`, `phenotypes`, and `utr` apply only to ID-based lookup.** They are sent only on the `/lookup/id` path and are ignored for a symbol lookup. `mane` and `utr` additionally require `expand`.

  <a name="api-run-ensembl-sequence" />
</div>

<div class="tool-section-card">
  ### Ensembl Sequence (`ensembl-sequence`)

  Retrieves the sequence for an Ensembl gene, transcript, or protein ID and returns one or more `EnsemblSequence` records (stable ID, description, molecule type, sequence string) alongside the source URL and raw payload.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_sequence.py#L41" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Input: EnsemblSequenceInput">
      <ParamField path="ensembl_id" type="string" required>
        Ensembl ID (`ENSG...`, `ENST...`, or `ENSP...`).
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_sequence.py#L59" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Config: EnsemblSequenceConfig">
      <ParamField path="sequence_type" type="enum" default="genomic">
        What to return — `genomic` (DNA + UTRs + introns), `cdna` (spliced mRNA + UTRs), `cds` (spliced coding only), `protein` (translation).

        Available options: `genomic`, `cdna`, `cds`, `protein`
      </ParamField>

      <ParamField path="assembly" type="enum" default="GRCh38">
        Genome assembly. `GRCh38` (default) or `GRCh37`.

        Available options: `GRCh38`, `GRCh37`
      </ParamField>

      <ParamField path="multiple_sequences" type="boolean" default="False">
        Return all sequences when an ID maps to multiple records (e.g. patches, alternative haplotypes).
      </ParamField>

      <ParamField path="mask" type="string">
        Mask repeats in the returned sequence. `hard` replaces with `N`; `soft` lowercases. Genomic sequence\_type only; mutually exclusive with mask\_feature.
      </ParamField>

      <ParamField path="mask_feature" type="boolean" default="False">
        Mask introns (when `sequence_type='genomic'`) or UTRs (when `sequence_type='cdna'`) so the primary feature stands out. Mutually exclusive with `mask`.
      </ParamField>

      <ParamField path="expand_3prime" type="integer">
        Bases to add to the 3' end (genomic only, incompatible with `end`).
      </ParamField>

      <ParamField path="expand_5prime" type="integer">
        Bases to add to the 5' end (genomic only, incompatible with `start`).
      </ParamField>

      <ParamField path="start" type="integer">
        1-indexed start trim coordinate (incompatible with `expand_5prime`).
      </ParamField>

      <ParamField path="end" type="integer">
        1-indexed end trim coordinate (incompatible with `expand_3prime`).
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_sequence.py#L144" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Output: EnsemblSequenceOutput">
      <ResponseField name="results" type="List[EnsemblSequence]">
        Fetched sequence record(s). Length 1 unless `multiple_sequences=True` and the ID maps to more than one.

        <Expandable title="EnsemblSequence">
          <ResponseField name="id" type="string" required>
            Stable ID echoed by the server. May differ from the input ID — for example, an ENST input with `type=protein` resolves to the corresponding ENSP.
          </ResponseField>

          <ResponseField name="desc" type="string">
            Description string returned by the server.
          </ResponseField>

          <ResponseField name="mol_type" type="string">
            Molecule type ('dna' / 'protein' / ...).
          </ResponseField>

          <ResponseField name="seq" type="string" required>
            The raw sequence string.
          </ResponseField>

          <ResponseField name="molecule" type="string">
            Molecule type ('dna', 'protein', ...)
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="source_url" type="string" required>
        Final Ensembl REST URL that was hit.
      </ResponseField>

      <ResponseField name="raw_payload" type="List[Dict[string, any]]">
        Raw API JSON, always wrapped in a list.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  Use this to retrieve a reference sequence at gene, transcript, or protein granularity for any downstream analysis. Fetch the spliced mRNA or coding sequence of a canonical transcript resolved by [`ensembl-lookup`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl) for primer design, codon-usage analysis, or sequence comparison, pull the genomic span with introns for promoter or splice-site studies, or obtain the protein translation for multiple-sequence alignment or structure prediction. Repeat masking and feature masking support cis-element and intron-aware analyses.

  #### Usage Tips

  * **The returned `id` may differ from the input ID.** Requesting a protein sequence for a transcript ID resolves to the corresponding protein ID, so read the record's `id` rather than assuming it echoes the input.
  * **`mask` and `mask_feature` are mutually exclusive, as are the expand and trim pairs.** Setting both masks, or both `expand_5prime` and `start`, or both `expand_3prime` and `end`, raises a validation error.
  * **Repeat masking and span expansion apply to genomic sequence only.** They have no effect on `cdna`, `cds`, or `protein` requests.
  * **Set `multiple_sequences` when an ID maps to more than one record.** Without it, IDs that resolve to multiple sequences (patches, alternative haplotypes) return only the first.

  <a name="api-run-ensembl-overlap" />
</div>

<div class="tool-section-card">
  ### Ensembl Overlap (`ensembl-overlap`)

  Retrieves features overlapping the genomic region of a given Ensembl ID and returns a list of `EnsemblOverlapFeatureRecord` entries, each exposing the common typed fields (feature type, identifier, biotype, coordinates, strand, region) plus a `raw` dict carrying the full upstream record.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_overlap.py#L44" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Input: EnsemblOverlapInput">
      <ParamField path="ensembl_id" type="string" required>
        Ensembl ID whose region to query for overlapping features.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_overlap.py#L62" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Config: EnsemblOverlapConfig">
      <ParamField path="overlap_feature" type="enum" default="gene">
        Type of feature to retrieve (e.g. gene, transcript, exon, regulatory, variation).

        Available options: `band`, `gene`, `transcript`, `cds`, `exon`, `repeat`, `simple`, `misc`, `variation`, `somatic_variation`, `structural_variation`, `somatic_structural_variation`, `constrained`, `regulatory`, `motif`, `mane`
      </ParamField>

      <ParamField path="assembly" type="enum" default="GRCh38">
        Genome assembly. `GRCh38` (default) or `GRCh37`.

        Available options: `GRCh38`, `GRCh37`
      </ParamField>

      <ParamField path="biotype" type="string">
        Restrict to a biotype (e.g. `protein_coding`); most useful when `overlap_feature` is `gene` or `transcript`.
      </ParamField>

      <ParamField path="so_term" type="string">
        Restrict variation features by Sequence Ontology consequence (e.g. `missense_variant`).
      </ParamField>

      <ParamField path="variant_set" type="string">
        Restrict variation features to a named variant set (e.g. `ClinVar`).
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_overlap.py#L104" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Output: EnsemblOverlapOutput">
      <ResponseField name="result" type="List[EnsemblOverlapFeatureRecord]">
        Features overlapping the queried region; each carries the full upstream dict in `raw` for feature-specific keys.

        <Expandable title="EnsemblOverlapFeatureRecord">
          <ResponseField name="feature_type" type="string" required>
            Feature type ('gene', 'transcript', 'exon', 'regulatory', 'motif', 'variation', ...).
          </ResponseField>

          <ResponseField name="id" type="string">
            Feature ID where the API returns one.
          </ResponseField>

          <ResponseField name="biotype" type="string">
            Biotype where applicable.
          </ResponseField>

          <ResponseField name="start" type="integer" required>
            1-indexed inclusive genomic start.
          </ResponseField>

          <ResponseField name="end" type="integer" required>
            1-indexed inclusive genomic end.
          </ResponseField>

          <ResponseField name="strand" type="integer" required>
            +1, -1, or 0 for unstranded features.
          </ResponseField>

          <ResponseField name="seq_region_name" type="string" required>
            Chromosome / contig name.
          </ResponseField>

          <ResponseField name="raw" type="Dict[string, any]">
            Full upstream record for feature-specific fields.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="source_url" type="string" required>
        Final Ensembl REST URL that was hit.
      </ResponseField>

      <ResponseField name="raw_payload" type="List[Dict[string, any]]">
        Raw API JSON.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  Use this to annotate a genomic locus by listing what overlaps it. Identify which gene or transcript contains a GWAS hit, ChIP-seq peak, or ATAC-seq peak, enumerate the regulatory-build features (promoters, enhancers, transcription-factor binding sites) within a region for functional-genomics analysis, or pull overlapping variants filtered to a named set such as ClinVar to ask whether the region is clinically annotated. The locus is typically obtained from [`ensembl-lookup`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl).

  #### Usage Tips

  * **Records are typed only on the common fields. Feature-specific keys live in `raw`.** Different feature classes return divergent payload shapes, so read per-feature attributes from each record's `raw` dict.
  * **`biotype` is most meaningful for gene and transcript features.** It filters those classes. Pairing it with unrelated feature types is unlikely to narrow results.
  * **`so_term` and `variant_set` apply to variation features.** They have no effect when the feature class is not a variation type.

  <a name="api-run-ensembl-xrefs" />
</div>

<div class="tool-section-card">
  ### Ensembl Xrefs (`ensembl-xrefs`)

  Resolves an Ensembl ID to its external-database cross-references and returns a list of `EnsemblXref` records (external database name, display and primary identifiers, description, cross-reference type) plus the source URL and raw payload.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_xrefs.py#L41" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Input: EnsemblXrefsInput">
      <ParamField path="ensembl_id" type="string" required>
        Ensembl ID for direct cross-reference lookup.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_xrefs.py#L59" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Config: EnsemblXrefsConfig">
      <ParamField path="assembly" type="enum" default="GRCh38">
        Genome assembly. `GRCh38` (default) or `GRCh37`.

        Available options: `GRCh38`, `GRCh37`
      </ParamField>

      <ParamField path="all_levels" type="boolean" default="False">
        Fan out to transcripts and translations. On a gene query this also returns xrefs from each child transcript and protein.
      </ParamField>

      <ParamField path="external_db" type="string">
        Restrict to one external database (e.g. `UniProtKB/Swiss-Prot`, `HGNC`).
      </ParamField>

      <ParamField path="object_type" type="string">
        Restrict to one feature type when the stable ID resolves ambiguously.
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_xrefs.py#L95" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Output: EnsemblXrefsOutput">
      <ResponseField name="result" type="List[EnsemblXref]">
        Cross-reference records to external databases (UniProt, EntrezGene, RefSeq, ...).

        <Expandable title="EnsemblXref">
          <ResponseField name="dbname" type="string" required>
            External database name (e.g. 'Uniprot\_gn', 'EntrezGene').
          </ResponseField>

          <ResponseField name="db_display_name" type="string">
            Human-readable DB name.
          </ResponseField>

          <ResponseField name="display_id" type="string" required>
            Display identifier in the external DB.
          </ResponseField>

          <ResponseField name="primary_id" type="string" required>
            Primary identifier in the external DB.
          </ResponseField>

          <ResponseField name="description" type="string">
            External-DB description.
          </ResponseField>

          <ResponseField name="info_type" type="string">
            Cross-reference type ('DIRECT', 'DEPENDENT', ...).
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="source_url" type="string" required>
        Final Ensembl REST URL that was hit.
      </ResponseField>

      <ResponseField name="raw_payload" type="List[Dict[string, any]]">
        Raw API JSON.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  Use this to convert identifiers between Ensembl and the other major sequence, gene, and protein resources. Map an Ensembl gene or protein to a UniProt accession before fetching its entry with [`uniprot-fetch`](https://bio-pro.mintlify.app/tools/database-retrieval/uniprot), which then bridges through to PDB structures via SIFTS, recover EntrezGene or RefSeq identifiers for NCBI-side retrieval, or follow GO and InterPro cross-references for functional annotation. The Ensembl ID is commonly produced by [`ensembl-lookup`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl).

  #### Usage Tips

  * **Filter on `dbname` in the result, not just `external_db`.** A single query can return several UniProt-related and RefSeq-related entries, so select the row by its `dbname` rather than assuming one record per database.
  * **`all_levels` changes result scope on gene queries.** It fans cross-references out to child transcripts and translations, which can substantially enlarge the result.
  * **Set `object_type` when a stable ID resolves ambiguously.** It restricts results to one feature type when the ID could map to a gene, transcript, or translation.

  <a name="api-run-ensembl-vep" />
</div>

<div class="tool-section-card">
  ### Ensembl VEP (`ensembl-vep`)

  Submits an HGVS notation to the Ensembl Variant Effect Predictor REST endpoint and returns a list of `EnsemblVEPConsequence` records (echoed input, most severe consequence as a Sequence Ontology term, region and coordinates, allele string, raw per-transcript consequences, co-located variants) plus a derived `num_consequences` count.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_vep.py#L123" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Input: EnsemblVEPInput">
      <ParamField path="hgvs" type="string" required>
        HGVS notation. Genomic (e.g. `9:g.22125504G>C`), coding (`ENST00000357654:c.5074G>A`), or protein (`ENSP00000418960:p.Tyr124Cys`) forms all work.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_vep.py#L212" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Config: EnsemblVEPConfig">
      <ParamField path="species" type="enum" default="homo_sapiens">
        Species slug. Default `homo_sapiens`.

        Available options: `homo_sapiens`, `mus_musculus`, `rattus_norvegicus`, `danio_rerio`, `saccharomyces_cerevisiae`
      </ParamField>

      <ParamField path="assembly" type="enum" default="GRCh38">
        Genome assembly. `GRCh38` (default) or `GRCh37`.

        Available options: `GRCh38`, `GRCh37`
      </ParamField>

      <ParamField path="annotations" type="EnsemblVEPAnnotationConfig">
        Collapsible group of species-agnostic annotation toggles.

        <Expandable title="EnsemblVEPAnnotationConfig">
          <ParamField path="canonical" type="boolean" default="False">
            Mark canonical Ensembl transcripts in each consequence record.
          </ParamField>

          <ParamField path="hgvs" type="boolean" default="False">
            Include HGVS notation per consequence.
          </ParamField>

          <ParamField path="protein" type="boolean" default="False">
            Include Ensembl protein identifiers.
          </ParamField>

          <ParamField path="domains" type="boolean" default="False">
            List overlapping protein domain names.
          </ParamField>

          <ParamField path="numbers" type="boolean" default="False">
            Include affected exon/intron numbers.
          </ParamField>

          <ParamField path="variant_class" type="boolean" default="False">
            Include Sequence Ontology variant class.
          </ParamField>

          <ParamField path="uniprot" type="boolean" default="False">
            Include UniProt accession for each transcript.
          </ParamField>

          <ParamField path="xref_refseq" type="boolean" default="False">
            Include RefSeq cross-reference IDs.
          </ParamField>

          <ParamField path="mirna" type="boolean" default="False">
            Include overlapping miRNA target sites.
          </ParamField>

          <ParamField path="pubmed" type="boolean" default="False">
            Include PubMed citation IDs.
          </ParamField>

          <ParamField path="conservation" type="boolean" default="False">
            Include conservation scores from EPO alignments.
          </ParamField>

          <ParamField path="phenotypes" type="boolean" default="False">
            Include overlapping phenotype/disease annotations.
          </ParamField>

          <ParamField path="blosum62" type="boolean" default="False">
            Include BLOSUM62 substitution score for missense.
          </ParamField>

          <ParamField path="max_ent_scan" type="boolean" default="False">
            Include MaxEntScan splice-site scores.
          </ParamField>

          <ParamField path="verbose" type="integer" default="0">
            Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
          </ParamField>

          <ParamField path="device" type="string" default="cpu">
            Device to run the tool on.
          </ParamField>

          <ParamField path="timeout" type="integer" default="3600">
            Maximum execution time in seconds. `None` waits indefinitely.
          </ParamField>

          <ParamField path="seed" type="integer">
            Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
          </ParamField>
        </Expandable>
      </ParamField>

      <ParamField path="sift" type="string">
        SIFT pathogenicity output — `b` (both prediction + score), `p` (prediction only), `s` (score only); `None` falls back to API default.
      </ParamField>

      <ParamField path="polyphen" type="string">
        PolyPhen output level; same value semantics as `sift`.
      </ParamField>

      <ParamField path="mane" type="boolean" default="False">
        Include MANE Select annotations (GRCh38 only).
      </ParamField>

      <ParamField path="alphamissense" type="boolean" default="False">
        AlphaMissense missense pathogenicity scores (human only).
      </ParamField>

      <ParamField path="revel" type="boolean" default="False">
        REVEL ensemble pathogenicity scores (human only).
      </ParamField>

      <ParamField path="cadd" type="boolean" default="False">
        CADD deleteriousness scores (human only).
      </ParamField>

      <ParamField path="appris" type="boolean" default="False">
        Include APPRIS principal isoform tag (human/mouse only).
      </ParamField>

      <ParamField path="tsl" type="boolean" default="False">
        Include transcript support level (human/mouse only).
      </ParamField>

      <ParamField path="ccds" type="boolean" default="False">
        Include CCDS identifier per transcript (human/mouse only).
      </ParamField>

      <ParamField path="distance" type="integer">
        Up/downstream distance (bp) used to assign consequence terms. `None` keeps the API default (5000).
      </ParamField>

      <ParamField path="pick" type="boolean" default="False">
        Return only one consequence per variant — Ensembl's PICK heuristic (canonical, longest CDS, …).
      </ParamField>

      <ParamField path="per_gene" type="boolean" default="False">
        Return one consequence per gene (less aggressive than `pick`); incompatible with `pick`.
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/ensembl_vep.py#L319" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a>

    <Accordion title="Output: EnsemblVEPOutput">
      <ResponseField name="consequences" type="List[EnsemblVEPConsequence]">
        One record per VEP input (Ensembl returns a list even for a single HGVS).

        <Expandable title="EnsemblVEPConsequence">
          <ResponseField name="input" type="string" required>
            HGVS string the API echoed back.
          </ResponseField>

          <ResponseField name="most_severe_consequence" type="string" required>
            Highest-severity consequence term (Sequence Ontology: `intron_variant`, `missense_variant`, `stop_gained`, …).
          </ResponseField>

          <ResponseField name="seq_region_name" type="string">
            Chromosome / contig.
          </ResponseField>

          <ResponseField name="start" type="integer">
            1-indexed inclusive genomic start.
          </ResponseField>

          <ResponseField name="end" type="integer">
            1-indexed inclusive genomic end.
          </ResponseField>

          <ResponseField name="strand" type="integer">
            +1 or -1.
          </ResponseField>

          <ResponseField name="allele_string" type="string">
            Reference/alternate alleles (e.g. 'G/C').
          </ResponseField>

          <ResponseField name="transcript_consequences" type="List[Dict[string, any]]">
            Per-transcript consequence records — kept as raw dicts because the field set (sift\_prediction, polyphen\_prediction, codons, amino\_acids, …) varies by consequence type and plugin configuration.
          </ResponseField>

          <ResponseField name="colocated_variants" type="List[Dict[string, any]]">
            Co-located known variants (rsIDs, frequencies, clinical significance) — also kept raw.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="source_url" type="string" required>
        Final URL hit.
      </ResponseField>

      <ResponseField name="raw_payload" type="List[Dict[string, any]]">
        Raw API JSON.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  Use this to predict the functional consequence of a variant and assess its likely impact. Classify a coding or genomic HGVS notation as missense, synonymous, stop-gain, splice-disrupting, or noncoding, then read per-transcript SIFT and PolyPhen predictions alongside optional human-only AlphaMissense, REVEL, and CADD pathogenicity scores for clinical or research variant interpretation. Co-located variant lookups surface population-frequency context from gnomAD and ClinVar annotations. Candidate variants are often identified from features returned by [`ensembl-overlap`](https://bio-pro.mintlify.app/tools/database-retrieval/ensembl) or from a designed or observed substitution in a downstream design workflow.

  #### Usage Tips

  * **`transcript_consequences` and `colocated_variants` are returned as raw dicts.** Their field sets vary by consequence type and annotation toggles, so read them defensively rather than expecting a fixed shape.
  * **`pick` and `per_gene` cannot be combined.** Setting both raises a validation error. Choose one collapse strategy.
  * **Several annotations are species- or assembly-restricted.** MANE applies to GRCh38 only. AlphaMissense, REVEL, and CADD are human only. APPRIS, TSL, and CCDS are human and mouse only. Enabling a restricted annotation outside its scope simply yields no extra data.
  * **A coding or genomic HGVS form is more reliable than a protein form.** A protein-level notation can map to multiple transcripts ambiguously, so prefer coding or genomic notation when available.
</div>

## Toolkit Notes

These apply to every Ensembl tool in this toolkit (`ensembl-lookup`, `ensembl-sequence`, `ensembl-overlap`, `ensembl-xrefs`, `ensembl-vep`).

* **Requires network access.** Every tool calls the live Ensembl REST API. None runs offline and no local copy of the database is kept.
* **Subject to the Ensembl REST rate limit.** Ensembl REST enforces a uniform per-IP limit of roughly 55,000 requests per hour, returning HTTP 429 with a `Retry-After` header when exceeded. There is no account or API key that raises this limit.

<Tip>
  **Example notebook:** See the [full working example](https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/database_retrieval/ensembl/examples/example.ipynb) for a copy-paste-ready walkthrough.
</Tip>

## Infrastructure Guides

The following guides cover how to run tools efficiently and at scale.

<CardGroup cols={2}>
  <Card title="Tool Persistence" icon="repeat" href="/docs/tools/guides/tool-persistence">Keep a tool's model warm across calls instead of reloading it every invocation.</Card>
  <Card title="Device Management" icon="cpu" href="/docs/tools/guides/device-management">How GPUs are allocated to tools and how to target specific devices.</Card>
  <Card title="Parallel Execution" icon="layers" href="/docs/tools/guides/parallel-execution">Fan a batch of inputs out across multiple GPUs.</Card>
</CardGroup>
