Skill Tracer
Skills › Scientific Agent Skills › paper-lookup › pmc.md

pmc.md

204 lines · skills/paper-lookup/references/pmc.md at 5f2bc03

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# PMC (PubMed Central)
2
3PMC is a **full-text archive** of biomedical and life sciences articles. It is separate from PubMed -- PubMed has citations/abstracts, PMC has full text. Not all PubMed articles are in PMC, and vice versa.
4

PMC (PubMed Central)

PMC is a full-text archive of biomedical and life sciences articles. It is separate from PubMed -- PubMed has citations/abstracts, PMC has full text. Not all PubMed articles are in PMC, and vice versa.

Raw lines 1 to 4
5## E-utilities for PMC
6

E-utilities for PMC

Raw lines 5 to 6
7### Base URL
8
9```
10https://eutils.ncbi.nlm.nih.gov/entrez/eutils/
11```
13Same E-utilities as PubMed, but with `db=pmc`.

Base URL

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/

Same E-utilities as PubMed, but with db=pmc.

Raw lines 7 to 14
15### eSearch -- Search PMC
17```
18GET /esearch.fcgi?db=pmc&term={query}&retmode=json
19```
21Same parameters as PubMed eSearch. PubMed and PMC ESearch are both limited to the first 10,000 matching IDs; partition larger searches or use an appropriate bulk workflow. Returns PMC UIDs (numeric, e.g., `13033346`). You need to prepend "PMC" to get a PMCID (e.g., `PMC13033346`).

eSearch -- Search PMC

GET /esearch.fcgi?db=pmc&term={query}&retmode=json

Same parameters as PubMed eSearch. PubMed and PMC ESearch are both limited to the first 10,000 matching IDs; partition larger searches or use an appropriate bulk workflow. Returns PMC UIDs (numeric, e.g., 13033346). You need to prepend "PMC" to get a PMCID (e.g., PMC13033346).

Raw lines 15 to 22
23### eFetch -- Get Full Text XML
25```
26GET /efetch.fcgi?db=pmc&id={pmcid}&retmode=xml
27```
29| rettype | retmode | Returns |
30|---------|---------|---------|
31| *(omit)* | `xml` | JATS XML -- full text for **eligible OA and Author Manuscript articles**; metadata only otherwise, with no error. See the hazard below before using this. |
33**Example:**
34```
35https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=7029759&retmode=xml
36```
38The XML uses JATS (Journal Article Tag Suite) format:
39- `<front>` -- journal metadata, article metadata, author info
40- `<body>` -- full article text with `<sec>` sections, `<p>` paragraphs, `<fig>` figures
41- `<back>` -- `<ref-list>` with all references
43Pass numeric IDs only (not "PMC7029759", just "7029759").

eFetch -- Get Full Text XML

GET /efetch.fcgi?db=pmc&id={pmcid}&retmode=xml
rettyperetmodeReturns
(omit)xmlJATS XML -- full text for eligible OA and Author Manuscript articles; metadata only otherwise, with no error. See the hazard below before using this.

Example:

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=7029759&retmode=xml

The XML uses JATS (Journal Article Tag Suite) format:

  • <front> -- journal metadata, article metadata, author info
  • <body> -- full article text with <sec> sections, <p> paragraphs, <fig> figures
  • <back> -- <ref-list> with all references

Pass numeric IDs only (not "PMC7029759", just "7029759").

