Awesome-Agent-Skills-for-Empirical-Research lens-scholarly-api
Search 300M+ scholarly and patent records via the Lens.org 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/search/lens-scholarly-api" ~/.claude/skills/brycewang-stanford-awesome-agent-skills-for-empirical-research-lens-scholarly-ap && rm -rf "$T"
manifest:
skills/43-wentorai-research-plugins/skills/literature/search/lens-scholarly-api/SKILL.mdsource content
Lens.org Scholarly and Patent API
Overview
Lens.org provides unified access to 300M+ scholarly articles and 150M+ patent records with cross-linkage between them. Uniquely, Lens connects academic research to patent citations, enabling innovation tracking and prior art discovery. The API offers full-text search, citation analysis, and patent-paper linkage. Free for non-commercial use with registration (up to 1,000 requests/day).
Authentication
# Register at https://www.lens.org/lens/user/subscriptions # API token provided in your account settings # Include in header: Authorization: Bearer YOUR_TOKEN
API Endpoints
Scholarly Search
# POST-based search curl -X POST "https://api.lens.org/scholarly/search" \ -H "Authorization: Bearer $LENS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "query": { "match": {"field_of_study": "machine learning"} }, "size": 20, "from": 0, "sort": [{"year_published": "desc"}] }' # Boolean query curl -X POST "https://api.lens.org/scholarly/search" \ -H "Authorization: Bearer $LENS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "query": { "bool": { "must": [ {"match": {"title": "transformer"}}, {"range": {"year_published": {"gte": 2023}}} ], "should": [ {"match": {"abstract": "attention mechanism"}} ] } }, "size": 25 }'
Patent Search
curl -X POST "https://api.lens.org/patent/search" \ -H "Authorization: Bearer $LENS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "query": { "bool": { "must": [ {"match": {"title": "neural network"}}, {"term": {"jurisdiction": "US"}} ] } }, "size": 20 }'
Scholarly Fields
| Field | Description | Type |
|---|---|---|
| Article title | text |
| Abstract text | text |
| Author name | text |
| Publication year | integer |
| Journal/venue name | text |
| Research field | text |
| DOI identifier | keyword |
| PubMed ID | keyword |
| Patents citing this work | integer |
| Citation count | integer |
| Open access status | boolean |
Python Usage
import os import requests TOKEN = os.environ["LENS_API_TOKEN"] BASE_URL = "https://api.lens.org" HEADERS = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json", } def search_scholarly(query: str, size: int = 20, min_year: int = None, fields: list = None) -> list: """Search Lens scholarly records.""" must_clauses = [{"match": {"title": query}}] if min_year: must_clauses.append( {"range": {"year_published": {"gte": min_year}}} ) body = { "query": {"bool": {"must": must_clauses}}, "size": size, "sort": [{"scholarly_citations_count": "desc"}], } if fields: body["include"] = fields resp = requests.post( f"{BASE_URL}/scholarly/search", headers=HEADERS, json=body, ) resp.raise_for_status() data = resp.json() results = [] for doc in data.get("data", []): results.append({ "title": doc.get("title"), "authors": [a.get("display_name", "") for a in doc.get("authors", [])[:5]], "year": doc.get("year_published"), "source": doc.get("source", {}).get("title"), "doi": doc.get("doi"), "citations": doc.get("scholarly_citations_count", 0), "patent_citations": doc.get("citing_patent_count", 0), "open_access": doc.get("open_access", {}).get("is_oa"), }) return results def find_patent_cited_papers(topic: str, min_patents: int = 5) -> list: """Find papers cited by patents (innovation indicators).""" body = { "query": { "bool": { "must": [ {"match": {"title": topic}}, {"range": {"citing_patent_count": {"gte": min_patents}}}, ] } }, "size": 50, "sort": [{"citing_patent_count": "desc"}], } resp = requests.post( f"{BASE_URL}/scholarly/search", headers=HEADERS, json=body, ) resp.raise_for_status() return resp.json().get("data", []) # Example: find high-impact ML papers cited by patents papers = search_scholarly("deep learning", size=10, min_year=2020) for p in papers: print(f"[{p['year']}] {p['title']}") print(f" Citations: {p['citations']} scholarly, " f"{p['patent_citations']} patent") # Example: find industry-impactful research patent_cited = find_patent_cited_papers("battery technology") for doc in patent_cited[:5]: print(f"{doc['title']} — {doc.get('citing_patent_count')} patents")
Unique Features
- Patent-paper linkage: Discover which research is cited in patents
- Unified search: Scholarly + patent in one platform
- Innovation metrics: Track technology transfer from academia to industry
- Prior art search: Find relevant literature for patent applications
Rate Limits
| Tier | Daily requests | Results per query |
|---|---|---|
| Free (non-commercial) | 1,000 | 1,000 |
| Institutional | 10,000+ | 10,000 |