Search and retrieve 3D protein structures from the RCSB Protein Data Bank
Scanned 6/6/2026
Install via CLI
openskills install brycewang-stanford/Auto-Empirical-Research-Skills---
name: pdb-structure-api
description: "Search and retrieve 3D protein structures from the RCSB Protein Data Bank"
metadata:
openclaw:
emoji: "🔮"
category: "domains"
subcategory: "biomedical"
keywords: ["protein structure", "PDB", "crystallography", "structural biology", "RCSB", "molecular structure"]
source: "https://data.rcsb.org"
---
# RCSB Protein Data Bank API Guide
## Overview
The RCSB Protein Data Bank (PDB) is the single global archive for experimentally determined 3D structures of biological macromolecules. It hosts over 200,000 structures resolved by X-ray crystallography, cryo-EM, NMR spectroscopy, and other methods. Each entry includes atomic coordinates, experimental metadata, polymer sequences, bound ligands, and literature references.
Two complementary APIs are available. The **Data API** (`data.rcsb.org`) serves structured entry metadata, polymer entities, and chemical components via RESTful GET endpoints. The **Search API** (`search.rcsb.org`) supports full-text, attribute-based, sequence similarity, and structure similarity searches.
## Authentication
No authentication required. Both APIs are freely accessible without API keys, tokens, or registration.
## Core Endpoints
### Data API: Get Entry by PDB ID
Retrieve metadata for a structure including experimental method, resolution, citations, and bound components.
- **URL**: `GET https://data.rcsb.org/rest/v1/core/entry/{pdb_id}`
```bash
curl "https://data.rcsb.org/rest/v1/core/entry/4HHB"
```
- **Response** (key fields):
```json
{
"rcsb_id": "4HHB",
"struct": {
"title": "THE CRYSTAL STRUCTURE OF HUMAN DEOXYHAEMOGLOBIN AT 1.74 ANGSTROMS RESOLUTION"
},
"exptl": [{"method": "X-RAY DIFFRACTION"}],
"rcsb_entry_info": {
"deposited_atom_count": 4779,
"molecular_weight": 64.74,
"polymer_composition": "heteromeric protein",
"polymer_entity_count_protein": 2,
"resolution_combined": [1.74],
"nonpolymer_bound_components": ["HEM"]
}
}
```
### Data API: Get Polymer Entity
Retrieve protein/nucleic acid entity details including sequence, organism, and gene info.
- **URL**: `GET https://data.rcsb.org/rest/v1/core/polymer_entity/{pdb_id}/{entity_id}`
```bash
curl "https://data.rcsb.org/rest/v1/core/polymer_entity/4HHB/1"
```
- **Response** (key fields):
```json
{
"entity_poly": {
"pdbx_seq_one_letter_code_can": "VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSH...",
"rcsb_entity_polymer_type": "Protein",
"rcsb_sample_sequence_length": 141,
"type": "polypeptide(L)"
},
"entity_src_gen": [{
"gene_src_common_name": "Human",
"pdbx_gene_src_scientific_name": "Homo sapiens",
"pdbx_gene_src_ncbi_taxonomy_id": "9606"
}]
}
```
### Data API: Get Chemical Component
Retrieve ligand or small molecule metadata by component ID.
- **URL**: `GET https://data.rcsb.org/rest/v1/core/chemcomp/{comp_id}`
```bash
curl "https://data.rcsb.org/rest/v1/core/chemcomp/HEM"
```
- **Response** (key fields):
```json
{
"rcsb_id": "HEM",
"chem_comp": {
"formula": "C34 H32 Fe N4 O4",
"formula_weight": 616.487,
"name": "PROTOPORPHYRIN IX CONTAINING FE",
"type": "non-polymer"
}
}
```
### Search API: Full-Text Search
Search across all PDB entries with free-text queries. Returns ranked results by relevance.
- **URL**: `POST https://search.rcsb.org/rcsbsearch/v2/query`
- **Headers**: `Content-Type: application/json`
- **Key body fields**: `query.type` (`"terminal"`), `query.service` (`"full_text"`, `"text"`, `"sequence"`, `"structure"`), `query.parameters.value`, `return_type` (`"entry"`, `"polymer_entity"`, `"assembly"`), `request_options.paginate.start/rows`
```bash
curl -X POST "https://search.rcsb.org/rcsbsearch/v2/query" \
-H "Content-Type: application/json" \
-d '{
"query": {
"type": "terminal",
"service": "full_text",
"parameters": {"value": "hemoglobin"}
},
"return_type": "entry",
"request_options": {
"results_content_type": ["experimental"],
"paginate": {"start": 0, "rows": 3}
}
}'
```
- **Response**:
```json
{
"query_id": "6f7192a6-d65b-4ff1-9d94-37b9600a8864",
"result_type": "entry",
"total_count": 8960,
"result_set": [
{"identifier": "3GOU", "score": 1.0},
{"identifier": "6IHX", "score": 0.9995},
{"identifier": "2PGH", "score": 0.9985}
]
}
```
For attribute-based searches, use `"service": "text"` with `"attribute"` and `"operator"` fields. Combine multiple criteria with `"type": "group"` and `"logical_operator": "and"`.
## Rate Limits
No formal rate limits or rate-limit headers are published. RCSB recommends reasonable request rates. For bulk data, use FTP downloads at `https://files.rcsb.org/pub/pdb/` or `ftp://ftp.wwpdb.org/pub/pdb/` instead of iterative API calls.
## Academic Use Cases
- **Structure-Based Drug Design**: Retrieve target protein structures with bound ligands to analyze binding pockets, then search for similar structures to identify drug scaffolds.
- **Comparative Structural Analysis**: Search all structures of a protein family, compare resolution and methods, select the best template for homology modeling.
- **Protein Engineering**: Retrieve wild-type structures and cross-reference with mutant entries to analyze how mutations affect fold stability and ligand interactions.
## Code Examples
### Search and Retrieve Structures
```python
import requests
# Search for kinase inhibitor structures
search_body = {
"query": {"type": "terminal", "service": "full_text",
"parameters": {"value": "tyrosine kinase inhibitor"}},
"return_type": "entry",
"request_options": {"results_content_type": ["experimental"],
"paginate": {"start": 0, "rows": 5}}
}
results = requests.post("https://search.rcsb.org/rcsbsearch/v2/query",
json=search_body).json()
print(f"Total hits: {results['total_count']}")
# Retrieve metadata for each hit
for hit in results["result_set"]:
pdb_id = hit["identifier"]
entry = requests.get(
f"https://data.rcsb.org/rest/v1/core/entry/{pdb_id}").json()
info = entry["rcsb_entry_info"]
print(f"{pdb_id}: {entry['struct']['title'][:80]}")
print(f" Resolution: {info.get('resolution_combined', ['N/A'])[0]} A, "
f"Method: {info['experimental_method']}")
```
### Extract Polymer Sequences
```python
import requests
pdb_id = "4HHB"
entry = requests.get(
f"https://data.rcsb.org/rest/v1/core/entry/{pdb_id}").json()
for eid in range(1, entry["rcsb_entry_info"]["polymer_entity_count"] + 1):
entity = requests.get(
f"https://data.rcsb.org/rest/v1/core/polymer_entity/{pdb_id}/{eid}"
).json()
poly = entity["entity_poly"]
src = entity.get("rcsb_entity_source_organism", [{}])[0]
print(f"Entity {eid}: {poly['rcsb_entity_polymer_type']} "
f"({src.get('ncbi_scientific_name', 'N/A')})")
print(f" {poly['rcsb_sample_sequence_length']} residues: "
f"{poly['pdbx_seq_one_letter_code_can'][:50]}...")
```
## References
- Data API docs: https://data.rcsb.org/redoc/index.html
- Search API docs: https://search.rcsb.org/index.html
- RCSB PDB homepage: https://www.rcsb.org/
- Programmatic access guide: https://www.rcsb.org/docs/programmatic-access
- PDB file format: https://www.wwpdb.org/documentation/file-format
- Worldwide PDB: https://www.wwpdb.org/
No comments yet. Be the first to comment!