Skip to content
Back to skills

Mendeley Api

BSecurity

Manage references and search Mendeley's catalog via REST API

  • 3,639 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added June 6, 2026
researchpythongobashapidatabasedocumentation

Works with

  • cli
  • api

Security analysis

B88/100
  • criticalExfiltrates credentials via HTTP β€” exact pattern from Snyk ToxicSkills study

Pro shows the line behind each finding and how to fix it

Scanned June 6, 2026

npx -y skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill mendeley-api --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Mendeley Api?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Mendeley Api
[![Security: B β€” Skills Directory](https://www.skillsdirectory.com/api/skills/brycewang-stanford-mendeley-api/badge)](https://www.skillsdirectory.com/skills/brycewang-stanford-mendeley-api)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: mendeley-api
description: "Manage references and search Mendeley's catalog via REST API"
metadata:
  openclaw:
    emoji: "πŸ“š"
    category: "writing"
    subcategory: "citation"
    keywords: ["mendeley", "reference manager", "bibliography", "catalog search", "research library", "citations"]
    source: "wentor-research-plugins"
---

# Mendeley REST API

## Overview

Mendeley provides a reference management platform with a REST API for programmatic access to personal libraries, group collections, and the Mendeley Catalog β€” a crowdsourced database of 200M+ academic documents. The API supports OAuth 2.0 authentication, CRUD operations on documents/folders/annotations, and catalog search with rich metadata. Free tier available with registration.

## Authentication

Mendeley uses OAuth 2.0 with client credentials or authorization code flow.

```bash
# 1. Register app at https://dev.elsevier.com/
# 2. Get access token via client credentials (for catalog search)
curl -X POST "https://api.mendeley.com/oauth/token" \
  -d "grant_type=client_credentials" \
  -d "scope=all" \
  -d "client_id=$MENDELEY_CLIENT_ID" \
  -d "client_secret=$MENDELEY_CLIENT_SECRET"

# Response: { "access_token": "...", "expires_in": 3600, "token_type": "bearer" }
```

## API Endpoints

### Base URL

```
https://api.mendeley.com
```

### Catalog Search

Search across Mendeley's 200M+ document database:

```bash
# Search by title/keywords
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/catalog?query=deep+learning+NLP&limit=20"

# Search by DOI
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/catalog?doi=10.1038/nature14539"

# Search by title
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/catalog?title=attention+is+all+you+need"
```

### User Library

```bash
# List documents in personal library
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/documents?limit=50&sort=created&order=desc"

# Get document details
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/documents/{doc_id}"

# Add document to library
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/vnd.mendeley-document.1+json" \
  -d '{"title":"My Paper","type":"journal","year":2025,"authors":[{"first_name":"A","last_name":"B"}]}' \
  "https://api.mendeley.com/documents"
```

### Folders and Groups

```bash
# List folders
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/folders"

# List group documents
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/documents?group_id={group_id}"
```

### Annotations

```bash
# Get annotations for a document
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.mendeley.com/annotations?document_id={doc_id}"
```

## Query Parameters

| Parameter | Description | Example |
|-----------|-------------|---------|
| `query` | Free-text search | `query=transformer+model` |
| `doi` | DOI lookup | `doi=10.1234/example` |
| `title` | Title search | `title=BERT` |
| `author` | Author filter | `author=LeCun` |
| `min_year` | From year | `min_year=2020` |
| `max_year` | To year | `max_year=2026` |
| `limit` | Results per page (max 500) | `limit=50` |
| `sort` | Sort field | `created`, `title`, `year` |
| `order` | Sort direction | `asc` or `desc` |
| `view` | Response detail | `bib` (bibliographic), `stats` (reader counts) |

## Catalog Response

```json
{
  "id": "abc123-...",
  "title": "Attention Is All You Need",
  "type": "conference_proceedings",
  "year": 2017,
  "authors": [
    {"first_name": "Ashish", "last_name": "Vaswani"}
  ],
  "source": "NeurIPS",
  "identifiers": {
    "doi": "10.5555/3295222.3295349",
    "arxiv": "1706.03762"
  },
  "keywords": ["attention mechanism", "transformer"],
  "abstract": "The dominant sequence transduction models...",
  "reader_count": 15432,
  "link": "https://www.mendeley.com/catalogue/..."
}
```

## Python Usage

```python
import os
import requests

CLIENT_ID = os.environ["MENDELEY_CLIENT_ID"]
CLIENT_SECRET = os.environ["MENDELEY_CLIENT_SECRET"]
TOKEN_URL = "https://api.mendeley.com/oauth/token"
BASE_URL = "https://api.mendeley.com"


def get_token() -> str:
    """Obtain access token via client credentials."""
    resp = requests.post(TOKEN_URL, data={
        "grant_type": "client_credentials",
        "scope": "all",
        "client_id": CLIENT_ID,
        "client_secret": CLIENT_SECRET,
    })
    resp.raise_for_status()
    return resp.json()["access_token"]


def search_catalog(query: str, limit: int = 20,
                   min_year: int = None) -> list:
    """Search the Mendeley catalog."""
    token = get_token()
    params = {"query": query, "limit": limit, "view": "bib"}
    if min_year:
        params["min_year"] = min_year

    resp = requests.get(
        f"{BASE_URL}/catalog",
        headers={"Authorization": f"Bearer {token}"},
        params=params,
    )
    resp.raise_for_status()

    results = []
    for doc in resp.json():
        results.append({
            "title": doc.get("title"),
            "authors": [f"{a['first_name']} {a['last_name']}"
                        for a in doc.get("authors", [])],
            "year": doc.get("year"),
            "source": doc.get("source"),
            "doi": doc.get("identifiers", {}).get("doi"),
            "readers": doc.get("reader_count", 0),
        })
    return results


def lookup_by_doi(doi: str) -> dict:
    """Look up a single document by DOI."""
    token = get_token()
    resp = requests.get(
        f"{BASE_URL}/catalog",
        headers={"Authorization": f"Bearer {token}"},
        params={"doi": doi, "view": "bib"},
    )
    resp.raise_for_status()
    items = resp.json()
    return items[0] if items else {}


# Example
papers = search_catalog("federated learning privacy", min_year=2023)
for p in papers:
    print(f"[{p['year']}] {p['title']} β€” readers: {p['readers']}")
```

## Reader Statistics

Mendeley tracks how many users have saved each paper, providing a real-time measure of scholarly interest (unlike citation counts which lag by months).

```python
def get_popular_papers(topic: str, limit: int = 10) -> list:
    """Find most-read papers on a topic via reader counts."""
    results = search_catalog(topic, limit=limit)
    return sorted(results, key=lambda x: x["readers"], reverse=True)
```

## Rate Limits

| Tier | Requests/hour | Catalog access |
|------|--------------|----------------|
| Free | 150 | Read-only catalog + personal library |
| Institutional | Higher | Full API access |

## References

- [Mendeley API Documentation](wentor-research-plugins)
- [Mendeley Developer Portal](https://dev.elsevier.com/)
- [Mendeley API Reference](https://api.mendeley.com/apidocs/)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.