| name | viaf-authority-api |
| description | Disambiguate author identities via the VIAF authority file API |
| metadata | {"openclaw":{"emoji":"👤","category":"literature","subcategory":"metadata","keywords":["VIAF","authority control","author disambiguation","name authority","OCLC","library catalog"],"source":"https://viaf.org/"}} |
VIAF (Virtual International Authority File) API
Overview
VIAF clusters authority records from 50+ national libraries worldwide, linking different forms of an author's name into a single canonical identity. It covers 50M+ personal, corporate, and geographic name entries. Essential for author disambiguation in bibliometric research — resolving "J. Smith", "John Smith", and "Smith, J.A." to the same person. Free, no authentication.
API Endpoints
Base URL
https://viaf.org
Search
curl "https://viaf.org/viaf/AutoSuggest?query=einstein+albert"
curl "https://viaf.org/viaf/search?query=local.personalNames+all+\"hinton+geoffrey\"&\
sortKeys=holdingscount&httpAccept=application/json"
curl "https://viaf.org/viaf/search?query=local.corporateNames+all+\"MIT\"&\
httpAccept=application/json"
Get Record by VIAF ID
curl "https://viaf.org/viaf/75121530/viaf.json"
curl -H "Accept: application/json" "https://viaf.org/viaf/75121530"
curl "https://viaf.org/viaf/75121530/justlinks.json"
Cross-Reference by External ID
curl "https://viaf.org/viaf/lccn/n79021164/viaf.json"
curl "https://viaf.org/viaf/isni/0000000121174331/viaf.json"
curl "https://viaf.org/viaf/sourceID/ORCID|0000-0002-1825-0097/viaf.json"
curl "https://viaf.org/viaf/sourceID/WKP|Q937/viaf.json"
Source Codes
| Code | Library/Source |
|---|
LC | Library of Congress |
DNB | German National Library |
BNF | Bibliothèque nationale de France |
NLA | National Library of Australia |
NDL | National Diet Library (Japan) |
NKC | National Library of Czech Republic |
WKP | Wikidata |
ISNI | ISNI |
Response Structure
{
"viafID": "75121530",
"nameType": "Personal",
"mainHeadings": {
"data": [
{
"text": "Einstein, Albert, 1879-1955",
"sources": {"s": ["LC", "DNB", "BNF"]}
}
]
},
"x400s": {
"x400": [
{"datafield": {"subfield": [{"text": "Albert Einstein"}]}}
]
Python Usage
import requests
BASE_URL = "https://viaf.org/viaf"
def search_person(name: str, limit: int = 10) -> list:
"""Search VIAF for personal name authorities."""
resp = requests.get(
f"{BASE_URL}/AutoSuggest",
params={"query": name},
)
resp.raise_for_status()
data = resp.json()
results = []
for item in data.get("result", [])[:limit]:
results.append({
"viaf_id": item.get("viafid"),
"name": item.get("displayForm"),
"name_type": item.get("nametype"),
"source_count": len(item.get("sources", "").split("|")),
})
return results
def get_authority(viaf_id: str) -> dict:
"""Get full VIAF authority record."""
resp = requests.get(f"{BASE_URL}/{viaf_id}/viaf.json")
resp.raise_for_status()
data = resp.json()
name_forms = []
for heading in data.get("mainHeadings", {}).get("data", []):
if isinstance(heading, dict):
name_forms.append({
"text": heading.get(),
: heading.get(, {}).get(, []),
})
external_ids = {}
src data.get(, {}).get(, []):
sid = src.get(, )
sid:
prefix, local_id = sid.split(, )
external_ids[prefix] = local_id
{
: data.get(),
: name_forms,
: data.get(),
: data.get(),
: external_ids,
}
() -> :
resp = requests.get(
)
resp.raise_for_status()
resp.json()
candidates = search_person()
c candidates:
(
)
candidates:
record = get_authority(candidates[][])
()
form record[]:
sources = .join(form[][:])
()
()
Use Cases
- Author disambiguation: Resolve name variants to canonical identities
- Cross-library linking: Connect records across national catalogs
- Bibliometric deduplication: Merge author records from different databases
- Identity verification: Confirm author identity via multiple authority sources
- Linked data enrichment: Bridge ORCID, Wikidata, and library authorities
References