# PubMed Literature Intelligence (`skootle/pubmed-literature-intelligence`) Actor

Search PubMed for full abstracts, MeSH terms, DOIs, PMC links, author affiliations, funding, and publication types, plus a per-query landscape summary with publication trend, top journals and evidence mix. Official NCBI API, schedulable, with monitoring and integration ready JSON.

- **URL**: https://apify.com/skootle/pubmed-literature-intelligence.md
- **Developed by:** [Skootle](https://apify.com/skootle) (community)
- **Categories:** AI, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 pubmed literature intelligence records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

<!-- skootle:growth-loop-hook -->
## PubMed Literature Intelligence

**Search PubMed and get clean, structured records for every matching paper, plus a landscape summary of the whole result set.** Full abstracts, MeSH terms, DOIs, PMC full text links, author affiliations, funding, and publication types, straight from the official NCBI E-utilities API. Built for medical and market researchers, competitive intelligence teams, and AI agents that need biomedical literature as data, not as a web page.

Three ways to run it:

1. **Keyword search.** Type a query like `semaglutide AND cardiovascular outcomes`, get the newest matching papers as JSON.
2. **Filtered pull.** Narrow by author, journal, year range, or article type (randomized controlled trial, meta-analysis, review, and more).
3. **Landscape scan.** Keep the summary record on and read the shape of a field in one object: publication trend, top journals, top authors, MeSH concentration, and evidence mix.

![PubMed Literature Intelligence](https://raw.githubusercontent.com/kesjam/skootle-actors-assets/main/heroes/pubmed-literature-intelligence.png)

<!-- skootle:review-cta -->
> Using this in your work? A short review helps other researchers find it: https://apify.com/skootle/pubmed-literature-intelligence/reviews

### TL;DR: what you get

Every run returns one `ARTICLE` record per paper and, by default, one `SUMMARY` record for the query. Article records carry the fields you actually filter, join, and cite on:

- **Identifiers:** `pmid`, `doi`, `pmcId`, plus ready-made `pubmedUrl`, `doiUrl`, and `pmcUrl`.
- **Full abstract:** `abstract` (the complete text, never truncated), `abstractSections` (labeled Background, Methods, Results, Conclusions when the publisher structured them), and `abstractWordCount`.
- **Authors:** `authors[]` with `fullName`, `affiliation`, `orcid`, and `isFirstAuthor` / `isLastAuthor` flags, plus `firstAuthor`, `lastAuthor`, `authorCount`, and `primaryAffiliation`.
- **Journal and dates:** `journal` (title, ISO abbreviation, ISSN, volume, issue, pages), `publicationDateIso`, `publicationYear`, and `yearsSincePublication`.
- **Classification:** `publicationTypes[]` plus boolean flags (`isReviewArticle`, `isClinicalTrial`, `isRandomizedControlledTrial`, `isMetaAnalysis`, `isSystematicReview`, `isCaseReport`) and a single `evidenceTier` you can sort on.
- **Indexing:** `meshHeadings[]` with major-topic flags, `meshDescriptors[]`, `majorMeshDescriptors[]`, and `keywords[]`.
- **Funding and access:** `grants[]`, `fundingAgencies[]`, `isOpenAccess`, and `fullTextAvailability` (PMC free full text, publisher link only, or abstract only).
- **Agent-grade extras:** `agentMarkdown` (a readable brief per paper), `fieldCompletenessScore` (0 to 100), a versioned `schemaVersion`, and normalized enums and ISO dates throughout.

The pain it kills: PubMed's website is built for humans clicking one result at a time, and its raw API returns dense XML that you have to parse, denormalize, and clean before it is usable. This Actor does that once, correctly, and hands you flat JSON plus a market-intelligence summary that the website never shows you.

### What does this Actor do?

It turns a PubMed search into a dataset. You give it search terms and optional filters. It queries the official NCBI E-utilities service (the same API the NIH publishes for programmatic access), pulls the full record for every match up to your limit, and returns structured JSON. Because it uses the official API rather than scraping the PubMed website, there is no anti-bot surface, no CAPTCHA, and no layout that can silently break the parse.

On top of the raw records it computes a per-query `SUMMARY`: how many papers matched in total, how many you pulled, the publication trend by year, the most active journals and authors, the most indexed MeSH concepts, and the evidence mix. That summary is the market-intelligence layer a plain scraper does not give you.

### Why pull PubMed as structured data?

PubMed indexes more than 37 million biomedical citations. If your work touches medicine, pharma, biotech, public health, or life-science market research, the answer to "what does the literature say" lives there. Reading it one browser tab at a time does not scale. Common jobs this Actor does in one run:

- **Literature reviews and meta-analyses:** pull every RCT on an intervention since 2020, with abstracts and DOIs, ready for screening.
- **Competitive and pipeline intelligence:** track publication volume and the leading authors and institutions around a drug, target, or mechanism.
- **KOL mapping:** find the most-published authors on a topic and their affiliations.
- **Journal and trend monitoring:** schedule a weekly run and watch new publications land in a topic area.
- **RAG and agent pipelines:** feed clean abstracts, MeSH tags, and citations into a retrieval system without writing a parser.

### Worked examples from real runs

Every example below is real output from a verification run against the live API on 2026-07-21.

#### Example 1: a drug-outcome search with the landscape summary

**Input**

```json
{
  "query": "semaglutide AND cardiovascular outcomes",
  "fromYear": 2023,
  "maxItems": 50
}
````

PubMed matched **652** records. The run returned the newest **50** and one summary. The first article record looked like this (abstract abbreviated here for space, full in the dataset):

```json
{
  "recordType": "ARTICLE",
  "pmid": "42012820",
  "doi": "10.1080/13696998.2026.2646078",
  "doiUrl": "https://doi.org/10.1080/13696998.2026.2646078",
  "pubmedUrl": "https://pubmed.ncbi.nlm.nih.gov/42012820/",
  "title": "Cost-effectiveness of tirzepatide versus semaglutide for patients with obesity ...",
  "journal": { "title": "Journal of medical economics", "isoAbbreviation": "J Med Econ" },
  "publicationDateIso": "2026-12-01",
  "authorCount": 9,
  "firstAuthor": "Erin Johansson",
  "evidenceTier": "CLINICAL_TRIAL",
  "meshCount": 16,
  "hasAbstract": true,
  "abstractWordCount": 295,
  "isOpenAccess": false,
  "fullTextAvailability": "PUBLISHER_LINK_ONLY",
  "fieldCompletenessScore": 100
}
```

And the `SUMMARY` record that came with it:

```json
{
  "recordType": "SUMMARY",
  "query": "semaglutide AND cardiovascular outcomes",
  "totalMatchingRecords": 652,
  "returnedRecords": 50,
  "coverageOfTotalPct": 7.7,
  "medianPublicationYear": 2026,
  "reviewPct": 34,
  "randomizedControlledTrialPct": 2,
  "openAccessPct": 42,
  "abstractCoveragePct": 96,
  "doiCoveragePct": 100,
  "distinctJournals": 37,
  "journalConcentrationTop5Pct": 36,
  "averageFieldCompleteness": 94.4,
  "topJournals": [{ "name": "Diabetes, obesity & metabolism", "count": 11, "sharePct": 22 }],
  "topMeshDescriptors": [
    { "descriptor": "Humans", "count": 25 },
    { "descriptor": "Semaglutide", "count": 21 },
    { "descriptor": "Diabetes Mellitus, Type 2", "count": 18 }
  ]
}
```

In one run you learn that the field is 652 papers deep, mostly recent, one third reviews, and heavily concentrated in a single journal. That is intelligence, not just a list.

#### Example 2: only randomized reviews, since 2024

**Input**

```json
{
  "query": "CRISPR gene editing",
  "fromYear": 2024,
  "articleTypes": ["Review"],
  "maxItems": 200
}
```

PubMed matched **2,323** review articles. The run returned **200** across two automatic fetch batches, with **100%** abstract coverage, **61%** MeSH coverage, and an average field completeness of **95.7 out of 100**. Article-type filtering happens inside the PubMed query itself, so you only pay for records that match.

#### Example 3: an author-scoped pull

**Input**

```json
{
  "query": "rheumatoid arthritis",
  "author": "Smolen JS",
  "maxItems": 25
}
```

The `author` field is combined with your query using PubMed's `[Author]` tag, so you get one researcher's work on a topic, each record carrying that author's affiliation and ORCID when PubMed has them.

#### Example 4: an honest empty result

**Input**

```json
{
  "query": "zzqxwv nonexistent biomedical concept 99812",
  "maxItems": 10
}
```

**Output:** exactly one `SUMMARY` record with `sourceStatus: "ZERO_MATCH"`, `zeroMatch: true`, and `totalMatchingRecords: 0`. The run succeeds and tells you plainly that the search itself worked and PubMed simply has nothing. It does not fail, and it does not return a silent empty dataset that could be mistaken for a bug. If a run ever ends with zero records because something actually broke, it fails loudly and saves the raw payload for diagnosis instead.

### Input reference

| Field | Type | What it does |
|---|---|---|
| `query` | string | PubMed search terms. Full PubMed syntax works, including field tags like `[Title/Abstract]`. |
| `author` | string | Restrict to one author in PubMed format, for example `Smolen JS`. |
| `journal` | string | Restrict to one journal by full name or NLM abbreviation. |
| `fromYear` | integer | Earliest publication year. |
| `toYear` | integer | Latest publication year. Defaults to the current year. |
| `articleTypes` | array | Keep only these publication types (RCT, meta-analysis, systematic review, review, and more). |
| `freeFullTextOnly` | boolean | Only records with free full text. |
| `hasAbstractOnly` | boolean | Skip records with no indexed abstract. |
| `maxItems` | integer | How many articles to return, newest first. Up to 2000. |
| `emitSummary` | boolean | Include the landscape summary record. On by default. |
| `ncbiApiKey` | string | Optional free NCBI key. Raises the rate limit and speeds up large runs. Not required. |

You must provide at least one of `query`, `author`, or `journal`.

### Output reference

Two record types share one dataset, told apart by `recordType`:

- **`ARTICLE`**: one per paper, with the fields listed in the TL;DR above.
- **`SUMMARY`**: one per run, with corpus size, coverage, year trend, top journals, top authors, top MeSH descriptors, top funding agencies, evidence-mix percentages, and field-coverage percentages.

Every run also writes an `AGENT_BRIEFING` key to the run's key-value store: the summary rendered as markdown, ready to drop into an agent context window. Run-level counters live in `RUN_STATS`.

### Pricing

This Actor uses pay-per-result pricing. You pay a small fee when a run starts and a per-record fee for each article returned. The optional summary record is included, not charged as an extra event.

Because the Actor runs on the official NCBI API with no browser and no proxy, its platform cost is very low, and that keeps the price low. At scale the measured platform cost is well under one cent per thousand records. A typical 50-record literature pull costs a few cents. Every run has a $5 maximum total charge, so a large accidental run cannot exceed that buyer-charge boundary. Usage-based platform costs are not passed through to you; the per-result price is what you pay.

To estimate a run: multiply your `maxItems` by the per-result price and add the one start fee. Volume plans (Bronze, Silver, Gold) lower the per-result price as your usage grows.

### Why choose this Actor?

There are several PubMed scrapers on the Store. Here is an honest comparison so you can pick the right one.

| | This Actor | Typical PubMed scraper |
|---|---|---|
| Data source | Official NCBI E-utilities API | Scrapes the PubMed web page |
| Reliability | No anti-bot surface, no layout to break | Breaks when the page markup changes |
| Abstract | Full text, labeled sections | Often the truncated preview shown on search results |
| MeSH terms | Yes, with major-topic flags | Rarely |
| DOI and PMC links | Yes | Sometimes |
| Author affiliations and ORCID | Yes | Rarely |
| Funding and grant data | Yes | No |
| Evidence tier and type flags | Yes | No |
| Per-query landscape summary | Yes | No |
| Agent-ready markdown and completeness score | Yes | No |

**Where a plain scraper is the better buy:** if all you need is a list of titles and PMIDs and you want the absolute lowest possible per-record price, a bare-bones scraper may edge this out on sticker price. This Actor is built for people who need the full, clean, analysis-ready record and the landscape view, and who value a source that does not break.

Two things it does that the others do not: it reads the abstract in full with its section labels intact, and it hands you a market-intelligence summary of the entire result set in the same run.

### Tutorial: your first run

1. Open the Actor and click **Try for free**.
2. In **Search query**, type a topic, for example `GLP-1 receptor agonists AND kidney`.
3. Set **Published from year** to `2022` to keep it recent.
4. Leave **Maximum articles** at `50` for a quick first pull.
5. Click **Start**. The run finishes in seconds.
6. Open the **Storage** tab, choose the dataset, and switch to the **Articles** view for a clean table, or download JSON, CSV, or Excel.
7. Scroll to the `SUMMARY` record at the end for the landscape view.

To schedule it, use the Apify **Schedules** tab, point a schedule at this Actor with your saved input, and you have a standing literature monitor. To call it from your own code, use the Apify API or any of the client SDKs; the Actor is a normal API-addressable Actor.

### Frequently asked questions

**Is this legal?** The Actor uses the public NCBI E-utilities API, which the U.S. National Library of Medicine provides for exactly this kind of programmatic access. PubMed records are U.S. government works and are not under copyright. See the legal note below and NCBI's usage guidelines. As with any data source, you are responsible for how you use the results.

**Do I need an NCBI API key?** No. The Actor runs fine without one and stays within NCBI's default rate limits. If you run very large or frequent pulls, add a free NCBI key in the input to get a higher rate limit and faster runs.

**How current is the data?** As current as PubMed. New records appear in the API as soon as NCBI indexes them, and the Actor sorts newest first.

**Can I get the full text of the paper?** The Actor returns the full abstract for every record that has one, plus a PMC link when free full text exists and a publisher DOI link otherwise. Full article text beyond the abstract is controlled by publishers and is outside PubMed's scope.

**What is the summary record for?** It gives you the shape of a whole result set in one object: how deep the field is, whether it is recent or stale, who publishes in it, and what the evidence mix looks like. It is the difference between a list of papers and an understanding of a literature.

**What happens if my search matches nothing?** You get one summary record marked as a real zero match. The run succeeds. It never disguises an empty search as an error, and it never disguises an error as an empty search.

**How many papers can I pull at once?** Up to 2000 per run. The Actor fetches full records in batches automatically and deduplicates by PMID.

**Does it work for non-English literature?** Yes. Records carry a `language` field, and PubMed indexes many languages. Filter in your query if you need a specific one.

### Legal and compliance

This Actor retrieves data from the National Center for Biotechnology Information (NCBI) E-utilities API, a public service of the U.S. National Library of Medicine. PubMed bibliographic records are works of the U.S. federal government and are generally not subject to copyright within the United States. Abstracts may carry publisher copyright; they are returned here for research and indexing use, the same use PubMed itself supports. You are responsible for complying with NCBI's usage policies and with the terms of any downstream use. This Actor is not affiliated with, endorsed by, or sponsored by NCBI, the National Library of Medicine, or the National Institutes of Health.

### Related Actors from Skootle

If you work across research and regulatory data, these siblings pair well with this one:

- **[Clinical Trials Intel](https://apify.com/skootle/clinical-trials-intel):** ClinicalTrials.gov by condition, sponsor, drug, or phase, with a pipeline landscape summary.
- **[FDA Drug Safety Signals](https://apify.com/skootle/fda-drug-safety-signals):** openFDA adverse-event signals for a drug or class.
- **[arXiv Papers](https://apify.com/skootle/arxiv-papers):** preprints and papers from arXiv for the physical and computer sciences.
- **[SEC EDGAR Filings](https://apify.com/skootle/sec-edgar-filings):** company filings for the market-research side of a life-science thesis.

### Your feedback

Found a bug or a record that did not parse the way you expected? Please open an issue on the Actor's **Issues** tab with the input you used, so it can be fixed quickly. Issues are the fastest path to a fix and they keep the review score meaningful for other buyers. If the Actor did what you needed, a short review at the link near the top genuinely helps other researchers find it.

# Actor input Schema

## `query` (type: `string`):

PubMed search terms. Full PubMed syntax works, for example: semaglutide AND obesity, or CRISPR\[Title/Abstract].

## `author` (type: `string`):

Restrict to one author, in PubMed format: Smolen JS. Combined with the search query using AND.

## `journal` (type: `string`):

Restrict to one journal by full name or NLM abbreviation, for example: Lancet or N Engl J Med.

## `fromYear` (type: `integer`):

Earliest publication year to include.

## `toYear` (type: `integer`):

Latest publication year to include. Leave empty for the current year.

## `articleTypes` (type: `array`):

Restrict to these PubMed publication types. Leave empty to include everything.

## `freeFullTextOnly` (type: `boolean`):

Only return records with free full text available.

## `hasAbstractOnly` (type: `boolean`):

Skip records that have no indexed abstract.

## `maxItems` (type: `integer`):

How many articles to return, newest first. Maximum 2000.

## `emitSummary` (type: `boolean`):

Adds one SUMMARY record per run with publication trend, top journals, top authors, MeSH concentration, evidence mix, and field coverage.

## `ncbiApiKey` (type: `string`):

Optional free NCBI key. Raises the rate limit from 3 to 10 requests per second, which speeds up large runs. Not required.

## Actor input object example

```json
{
  "query": "semaglutide AND cardiovascular outcomes",
  "fromYear": 2023,
  "articleTypes": [],
  "freeFullTextOnly": false,
  "hasAbstractOnly": false,
  "maxItems": 50,
  "emitSummary": true
}
```

# Actor output Schema

## `results` (type: `string`):

Normalized article records followed by a landscape summary for each query.

## `briefing` (type: `string`):

Markdown briefing generated from the verified literature landscape.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "semaglutide AND cardiovascular outcomes",
    "fromYear": 2023,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("skootle/pubmed-literature-intelligence").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "semaglutide AND cardiovascular outcomes",
    "fromYear": 2023,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("skootle/pubmed-literature-intelligence").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "semaglutide AND cardiovascular outcomes",
  "fromYear": 2023,
  "maxItems": 50
}' |
apify call skootle/pubmed-literature-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=skootle/pubmed-literature-intelligence",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "PubMed Literature Intelligence",
        "description": "Search PubMed for full abstracts, MeSH terms, DOIs, PMC links, author affiliations, funding, and publication types, plus a per-query landscape summary with publication trend, top journals and evidence mix. Official NCBI API, schedulable, with monitoring and integration ready JSON.",
        "version": "0.1",
        "x-build-id": "7KvHRKzllaz75Ifh7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/skootle~pubmed-literature-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-skootle-pubmed-literature-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/skootle~pubmed-literature-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-skootle-pubmed-literature-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/skootle~pubmed-literature-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-skootle-pubmed-literature-intelligence",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "query": {
                        "title": "Search query",
                        "type": "string",
                        "description": "PubMed search terms. Full PubMed syntax works, for example: semaglutide AND obesity, or CRISPR[Title/Abstract]."
                    },
                    "author": {
                        "title": "Author",
                        "type": "string",
                        "description": "Restrict to one author, in PubMed format: Smolen JS. Combined with the search query using AND."
                    },
                    "journal": {
                        "title": "Journal",
                        "type": "string",
                        "description": "Restrict to one journal by full name or NLM abbreviation, for example: Lancet or N Engl J Med."
                    },
                    "fromYear": {
                        "title": "Published from year",
                        "minimum": 1800,
                        "type": "integer",
                        "description": "Earliest publication year to include."
                    },
                    "toYear": {
                        "title": "Published to year",
                        "minimum": 1800,
                        "type": "integer",
                        "description": "Latest publication year to include. Leave empty for the current year."
                    },
                    "articleTypes": {
                        "title": "Article types",
                        "type": "array",
                        "description": "Restrict to these PubMed publication types. Leave empty to include everything.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Randomized Controlled Trial",
                                "Clinical Trial",
                                "Meta-Analysis",
                                "Systematic Review",
                                "Review",
                                "Case Reports",
                                "Observational Study",
                                "Comparative Study",
                                "Multicenter Study",
                                "Practice Guideline"
                            ],
                            "enumTitles": [
                                "Randomized controlled trial",
                                "Clinical trial",
                                "Meta-analysis",
                                "Systematic review",
                                "Review",
                                "Case report",
                                "Observational study",
                                "Comparative study",
                                "Multicenter study",
                                "Practice guideline"
                            ]
                        },
                        "default": []
                    },
                    "freeFullTextOnly": {
                        "title": "Free full text only",
                        "type": "boolean",
                        "description": "Only return records with free full text available.",
                        "default": false
                    },
                    "hasAbstractOnly": {
                        "title": "Records with an abstract only",
                        "type": "boolean",
                        "description": "Skip records that have no indexed abstract.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum articles",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "How many articles to return, newest first. Maximum 2000."
                    },
                    "emitSummary": {
                        "title": "Include the landscape summary record",
                        "type": "boolean",
                        "description": "Adds one SUMMARY record per run with publication trend, top journals, top authors, MeSH concentration, evidence mix, and field coverage.",
                        "default": true
                    },
                    "ncbiApiKey": {
                        "title": "NCBI API key (optional)",
                        "type": "string",
                        "description": "Optional free NCBI key. Raises the rate limit from 3 to 10 requests per second, which speeds up large runs. Not required."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