Raw lines 23 to 44
45### Hazard: eFetch returns metadata-only XML for non-OA articles, with HTTP 200
47This is the most dangerous failure in this skill, because nothing about the response says it failed.
48When the publisher does not permit XML redistribution, eFetch returns a **well-formed
49`<pmc-articleset>`** containing `<front>` metadata, **no `<body>`**, and the reason as an XML
50*comment* -- which every standard parser discards. Verified 2026-07-27 on PMCID 1500000:
52```
53HTTP/1.1 200 OK
55<pmc-articleset><article article-type="obituary" ...>
56 <!--The publisher of this article does not allow downloading of the full text in XML form.-->
57 <front>...</front>
58</article></pmc-articleset>
59```
61An agent that fetches this, parses it, and reports "retrieved full text" has retrieved only the
62title, journal, and author list. An article being readable on the PMC website does not establish that its XML is available through this API. The absence of a body is a retrieval limitation, not evidence about the article contents.
64**Always confirm `<body>` exists before claiming you have full text.** Two ways, in order of
65preference:
671. **Use `scripts/jats_to_text.py`**, which exits non-zero with `no <body> element` when the article
68 is metadata-only and surfaces the publisher-restriction comment instead of dropping it.
692. **Fall back to Europe PMC** (`references/europepmc.md`), whose `fullTextXML` endpoint returns a
70 clean **404** for the same article rather than a 200 with no body -- an honest failure is easier to
71 handle than a plausible one.
73If full text is unavailable, say so explicitly and offer the abstract (PubMed eFetch) or an OA copy
74elsewhere (Unpaywall, CORE) rather than presenting `<front>` metadata as the article.

Hazard: eFetch returns metadata-only XML for non-OA articles, with HTTP 200

This is the most dangerous failure in this skill, because nothing about the response says it failed. When the publisher does not permit XML redistribution, eFetch returns a **well-formed <pmc-articleset>** containing <front> metadata, **no <body>**, and the reason as an XML comment -- which every standard parser discards. Verified 2026-07-27 on PMCID 1500000:

HTTP/1.1 200 OK

<pmc-articleset><article article-type="obituary" ...>
  <!--The publisher of this article does not allow downloading of the full text in XML form.-->
  <front>...</front>
</article></pmc-articleset>

An agent that fetches this, parses it, and reports "retrieved full text" has retrieved only the title, journal, and author list. An article being readable on the PMC website does not establish that its XML is available through this API. The absence of a body is a retrieval limitation, not evidence about the article contents.

**Always confirm <body> exists before claiming you have full text.** Two ways, in order of preference:

  1. **Use scripts/jats_to_text.py**, which exits non-zero with no <body> element when the article is metadata-only and surfaces the publisher-restriction comment instead of dropping it.
  2. Fall back to Europe PMC (references/europepmc.md), whose fullTextXML endpoint returns a clean 404 for the same article rather than a 200 with no body -- an honest failure is easier to handle than a plausible one.

If full text is unavailable, say so explicitly and offer the abstract (PubMed eFetch) or an OA copy elsewhere (Unpaywall, CORE) rather than presenting <front> metadata as the article.

