curl --request POST \
--url https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch \
--header 'Content-Type: application/json' \
--data '
{
"protein_hashes": [
"<string>"
],
"topk_features": 10,
"include_structure": true,
"include_cluster_info": true,
"include_sequence": true,
"include_features": {
"protein_level": true,
"per_residue": true
}
}
'import requests
url = "https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch"
payload = {
"protein_hashes": ["<string>"],
"topk_features": 10,
"include_structure": True,
"include_cluster_info": True,
"include_sequence": True,
"include_features": {
"protein_level": True,
"per_residue": True
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
protein_hashes: ['<string>'],
topk_features: 10,
include_structure: true,
include_cluster_info: true,
include_sequence: true,
include_features: {protein_level: true, per_residue: true}
})
};
fetch('https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'protein_hashes' => [
'<string>'
],
'topk_features' => 10,
'include_structure' => true,
'include_cluster_info' => true,
'include_sequence' => true,
'include_features' => [
'protein_level' => true,
'per_residue' => true
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch"
payload := strings.NewReader("{\n \"protein_hashes\": [\n \"<string>\"\n ],\n \"topk_features\": 10,\n \"include_structure\": true,\n \"include_cluster_info\": true,\n \"include_sequence\": true,\n \"include_features\": {\n \"protein_level\": true,\n \"per_residue\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch")
.header("Content-Type", "application/json")
.body("{\n \"protein_hashes\": [\n \"<string>\"\n ],\n \"topk_features\": 10,\n \"include_structure\": true,\n \"include_cluster_info\": true,\n \"include_sequence\": true,\n \"include_features\": {\n \"protein_level\": true,\n \"per_residue\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"protein_hashes\": [\n \"<string>\"\n ],\n \"topk_features\": 10,\n \"include_structure\": true,\n \"include_cluster_info\": true,\n \"include_sequence\": true,\n \"include_features\": {\n \"protein_level\": true,\n \"per_residue\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Batch protein lookup
Look up multiple proteins by hash. Small batches return a zip file with per-data-type files (200). Large batches return a job handle for async polling (202).
curl --request POST \
--url https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch \
--header 'Content-Type: application/json' \
--data '
{
"protein_hashes": [
"<string>"
],
"topk_features": 10,
"include_structure": true,
"include_cluster_info": true,
"include_sequence": true,
"include_features": {
"protein_level": true,
"per_residue": true
}
}
'import requests
url = "https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch"
payload = {
"protein_hashes": ["<string>"],
"topk_features": 10,
"include_structure": True,
"include_cluster_info": True,
"include_sequence": True,
"include_features": {
"protein_level": True,
"per_residue": True
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
protein_hashes: ['<string>'],
topk_features: 10,
include_structure: true,
include_cluster_info: true,
include_sequence: true,
include_features: {protein_level: true, per_residue: true}
})
};
fetch('https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'protein_hashes' => [
'<string>'
],
'topk_features' => 10,
'include_structure' => true,
'include_cluster_info' => true,
'include_sequence' => true,
'include_features' => [
'protein_level' => true,
'per_residue' => true
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch"
payload := strings.NewReader("{\n \"protein_hashes\": [\n \"<string>\"\n ],\n \"topk_features\": 10,\n \"include_structure\": true,\n \"include_cluster_info\": true,\n \"include_sequence\": true,\n \"include_features\": {\n \"protein_level\": true,\n \"per_residue\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch")
.header("Content-Type", "application/json")
.body("{\n \"protein_hashes\": [\n \"<string>\"\n ],\n \"topk_features\": 10,\n \"include_structure\": true,\n \"include_cluster_info\": true,\n \"include_sequence\": true,\n \"include_features\": {\n \"protein_level\": true,\n \"per_residue\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://biohub.ai/esm/protein/api/v1alpha1/proteins/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"protein_hashes\": [\n \"<string>\"\n ],\n \"topk_features\": 10,\n \"include_structure\": true,\n \"include_cluster_info\": true,\n \"include_sequence\": true,\n \"include_features\": {\n \"protein_level\": true,\n \"per_residue\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Body
Request body for batch protein lookup.
Data type flags control which output files are generated. By default all data types are included.
MD5 hashes of proteins to look up. Max 500 unique entries; duplicates are deduplicated.
Number of top SAE features to include per protein (1–100).
If true, include PDB structure, pTM, and per-residue pLDDT.
If true, include cluster representative metadata for each protein.
If true, include the amino acid sequence.
Control SAE feature data. Pass false to omit entirely, true for both protein-level and per-residue, or an object with protein_level / per_residue sub-flags.
Show child attributes
Show child attributes
Response
Successful Response