Scholarly Correction Monitor avatar

Scholarly Correction Monitor

Pricing

from $3.00 / 1,000 doi results

Go to Apify Store
Scholarly Correction Monitor

Scholarly Correction Monitor

Check DOI lists against public Crossref updates and Retraction Watch records, then emit one deterministic correction-status row per DOI with provenance, warnings, and stable evidence hashes. Invalid or source-failed DOI checks are uncharged.

Pricing

from $3.00 / 1,000 doi results

Rating

0.0

(0)

Developer

Flintglade

Flintglade

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Share

Watches a bounded DOI watchlist for Crossref-deposited corrections, retractions, expressions of concern, withdrawals, and other updates, and reports what changed since the prior run. Built for research teams, librarians, systematic-review maintainers, and evidence-product builders.

This is an unofficial metadata monitoring tool. It is not affiliated with or endorsed by Crossref or Retraction Watch.

Full behavioral contract: PRODUCT-SPEC.md.

Why two Crossref requests per DOI

Crossref's own documented data model places the update-to field on the notice record (the correction/retraction/etc.), where it points backward at the DOI it updates -- not on the original work. A direct lookup of an original DOI therefore frequently exposes no update-to at all, even when deposited updates exist:

  • Direct lookup of 10.1177/1758835920922055 (GET /v1/works/10.1177%2F1758835920922055) returns no update-to.
  • Crossref's update-discovery query, GET /v1/works?filter=updates:10.1177/1758835920922055, returns notice 10.1177/17588359231172420, which carries the retraction record.

This Actor fetches both endpoints for every watched DOI: the direct lookup for bounded bibliographic metadata, and the update-discovery query as the sole, authoritative source of currentStatus and deposited updates. no-deposited-update in this Actor's output means both sources were checked and neither exposed a recognized update -- never a direct-lookup-only guess. Even a direct 404 still runs bounded update discovery; this prevents a missing direct record from hiding a notice that explicitly targets that DOI. If a watched DOI is itself an update notice, that edge case is flagged with a warning rather than misreported as the notice's own status (see PRODUCT-SPEC.md).

Input

FieldTypeDefaultNotes
doisarray of strings(required)1-500 DOIs or doi.org URLs. Deduplicated, first-seen order preserved.
baselineMode"compare" | "snapshot-only""compare"snapshot-only records this run without diffing against saved history.
stateNamespacestring"default"Scopes the saved baseline; use distinct namespaces for unrelated watchlists.
resetBaselinebooleanfalseIgnore prior state for watched DOIs this run and replace only their successful per-DOI records. Failed, skipped, and unrelated records are preserved.
maxConcurrencyinteger 1-33Bounded by Crossref's polite-pool limits.
requestTimeoutSecondsinteger 5-3015Per-request timeout.

Output

One dataset item per watched DOI: bibliographic facts (title, publisher, type, issued date, container title), currentStatus, normalized deposited updates, changeType versus the saved baseline, content/status/metadata hashes, warnings, retry count, and an error code where applicable. Full field list: PRODUCT-SPEC.md#output-contract and .actor/dataset_schema.json.

A run summary and the current watchlist's baseline snapshot are stored in the run's default key-value store. Authoritative state uses one hashed key-value record per DOI, so overlapping runs on different DOI subsets cannot overwrite one another. No abstracts, author emails, or raw Crossref payloads are ever stored -- see SECURITY.md.

Pricing

Pay per event: the synthetic apify-actor-start event (Apify default pricing) plus doi-result at $0.003 per DOI that was successfully fetched or explicitly resolved as not-found. Source errors after retries are emitted as free diagnostics, and DOIs skipped once the run's spending limit was reached are never fetched or charged. Paid capacity is reserved before source work. See PRODUCT-SPEC.md#billing and LIMITS.md.

Local development

Requires Node.js 22+.

npm install
npm run lint
npm run typecheck
npm test # unit + integration tests (mocked HTTP, no network)
npm run fixture-run # deterministic offline run through the real request/parsing pipeline
npm run smoke # bounded LIVE Crossref smoke -- real network, run manually only
npm start # runs the Actor locally (needs local Apify storage emulation)

npm run smoke is not part of npm test and is never run in CI; it makes a small number of real, polite requests to the live Crossref API using the two DOIs documented in PRODUCT-SPEC.md.

More docs

  • SECURITY.md -- permissions, data handling, privacy.
  • LIMITS.md -- technical and product limits, including the no-deposited-update limitation.
  • CHANGELOG.md -- version history.

Rollback

If a published build misbehaves, revert traffic to the last known-good build on the Apify platform (Actor -> Builds -> select the previous tagged build -> "Publish this build" / repoint the latest tag), which requires no code change. To roll back the source itself,

git revert
the offending commit(s) on main and publish a new build from the reverted state; do not force-push over published history. Because state (the saved baseline) is namespaced by stateNamespace and keyed by DOI, rolling back the Actor code never corrupts previously saved baselines -- at worst, a run under the reverted version reports metadata-changed or status-changed once against a baseline written by a newer extraction version, which self-heals on the next run.

Support

Support: support@flintglade.com