skills/literature/metadata/ror-organization-api/SKILL.md
Identify and link research organizations via the ROR registry API
npx skillsauth add wentorai/research-plugins ror-organization-apiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
ROR is the community-led registry of open persistent identifiers for research organizations worldwide — 110,000+ entries covering universities, research institutes, government agencies, hospitals, and companies. The API enables affiliation disambiguation, institutional search, and metadata retrieval. Essential for bibliometrics, funder compliance, and research analytics. Free, no authentication required.
https://api.ror.org/v2
# Text search
curl "https://api.ror.org/v2/organizations?query=MIT"
# Affiliation matching (fuzzy match for messy affiliation strings)
curl "https://api.ror.org/v2/organizations?affiliation=Dept+of+CS,+Massachusetts+Inst+of+Technology"
# Filter by country
curl "https://api.ror.org/v2/organizations?query=university&filter=locations.geonames_details.country_code:US"
# Filter by organization type
curl "https://api.ror.org/v2/organizations?query=research&filter=types:facility"
# Retrieve full record
curl "https://api.ror.org/v2/organizations/https://ror.org/042nb2s44"
# Also works with just the ID portion
curl "https://api.ror.org/v2/organizations/042nb2s44"
| Parameter | Description | Example |
|-----------|-------------|---------|
| query | Text search | query=Harvard |
| affiliation | Fuzzy affiliation match | affiliation=MIT Cambridge MA |
| filter | Faceted filtering | filter=types:education |
| page | Page number (1-based) | page=2 |
| Type | Description |
|------|-------------|
| education | Universities, colleges |
| facility | Research facilities, labs |
| healthcare | Hospitals, medical centers |
| company | Companies with research activities |
| government | Government agencies |
| nonprofit | Non-profit research organizations |
| funder | Funding agencies |
| archive | Archives, libraries |
{
"number_of_results": 3,
"items": [
{
"id": "https://ror.org/042nb2s44",
"names": [
{"value": "Massachusetts Institute of Technology", "types": ["ror_display"]},
{"value": "MIT", "types": ["acronym"]}
],
"types": ["education"],
"locations": [
{
"geonames_details": {
"country_code": "US",
"country_name": "United States",
"name": "Cambridge"
}
}
],
"external_ids": [
{"type": "isni", "all": ["0000 0001 2341 2786"]},
{"type": "grid", "all": ["grid.116068.8"]},
{"type": "wikidata", "all": ["Q49108"]}
],
"links": [{"type": "website", "value": "https://www.mit.edu/"}],
"relationships": [
{"id": "https://ror.org/01a8ajp77", "label": "Lincoln Laboratory", "type": "child"}
],
"status": "active",
"established": 1861
}
]
}
import requests
BASE_URL = "https://api.ror.org/v2/organizations"
def search_organizations(query: str,
country: str = None,
org_type: str = None) -> list:
"""Search ROR for research organizations."""
params = {"query": query}
filters = []
if country:
filters.append(
f"locations.geonames_details.country_code:{country}")
if org_type:
filters.append(f"types:{org_type}")
if filters:
params["filter"] = ",".join(filters)
resp = requests.get(BASE_URL, params=params)
resp.raise_for_status()
data = resp.json()
results = []
for org in data.get("items", []):
display_name = next(
(n["value"] for n in org.get("names", [])
if "ror_display" in n.get("types", [])),
org.get("names", [{}])[0].get("value", ""),
)
acronyms = [n["value"] for n in org.get("names", [])
if "acronym" in n.get("types", [])]
loc = org.get("locations", [{}])[0].get("geonames_details", {})
results.append({
"ror_id": org.get("id"),
"name": display_name,
"acronyms": acronyms,
"types": org.get("types", []),
"country": loc.get("country_name"),
"city": loc.get("name"),
"established": org.get("established"),
})
return results
def match_affiliation(affiliation_string: str) -> dict:
"""Disambiguate a messy affiliation string to a ROR record."""
resp = requests.get(
BASE_URL,
params={"affiliation": affiliation_string},
)
resp.raise_for_status()
items = resp.json().get("items", [])
if items and items[0].get("chosen"):
return items[0].get("organization", {})
return items[0] if items else {}
def get_organization(ror_id: str) -> dict:
"""Get full ROR record for an organization."""
resp = requests.get(f"{BASE_URL}/{ror_id}")
resp.raise_for_status()
return resp.json()
# Example: find German research institutes
orgs = search_organizations("Max Planck", country="DE",
org_type="facility")
for o in orgs:
print(f"{o['name']} ({', '.join(o['acronyms'])}) "
f"— {o['city']}, {o['country']} (est. {o['established']})")
# Example: disambiguate messy affiliations
result = match_affiliation(
"Dept. of Computer Sci., Stanford Univ., CA, USA")
print(f"Matched: {result.get('id')} — "
f"{result.get('names', [{}])[0].get('value')}")
documentation
Write Tsinghua University theses using the ThuThesis LaTeX template
development
Templates, formatting rules, and strategies for thesis and dissertation writing
documentation
Set up LaTeX templates for PhD and Master's thesis documents
documentation
Write SJTU theses using the SJTUThesis LaTeX template with full compliance