Awesome-Agent-Skills-for-Empirical-Research doi-content-negotiation
Retrieve structured metadata from any DOI via HTTP content negotiation
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/doi-content-negotiation" ~/.claude/skills/brycewang-stanford-awesome-agent-skills-for-empirical-research-doi-content-negot && rm -rf "$T"
manifest:
skills/43-wentorai-research-plugins/skills/literature/metadata/doi-content-negotiation/SKILL.mdsource content
DOI Content Negotiation
Overview
Any DOI can return structured metadata in multiple formats through HTTP content negotiation — simply set the
Accept header when requesting https://doi.org/{doi}. This is the most universal way to get citation metadata, BibTeX entries, JSON-LD, and RDF from any publisher without needing a specific API. Works for all 300M+ registered DOIs. Free, no authentication.
Usage
Basic Content Negotiation
# Get JSON citation metadata (Citeproc JSON) curl -LH "Accept: application/vnd.citationstyles.csl+json" \ "https://doi.org/10.1038/nature14539" # Get BibTeX curl -LH "Accept: application/x-bibtex" \ "https://doi.org/10.1038/nature14539" # Get RIS format curl -LH "Accept: application/x-research-info-systems" \ "https://doi.org/10.1038/nature14539" # Get formatted citation (APA style) curl -LH "Accept: text/x-bibliography; style=apa" \ "https://doi.org/10.1038/nature14539" # Get formatted citation (Chicago style) curl -LH "Accept: text/x-bibliography; style=chicago-author-date" \ "https://doi.org/10.1038/nature14539"
Available Formats
| Accept Header | Format | Use Case |
|---|---|---|
| Citeproc JSON | Programmatic metadata |
| BibTeX | LaTeX bibliography |
| RIS | Reference managers |
| Formatted text | Direct citation |
| RDF/XML | Linked data |
| Turtle RDF | Linked data |
| Schema.org JSON-LD | Web metadata |
| DataCite JSON | DataCite DOIs |
| Crossref XML | Full Crossref metadata |
Citation Styles
Over 9,000 CSL styles available:
# APA 7th edition style=apa # Chicago Manual of Style (author-date) style=chicago-author-date # IEEE style=ieee # MLA style=modern-language-association # Harvard style=harvard-cite-them-right # Vancouver (medical) style=vancouver # Nature style=nature
Citeproc JSON Response
{ "DOI": "10.1038/nature14539", "type": "article-journal", "title": "Deep learning", "author": [ {"given": "Yann", "family": "LeCun"}, {"given": "Yoshua", "family": "Bengio"}, {"given": "Geoffrey", "family": "Hinton"} ], "container-title": "Nature", "volume": "521", "issue": "7553", "page": "436-444", "issued": {"date-parts": [[2015, 5, 28]]}, "publisher": "Springer Science and Business Media LLC", "ISSN": ["0028-0836", "1476-4687"], "URL": "http://dx.doi.org/10.1038/nature14539", "abstract": "Deep learning allows computational models..." }
Python Usage
import requests def get_metadata(doi: str) -> dict: """Get structured metadata for a DOI.""" resp = requests.get( f"https://doi.org/{doi}", headers={"Accept": "application/vnd.citationstyles.csl+json"}, allow_redirects=True, ) resp.raise_for_status() return resp.json() def get_bibtex(doi: str) -> str: """Get BibTeX entry for a DOI.""" resp = requests.get( f"https://doi.org/{doi}", headers={"Accept": "application/x-bibtex"}, allow_redirects=True, ) resp.raise_for_status() return resp.text def get_formatted_citation(doi: str, style: str = "apa") -> str: """Get a formatted citation string.""" resp = requests.get( f"https://doi.org/{doi}", headers={ "Accept": f"text/x-bibliography; style={style}", }, allow_redirects=True, ) resp.raise_for_status() return resp.text.strip() def batch_bibtex(dois: list) -> str: """Generate BibTeX file for multiple DOIs.""" entries = [] for doi in dois: try: bib = get_bibtex(doi) entries.append(bib) except requests.HTTPError: entries.append(f"% Failed to resolve: {doi}") return "\n\n".join(entries) # Example: get metadata meta = get_metadata("10.1038/nature14539") authors = ", ".join( f"{a['given']} {a['family']}" for a in meta.get("author", []) ) print(f"{meta['title']}") print(f" Authors: {authors}") print(f" {meta.get('container-title')} ({meta.get('volume')})") # Example: get BibTeX bibtex = get_bibtex("10.1038/nature14539") print(f"\nBibTeX:\n{bibtex}") # Example: formatted APA citation apa = get_formatted_citation("10.1038/nature14539", "apa") print(f"\nAPA: {apa}") # Example: batch export bibliography = batch_bibtex([ "10.1038/nature14539", "10.5555/3295222.3295349", ]) with open("references.bib", "w") as f: f.write(bibliography)
Use Cases
- Bibliography generation: Export BibTeX/RIS for any DOI list
- Citation formatting: Generate properly formatted citations
- Metadata extraction: Get structured metadata for data pipelines
- Linked data: Retrieve RDF for knowledge graph construction
- Verification: Confirm publication details from authoritative source
References
See Also
- doi-resolution-guide -- Conceptual overview of DOI resolution, validation, normalization, and CrossRef API usage.