Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Search 300M+ scholarly and patent records via the Lens.org API
.claude/skills/brycewang-stanford-lens-scholarly-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 63% | 0% |
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).
bash# Register at https://www.lens.org/lens/user/subscriptions # API token provided in your account settings # Include in header: Authorization: Bearer YOUR_TOKEN
bash# 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 }'
bashcurl -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 }'
| Field | Description | Type | |-------|-------------|------| | title | Article title | text | | abstract | Abstract text | text | | author.display_name | Author name | text | | year_published | Publication year | integer | | source.title | Journal/venue name | text | | field_of_study | Research field | text | | doi | DOI identifier | keyword | | pmid | PubMed ID | keyword | | citing_patent_count | Patents citing this work | integer | | scholarly_citations_count | Citation count | integer | | open_access.is_oa | Open access status | boolean |
pythonimport 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")
| Tier | Daily requests | Results per query | |------|---------------|-------------------| | Free (non-commercial) | 1,000 | 1,000 | | Institutional | 10,000+ | 10,000 |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,403 | 8,943 | -14% | 1 | 1 | 0% | 2,115 | 2,911 | +38% | 0 | 0 | — |
case-02 | fail→pass | 18,227 | 15,473 | -15% | 1 | 1 | 0% | 3,119 | 4,422 | +42% | 0 | 0 | — |
case-08 | pass→pass | 5,291 | 2,350 | -56% | 1 | 1 | 0% | 947 | 2,070 | +119% | 0 | 0 | — |
case-03 | pass→pass | 6,798 | 4,000 | -41% | 1 | 1 | 0% | 1,280 | 2,264 | +77% | 0 | 0 | — |
case-04 | pass→pass | 6,406 | 3,872 | -40% | 1 | 1 | 0% | 1,116 | 2,322 | +108% | 0 | 0 | — |
case-05 | pass→pass | 6,128 | 2,593 | -58% | 1 | 1 | 0% | 937 | 2,227 | +138% | 0 | 0 | — |
case-06 | pass→pass | 6,623 | 4,453 | -33% | 1 | 1 | 0% | 1,318 | 2,290 | +74% | 0 | 0 | — |
case-07 | fail→pass | 8,027 | 3,143 | -61% | 1 | 1 | 0% | 1,278 | 2,335 | +83% | 0 | 0 | — |
case-09 | fail→pass | 10,121 | 3,260 | -68% | 1 | 1 | 0% | 1,428 | 2,318 | +62% | 0 | 0 | — |
case-10 | fail→pass | 7,900 | 4,889 | -38% | 1 | 1 | 0% | 1,473 | 2,394 | +63% | 0 | 0 | — |
case-11 | pass→pass | 8,563 | 3,666 | -57% | 1 | 1 | 0% | 1,303 | 2,350 | +80% | 0 | 0 | — |
case-12 | pass→pass | 7,567 | 4,141 | -45% | 1 | 1 | 0% | 1,428 | 2,520 | +76% | 0 | 0 | — |
case-13 | pass→pass | 9,252 | 1,637 | -82% | 1 | 1 | 0% | 1,619 | 1,959 | +21% | 0 | 0 | — |
case-14 | pass→pass | 9,563 | 2,059 | -78% | 1 | 1 | 0% | 1,925 | 2,007 | +4% | 0 | 0 | — |
case-15 | pass→pass | 6,890 | 2,448 | -64% | 1 | 1 | 0% | 1,098 | 1,977 | +80% | 0 | 0 | — |
case-16 | pass→pass | 9,985 | 5,551 | -44% | 1 | 1 | 0% | 1,482 | 2,651 | +79% | 0 | 0 | — |
case-17 | pass→pass | 11,527 | 5,177 | -55% | 1 | 1 | 0% | 1,719 | 2,653 | +54% | 0 | 0 | — |
case-18 | fail→pass | 27,131 | 3,991 | -85% | 1 | 1 | 0% | 4,249 | 2,460 | -42% | 0 | 0 | — |
case-19 | pass→pass | 4,430 | 2,060 | -53% | 1 | 1 | 0% | 744 | 2,073 | +179% | 0 | 0 | — |
case-20 | pass→pass | 11,229 | 6,824 | -39% | 1 | 1 | 0% | 2,115 | 2,707 | +28% | 0 | 0 | — |
case-21 | pass→pass | 9,360 | 6,669 | -29% | 1 | 1 | 0% | 1,813 | 3,003 | +66% | 0 | 0 | — |
case-22 | pass→pass | 8,502 | 5,617 | -34% | 1 | 1 | 0% | 1,309 | 2,811 | +115% | 0 | 0 | — |
case-23 | pass→pass | 3,670 | 5,007 | +36% | 1 | 1 | 0% | 733 | 2,633 | +259% | 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. 23 cases were attempted. The headline lift of +26 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.