# PubMed Evidence Table: Study Designs, Retractions & PRISMA (`pandadad0214/pubmed-evidence-table`) Actor

Search PubMed and get a screening-ready Excel evidence table: study design from NLM indexing, sample size quoted from the abstract (blank when unclear), retraction and correction status, PMID/DOI/PMC links, PRISMA-style counts, and RIS / Rayyan CSV / NBIB files for Rayyan, Covidence and EndNote.

- **URL**: https://apify.com/pandadad0214/pubmed-evidence-table.md
- **Developed by:** [Panda Federation](https://apify.com/pandadad0214) (community)
- **Categories:** AI, Education, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## PubMed Evidence Table: Study Designs, Retraction Screening, PRISMA Counts & Rayyan/Covidence Import

**Run your PubMed searches and get a screening-ready Excel evidence table. Each article comes with its study design, a sample size quoted from the abstract, its retraction and correction status, and PMID, DOI and PMC links. You also get PRISMA-style counts and import files for Rayyan, Covidence, EndNote and Zotero.**

Most PubMed exports are raw dumps that someone then spends hours tidying in Excel. **PubMed Evidence Table** does the mechanical part and leaves the judgement to you. It queries **PubMed through NCBI's official E-utilities API**, tags study designs from **NLM's own indexing**, screens every article against **PubMed and Crossref retraction notices (including Retraction Watch data)**, and records how many records each filter removed.

- 🔎 **Your exact PubMed syntax**, with one or more search strings. Overlaps are de-duplicated and counted
- 🧪 **Study design from NLM indexing:** RCT (with trial phase), meta-analysis, systematic review, cohort, case-control, cross-sectional, case report, guideline, review. If PubMed hasn't indexed a record yet, the field stays blank rather than guessed
- 👥 **Population tags** from MeSH (age groups, sex, humans or animals) and a **sample size quoted from the abstract** with a confidence level and the exact sentence it came from, left blank when the abstract is ambiguous
- 🚦 **Retraction screen:** **OK**, **CHECK** (expression of concern, preprint, or a notice record) or **FIX** (retracted). Errata are noted
- 📊 **PRISMA-style counts:** records identified, removed by each filter, duplicates removed, records over your limit, retracted records excluded, and records left for screening. The numbers always add up
- 📥 **Import files:** RIS (Rayyan, Covidence, EndNote, Zotero), Rayyan CSV, and the original PubMed-format text straight from NCBI
- 🧾 **Search log:** each query as written, the final search string, PubMed's own translation of it, and the date, ready for your methods section
- 💸 **$0.004 per returned article.** 200 articles cost $0.80. Searches with no results cost nothing

### Who it's for

- **Medical writers and med-affairs teams:** evidence tables for literature reviews, publication plans and value dossiers
- **Clinicians, pharmacists and guideline groups:** a fast, structured first pass over the evidence on a question
- **HEOR, market-access and consulting analysts:** reproducible PubMed searches with counts you can report
- **Systematic-review teams:** run the searches, then screen in Rayyan or Covidence with the counts already logged

> **Not for coursework or ghostwriting.** This tool searches, organizes and screens records. It doesn't write reviews, judge study quality or extract outcomes, and it isn't meant for completing assignments or academic work on someone else's behalf. Every included study still needs a human to read it.

### How to use it

1. Click **Try for free** and paste one or more **PubMed search strings**, written exactly as you would in PubMed (`[tiab]`, `[mh]`, `[pt]`, AND / OR / NOT).
2. Optional: add **filters**, such as publication dates, study designs, languages, animal-only exclusion, abstract required or free full text. Each filter's effect is counted.
3. Set **Maximum articles**. You pay per returned article, so this also caps the cost.
4. Click **Start**. 200 articles usually take under a minute without an NCBI key.
5. Download **EVIDENCE_TABLE_XLSX** from **Storage → Key-value store**. Import **REVIEW_IMPORT_RIS** or **REVIEW_IMPORT_RAYYAN_CSV** into your screening tool.

#### Input example

```json
{
  "queries": [
    "semaglutide[tiab] AND obesity[tiab]",
    "semaglutide[tiab] AND (weight loss[tiab] OR body weight[mh])"
  ],
  "dateFrom": "2020",
  "dateTo": "2025",
  "studyDesigns": ["rct", "meta-analysis", "systematic-review"],
  "excludeAnimalOnly": true,
  "languages": ["english"],
  "retractedArticles": "flag",
  "maxResults": 60,
  "citationStyle": "vancouver"
}
```

### Output example

Real output from a platform run of the input above:

**PRISMA-style counts (PRISMA_COUNTS / Excel sheet)**

| Stage | Records |
|---|---|
| Records identified (PubMed, 2 queries) | 5,419 |
| Removed by filter: publication date 2020–2025 | 2,001 |
| Removed by filter: study design (RCT, meta-analysis, systematic review) | 2,911 |
| Removed by filter: language English | 4 |
| Duplicates removed (found by both queries) | 198 |
| Not included (maximum articles reached) | 245 |
| **Records for screening** | **60** |

**Evidence table rows (shortened)**

| Status | Citation (Vancouver, shortened here) | Study design | Sample size (confidence) | Quote |
|---|---|---|---|---|
| OK | Wilding JPH, Batterham RL, Calanna S, et al. Once-Weekly Semaglutide in Adults with Overweight or Obesity. N Engl J Med. 2021;384(11):989–1002. | Randomized controlled trial | 1,961 adults (high) | "…we enrolled 1961 adults with a body-mass index…" |
| OK | Lincoff AM, Brown-Frandsen K, Colhoun HM, et al. Semaglutide and Cardiovascular Outcomes in Obesity without Diabetes. N Engl J Med. 2023;389(24):2221–32. | Randomized controlled trial | 17,604 patients (high) | "…A total of 17,604 patients were enrolled…" |
| OK | Tan HC, Dampil OA, Marquez MM. Efficacy and Safety of Semaglutide for Weight Loss in Obesity Without Diabetes: A Systematic Review and Meta-Analysis. J ASEAN Fed Endocr Soc. 2022;37(2):65–72. | Meta-analysis | 4 studies (medium); note: pooled participants 3,613 | "…The study included 4 randomized controlled trials having a total of 3,613 individuals…" |
| OK | PMID 35441470 (its abstract reports two different group sizes) | Randomized controlled trial | *blank* (unclear: 327 and 1,961) | n/a: extract by hand |

A retracted trial, as the screen reports it:

```json
{
  "status": "FIX",
  "title": "RETRACTED: Hydroxychloroquine in the Treatment of COVID-19: A Multicenter Randomized Controlled Study.",
  "studyDesign": "Randomized controlled trial",
  "retractionStatus": "Retracted",
  "notices": [
    {"source": "PubMed", "type": "RetractionIn"},
    {"source": "Crossref (Retraction Watch)", "type": "retraction"}
  ],
  "notes": ["RETRACTED. Exclude it, or report it as retracted."]
}
```

#### The Excel evidence table

| Column group | What's in it |
|---|---|
| Citation, year, journal | Formatted in your chosen style (Vancouver by default) with citeproc-js and the official CSL style |
| Study design + source | From PubMed publication types or MeSH, with the source named. Blank when PubMed hasn't indexed it |
| Population tags | MeSH age, sex and species check tags (e.g. Humans, Adult, Aged, Female) |
| Sample size, unit, confidence, quote | Copied from the abstract only when it is stated clearly. **high** = an explicit total or enrolment statement; **medium** = one clear statement; **low** = only an "n =" mention; **blank** = unclear or not stated |
| Outcomes, Include/Exclude, Reason, Notes | **Left empty for the reviewer** (shaded) |
| Retraction / correction status, flags | Retracted, expression of concern, corrected (erratum), notice record, or none found |
| PMID, PubMed, DOI and PMC links | Clickable |
| Publication types, major MeSH, title, authors, abstract | For screening and filtering in Excel |

Other sheets: **PRISMA counts**, **Search strategy** (queries, final strings, PubMed translations, per-filter counts) and **Read me** (column definitions and caveats).

#### What OK, CHECK and FIX mean

| Status | Meaning |
|---|---|
| 🟢 **OK** | No retraction or expression of concern found in PubMed or Crossref. Errata are noted but don't change the status |
| 🟡 **CHECK** | Partial retraction, expression of concern, preprint, or a record that is itself a retraction, erratum or concern notice |
| 🔴 **FIX** | Retracted (PubMed "Retracted Publication" / RetractionIn, or a Crossref / Retraction Watch notice). Left out of the citations file |

"OK" means no notice was found. It isn't a quality rating. To check a finished manuscript's reference list, use our **[Reference Checker](https://apify.com/pandadad0214/reference-checker)**.

### Files you get

| Key-value store key | What it is |
|---|---|
| `EVIDENCE_TABLE_XLSX` | Excel evidence table plus PRISMA, search strategy and read-me sheets |
| `EVIDENCE_TABLE_CSV` | The evidence table as CSV |
| `PRISMA_COUNTS` | Identification-stage counts as JSON (with an arithmetic check) |
| `REVIEW_IMPORT_RIS` | RIS for Rayyan, Covidence, EndNote, Zotero, Mendeley (abstract, MeSH keywords, PMID, DOI). The recommended import file |
| `REVIEW_IMPORT_RAYYAN_CSV` | CSV in Rayyan's column layout (key, title, authors, abstract, doi, pubmed_id, pmc_id…) |
| `PUBMED_MEDLINE_TXT` | The records in PubMed (MEDLINE) text format, straight from NCBI. It's the same format as PubMed's Save → Format: PubMed, so save it as a `.txt` file for Covidence or Rayyan |
| `CITATIONS` | Bibliography in your chosen style (retracted articles left out) |
| `SUMMARY` | Search log, PRISMA counts, design breakdown and API stats |

### Pricing

**$0.004 per article returned** (pay-per-event). Design tags, sample-size quotes, the retraction screen, citations and all export files are included.

| Articles | Cost |
|---|---|
| 50 | $0.20 |
| 200 | $0.80 |
| 1,000 | $4.00 |

Searches with no results cost nothing. If you choose **Exclude** for retracted articles, they are removed before you're charged. The Actor also never fetches more articles than your maximum charge per run allows.

### Limits, honestly

- **Study design depends on NLM indexing.** Very recent articles are often not indexed yet, so their design is blank and flagged. We never infer a design from the abstract.
- **Sample size is a quote, not an extraction.** We copy a number only when the abstract states it unambiguously, show you the sentence, and leave it blank otherwise. Always confirm against the full text.
- **Outcomes, risk of bias and inclusion decisions are yours.** Those columns stay empty.
- **PRISMA counts cover identification only.** Screening and eligibility happen in your review tool.
- **PubMed returns at most 9,999 records per search string.** Anything beyond that is counted, and the fix is to split the search by date.
- **One database.** This searches PubMed/MEDLINE only. A systematic review usually needs more (Embase, CENTRAL, trial registries).

### FAQ

**Does it work without an NCBI API key?**
Yes. It identifies itself to NCBI as required and stays under NCBI's limit of 3 requests per second. Adding your own free NCBI key makes large searches faster.

**Will my search give the same results as the PubMed website?**
The same search string gives the same records. The Search strategy sheet shows PubMed's own translation of each query, so you can reproduce it. Counts change over time as PubMed adds records, which is why the date is logged.

**Can AI agents use it?**
Yes, through the Apify API, the Python or JavaScript clients, or Apify's MCP server. Each run returns structured JSON with designs, links and retraction flags.

### Data sources and credits

- [PubMed / MEDLINE](https://pubmed.ncbi.nlm.nih.gov), U.S. National Library of Medicine, through [NCBI E-utilities](https://www.ncbi.nlm.nih.gov/books/NBK25501/). Not affiliated with or endorsed by NLM/NCBI
- [Crossref](https://www.crossref.org) for retraction, correction and expression-of-concern notices, including [Retraction Watch](https://retractionwatch.com) data
- [citeproc-js](https://github.com/Juris-M/citeproc-js) and the [CSL project](https://citationstyles.org) styles (CC BY-SA 3.0) for citations

***

#### Built by Panda Federation

**Self-healing, local-first AI systems and data tools that run themselves.**

The Panda Federation research toolkit:

- **[PubMed Evidence Table](https://apify.com/pandadad0214/pubmed-evidence-table)**: screening-ready evidence tables from PubMed
- **[Literature Search](https://apify.com/pandadad0214/literature-search)**: a Google Scholar alternative across 250M+ papers, with retraction screening
- **[Citation Formatter](https://apify.com/pandadad0214/citation-formatter)**: DOIs, ISBNs and messy references to APA, MLA, Chicago, Harvard, IEEE, Vancouver, BibTeX and RIS
- **[Reference Checker](https://apify.com/pandadad0214/reference-checker)**: fake citations and retracted papers, found

[More from Panda Federation on Apify](https://apify.com/pandadad0214) · [GitHub](https://github.com/pandadad0214)

# Actor input Schema

## `queries` (type: `array`):

One or more PubMed queries, written exactly as you would in PubMed (field tags like \[tiab], \[mh], \[pt] and AND / OR / NOT work). Records found by more than one query are counted once and reported as duplicates.

## `dateFrom` (type: `string`):

Optional. 2020, 2020-06 or 2020-06-30 (publication date).

## `dateTo` (type: `string`):

Optional. 2025, 2025-12 or 2025-12-31.

## `studyDesigns` (type: `array`):

Keep only these designs (PubMed publication types / MeSH). Leave empty for all.

## `excludeAnimalOnly` (type: `boolean`):

Removes records indexed with Animals but not Humans. Records not yet indexed are kept.

## `languages` (type: `array`):

Optional, e.g. english, spanish. Leave empty for all.

## `hasAbstract` (type: `boolean`):

Removes records without an abstract (often letters, editorials and older records).

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

Keep only records PubMed links to a free full text.

## `excludePreprints` (type: `boolean`):

Removes records with the Preprint publication type.

## `retractedArticles` (type: `string`):

Flag keeps them in the table, marked FIX (charged as returned articles). Exclude removes them before they are returned (not charged) and counts them in PRISMA.

## `sortBy` (type: `string`):

Order of the table. PubMed best match or most recent first.

## `maxResults` (type: `integer`):

You pay per returned article ($0.004 each), so this also caps the cost. Counts for everything not included are still reported.

## `citationStyle` (type: `string`):

Style for the citation column and the CITATIONS file. Formatted by citeproc-js with the official CSL style.

## `includeAbstracts` (type: `boolean`):

Include the abstract in the table and import files (recommended for screening).

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

Optional. A free NCBI key raises the limit from 3 to 10 requests per second (faster big searches). Stored encrypted; never logged.

## `contactEmail` (type: `string`):

Sent to NCBI and Crossref as the contact for this tool. Leave empty to use ours.

## Actor input object example

```json
{
  "queries": [
    "semaglutide[tiab] AND obesity[tiab]",
    "semaglutide[tiab] AND (weight loss[tiab] OR body weight[mh])"
  ],
  "excludeAnimalOnly": false,
  "hasAbstract": false,
  "freeFullTextOnly": false,
  "excludePreprints": false,
  "retractedArticles": "flag",
  "sortBy": "relevance",
  "maxResults": 200,
  "citationStyle": "vancouver",
  "includeAbstracts": true
}
```

# Actor output Schema

## `table` (type: `string`):

No description

## `flagged` (type: `string`):

No description

## `xlsx` (type: `string`):

No description

## `prisma` (type: `string`):

No description

## `ris` (type: `string`):

No description

## `rayyan` (type: `string`):

No description

## `medline` (type: `string`):

No description

## `citations` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "queries": [
        "semaglutide[tiab] AND obesity[tiab]",
        "semaglutide[tiab] AND (weight loss[tiab] OR body weight[mh])"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pandadad0214/pubmed-evidence-table").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 = { "queries": [
        "semaglutide[tiab] AND obesity[tiab]",
        "semaglutide[tiab] AND (weight loss[tiab] OR body weight[mh])",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pandadad0214/pubmed-evidence-table").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "semaglutide[tiab] AND obesity[tiab]",
    "semaglutide[tiab] AND (weight loss[tiab] OR body weight[mh])"
  ]
}' |
apify call pandadad0214/pubmed-evidence-table --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pandadad0214/pubmed-evidence-table"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qU1i6zmgFWvBFqk3k/builds/NiYl2KvTUHTJWDWd3/openapi.json
