Awesome-Agent-Skills-for-Empirical-Research plos-open-access-api
Search PLOS open access journals with full-text Solr-powered API
install
source · Clone the upstream repo
git clone https://github.com/brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/43-wentorai-research-plugins/skills/literature/search/plos-open-access-api" ~/.claude/skills/brycewang-stanford-awesome-agent-skills-for-empirical-research-plos-open-access- && rm -rf "$T"
manifest:
skills/43-wentorai-research-plugins/skills/literature/search/plos-open-access-api/SKILL.mdsource content
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
# 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 |
|---|---|---|
| Article title | |
| Abstract text | |
| Full text body | |
| Author name | |
| Subject area | |
| Journal name | |
Query Parameters
| Parameter | Description | Default |
|---|---|---|
| Solr query (supports AND/OR/NOT) | Required |
| Filter query (narrows without affecting score) | None |
| Fields to return (comma-separated) | All |
| Results per page (max 999) | 10 |
| Pagination offset | 0 |
| Sort order | |
| Format: or | |
| Enable highlighting | |
Available Return Fields
| Field | Type | Description |
|---|---|---|
| string | DOI |
| string | Article title |
| array | Author names |
| string | Abstract text |
| string | Full text (large) |
| date | Publication date |
| string | Journal name |
| string | Article type |
| array | Subject categories |
| 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
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
# 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.