Resolve a research organization via the Research Organization Registry (ROR). Pass id (a ROR id like 056y0v115 or its full URL) to fetch one org, or name to search by free text. Returns the canonical ROR id and name, organization type, status, founding year, location (city, country, GeoNames coordinates), website, Wikipedia link, external identifiers (GRID, ISNI, Wikidata, Crossref Funder), parent/child relationships, and aliases/acronyms. Data: ROR, free and CC0. The canonical institution key in scholarly metadata — pair with /api/papers/search and /api/paper/doi-lookup (author affiliations) and /api/research/author (ORCID). Use to disambiguate an institution name to a stable id before joining datasets.
/api/research/orgPAYMENT-SIGNATURE.The org API is a pay-per-call research endpoint built for AI agents and autonomous software. Resolve a research organization via the Research Organization Registry (ROR).
There is no signup and no API key. An agent (or any HTTP client) hits the endpoint, receives an x402 "402 Payment Required" challenge, signs a sub-cent USDC payment on Base or Solana, and retries — the data comes back on the paid request. That makes it a drop-in org data source for an agent tool-use loop, an MCP host, or a backend that needs research data on demand without onboarding to yet another vendor portal.
| Name | Type | Description |
|---|---|---|
id | string | min 2 chars · max 120 chars |
name | string | min 2 chars · max 200 chars |
limit | integer | min 1 · max 20 |
# 1. Probe with no auth → 402 envelope with PaymentRequirements curl -sS 'https://2s.io/api/research/org?id=xx&name=xx&limit=5' # 2. Sign + retry with PAYMENT-SIGNATURE: curl -sS 'https://2s.io/api/research/org?id=xx&name=xx&limit=5' \ -H 'PAYMENT-SIGNATURE: <base64-json-payload>' # Or use the canonical runner (handles probe → sign → retry): # EVM_PRIVATE_KEY=0x... node --env-file=.env.local \ # --experimental-strip-types scripts/x402-pay.ts \ # 'https://2s.io/api/research/org?id=xx&name=xx&limit=5'
import { TwoS } from '@2sio/sdk'
const client = new TwoS({
privateKey: process.env.EVM_PRIVATE_KEY as `0x${string}`,
})
const result = await client.research.org({
"id": "xx",
"name": "xx",
"limit": 5
})
console.log('endpoint:', result.endpoint)
console.log('cost:', result.costUsd, 'USDC')
console.log('tx:', result.settlement?.txHash)
console.log('data:', result.data)import os
from twosio import TwoS
client = TwoS(private_key=os.environ["EVM_PRIVATE_KEY"])
result = client.research.org(id="xx", name="xx", limit=5)
print("endpoint:", result.endpoint)
print("cost:", result.cost_usd, "USDC")
print("tx:", (result.settlement or {}).get("tx_hash"))
print("data:", result.data)// 1. Add @2sio/mcp to your MCP host config (Claude Desktop example below).
// EVM_PRIVATE_KEY funds x402 payments per call.
// claude_desktop_config.json
{
"mcpServers": {
"2sio": {
"command": "npx",
"args": ["-y", "@2sio/mcp"],
"env": { "EVM_PRIVATE_KEY": "0x..." }
}
}
}
// 2. Once the server is running, agents call this tool via standard MCP:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "research.org",
"arguments": {
"id": "xx",
"name": "xx",
"limit": 5
}
}
}| Field | Type | Description |
|---|---|---|
query | object | |
total | number | |
count | number | |
organizations | array | |
sources | array |
{
"query": {
"id": "example",
"name": "example"
},
"total": 1,
"count": 1,
"organizations": [
{
"id": "example",
"name": "example",
"established": 1,
"status": "example",
"types": [
"example"
],
"location": {
"city": "example",
"countryCode": "example",
"countryName": "example",
"subdivision": "example",
"lat": 1,
"lng": 1,
"geonamesId": 1
},
"website": "example",
"wikipedia": "example",
"externalIds": [
{
"type": "example",
"preferred": "example",
"all": [
"example"
]
}
],
"relationships": [
{
"type": "example",
"id": "example",
"label": "example"
}
],
"aliases": [
"example"
]
}
],
"sources": [
{
"provider": "example",
"url": "example",
"license": "example"
}
]
}