DOI Metadata & Bibliography Enrichment avatar

DOI Metadata & Bibliography Enrichment

Pricing

from $1.50 / 1,000 doi metadata records

Go to Apify Store
DOI Metadata & Bibliography Enrichment

DOI Metadata & Bibliography Enrichment

Turn a list of DOIs into clean citation metadata from the official Crossref, DataCite and JaLC APIs: title, authors with ORCID, journal or book, exact dates, pages, ISSN/ISBN, license, citation counts, and an honest not-found status.

Pricing

from $1.50 / 1,000 doi metadata records

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Paste a list of DOIs and get one clean citation record per DOI. This bulk DOI metadata lookup checks each DOI at doi.org, reads the metadata from the official Crossref, DataCite or JaLC API, and returns title, authors, journal or book, exact dates, volume, pages, ISSN/ISBN, license and citation counts.

Use it to fill a reference list, check a bibliography or enrich a spreadsheet of papers and datasets. The smallest run is one DOI, and three DOIs finish in about 2 seconds.

DOI Metadata & Bibliography Enrichment: paste DOIs, check the registration agency, get a clean citation record from Crossref, DataCite or JaLC

Table of contents

What it does

A DOI (Digital Object Identifier) is a permanent ID for a paper, book chapter, dataset or other work, for example 10.1038/nature12373. Each DOI is registered with one registration agency. This Actor:

  1. Cleans your input. It accepts 10.…, doi:10.…, https://doi.org/10.… and dx.doi.org links, in any letter case.
  2. Asks doi.org which agency registered each DOI.
  3. Reads the record from that agency: Crossref (most journals and books), DataCite (datasets, software, repositories) or JaLC (Japan).
  4. Writes one Dataset row for each input value, in your input order, with a clear status.

Good fit

  • Turn a list of DOIs into a table of titles, authors, journals, years and pages.
  • Check a reference list: find DOIs that are not registered or have a typo.
  • Add ISSN, ISBN, publisher, license and citation counts to a list of papers.
  • Mix journal articles and research datasets in one run (Crossref and DataCite).

Not a fit / limits

  • No search by title or author. You need the DOI.
  • No PDFs, full text or abstracts. The Actor reads only bibliographic metadata.
  • No Open Access links (for example from Unpaywall).
  • DOIs from other agencies (for example mEDRA) are only identified. The row has status: unsupported_agency and the agency name, but no title or authors.
  • No BibTeX or RIS file. You get structured fields that you can export as JSON, CSV or Excel.
  • Up to 500 DOIs per run.

Quick start

  1. Open the Input tab.
  2. Keep the three example DOIs in DOIs (dois) or paste your own, one per line.
  3. Leave Contact email empty, or add your own email for large runs.
  4. Click Start.
  5. Open the Output tab, view Citations. Check status and title in the first row.

Expected result: one row per DOI. With the example input you get three complete rows: a Nature article (Crossref), a Dryad dataset (DataCite) and a book chapter (Crossref).

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Build a reference tabledoisOne citation record per DOItitle, authors, containerTitle, issuedDate, pagesExport CSV/Excel, or read the Dataset by API
Clean a bibliographydoisStatus per DOIstatus, statusReason, errorCode, doiFilter rows where status is not complete
Enrich a paper listdoisIdentifiers and countsissn, isbn, publisher, licenses, citedByCountJoin on doi (always lower case)
Catalogue research datadoisDataCite dataset recordresourceTypeGeneral, publisher, publicationYear, languageExport or API

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
doisDOIsarray of strings (one per line in the form)yesPrefill: 3 example DOIs. No runtime default.1–500 values, each up to 1,000 charactersEach value becomes one output row10.1038/nature12373Paste DOIs in any common form. Split lists longer than 500 into several runs.
contactEmailContact email for Crossref and DataCitestringnoemptyA plain email address, up to 254 charactersSent only in the request User-Agent (mailto) to Crossref, DataCite and doi.org. Crossref uses it to put requests in its "polite" pool.name@example.orgAdd it for runs of hundreds of DOIs. It is never logged or saved in the output.

