Search 300M+ scholarly and patent records via the Lens.org API
Scanned 6/6/2026
Install via CLI
openskills install brycewang-stanford/Auto-Empirical-Research-Skills---
name: lens-scholarly-api
description: "Search 300M+ scholarly and patent records via the Lens.org API"
metadata:
openclaw:
emoji: "🔎"
category: "literature"
subcategory: "search"
keywords: ["Lens.org", "patent search", "scholarly search", "citation linking", "innovation", "prior art"]
source: "https://www.lens.org/"
---
# 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
```bash
# 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
```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
}'
```
### Patent Search
```bash
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 |
|-------|-------------|------|
| `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 |
## Python Usage
```python
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 |
## References
- [Lens.org](https://www.lens.org/)
- [Lens API Documentation](https://docs.api.lens.org/)
- [Lens Scholarly Search](https://www.lens.org/lens/search/scholar/list)
No comments yet. Be the first to comment!