This vignette explains how common scholarly identifiers are formally defined, what their structural components are, and what it means for them to be valid in a programmatic context.
When working with identifiers in R, it is essential to distinguish between:
The functions in scholid validate identifiers at the
structural level and verify checksums where defined
(ORCID, ROR, ISNI, ISBN, ISSN). They do not check registry or online
existence. The regexes in each section describe the
canonical form that is_scholid() expects;
wrapped URLs and labels should be normalized with
normalize_scholid() first. Checksum rules are documented
separately where they apply.
classify_scholid() and
detect_scholid_type() walk types in the order returned by
scholid_types() (most specific first). The first matching
type wins. This matters when patterns overlap: for example, OpenAlex is
checked before PMID, and six-character UniProt accessions such as
P12345 are not treated as OpenAlex keys.
PMID is a fallback type (detect_last in
the registry): bare digit strings are only classified or detected as
PMID when no more specific type matches. During extraction, PMID
candidates use 4–9 digits and do not match digits immediately following
PMC.
For the authoritative type list and order, call
scholid_types() in R.
Text copied from PDFs, word processors, and web pages often contains characters that look like ASCII but are not. scholid handles them as follows.
is_scholid() returns
FALSE for values that contain one;
normalize_scholid(), extract_scholid(), and
detect_scholid_type() remove them first.is_scholid() returns FALSE.normalize_scholid(), extract_scholid(), and
detect_scholid_type() read them as - and
0–9 for the types in the table below.
is_scholid() and classify_scholid() accept
only the ASCII characters. The em dash (U+2014) is never read as a
hyphen.| Types | Dashes | Full-width digits |
|---|---|---|
orcid, isbn, isni |
Yes | Yes |
issn |
normalize_scholid() only |
Yes |
arxiv, bibcode, openalex,
ror, uniprot, refseq,
sra, geo, bioproject,
assembly, pmcid, pmid |
No | Yes |
doi, ark, swhid,
rrid |
No | No |
Dashes are read as hyphens only for types that separate digit groups
with hyphens. In free text, an en dash usually marks a page or year
range, and 1998–2003 passes the ISSN checksum, so
extract_scholid() doesn’t read dashes for ISSN. A DOI
suffix may contain any Unicode character, and ARK names, SWHID
qualifiers, and some RRID bodies are free-form, so those types keep
dashes and digits as written.
The same identifier can normalize to different strings: an ISBN-10
and its ISBN-13 name one book, and 2101.00001v1 and
2101.00001v2 are versions of one preprint.
scholid_key() normalizes values and then applies the type’s
key rule, so that such values get the same key for
duplicated(), match(), or
merge(). A type’s key rule, if it has one, is stated in its
“Validation in scholid” section. For every other type, the key is the
normalized value.
Keys are for comparing, not identifiers. Some keys don’t pass
is_scholid(), and a key can leave out a version that tells
two records apart. Store and show the normalized values instead.
Each type’s section has a table with its resolver URL, the link form that the issuing authority documents, and its CURIE, the canonical Bioregistry prefix, a colon, and the identifier. ISBNs have no resolver URL, and bibcodes have no Bioregistry prefix. Some tables also name older URLs that still resolve.
normalize_scholid() reads these forms:
http or https, in any case, and
with or without a slash at the end. ARK and SWHID keep that slash in
some cases; see their sections.PubMed:12345678. The identifier must follow the colon
directly.The canonical forms of ARKs, SWHIDs, and RRIDs already start with
their Bioregistry prefix and a colon (for RRIDs, in uppercase), so for
these types the canonical form is the CURIE. is_scholid()
and classify_scholid() accept canonical values only.
format_scholid() writes the forms in the URL and CURIE
rows of these tables, and for arXiv the DOI. Older URLs and those under
“Also read” are only read. It normalizes its input first, and
normalize_scholid() reads back what it writes. For ARKs,
SWHIDs, and RRIDs, it writes the canonical form as the CURIE, so RRIDs
keep the uppercase RRID: prefix.
The table below is generated with format_scholid() from
one example per type. An empty cell means that the type has no such
form, and format_scholid() stops with an error for it.
| Type | URL | CURIE | DOI |
|---|---|---|---|
doi |
https://doi.org/10.1000/182 |
doi:10.1000/182 |
|
arxiv |
https://arxiv.org/abs/2101.00001v1 |
arxiv:2101.00001v1 |
10.48550/arXiv.2101.00001 |
bibcode |
https://ui.adsabs.harvard.edu/abs/1998AJ....116.1009R |
||
openalex |
https://openalex.org/W2741809807 |
openalex:W2741809807 |
|
swhid |
https://archive.softwareheritage.org/swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2 |
swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2 |
|
ark |
https://n2t.net/ark:/12148/btv1b8449691v |
ark:/12148/btv1b8449691v |
|
isni |
https://isni.org/isni/0000000121032683 |
isni:0000000121032683 |
|
orcid |
https://orcid.org/0000-0002-1825-0097 |
orcid:0000-0002-1825-0097 |
|
ror |
https://ror.org/01an7q238 |
ror:01an7q238 |
|
rrid |
https://scicrunch.org/resolver/RRID:AB_262044 |
RRID:AB_262044 |
|
uniprot |
https://www.uniprot.org/uniprotkb/P12345 |
uniprot:P12345 |
|
refseq |
https://www.ncbi.nlm.nih.gov/nuccore/NM_001744.6 |
refseq:NM_001744.6 |
|
sra |
https://www.ncbi.nlm.nih.gov/sra/SRR1553610 |
insdc.sra:SRR1553610 |
|
geo |
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE2553 |
geo:GSE2553 |
|
bioproject |
https://www.ncbi.nlm.nih.gov/bioproject/PRJNA257197 |
bioproject:PRJNA257197 |
|
assembly |
https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000001405.40 |
ncbi.assembly:GCF_000001405.40 |
|
isbn |
isbn:9780306406157 |
||
issn |
https://portal.issn.org/resource/ISSN/0317-8471 |
issn:0317-8471 |
|
pmcid |
https://pmc.ncbi.nlm.nih.gov/articles/PMC1234567/ |
pmc:PMC1234567 |
|
pmid |
https://pubmed.ncbi.nlm.nih.gov/12345678/ |
pubmed:12345678 |
| Type | Example | Checksum | Notes |
|---|---|---|---|
doi |
10.1000/182 |
No | Prefix 10.; opaque suffix |
arxiv |
2101.00001v2 |
No | Modern or legacy archive form |
bibcode |
1992ApJ...400L...1W |
No | Fixed 19 characters |
openalex |
W2741809807 |
No | Not UniProt-shaped 6-char accessions |
swhid |
swh:1:cnt:94a9ed02… |
No | Requires swh: prefix; optional qualifiers |
ark |
ark:/12148/btv1b8449691v |
No | Requires ark: label; 5-digit NAAN |
isni |
000000012146438X |
Yes | Compact 16 characters |
orcid |
0000-0002-1825-0097 |
Yes | Hyphenated canonical form |
ror |
01an7q238 |
Yes | Lowercase Crockford base32 |
rrid |
RRID:AB_262044 |
No | RRID: prefix; authority allowlist |
uniprot |
P12345 |
No | Uppercase; no version suffix |
refseq |
NM_001744.6 |
No | Prefix allowlist; version required |
sra |
SRR1553610 |
No | INSDC S/E/D + R
+ entity letter |
geo |
GSE2553 |
No | GSE, GSM, GPL, or
GDS |
bioproject |
PRJNA257197 |
No | INSDC PRJ* prefixes |
assembly |
GCF_000001405.40 |
No | GCA_ or GCF_; nine digits + version |
isbn |
9780306406157 |
Yes | ISBN-10 or ISBN-13 |
issn |
2434-561X |
Yes | Hyphenated canonical display |
pmcid |
PMC1234567 |
No | Literal PMC prefix |
pmid |
12345678 |
No | Fallback; excludes valid ISBNs |
The sections below follow a consistent layout: Structure, Resolver URL and CURIE, Validation in scholid, Checksum (if applicable), and Structural regex.
Governing body: International DOI Foundation
Standard: ISO 26324
A DOI has two parts:
prefix/suffix
10.Example:
10.1000
10.1038
Example:
10.1000/182
10.1038/s41586-020-2649-2
| Form | Example | Source |
|---|---|---|
| URL | https://doi.org/10.1000/182 |
DOI resolution documentation |
| Older URL | https://dx.doi.org/10.1000/182 |
Still resolves |
| CURIE | doi:10.1000/182 |
Bioregistry
doi |
The DOI
Handbook (section 4.7, “Percent-encoding”) percent-encodes most
characters of a DOI in a URL. format_scholid() encodes only
%, #, and ?, as %25,
%23, and %3F, because doi.org
would otherwise read them as an escape, the start of a fragment, and the
start of a query, and resolve a different DOI. It writes other
characters as they are, so that the URL stays readable; browsers encode
them when they send the request. So 10.1000/456#789 gives
https://doi.org/10.1000/456%23789.
normalize_scholid() decodes these URLs again. CURIEs are
not encoded.
DOI validation is structural only. There is no
checksum. Registry existence is not checked. Wrapped forms
(https://doi.org/…, doi: labels) should be
normalized before classification.
normalize_scholid() percent-decodes the part of a
doi.org or dx.doi.org URL after the host, so
https://doi.org/10.1000%2F182 gives
10.1000/182. Bare DOIs and doi: labels are not
decoded, because % can be part of a DOI name. A URL with a
malformed escape, or with escapes that don’t decode to valid text, is
kept as written. extract_scholid() does not decode URLs in
free text.
is_scholid() and normalize_scholid()
preserve case. DOIs should be compared case-insensitively for ASCII
letters only: the key from scholid_key() turns ASCII
letters into uppercase and keeps other characters as they are.
Canonical form (as enforced by is_scholid()):
^10\.\d{4,9}/\S+$
This checks: - Prefix starts with 10. - 4–9 digits - A
slash - Non-whitespace suffix
Governing body: ISNI International Agency
Standard: ISO 27729
Documentation: ISNI
overview; official site isni.org
An ISNI uniquely identifies public identities of contributors to media content. The identifier is 16 characters: 15 decimal digits plus a check character.
Compact canonical form:
000000012146438X
Human-readable presentation uses an ISNI prefix and
spaces in blocks of four:
ISNI 0000 0001 2146 438X
ORCID iDs use the same ISO/IEC 7064 MOD 11-2 checksum on 16
characters but are canonicalized in scholid with hyphens.
Compact checksum-valid 16-character strings are treated as ISNI;
hyphenated strings are treated as ORCID.
| Form | Example | Source |
|---|---|---|
| URL | https://isni.org/isni/000000012146438X |
ISNI Linked Data page (isni.org/page/linked-data) |
| CURIE | isni:000000012146438X |
Bioregistry
isni |
ISNI validation requires a checksum-valid compact 16-character string. Hyphenated ORCID-shaped input is not accepted as ISNI; normalize or classify as ORCID instead. Registry existence is not checked.
Uses ISO/IEC 7064 MOD 11-2, identical to ORCID. The check character
may be 0–9 or X.
Compact canonical form:
^\d{15}[\dX]$
Governing body: ORCID, Inc.
Standard basis: ISO 7064 (checksum algorithm)
An ORCID iD consists of 16 characters:
0000-0002-1825-0097
XInternally (without hyphens):
0000000218250097
| Form | Example | Source |
|---|---|---|
| URL | https://orcid.org/0000-0002-1825-0097 |
ORCID iD display guidelines |
| CURIE | orcid:0000-0002-1825-0097 |
Bioregistry
orcid |
Uses ISO 7064 Mod 11-2 algorithm.
A structurally correct ORCID may still be invalid if the checksum does
not match.
ORCID validation requires a checksum-valid
hyphenated iD. Unhyphenated 16-character strings are not accepted as
ORCID by is_scholid(); if they match the ISNI compact
pattern and checksum, they classify as isni instead.
Wrapped https://orcid.org/ URLs should be normalized
first.
Hyphenated canonical form (used by is_scholid()):
^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$
Unhyphenated internal form:
^\d{15}[\dX]$
Governing body: ROR Community
Documentation: ROR identifier
pattern
A ROR iD is a 9-character lowercase string:
0abcdef94
| Form | Example | Source |
|---|---|---|
| URL | https://ror.org/01an7q238 |
ROR identifier pattern |
| CURIE | ror:01an7q238 |
Bioregistry
ror |
The last two characters are a checksum derived from the preceding seven characters using Crockford base32 encoding and ISO/IEC 7064 MOD 97-10 rules, matching ROR’s identifier generation implementation.
ROR validation requires a checksum-valid lowercase
compact iD. https://ror.org/ URLs should be normalized
before classification. Registry existence is not checked.
Canonical compact form:
^0[a-hjkmnp-tv-z0-9]{6}[0-9]{2}$
Governing body: Resource Identification Initiative
(SciCrunch)
Documentation: RRID
Initiative
A RRID cites a research resource such as an antibody, cell line,
model organism, software tool, or plasmid. The canonical form includes
the literal RRID: prefix followed by an authority-specific
accession:
RRID:AB_262044
RRID:CVCL_2260
RRID:SCR_007358
RRID:IMSR_JAX:000664
RRID:MGI:3840442
RRID:Addgene_80088
| Form | Example | Source |
|---|---|---|
| URL | https://scicrunch.org/resolver/RRID:AB_262044 |
Bioregistry
rrid |
| CURIE | rrid:AB_262044 |
Bioregistry
rrid |
The canonical form is the CURIE. Bioregistry writes the prefix in
lowercase, and normalize_scholid() reads
rrid:AB_262044 as RRID:AB_262044.
RRID validation is structural only. There is no checksum algorithm, and registry existence is not checked.
To limit false positives, scholid accepts only canonical
RRID:-prefixed forms and validates the accession body
against a conservative allowlist of known RRID authority prefixes (for
example AB, CVCL, SCR,
IMSR, MGI, Addgene). Bare local
IDs such as AB_262044 without the RRID: prefix
are rejected.
Canonical prefix (body matched against an authority allowlist, not
.+):
^RRID:(?:AB_\d+|CVCL_[0-9A-Z]+|SCR_\d+|…)$
The full allowlist is defined in the package registry; see the RRID implementation for the current authority patterns.
Governing body: UniProt Consortium
Documentation: UniProt accession
numbers
A UniProtKB accession uniquely identifies a protein record. Accessions are 6 or 10 uppercase alphanumeric characters following UniProt-defined patterns.
Examples:
P12345
Q9H0H5
A0A022YWF9
| Form | Example | Source |
|---|---|---|
| URL | https://www.uniprot.org/uniprotkb/P12345 |
Linking to UniProt |
| Older URL | https://www.uniprot.org/uniprot/P12345 |
Still resolves |
| Also read | https://identifiers.org/uniprot/P12345 |
identifiers.org |
| CURIE | uniprot:P12345 |
Bioregistry
uniprot |
UniProt validation is structural only. Registry existence is not checked.
Canonical form is the uppercase accession without version suffixes or
entry name qualifiers. Wrapped URLs and lowercase accessions should be
normalized with normalize_scholid() before
classification.
Six-character accessions such as P12345 are
not accepted as OpenAlex keys (OpenAlex is checked
earlier in classification order, but is_openalex()
explicitly rejects UniProt-shaped strings).
^(?:[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2})$
Governing body: NCBI RefSeq
Documentation: RefSeq
accession prefixes
A RefSeq accession uniquely identifies a curated sequence record. The format is a two-letter molecule-type prefix, an underscore, an alphanumeric accession body, a period, and a version number.
Examples:
NM_001744.6
NP_001735.1
NC_003619.1
NZ_CASIGT010000001.1
| Form | Example | Source |
|---|---|---|
| URL (protein) | https://www.ncbi.nlm.nih.gov/protein/NP_001735.1 |
Bioregistry
refseq |
| URL (other) | https://www.ncbi.nlm.nih.gov/nuccore/NM_001744.6 |
Bioregistry
refseq |
| Also read | https://identifiers.org/refseq/NM_001744.6 |
identifiers.org |
| CURIE | refseq:NM_001744.6 |
Bioregistry
refseq |
Protein records, with the prefixes AP, NP,
WP, XP, and YP in the RefSeq
accession table linked above, resolve under /protein/, and
the others under /nuccore/.
normalize_scholid() reads either path for any RefSeq
accession.
RefSeq validation is structural only. Registry existence is not checked.
Canonical form is the uppercase accession with version suffix. Known
RefSeq prefixes are allowlisted. Wrapped URLs and lowercase accessions
should be normalized with normalize_scholid() before
classification.
GCA_ / GCF_ genome assembly accessions are
a separate type (assembly) and are not matched as
RefSeq.
The key from scholid_key() drops the version suffix, so
NM_000546.5 and NM_000546.6 share the key
NM_000546.
^(?:AC|AP|NC|NG|NM|NP|NR|NT|NW|NZ|XM|XP|XR|YP|WP)_[A-Z0-9]+\.[0-9]+$
Governing body: INSDC Sequence Read Archive (NCBI,
EBI, DDBJ)
Documentation: Search in SRA
Entrez
An SRA accession identifies a study, sample, experiment, or run in the INSDC archives. The format is a three-letter prefix (source database plus entity type) followed by digits.
Examples:
SRP006081
SRS123456
SRX1234567
SRR1553610
ERR1234567
DRR1234567
| Form | Example | Source |
|---|---|---|
| URL | https://www.ncbi.nlm.nih.gov/sra/SRR1553610 |
Bioregistry
insdc.sra |
| Also read | https://identifiers.org/sra/SRR1553610 |
identifiers.org |
| CURIE | insdc.sra:SRR1553610 |
Bioregistry
insdc.sra |
SRA validation is structural only. Registry existence is not checked.
Canonical form is the uppercase accession without version suffix. The
first letter denotes the source archive (S NCBI,
E EBI, D DDBJ); the third letter denotes
entity type (P study, S sample, X
experiment, R run). Wrapped URLs and lowercase accessions
should be normalized with normalize_scholid() before
classification.
^[SED]R[RXSP][0-9]{5,}$
Governing body: NCBI GEO
Documentation: GEO
programmatic access
A GEO accession identifies a curated dataset, series, sample, or platform record. The format is a three-letter entity prefix followed by digits.
Examples:
GSE2553
GSM313800
GPL96
GDS505
| Form | Example | Source |
|---|---|---|
| URL | https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE2553 |
Citing and linking to GEO |
| Also read | https://identifiers.org/geo/GSE2553 |
identifiers.org |
| CURIE | geo:GSE2553 |
Bioregistry
geo |
GEO validation is structural only. Registry existence is not checked.
Canonical form is the uppercase accession. Supported entity prefixes
are GSE (series), GSM (sample),
GPL (platform), and GDS (dataset). Wrapped
URLs and lowercase accessions should be normalized with
normalize_scholid() before classification.
^(?:GSE|GSM|GPL|GDS)[0-9]{2,}$
Governing body: INSDC BioProject (NCBI, EBI,
DDBJ)
Documentation: BioProject
handbook
A BioProject accession identifies a research project that groups related sequence and sample records. The format is a five-letter INSDC prefix followed by digits.
Examples:
PRJNA257197
PRJEB12345
PRJDB303
| Form | Example | Source |
|---|---|---|
| URL | https://www.ncbi.nlm.nih.gov/bioproject/PRJNA257197 |
Links on NCBI record pages |
| Also read | https://www.ncbi.nlm.nih.gov/bioproject/?term=PRJNA257197 |
Bioregistry
bioproject |
| Also read | https://identifiers.org/bioproject/PRJNA257197 |
identifiers.org |
| CURIE | bioproject:PRJNA257197 |
Bioregistry
bioproject |
BioProject validation is structural only. Registry existence is not checked.
Canonical form is the uppercase accession. Known prefixes
(PRJNA, PRJEB, PRJDB,
PRJDA, PRJEA) are allowlisted. Wrapped URLs
and lowercase accessions should be normalized with
normalize_scholid() before classification.
^(?:PRJNA|PRJEB|PRJDB|PRJDA|PRJEA)[0-9]{2,}$
Governing body: INSDC / NCBI Assembly
Documentation: Genome
assembly accessions
A genome assembly accession identifies a collection of sequences
comprising an assembled genome. GenBank assemblies use the
GCA_ prefix; NCBI RefSeq assembly counterparts use
GCF_. The accession body is nine digits followed by a
version number.
Examples:
GCF_000001405.40
GCA_000001405.29
GCA_009914755.4
| Form | Example | Source |
|---|---|---|
| URL | https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000001405.40 |
Bioregistry
ncbi.assembly |
| Older URL | https://www.ncbi.nlm.nih.gov/assembly/GCF_000001405.40 |
Redirects since NCBI Assembly was retired in 2024 |
| Also read | https://identifiers.org/insdc.gcf:GCF_000001405.40 |
identifiers.org |
| CURIE | ncbi.assembly:GCF_000001405.40 |
Bioregistry
ncbi.assembly |
Bioregistry also has the prefixes insdc.gca and
insdc.gcf for one kind of accession each.
ncbi.assembly covers both.
Assembly validation is structural only. Registry existence is not checked.
Canonical form is the uppercase accession with version suffix. Only
GCA_ and GCF_ prefixes are accepted, with
exactly nine digits in the accession body. Wrapped URLs and lowercase
accessions should be normalized with normalize_scholid()
before classification.
RefSeq gene and protein accessions (NM_,
NP_, …) are validated separately and are not accepted as
assembly.
The key from scholid_key() drops the version suffix.
GCA_ and GCF_ accessions with the same number
keep different keys, because they are different records.
^GC[AF]_[0-9]{9}\.[0-9]+$
Governing body: International ISBN Agency
Standard: ISO 2108
XExample:
0306406152
030640615X
Example:
9780306406157
| Form | Example | Source |
|---|---|---|
| URL | None |
No official resolver |
| CURIE | isbn:9780306406157 |
Bioregistry
isbn |
ISBN validation requires a checksum-valid ISBN-10 or ISBN-13 in compact form (no hyphens or spaces in canonical output). Labeled or spaced input should be normalized first. Registry existence is not checked.
The key from scholid_key() is the ISBN-13: an ISBN-10
becomes 978, its first nine digits, and a recomputed check
digit, so both forms of a book share a key.
ISBN-10 (canonical compact):
^\d{9}[\dX]$
ISBN-13:
^\d{13}$
Governing body: ISSN International Centre
Standard: ISO 3297
An ISSN has 8 characters:
1234-567X
Internal numeric form:
1234567X
| Form | Example | Source |
|---|---|---|
| URL | https://portal.issn.org/resource/ISSN/0317-8471 |
Bioregistry
issn |
| Also read | https://issn.org/resource/ISSN/0317-8471 |
ISSN Portal FAQ, 7.2 |
| CURIE | issn:0317-8471 |
Bioregistry
issn |
The ISSN Portal FAQ gives the issn.org URL, which
redirects to the portal record.
ISSN validation requires a checksum-valid ISSN.
Canonical form uses a hyphen after the fourth digit
(1234-567X). Extraction targets hyphenated tokens;
normalize for compact checks. Registry existence is not checked.
detect_scholid_type() only reports issn
when the input carries ISSN context: the hyphen (2434-561X)
or an ISSN label (ISSN 2434561X). Bare compact
forms are not detected as ISSN, because checksum-valid 8-digit strings
collide with PMIDs: 29456894 is detected as
pmid, and 2434561X is not detected at all.
When the type is known, normalize_scholid(x, "issn") still
accepts the compact form.
Hyphenated (common in extraction):
^\d{4}-\d{3}[\dX]$
Compact form:
^\d{7}[\dX]$
Authority: arXiv (Cornell University)
YYMM.NNNN
YYMM.NNNNN
Optional version suffix:
YYMM.NNNN(v2)
Components: - 4-digit year/month - Dot - 4–5 digit submission number
- Optional version vN
Structural regex:
^\d{4}\.\d{4,5}(v\d+)?$
archive/YYMMNNN
Example:
hep-th/9901001
Structural regex:
^[a-z\-]+/\d{7}(v\d+)?$
| Form | Example | Source |
|---|---|---|
| URL | https://arxiv.org/abs/2101.00001 |
arXiv identifier for services |
| CURIE | arxiv:2101.00001 |
Bioregistry
arxiv |
| DOI | 10.48550/arXiv.2101.00001 |
arXiv assigned DOIs |
arXiv registers one DataCite DOI per article:
10.48550/arXiv. and the identifier, without a version. For
old-style identifiers, the canonical form that arXiv uses leaves out the
subject class, as in 10.48550/arXiv.hep-th/9901001 and
10.48550/arXiv.math/0309136.
normalize_scholid(x, "arxiv") reads these DOIs bare, with a
doi: label, or as doi.org URLs, with the
prefix in any case. It rejects DOIs with a version or a subject class,
which arXiv does not register. detect_scholid_type() still
reports these values as doi.
format_scholid(x, "arxiv", "doi") writes these DOIs, so it
leaves out the version and the subject class:
math.GT/0309136v1 gives
10.48550/arXiv.math/0309136. The URL and the CURIE keep
both.
arXiv validation is structural only. Both modern
(YYMM.NNNNN) and legacy (archive/YYMMNNN)
forms are accepted. Optional version suffix vN is allowed.
Wrapped arXiv: labels and https://arxiv.org/
URLs should be normalized before classification. No checksum; registry
existence is not checked.
The key from scholid_key() drops the version suffix, so
all versions of a preprint share a key.
Authority: SAO/NASA Astrophysics Data System
(ADS)
Documentation: ADS
bibliographic codes
An ADS bibcode is a fixed 19-character identifier for bibliographic records in astronomy and related fields. The format follows SIMBAD/NED conventions:
YYYYJJJJJVVVVM PPPPA
Where:
YYYY — publication year (four digits)JJJJJ — journal abbreviation, left-justified, padded
with .VVVV — volume, right-justified, padded with
.M — qualifier (e.g. L for letters)PPPP — page, right-justified, padded with
.A — first letter of the first author’s surnameExample:
1992ApJ...400L...1W
| Form | Example | Source |
|---|---|---|
| URL | https://ui.adsabs.harvard.edu/abs/1992ApJ...400L...1W |
ADS help |
| Older URL | https://adsabs.harvard.edu/abs/1992ApJ...400L...1W |
Classic ADS; still resolves |
| CURIE | None |
No Bioregistry entry |
Bibcode validation is structural only. There is no checksum algorithm, and ADS existence is not checked.
To limit false positives, scholid requires exactly 19
characters, a letter in the journal field, and a letter as the final
author-initial character. Case is preserved in canonical form.
^\d{4}[A-Za-z0-9.]{14}[A-Za-z]$
Governing body: OurResearch (OpenAlex)
Documentation: OpenAlex key
concepts
Every OpenAlex entity has a persistent ID. The official form is a URL:
https://openalex.org/W2741809807
The short key (W2741809807) is commonly used in API
calls and tabular data. Keys are case-insensitive; scholid
canonicalizes them to uppercase.
A key consists of:
W,
A, S, I, T,
K, P, F, or G)Examples:
W2741809807
A5023888391
I97018004
| Form | Example | Source |
|---|---|---|
| URL | https://openalex.org/W2741809807 |
OpenAlex key concepts |
| Also read | https://api.openalex.org/works/W2741809807 |
OpenAlex API |
| CURIE | openalex:W2741809807 |
Bioregistry
openalex |
OpenAlex validation is structural only. There is no checksum algorithm, and registry existence is not checked.
Deprecated concept IDs (C prefix) are not accepted. Bare
keys are accepted only when they match the structural pattern; wrapped
URLs should be normalized with normalize_scholid() before
classification.
Six-character keys that match the UniProt accession pattern (for
example P12345) are rejected by
is_openalex() to avoid overlap with UniProt.
Works, authors, and institutions in OpenAlex often also have DOI, ORCID, or ROR identifiers respectively; those types are checked earlier during classification.
Canonical uppercase key:
^[WASTIKPFG][0-9]{5,}$
Governing body: ARK Alliance
Documentation: ARK
specification
An ARK is a persistent identifier for digital, physical, or abstract objects. The core identifier has the form:
ark:/NAAN/Name[Qualifier]
Where:
NAAN — Name Assigning Authority Number (in
scholid, five digits)Name — opaque name assigned by the authorityQualifier — optional hierarchical (/) or
variant (.) suffixExamples:
ark:/12148/btv1b8449691v/f29
ark:/13030/654xz321
The labels ark: and ark:/ are equivalent;
scholid canonicalizes to ark:/.
| Form | Example | Source |
|---|---|---|
| URL | https://n2t.net/ark:/12148/btv1b8449691v |
Running minters and resolvers |
| CURIE | ark:/12148/btv1b8449691v |
Bioregistry
ark |
The CURIE is the canonical form. normalize_scholid()
reads an ARK after any host, such as an institution’s own resolver. A
slash at the end of the URL is kept, because an ARK name can end in a
slash.
ARK validation is structural only. Resolver existence is not checked.
To limit false positives, scholid requires an explicit
ark: label, a five-digit NAAN, and a non-empty name body.
Bare paths without the ark: prefix are rejected.
Canonical form:
^ark:/[0-9]{5}/[0-9A-Za-z][0-9A-Za-z._/=-]*$
Governing body: Software Heritage
Standard: ISO/IEC 18670
Documentation: SWHID
specification
A SWHID identifies a software artifact archived by Software Heritage. The core identifier has four colon-separated fields:
swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2
Where:
swh is the scheme prefix1 is the scheme versioncnt is the object type (cnt,
dir, rev, rel, or
snp)Optional qualifiers may follow, separated by semicolons:
swh:1:cnt:4d99d2d18326621ccdd70f5ea66c2e2ac236ad8b;origin=https://example.org/repo.git;path=/src/main.c;lines=9-15
| Form | Example | Source |
|---|---|---|
| URL | https://archive.softwareheritage.org/swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2 |
SWHID specification, “Resolvers” |
| CURIE | swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2 |
Bioregistry
swh |
The CURIE is the canonical form. A slash at the end of a URL is
dropped only if the SWHID has no qualifiers, because a path
qualifier can end in a slash.
SWHID validation is structural only. The embedded
hash is an intrinsic content identifier, but verifying that it matches
the referenced artifact requires access to the artifact itself and is
not performed by scholid.
To limit false positives, scholid requires the explicit
swh: prefix and rejects bare 40-character hex strings (for
example Git commit hashes). Known qualifier keys (origin,
visit, anchor, path,
lines) are validated conservatively when present.
The key from scholid_key() drops the qualifiers and
keeps the core identifier, because qualifiers describe the context of an
object, not the object.
Core form:
^swh:1:(cnt|dir|rev|rel|snp):[0-9a-f]{40}$
Authority: U.S. National Library of Medicine
A PMID is a decimal integer assigned by PubMed. There is no checksum.
Example:
12345678
| Form | Example | Source |
|---|---|---|
| URL | https://pubmed.ncbi.nlm.nih.gov/12345678/ |
Bioregistry
pubmed |
| Older URL | https://www.ncbi.nlm.nih.gov/pubmed/12345678 |
Legacy PubMed, retired in 2020; redirects |
| CURIE | pubmed:12345678 |
Bioregistry
pubmed |
PMID validation is intentionally permissive at the
character level: canonical form is digits only (^\d+$), but
is_scholid() also rejects values that are valid
ISBNs to reduce cross-type false positives.
Because bare digit strings are ambiguous, PMID is registered as a
fallback type (detect_last):
classify_scholid() and the primary pass of
detect_scholid_type() try other types first. Use PMID only
when nothing more specific matches.
For extraction, candidates are 4–9
digits and must not immediately follow the literal
PMC (so PMC12345 does not yield a PMID
12345).
Wrapped forms such as PMID: 12345678 should be detected
via detect_scholid_type() and normalized before strict
validation.
Canonical form accepted by is_scholid() (after ISBN
exclusion):
^\d+$
Extraction pattern (digit run length and PMC
boundary):
(?<![[:alnum:]_./-]|PMC)\d{4,9}(?![[:alnum:]_]|[-/.][[:alnum:]_])
Authority: PubMed Central
PMC1234567
Components:
PMC| Form | Example | Source |
|---|---|---|
| URL | https://pmc.ncbi.nlm.nih.gov/articles/PMC1234567/ |
NLM Technical Bulletin, 2024 Sep-Oct |
| Older URL | https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1234567/ |
Used until 2024; redirects |
| CURIE | pmc:PMC1234567 |
Bioregistry
pmc |
The CURIE keeps the PMC prefix: pmc:1234567
is not read.
PMCID validation is structural only: canonical form
is PMC followed by digits. There is no checksum. Registry
existence is not checked.
PMCIDs are checked before PMID in classification
order, so PMC1234567 is never classified as a bare PMID.
Extraction uses a dedicated PMC prefix pattern.
Canonical form:
^PMC\d+$