How Scholarly Identifiers Are Defined

Introduction

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:

  • Structural validity (does it match the formal grammar?)
  • Checksum validity (does the control digit verify?)
  • Registry validity (does the identifier actually exist?)

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.

Classification order

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.

Input characters

Text copied from PDFs, word processors, and web pages often contains characters that look like ASCII but are not. scholid handles them as follows.

  • Invisible characters: the soft hyphen (U+00AD), zero-width and directional marks (U+200B–U+200F, U+202A–U+202E, U+2060–U+2064, U+2066–U+2069), and the byte order mark (U+FEFF). They are never part of an identifier. is_scholid() returns FALSE for values that contain one; normalize_scholid(), extract_scholid(), and detect_scholid_type() remove them first.
  • Unicode spaces: the no-break space (U+00A0), U+1680, U+2000–U+200A, U+202F, U+205F, and the ideographic space (U+3000). They count as whitespace wherever an ASCII space does: they are trimmed, they may follow a label or separate digit groups, and they end a match in extraction. No identifier contains one, so is_scholid() returns FALSE.
  • Unicode dashes (U+2010–U+2013, U+2212, U+FE63, U+FF0D) and full-width digits (U+FF10–U+FF19): 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.

Comparison keys

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.

Resolver URLs and CURIEs

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:

  • URLs with 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.
  • CURIEs with the prefix in any case, such as PubMed:12345678. The identifier must follow the colon directly.
  • For arXiv, the DOIs that arXiv registers; see the arXiv section.

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

Supported types (overview)

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.


DOI (Digital Object Identifier)

Governing body: International DOI Foundation
Standard: ISO 26324

Structure

A DOI has two parts:

prefix/suffix

Prefix

  • Always begins with 10.
  • Followed by a registrant code (4–9 digits)

Example:

10.1000
10.1038

Suffix

  • Assigned by the registrant
  • May contain almost any printable character
  • Has no globally fixed grammar
  • Case-insensitive for ASCII letters. Names that differ only in non-ASCII case may be different identifiers (DOI Handbook, “Case Insensitivity of the DOI Name”)

Example:

10.1000/182
10.1038/s41586-020-2649-2

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

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


ISNI (International Standard Name Identifier)

Governing body: ISNI International Agency
Standard: ISO 27729
Documentation: ISNI overview; official site isni.org

Structure

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.

Resolver URL and CURIE

Form Example Source
URL https://isni.org/isni/000000012146438X ISNI Linked Data page (isni.org/page/linked-data)
CURIE isni:000000012146438X Bioregistry isni

Validation in scholid

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.

Checksum

Uses ISO/IEC 7064 MOD 11-2, identical to ORCID. The check character may be 0–9 or X.

Structural Regex

Compact canonical form:

^\d{15}[\dX]$

ORCID

Governing body: ORCID, Inc.
Standard basis: ISO 7064 (checksum algorithm)

Structure

An ORCID iD consists of 16 characters:

0000-0002-1825-0097

Components

  • 16 digits total
  • Grouped as 4-4-4-4
  • Final character is a checksum digit
  • Check digit may be X

Internally (without hyphens):

0000000218250097

Resolver URL and CURIE

Form Example Source
URL https://orcid.org/0000-0002-1825-0097 ORCID iD display guidelines
CURIE orcid:0000-0002-1825-0097 Bioregistry orcid

Checksum

Uses ISO 7064 Mod 11-2 algorithm.
A structurally correct ORCID may still be invalid if the checksum does not match.

Validation in scholid

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.

Structural Regex

Hyphenated canonical form (used by is_scholid()):

^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$

Unhyphenated internal form:

^\d{15}[\dX]$

ROR (Research Organization Registry)

Governing body: ROR Community
Documentation: ROR identifier pattern

Structure

A ROR iD is a 9-character lowercase string:

0abcdef94

Resolver URL and CURIE

Form Example Source
URL https://ror.org/01an7q238 ROR identifier pattern
CURIE ror:01an7q238 Bioregistry ror

Checksum

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.

Validation in scholid

ROR validation requires a checksum-valid lowercase compact iD. https://ror.org/ URLs should be normalized before classification. Registry existence is not checked.

Structural Regex

Canonical compact form:

^0[a-hjkmnp-tv-z0-9]{6}[0-9]{2}$

RRID (Research Resource Identifier)

Governing body: Resource Identification Initiative (SciCrunch)
Documentation: RRID Initiative

Structure

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

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

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.


UniProt (UniProtKB accession)

Governing body: UniProt Consortium
Documentation: UniProt accession numbers

Structure

A UniProtKB accession uniquely identifies a protein record. Accessions are 6 or 10 uppercase alphanumeric characters following UniProt-defined patterns.

Examples:

P12345
Q9H0H5
A0A022YWF9

Resolver URL and CURIE

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

Validation in scholid

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

Structural Regex

^(?:[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2})$

RefSeq (NCBI Reference Sequence accession)

Governing body: NCBI RefSeq
Documentation: RefSeq accession prefixes

Structure

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

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

^(?:AC|AP|NC|NG|NM|NP|NR|NT|NW|NZ|XM|XP|XR|YP|WP)_[A-Z0-9]+\.[0-9]+$