Raw lines 45 to 75
Runs code scripts/jats_to_text.py :67
76## Retired OA Web Service
78The PMC OA Web Service (`oa.fcgi`) was retired on **2026-08-25**. Do not use it
79as an availability preflight, retraction check, or source of FTP package links.
80The old OA-package FTP workflow is no longer the supported retrieval path.
81For a targeted paper, fetch via E-utilities, BioC, or Europe PMC and validate
82that the response actually contains article text. For bulk access consult
83[PMC Article Datasets](https://pmc.ncbi.nlm.nih.gov/tools/textmining/) and the
84[PMC Cloud Service](https://pmc.ncbi.nlm.nih.gov/tools/cloud/).
86Use the article's current license for reuse decisions. For retractions inspect
87PubMed/publisher notices and Crossref update relationships; a missing OA copy
88says nothing about retraction status.

Retired OA Web Service

The PMC OA Web Service (oa.fcgi) was retired on 2026-08-25. Do not use it as an availability preflight, retraction check, or source of FTP package links. The old OA-package FTP workflow is no longer the supported retrieval path. For a targeted paper, fetch via E-utilities, BioC, or Europe PMC and validate that the response actually contains article text. For bulk access consult PMC Article Datasets and the PMC Cloud Service.

Use the article's current license for reuse decisions. For retractions inspect PubMed/publisher notices and Crossref update relationships; a missing OA copy says nothing about retraction status.

Raw lines 76 to 89
90## BioC API -- Structured Full Text
92An alternative way to get full text in a structured passage format.

BioC API -- Structured Full Text

An alternative way to get full text in a structured passage format.

Raw lines 90 to 93
94### Base URL
96```
97https://www.ncbi.nlm.nih.gov/research/bionlp/RESTful/pmcoa.cgi/
98```

Base URL

https://www.ncbi.nlm.nih.gov/research/bionlp/RESTful/pmcoa.cgi/
Raw lines 94 to 99
100### Endpoint
102```
103GET /BioC_{format}/{id}/{encoding}
104```
106| Parameter | Values |
107|-----------|--------|
108| `format` | `json` or `xml` |
109| `id` | PMID (e.g., `17299597`) or PMCID (e.g., `PMC7029759`) |
110| `encoding` | `unicode` or `ascii` |
112**Example:**
113```
114https://www.ncbi.nlm.nih.gov/research/bionlp/RESTful/pmcoa.cgi/BioC_json/PMC7029759/unicode
115```
117**Response structure (JSON):** a list of BioC collections. Read `[0].documents`, not a top-level `documents` object.
118```json
119[{
120 "source": "PMC",
121 "documents": [{
122 "id": "PMC7029759",
123 "infons": {"license": "...", "doi": "..."},
124 "passages": [
125 {
126 "offset": 0,
127 "infons": {"section_type": "TITLE"},
128 "text": "Article title..."
129 },
130 {
131 "offset": 42,
132 "infons": {"section_type": "ABSTRACT"},
133 "text": "Abstract text..."
134 },
135 {
136 "offset": 500,
137 "infons": {"section_type": "INTRO"},
138 "text": "Introduction text..."
139 }
140 ]
141 }]
142}]
143```
145Section types: `TITLE`, `ABSTRACT`, `INTRO`, `METHODS`, `RESULTS`, `DISCUSS`, `CONCL`, `REF`, `SUPPL`, `FIG`, `TABLE`
147**Coverage:** PMC Open Access and eligible Author Manuscript articles; not all PMC records. Do not use the count in the 2019 BioC paper as a current coverage total.

Endpoint

GET /BioC_{format}/{id}/{encoding}
ParameterValues
formatjson or xml
idPMID (e.g., 17299597) or PMCID (e.g., PMC7029759)
encodingunicode or ascii

Example:

https://www.ncbi.nlm.nih.gov/research/bionlp/RESTful/pmcoa.cgi/BioC_json/PMC7029759/unicode

Response structure (JSON): a list of BioC collections. Read [0].documents, not a top-level documents object.

[{
  "source": "PMC",
  "documents": [{
    "id": "PMC7029759",
    "infons": {"license": "...", "doi": "..."},
    "passages": [
      {
        "offset": 0,
        "infons": {"section_type": "TITLE"},
        "text": "Article title..."
      },
      {
        "offset": 42,
        "infons": {"section_type": "ABSTRACT"},
        "text": "Abstract text..."
      },
      {
        "offset": 500,
        "infons": {"section_type": "INTRO"},
        "text": "Introduction text..."
      }
    ]
  }]
}]

Section types: TITLE, ABSTRACT, INTRO, METHODS, RESULTS, DISCUSS, CONCL, REF, SUPPL, FIG, TABLE

Coverage: PMC Open Access and eligible Author Manuscript articles; not all PMC records. Do not use the count in the 2019 BioC paper as a current coverage total.

Raw lines 100 to 148
149## PMC ID Converter API
151Converts between PMID, PMCID, DOI, and Manuscript ID.

PMC ID Converter API

Converts between PMID, PMCID, DOI, and Manuscript ID.

Raw lines 149 to 152
153### Base URL
155```
156https://pmc.ncbi.nlm.nih.gov/tools/idconv/api/v1/articles/
157```

Base URL

https://pmc.ncbi.nlm.nih.gov/tools/idconv/api/v1/articles/
Raw lines 153 to 158
159### Parameters
161| Parameter | Required | Description |
162|-----------|----------|-------------|
163| `ids` | Yes | Up to 200 comma-separated IDs, all of the same identifier type |
164| `idtype` | No | `pmcid`, `pmid`, `mid`, `doi` (default: auto-detect) |
165| `format` | No | `json`, `xml`, `csv`, `html` (default: xml) |
166| `tool` | Recommended | Your application name |
167| `email` | Recommended | Your contact email |
169**Example:**
170```
171https://pmc.ncbi.nlm.nih.gov/tools/idconv/api/v1/articles/?ids=PMC7029759&format=json
172```
174**Response:**
175```json
177 "status": "ok",
178 "records": [{
179 "pmcid": "PMC7029759",
180 "pmid": "32117569",
181 "doi": "10.12688/f1000research.22211.2"
182 }]
184```
186The JSON `pmid` may be numeric; normalize identifiers to strings before joining across APIs. Inspect per-record errors/availability as well as top-level `status`. Only returns related identifiers for articles that are in PMC. If an article is in PubMed but not PMC, no PMCID will be returned.

Parameters

ParameterRequiredDescription
idsYesUp to 200 comma-separated IDs, all of the same identifier type
idtypeNopmcid, pmid, mid, doi (default: auto-detect)
formatNojson, xml, csv, html (default: xml)
toolRecommendedYour application name
emailRecommendedYour contact email

Example:

https://pmc.ncbi.nlm.nih.gov/tools/idconv/api/v1/articles/?ids=PMC7029759&format=json

Response:

{
  "status": "ok",
  "records": [{
    "pmcid": "PMC7029759",
    "pmid": "32117569",
    "doi": "10.12688/f1000research.22211.2"
  }]
}

The JSON pmid may be numeric; normalize identifiers to strings before joining across APIs. Inspect per-record errors/availability as well as top-level status. Only returns related identifiers for articles that are in PMC. If an article is in PubMed but not PMC, no PMCID will be returned.

Raw lines 159 to 187
188## Rate Limits
190| Service | Limit |
191|---------|-------|
192| E-utilities (`db=pmc`) | 3/sec without key, 10/sec with key |
193| BioC API | Serialize conservatively; an E-utilities API key does not establish a higher BioC quota |
194| ID Converter | Follow general NCBI policy |
196Include `tool` and `email` parameters on E-utility requests. Large batch jobs should run outside peak hours (Mon-Fri 5AM-9PM ET).

Rate Limits

ServiceLimit
E-utilities (db=pmc)3/sec without key, 10/sec with key
BioC APISerialize conservatively; an E-utilities API key does not establish a higher BioC quota
ID ConverterFollow general NCBI policy

Include tool and email parameters on E-utility requests. Large batch jobs should run outside peak hours (Mon-Fri 5AM-9PM ET).

Raw lines 188 to 197
198## Official sources reviewed 2026-09-30
200- https://pmc.ncbi.nlm.nih.gov/tools/developers/
201- https://pmc.ncbi.nlm.nih.gov/tools/oa-service/
202- https://pmc.ncbi.nlm.nih.gov/tools/id-converter-api/
203- https://www.ncbi.nlm.nih.gov/research/bionlp/APIs/BioC-PMC/
204- https://pmc.ncbi.nlm.nih.gov/tools/textmining/

Official sources reviewed 2026-09-30

  • https://pmc.ncbi.nlm.nih.gov/tools/developers/
  • https://pmc.ncbi.nlm.nih.gov/tools/oa-service/
  • https://pmc.ncbi.nlm.nih.gov/tools/id-converter-api/
  • https://www.ncbi.nlm.nih.gov/research/bionlp/APIs/BioC-PMC/
  • https://pmc.ncbi.nlm.nih.gov/tools/textmining/
Raw lines 198 to 204