How dois is read:

  • Accepted forms: 10.1038/nature12373, doi:10.1038/nature12373, https://doi.org/10.1038/nature12373, http://dx.doi.org/… and percent-encoded links. Spaces around a value are removed. Empty lines are skipped.
  • Letter case does not matter: DOIs are case-insensitive, and the output doi is always lower case.
  • A repeated DOI (also in another form or case) gets its own row with the same data, but it is charged only once.
  • A value that is not a DOI gets a free row with status: invalid.
  • An empty list or more than 500 values is rejected before the run starts.

Input examples

Mixed list of papers and data

{
"dois": [
"10.1038/nature12373",
"10.5061/dryad.8515",
"10.1007/978-3-319-24277-4_9"
]
}

Expected behavior: doi.org returns Crossref for the first and third DOI and DataCite for the second. One batch request goes to each API. Expected output: three complete rows with title, authors, containerTitle, issuedDate and agency. Limit or cost note: 3 found DOIs = 3 doi-metadata events plus the run start.

Reference list check with problems

{
"dois": [
"https://doi.org/10.1038/NATURE12373",
"10.9999/notexist",
"not a doi",
"doi:10.1038/nature12373"
],
"contactEmail": "name@example.org"
}

Expected output: row 1 is complete; row 2 is not_found with errorCode: DOI_NOT_REGISTERED; row 3 is invalid (free); row 4 is a duplicate of row 1 (complete, free).

Output

Each input value gives exactly one row in the default Dataset, in input order. The Citations view shows the main columns; the Identifiers view shows IDs and links. A run summary is saved as RUN_SUMMARY in the default Key-value store.

Status values

statusMeaningCharged as
completeThe DOI is registered and the record has a title.doi-metadata
partialThe DOI is registered, but the record has no title (NO_TITLE, for example a journal issue or a figure) or the agency API has no record for it yet (RECORD_NOT_INDEXED). Read statusReason.doi-metadata for NO_TITLE; doi-check for RECORD_NOT_INDEXED
not_founddoi.org says the DOI is not registered (DOI_NOT_REGISTERED).doi-check
unsupported_agencyThe DOI is registered with another agency. agency names it (UNSUPPORTED_AGENCY).doi-check
invalidThe value is not a DOI (INVALID_DOI).free
errorA source failed after retries, or the run reached its time limit. Existence is unknown; the row never says "not found" in this case.free

Output fields

FieldMeaningTypeCan be empty?Example / enumSource / notes
inputYour input value exactly as givenstringnohttps://doi.org/10.1038/NATURE12373Input
doiDOI in lower casestringnull for invalid10.1038/nature12373Cleaned input
doiUrlResolvable linkstringnull for invalidhttps://doi.org/10.1038/nature12373Built from doi
statusResult typestringnosee Status valuesActor
statusReasonPlain-English reason for any status other than completestringnull for completedoi.org reports that this DOI does not exist …Actor
agencyRegistration agencystringnull for invalid, not_found, errorCrossref, DataCite, JaLC, mEDRAdoi.org
typeWork type as the agency names itstringyesjournal-article, book-chapter, datasetAgency
resourceTypeGeneralDataCite general typestringnull outside DataCiteDataset, Software, TextDataCite
titleTitle, markup removed, entities decodedstringnull for partial and non-found rowsNanometre-scale thermometry in a living cellAgency
subtitleSubtitlestringyesAgency
authorsAuthors in record order: given, family, name, orcid, affiliationsarrayempty when the record has none[{"given":"G.","family":"Kucsko",…}]Agency. orcid only when the source lists it. affiliations is copied as the source has it and can include contact details.
editorsEditors, same shapearrayoften emptyAgency
containerTitleJournal, book or proceedings that contains the workstringyesNature, ggplot2Agency. For a book chapter: the book.
containerTitlesAll container titles as the agency lists themarrayyes["Use R!","ggplot2"]Agency
seriesTitleBook seriesstringyesUse R!Crossref
publisherPublisherstringyesSpringer Science and Business Media LLCAgency
issuedDatePublication date at the source precisionstringyes2013-07-31, 2013-08, 2016Agency. Never padded to a full date.
publishedOnlineDateOnline datestringyes2013-07-31Crossref
publishedPrintDatePrint datestringyes2013-08Crossref
publicationYearYearintegeryes2013Agency
volumeVolumestringyes500Agency
issueIssuestringyes7460Agency
pagesPage rangestringyes54-58Agency
articleNumberArticle number (journals without pages)stringyese06495Crossref
issnISSNs: value, type (print/electronic/null)arrayyes[{"value":"0028-0836","type":"print"}]Agency
isbnISBNs, same shapearrayyes[{"value":"9783319242750","type":null}]Agency
licensesLicense statements: url, name, contentVersion, startDatearrayyes[{"url":"http://www.springer.com/tdm",…}]Crossref license / DataCite rightsList
referencesCountReferences deposited with the recordintegeryes30Crossref
citedByCountCitations known to the agencyintegeryes1845Crossref is-referenced-by-count / DataCite citationCount. Other indexes count differently.
languageLanguage codestringnull for Crossrefen, jaDataCite, JaLC
landingUrlPublisher landing pagestringyeshttps://www.nature.com/articles/nature12373Agency
sourceUpdatedAtWhen the agency last indexed or updated the recordstringyes2026-10-11T02:44:13ZAgency
authorsCountNumber of authorsintegerno (0 when none)8Actor
providerAPI the row came fromstringyesCrossref REST APIActor
sourceUrlAPI request the metadata was read fromstringyeshttps://api.crossref.org/works?filter=doi:…Actor
fetchedAtWhen the row was made (ISO 8601)stringno2026-10-11T09:31:37.688ZActor
errorCodeMachine codestringnull for completeINVALID_DOI, DOI_NOT_REGISTERED, UNSUPPORTED_AGENCY, RECORD_NOT_INDEXED, NO_TITLE, SOURCE_UNAVAILABLE, RATE_LIMITED, DEADLINE_REACHEDActor

