skills/43-wentorai-research-plugins/skills/literature/metadata/ror-organization-api/SKILL.md
Identify and link research organizations via the ROR registry API
npx skillsauth add brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research 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')}")
tools
Autonomous multi-round research review loop using MiniMax API. Use when you want to use MiniMax instead of Codex MCP for external review. Trigger with "auto review loop minimax" or "minimax review".
tools
Autonomous research review loop using any OpenAI-compatible LLM API. Configure via llm-chat MCP server or environment variables. Trigger with "auto review loop llm" or "llm review".
tools
Autonomous multi-round research review loop using MiniMax API. Use when you want to use MiniMax instead of Codex MCP for external review. Trigger with "auto review loop minimax" or "minimax review".
tools
Autonomous research review loop using any OpenAI-compatible LLM API. Configure via llm-chat MCP server or environment variables. Trigger with "auto review loop llm" or "llm review".