plos-open-access-api

Search PLOS open access journals with full-text Solr-powered API

191 stars

Best use case

plos-open-access-api is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Search PLOS open access journals with full-text Solr-powered API

Teams using plos-open-access-api should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/plos-open-access-api/SKILL.md --create-dirs "https://raw.githubusercontent.com/wentorai/research-plugins/main/skills/literature/search/plos-open-access-api/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/plos-open-access-api/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How plos-open-access-api Compares

Feature / Agentplos-open-access-apiStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Search PLOS open access journals with full-text Solr-powered API

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# PLOS Search API

## Overview

PLOS (Public Library of Science) publishes 7 peer-reviewed open access journals covering biology, medicine, genetics, and more. The Search API provides Solr-powered full-text search across all PLOS content — 350K+ articles, all freely available under CC-BY licenses. No authentication required. Particularly valuable for biomedical and life sciences systematic reviews.

## API Endpoint

### Base URL

```
https://api.plos.org/search
```

### Search Examples

```bash
# Basic keyword search
curl "https://api.plos.org/search?q=CRISPR+gene+editing&rows=20&wt=json"

# Search in specific fields
curl "https://api.plos.org/search?q=title:\"machine learning\"+AND+abstract:biomarker&wt=json"

# Filter by journal
curl "https://api.plos.org/search?q=microbiome&fq=journal:\"PLOS ONE\"&wt=json"

# Filter by date range
curl "https://api.plos.org/search?q=COVID-19+vaccine&\
fq=publication_date:[2024-01-01T00:00:00Z TO 2026-12-31T23:59:59Z]&wt=json"

# Filter by article type
curl "https://api.plos.org/search?q=climate+change&fq=article_type:\"Research Article\"&wt=json"

# Return specific fields only
curl "https://api.plos.org/search?q=deep+learning&fl=id,title,author,publication_date,score&wt=json"
```

### Search Fields

| Field | Description | Example |
|-------|-------------|---------|
| `title` | Article title | `title:"attention mechanism"` |
| `abstract` | Abstract text | `abstract:neural+network` |
| `body` | Full text body | `body:transformer` |
| `author` | Author name | `author:"Vaswani"` |
| `subject` | Subject area | `subject:"Neuroscience"` |
| `journal` | Journal name | `journal:"PLOS Medicine"` |

### Query Parameters

| Parameter | Description | Default |
|-----------|-------------|---------|
| `q` | Solr query (supports AND/OR/NOT) | Required |
| `fq` | Filter query (narrows without affecting score) | None |
| `fl` | Fields to return (comma-separated) | All |
| `rows` | Results per page (max 999) | 10 |
| `start` | Pagination offset | 0 |
| `sort` | Sort order | `score desc` |
| `wt` | Format: `json` or `xml` | `xml` |
| `hl` | Enable highlighting | `false` |

### Available Return Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | DOI |
| `title` | string | Article title |
| `author` | array | Author names |
| `abstract` | string | Abstract text |
| `body` | string | Full text (large) |
| `publication_date` | date | Publication date |
| `journal` | string | Journal name |
| `article_type` | string | Article type |
| `subject` | array | Subject categories |
| `score` | float | Relevance score |

### PLOS Journals

| Journal | Scope |
|---------|-------|
| PLOS ONE | Multidisciplinary |
| PLOS Biology | Life sciences |
| PLOS Medicine | Clinical medicine |
| PLOS Genetics | Genetics and genomics |
| PLOS Computational Biology | Computational biology |
| PLOS Pathogens | Infectious disease |
| PLOS Neglected Tropical Diseases | Tropical medicine |

## Python Usage

```python
import requests

BASE_URL = "https://api.plos.org/search"


def search_plos(query: str, rows: int = 20,
                journal: str = None,
                from_date: str = None,
                fields: str = None) -> list:
    """Search PLOS open access articles."""
    params = {
        "q": query,
        "wt": "json",
        "rows": rows,
        "fl": fields or "id,title,author,abstract,publication_date,journal,score",
    }

    fq_parts = []
    if journal:
        fq_parts.append(f'journal:"{journal}"')
    if from_date:
        fq_parts.append(
            f"publication_date:[{from_date}T00:00:00Z TO NOW]"
        )
    if fq_parts:
        params["fq"] = " AND ".join(fq_parts)

    resp = requests.get(BASE_URL, params=params)
    resp.raise_for_status()
    data = resp.json()

    results = []
    for doc in data.get("response", {}).get("docs", []):
        results.append({
            "doi": doc.get("id"),
            "title": doc.get("title"),
            "authors": doc.get("author", []),
            "date": doc.get("publication_date", "")[:10],
            "journal": doc.get("journal"),
            "abstract": (doc.get("abstract", [""])[0])[:300]
                        if isinstance(doc.get("abstract"), list)
                        else (doc.get("abstract", ""))[:300],
        })
    return results


def get_full_text(doi: str) -> str:
    """Retrieve full text body of a PLOS article."""
    params = {
        "q": f'id:"{doi}"',
        "fl": "body",
        "wt": "json",
    }
    resp = requests.get(BASE_URL, params=params)
    resp.raise_for_status()
    docs = resp.json().get("response", {}).get("docs", [])
    return docs[0].get("body", "") if docs else ""


# Example: search PLOS Computational Biology
papers = search_plos(
    "protein structure prediction",
    journal="PLOS Computational Biology",
    from_date="2024-01-01",
)
for p in papers:
    print(f"[{p['date']}] {p['title']}")
    print(f"  DOI: {p['doi']}")

# Example: full-text search across all PLOS
papers = search_plos("body:reinforcement+learning AND title:robot")
for p in papers:
    print(f"{p['title']} — {p['journal']}")
```

## Advanced Solr Queries

```bash
# Phrase proximity search (words within 5 of each other)
q=abstract:"machine learning"~5

# Boosted field search
q=title:"CRISPR"^2 OR abstract:"CRISPR"

# Wildcard search
q=title:neuro*

# Range query on dates
fq=publication_date:[2024-01-01T00:00:00Z TO 2024-12-31T23:59:59Z]
```

## Rate Limits

No formal rate limit, but PLOS requests courtesy delays of 1 request per second for bulk operations. No authentication needed.

## References

- [PLOS API Documentation](https://api.plos.org/)
- [PLOS Search Tips](https://journals.plos.org/plosone/s/search)
- [Solr Query Syntax](https://solr.apache.org/guide/solr/latest/query-guide/standard-query-parser.html)