Scholarly Correction Monitor
Pricing
from $3.00 / 1,000 doi results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
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 noupdate-to. - Crossref's update-discovery query,
GET /v1/works?filter=updates:10.1177/1758835920922055, returns notice10.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
| Field | Type | Default | Notes |
|---|---|---|---|
dois | array 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. |
stateNamespace | string | "default" | Scopes the saved baseline; use distinct namespaces for unrelated watchlists. |
resetBaseline | boolean | false | Ignore prior state for watched DOIs this run and replace only their successful per-DOI records. Failed, skipped, and unrelated records are preserved. |
maxConcurrency | integer 1-3 | 3 | Bounded by Crossref's polite-pool limits. |
requestTimeoutSeconds | integer 5-30 | 15 | Per-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 installnpm run lintnpm run typechecknpm test # unit + integration tests (mocked HTTP, no network)npm run fixture-run # deterministic offline run through the real request/parsing pipelinenpm run smoke # bounded LIVE Crossref smoke -- real network, run manually onlynpm 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-updatelimitation. - 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 revertmain 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