Awesome-Agent-Skills-for-Empirical-Research ror-organization-api
Identify and link research organizations via the ROR registry API
install
source · Clone the upstream repo
git clone https://github.com/brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/43-wentorai-research-plugins/skills/literature/metadata/ror-organization-api" ~/.claude/skills/brycewang-stanford-awesome-agent-skills-for-empirical-research-ror-organization- && rm -rf "$T"
manifest:
skills/43-wentorai-research-plugins/skills/literature/metadata/ror-organization-api/SKILL.mdsource content
ROR (Research Organization Registry) API
Overview
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.
API Endpoints
Base URL
https://api.ror.org/v2
Search Organizations
# 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"
Get Organization by ROR ID
# 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"
Query Parameters
| Parameter | Description | Example |
|---|---|---|
| Text search | |
| Fuzzy affiliation match | |
| Faceted filtering | |
| Page number (1-based) | |
Organization Types
| Type | Description |
|---|---|
| Universities, colleges |
| Research facilities, labs |
| Hospitals, medical centers |
| Companies with research activities |
| Government agencies |
| Non-profit research organizations |
| Funding agencies |
| Archives, libraries |
Response Structure
{ "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 } ] }
Python Usage
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')}")
Use Cases
- Affiliation disambiguation: Clean messy author affiliation strings
- Bibliometric analysis: Aggregate publications by institution
- Funder compliance: Link outputs to institutional identifiers
- Research profiling: Map institutional research portfolios
- Collaboration networks: Trace inter-institutional partnerships