agentsclimarketplace

Lens scholarly api

Skill brycewang-stanford/Auto-Empirical-Research-Skills/skills/43-wentorai-research-plugins/skills/literature/search/lens-scholarly-api

Search 300M+ scholarly and patent records via the Lens.org APIFrom its SKILL.md

Install
npx -y skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill lens-scholarly-api

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.

SKILL.md

6.0 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it

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

FieldDescriptionType
titleArticle titletext
abstractAbstract texttext
author.display_nameAuthor nametext
year_publishedPublication yearinteger
source.titleJournal/venue nametext
field_of_studyResearch fieldtext
doiDOI identifierkeyword
pmidPubMed IDkeyword
citing_patent_countPatents citing this workinteger
scholarly_citations_countCitation countinteger
open_access.is_oaOpen access statusboolean

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

TierDaily requestsResults per query
Free (non-commercial)1,0001,000
Institutional10,000+10,000

References

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.