null means the agency record does not have this value. The Actor never invents a value, for example a day or month that the source does not give.

Output entities and surfaces

SituationWhereResult shapeUser action
Normal itemDataset, view Citationscomplete row with metadataExport or use the fields
DOI not registeredDatasetnot_found row, metadata fields nullCheck the DOI for a typo
Partial resultDatasetpartial row with statusReasonRead statusReason; try again later for RECORD_NOT_INDEXED
Technical failureDataset + RUN_SUMMARYerror row with SOURCE_UNAVAILABLE, RATE_LIMITED or DEADLINE_REACHEDRun these DOIs again later; error rows are free
Run overviewKey-value store RUN_SUMMARYcounts by status and agency, HTTP stats, warnings, sourcesCheck status and counts

Output example

{
"input": "10.1038/nature12373",
"doi": "10.1038/nature12373",
"doiUrl": "https://doi.org/10.1038/nature12373",
"status": "complete",
"statusReason": null,
"agency": "Crossref",
"type": "journal-article",
"title": "Nanometre-scale thermometry in a living cell",
"authors": [
{ "given": "G.", "family": "Kucsko", "name": "G. Kucsko", "orcid": null, "affiliations": [] }
],
"containerTitle": "Nature",
"publisher": "Springer Science and Business Media LLC",
"issuedDate": "2013-07-31",
"publishedPrintDate": "2013-08",
"publicationYear": 2013,
"volume": "500",
"issue": "7460",
"pages": "54-58",
"issn": [
{ "value": "0028-0836", "type": "print" },
{ "value": "1476-4687", "type": "electronic" }
],
"authorsCount": 8,
"provider": "Crossref REST API",
"errorCode": null
}

This example is trimmed: it shows one row from the first input example, with one of eight authors and some fields left out. Counts such as citedByCount change over time.

Field names compared with other DOI tools

If you move from another DOI tool, these names may help:

Common name elsewhereField here
journalcontainerTitle
publishedDateissuedDate
publishedYearpublicationYear
pagepages
citationCountcitedByCount
urldoiUrl (DOI link) or landingUrl (publisher page)
authors as one stringauthors[].name

Pricing and limits

Pricing unit

This Actor uses pay-per-event pricing. You pay for each DOI result and once for each run start. Platform usage is included.

EventWhen it is chargedFree planBronzeSilverGold
doi-metadataA complete row, or a partial row with metadata (NO_TITLE)$0.0018$0.0017$0.0016$0.0015
doi-checkA not_found, unsupported_agency or RECORD_NOT_INDEXED row$0.0005$0.0005$0.0005$0.0005
Actor startOnce per run (memory is 256 MB, so always one event)$0.001$0.001$0.001$0.001