SRA (Sequence Read Archive accession)

Governing body: INSDC Sequence Read Archive (NCBI, EBI, DDBJ)
Documentation: Search in SRA Entrez

Structure

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

Resolver URL and CURIE

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

Validation in scholid

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.

Structural Regex

^[SED]R[RXSP][0-9]{5,}$

GEO (Gene Expression Omnibus accession)

Governing body: NCBI GEO
Documentation: GEO programmatic access

Structure

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

Resolver URL and CURIE

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

Validation in scholid

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.

Structural Regex

^(?:GSE|GSM|GPL|GDS)[0-9]{2,}$

BioProject (INSDC BioProject accession)

Governing body: INSDC BioProject (NCBI, EBI, DDBJ)
Documentation: BioProject handbook

Structure

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

Resolver URL and CURIE

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

Validation in scholid

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.

Structural Regex

^(?:PRJNA|PRJEB|PRJDB|PRJDA|PRJEA)[0-9]{2,}$

Genome assembly (INSDC GCA/GCF accession)

Governing body: INSDC / NCBI Assembly
Documentation: Genome assembly accessions

Structure

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

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

^GC[AF]_[0-9]{9}\.[0-9]+$

ISBN (International Standard Book Number)

Governing body: International ISBN Agency
Standard: ISO 2108

Two Forms

ISBN-10

  • 9 digits + checksum digit
  • Check digit may be X

Example:

0306406152
030640615X

ISBN-13

  • 13 digits
  • Usually begins with 978 or 979
  • EAN-13 checksum algorithm

Example:

9780306406157

Resolver URL and CURIE

Form Example Source
URL None No official resolver
CURIE isbn:9780306406157 Bioregistry isbn

Validation in scholid

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.

Structural Regex

ISBN-10 (canonical compact):

^\d{9}[\dX]$

ISBN-13:

^\d{13}$

ISSN (International Standard Serial Number)

Governing body: ISSN International Centre
Standard: ISO 3297

Structure

An ISSN has 8 characters:

1234-567X

Components

  • 7 digits
  • 1 checksum digit (0–9 or X)
  • Canonical display includes a hyphen after 4 digits

Internal numeric form:

1234567X

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

Hyphenated (common in extraction):

^\d{4}-\d{3}[\dX]$

Compact form:

^\d{7}[\dX]$

arXiv Identifier

Authority: arXiv (Cornell University)

Two Formats

Modern (post-2007)

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+)?$

Legacy (pre-2007)

archive/YYMMNNN

Example:

hep-th/9901001

Structural regex:

^[a-z\-]+/\d{7}(v\d+)?$

Resolver URL and CURIE

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.

Validation in scholid

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.


ADS Bibcode

Authority: SAO/NASA Astrophysics Data System (ADS)
Documentation: ADS bibliographic codes

Structure

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 surname

Example:

1992ApJ...400L...1W

Resolver URL and CURIE

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

Validation in scholid

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.

Structural Regex

^\d{4}[A-Za-z0-9.]{14}[A-Za-z]$

OpenAlex ID

Governing body: OurResearch (OpenAlex)
Documentation: OpenAlex key concepts

Structure

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:

  • a single letter prefix indicating entity type (W, A, S, I, T, K, P, F, or G)
  • a numeric tail (at least five digits)

Examples:

W2741809807
A5023888391
I97018004

Resolver URL and CURIE

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

Validation in scholid

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.

Structural Regex

Canonical uppercase key:

^[WASTIKPFG][0-9]{5,}$

ARK (Archival Resource Key)

Governing body: ARK Alliance
Documentation: ARK specification

Structure

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 authority
  • Qualifier — optional hierarchical (/) or variant (.) suffix

Examples:

ark:/12148/btv1b8449691v/f29
ark:/13030/654xz321

The labels ark: and ark:/ are equivalent; scholid canonicalizes to ark:/.

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

Canonical form:

^ark:/[0-9]{5}/[0-9A-Za-z][0-9A-Za-z._/=-]*$

SWHID (SoftWare Hash IDentifier)

Governing body: Software Heritage
Standard: ISO/IEC 18670
Documentation: SWHID specification

Structure

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 prefix
  • 1 is the scheme version
  • cnt is the object type (cnt, dir, rev, rel, or snp)
  • the final field is a 40-character lowercase hex SHA-1 intrinsic identifier

Optional qualifiers may follow, separated by semicolons:

swh:1:cnt:4d99d2d18326621ccdd70f5ea66c2e2ac236ad8b;origin=https://example.org/repo.git;path=/src/main.c;lines=9-15

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

Core form:

^swh:1:(cnt|dir|rev|rel|snp):[0-9a-f]{40}$

PMID (PubMed Identifier)

Authority: U.S. National Library of Medicine

Structure

A PMID is a decimal integer assigned by PubMed. There is no checksum.

Example:

12345678

Resolver URL and CURIE

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

Validation in scholid

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.

Structural Regex

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:]_])

PMCID (PubMed Central Identifier)

Authority: PubMed Central

Structure

PMC1234567

Components:

  • Literal prefix PMC
  • One or more digits

Resolver URL and CURIE

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.

Validation in scholid

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.

Structural Regex

Canonical form:

^PMC\d+$