Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use Unpaywall API to find free full-text versions of paywalled papers
.claude/skills/brycewang-stanford-finding-open-access-papers/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 136% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 200% | 0% |
<!-- ╔══════════════════════════════════════════════════════════════╗ ║ 本文件为开源 Skill 原始文档,收录仅供学习与研究参考 ║ ║ CoPaper.AI 收集整理 | https://copaper.ai ║ ╚══════════════════════════════════════════════════════════════╝
来源仓库: https://github.com/kthorn/research-superpower 项目名称: research-superpower 开源协议: MIT License 收录日期: 2026-04-02
声明: 本文件版权归原作者所有。此处收录旨在为社会科学实证研究者 提供 AI Agent Skills 的集中参考。如有侵权,请联系删除。 -->
Use Unpaywall to find legally available open access versions of papers that appear to be behind paywalls.
Core principle: Many paywalled papers have free versions (preprints, author manuscripts, institutional repositories). Unpaywall finds them.
Use this skill when:
Use BEFORE giving up on full text access
Simple REST API - no authentication required for reasonable usage
bashcurl "https://api.unpaywall.org/v2/DOI?email=YOUR_EMAIL"
Parameters:
DOI - The paper's DOI (URL-encoded if needed)email - User's email (required, for courtesy/contact)IMPORTANT: Ask user for their email at the start of research session. Do NOT use placeholder emails like claude@anthropic.com or researcher@example.com.
Example:
bashcurl "https://api.unpaywall.org/v2/10.1038/nature12373?email=user@example.com"
json{ "doi": "10.1038/nature12373", "title": "Paper Title", "is_oa": true, "best_oa_location": { "url": "https://europepmc.org/articles/pmc3858213", "url_for_pdf": "https://europepmc.org/articles/pmc3858213?pdf=render", "version": "publishedVersion", "license": "cc-by", "host_type": "repository" }, "oa_locations": [ { "url": "https://europepmc.org/articles/pmc3858213", "version": "publishedVersion" }, { "url": "https://arxiv.org/abs/1234.5678", "version": "submittedVersion" } ] }
is_oa (boolean)
true - Open access version availablefalse - No free version foundbest_oa_location (object or null)
oa_locations (array)
version types:
publishedVersion - Final published version (best)acceptedVersion - Author's accepted manuscript (good)submittedVersion - Preprint before peer review (useful)bash# Try DOI first curl -L "https://doi.org/10.1234/example.2023" # If paywall detected (403, subscription required, etc): curl "https://api.unpaywall.org/v2/10.1234/example.2023?email=your@email.com"
bash# Parse JSON response response=$(curl -s "https://api.unpaywall.org/v2/DOI?email=EMAIL") # Check if OA available is_oa=$(echo $response | jq -r '.is_oa') if [ "$is_oa" = "true" ]; then # Get best PDF URL pdf_url=$(echo $response | jq -r '.best_oa_location.url_for_pdf // .best_oa_location.url') # Download curl -L -o "papers/paper.pdf" "$pdf_url" fi
When OA found:
⚠️ Paper behind paywall at publisher
✓ Found open access version via Unpaywall!
Source: Europe PMC (published version)
PDF: https://europepmc.org/articles/pmc3858213?pdf=render
→ Downloading...When no OA found:
⚠️ Paper behind paywall at publisher
✗ No open access version found via Unpaywall
Options:
- Request via institutional access
- Contact authors for preprint
- Continue with abstract onlyIf multiple locations available:
Priority order:
publishedVersion from publisher or PMCacceptedVersion from institutional repositorysubmittedVersion from preprint server (arXiv, bioRxiv)Add to full text fetching workflow:
Stage 2: Fetch Full Text
Try in order:
A. PubMed Central (free full text)
B. DOI resolution → If paywall, try Unpaywall
C. Unpaywall direct lookup
D. Preprints (bioRxiv, arXiv)Updated workflow:
bash# 1. Try PMC pmc_result=$(curl "https://eutils.ncbi.nlm.nih.gov/...") if has_pmc_fulltext; then fetch_pmc exit 0 fi # 2. Try DOI doi_result=$(curl -L "https://doi.org/$doi") if is_paywall; then # 3. Try Unpaywall unpaywall_result=$(curl "https://api.unpaywall.org/v2/$doi?email=$EMAIL") if has_oa; then fetch_unpaywall_pdf exit 0 fi fi # 4. No full text available report_no_fulltext
Free tier (with email):
Best practices:
pythonimport requests import time def find_open_access(doi, email): """ Find open access version via Unpaywall Returns: (pdf_url, version, source) or (None, None, None) """ url = f"https://api.unpaywall.org/v2/{doi}" params = {"email": email} try: response = requests.get(url, params=params, timeout=10) response.raise_for_status() data = response.json() if not data.get('is_oa'): return None, None, None best_loc = data.get('best_oa_location') if not best_loc: return None, None, None pdf_url = best_loc.get('url_for_pdf') or best_loc.get('url') version = best_loc.get('version', 'unknown') source = best_loc.get('host_type', 'unknown') return pdf_url, version, source except Exception as e: print(f"Error checking Unpaywall for {doi}: {e}") return None, None, None # Usage doi = "10.1038/nature12373" pdf_url, version, source = find_open_access(doi, "researcher@example.com") if pdf_url: print(f"Found {version} at {source}") print(f"PDF: {pdf_url}") # Download PDF response = requests.get(pdf_url) with open(f'papers/{doi.replace("/", "_")}.pdf', 'wb') as f: f.write(response.content) else: print("No open access version found") time.sleep(0.1) # Rate limiting
Repositories:
Preprint servers:
Publisher sites:
DOI not found:
json{ "error": "true", "message": "DOI not found" }
→ Check DOI format, try alternative identifiers
Network errors:
Malformed response:
is_oa fieldoa_locations array if best_oa_location missing| Task | Command | |------|---------| | Check if OA available | curl "https://api.unpaywall.org/v2/DOI?email=EMAIL" | | Get best PDF URL | Parse .best_oa_location.url_for_pdf | | List all OA sources | Parse .oa_locations[] | | Check version type | Look at .version field | | Download PDF | curl -L -o paper.pdf "$pdf_url" |
Called by:
evaluating-paper-relevance - When full text not in PMCanswering-research-questions - For highly relevant papersUpdates:
papers-reviewed.json - Note if OA foundSUMMARY.md - Include OA source infoUsing placeholder email: Using claude@anthropic.com or researcher@example.com → Ask user for their real email Not including email: Required parameter, requests will fail Checking every paper: Only check when needed (score ≥7, no PMC) Ignoring version type: Published version better than preprint Single source only: Check oa_locations array for alternatives No rate limiting: Add delays even though no hard limit
Successful when:
After finding OA version:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 7,260 | 6,507 | -10% | 1 | 1 | 0% | 1,452 | 4,214 | +190% | 0 | 0 | — |
case-01 | fail→fail | 11,658 | 9,513 | -18% | 1 | 1 | 0% | 2,192 | 4,642 | +112% | 0 | 0 | — |
case-02 | fail→fail | 6,525 | 4,944 | -24% | 1 | 1 | 0% | 664 | 2,978 | +348% | 0 | 0 | — |
case-03 | pass→pass | 7,386 | 3,067 | -58% | 1 | 1 | 0% | 1,576 | 3,322 | +111% | 0 | 0 | — |
case-04 | pass→pass | 6,664 | 4,183 | -37% | 1 | 1 | 0% | 1,287 | 3,465 | +169% | 0 | 0 | — |
case-05 | pass→pass | 4,819 | 1,873 | -61% | 1 | 1 | 0% | 851 | 3,061 | +260% | 0 | 0 | — |
case-06 | pass→pass | 9,453 | 2,607 | -72% | 1 | 1 | 0% | 1,678 | 3,252 | +94% | 0 | 0 | — |
case-07 | fail→pass | 12,832 | 3,057 | -76% | 1 | 1 | 0% | 2,273 | 3,347 | +47% | 0 | 0 | — |
case-08 | fail→pass | 7,264 | 3,267 | -55% | 1 | 1 | 0% | 1,406 | 3,325 | +136% | 0 | 0 | — |
case-09 | pass→pass | 5,119 | 3,163 | -38% | 1 | 1 | 0% | 1,043 | 3,400 | +226% | 0 | 0 | — |
case-10 | pass→pass | 10,111 | 4,896 | -52% | 1 | 1 | 0% | 2,161 | 3,657 | +69% | 0 | 0 | — |
case-11 | pass→pass | 13,178 | 5,724 | -57% | 1 | 1 | 0% | 2,396 | 3,734 | +56% | 0 | 0 | — |
case-12 | pass→pass | 12,273 | 4,744 | -61% | 1 | 1 | 0% | 2,459 | 3,634 | +48% | 0 | 0 | — |
case-13 | fail→pass | 10,008 | 3,275 | -67% | 1 | 1 | 0% | 2,048 | 3,260 | +59% | 0 | 0 | — |
case-14 | pass→pass | 6,642 | 2,484 | -63% | 1 | 1 | 0% | 1,138 | 3,120 | +174% | 0 | 0 | — |
case-15 | pass→pass | 5,735 | 2,929 | -49% | 1 | 1 | 0% | 1,021 | 3,235 | +217% | 0 | 0 | — |
case-16 | fail→pass | 11,910 | 1,996 | -83% | 1 | 1 | 0% | 2,111 | 3,019 | +43% | 0 | 0 | — |
case-17 | fail→pass | 5,801 | 1,318 | -77% | 1 | 1 | 0% | 975 | 2,927 | +200% | 0 | 0 | — |
case-18 | pass→pass | 2,753 | 2,182 | -21% | 1 | 1 | 0% | 566 | 3,071 | +443% | 0 | 0 | — |
case-19 | pass→pass | 12,721 | 7,479 | -41% | 1 | 1 | 0% | 2,395 | 4,122 | +72% | 0 | 0 | — |
case-20 | pass→fail | 2,776 | 2,209 | -20% | 1 | 1 | 0% | 525 | 3,072 | +485% | 0 | 0 | — |
case-21 | pass→pass | 7,998 | 5,052 | -37% | 1 | 1 | 0% | 1,868 | 3,880 | +108% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +18 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.