Free: invalid rows, error rows and repeated DOIs. A run where no value is a DOI fails with a clear message and charges only the start.

Cost examples (Free plan prices)

ScenarioInput scopeExpected eventsBase chargeTotal
Example input3 DOIs, all found3 × doi-metadata$0.001 start$0.0064
Small list100 DOIs, all found100 × doi-metadata$0.001 start$0.181
Reference check100 DOIs: 90 found, 5 not registered, 5 invalid90 × doi-metadata, 5 × doi-check$0.001 start$0.1655
Full run500 DOIs, all found500 × doi-metadata$0.001 start$0.901

Spending limit

If you set a maximum cost per run, the Actor stops before it goes over the limit. Rows already saved stay in the Dataset; DOIs after the limit get no row, and RUN_SUMMARY.status is CAPPED.

Limits

  • Up to 500 DOIs per run. In tests, 500 DOIs finished in about 24 seconds and 100 DOIs in about 6 seconds.
  • The Actor reads sources for up to 240 seconds. DOIs not processed in time get a free error row with DEADLINE_REACHED.
  • It sends batch requests (up to 50 DOIs each) and retries temporary failures. It respects source rate limits.

API, export and integrations

  • API: start the Actor with the Apify API and read the Dataset items. The doi field is lower case, so you can join on it.
  • Export: download the Dataset as JSON, CSV, Excel, XML or RSS from the Output tab.
  • Scheduling: you can run it on an Apify schedule, for example to refresh citation counts.

Use with AI agents (MCP)

AI agents can call this Actor through the Apify MCP server: add https://mcp.apify.com?tools=cliqtomedia/doi-bibliography-enrichment to your MCP client (Claude, Cursor, VS Code and others). The MCP server needs your Apify account (OAuth sign-in or an Apify API token); the DOI sources need no key. The agent builds the input from the input schema. The smallest useful input:

{ "dois": ["10.1038/nature12373"] }

Key output fields for an agent: status (complete, not_found, …), title, authors, containerTitle, issuedDate, agency, errorCode. A call with 10 DOIs usually finishes in a few seconds and costs about $0.019. Up to 500 DOIs fit in one run. Treat error rows as "unknown", not as "does not exist".

Troubleshooting

SymptomCheckAction
not_found for a DOI you trustinput, doiLook for a typo or extra characters. doi.org itself says the DOI is not registered.
invalid rowinput, statusReasonAfter cleaning, the value is not in the form 10.<prefix>/<suffix>. Fix the value.
partial with RECORD_NOT_INDEXEDstatusReasonThe DOI is registered, but the agency API does not have the record yet. Try again later.
partial with NO_TITLEtypeRecords such as journal issues or figures often have no title. This is source data.
unsupported_agencyagencyThe DOI belongs to another agency. This Actor does not read its metadata.
error rowserrorCode, RUN_SUMMARY.warningsA source was down or slow. Run only these DOIs again later; they were not charged.
Run rejected at startInputdois is empty or has more than 500 values.

FAQ

Do I need an API key?

No. Crossref, DataCite, JaLC and doi.org are open. You only need your Apify account.

Why is a date only a year or a month?

The Actor keeps the precision of the source. If the record says 2016, you get 2016, not 2016-01-01.

Why is citedByCount different from Google Scholar?

It is the count known to the registration agency (Crossref or DataCite). Other indexes count different sources.

How fresh is the data?

Each run reads the sources live. Each row has fetchedAt (our read time) and sourceUpdatedAt (when the agency last updated the record).

Can I get abstracts or PDFs?

No. The Actor returns bibliographic metadata only.

Data sources and licence

  • doi.org — registration agency of each DOI.
  • Crossref REST API — bibliographic metadata. Abstracts are not exported.
  • DataCite REST API — metadata under CC0.
  • JaLC — Japanese records, read through doi.org content negotiation.

This Actor is independent and not endorsed by Crossref, DataCite, JaLC or the DOI Foundation.

Support

Use the Issues tab of this Actor. Add the run ID, the DOI and the status or errorCode you saw. Do not send API tokens or private data.