# Changelog of Academic Papers Search: Research Papers via OpenAlex & Crossref (`humble-echidna/academic-papers`) Actor

- **URL**: https://apify.com/humble-echidna/academic-papers/changelog.md
- **Full Actor documentation**: https://apify.com/humble-echidna/academic-papers.md

## Changelog

Versions follow MAJOR.MINOR.PATCH (`src/version.py`); Apify shows MAJOR.MINOR from `.actor/actor.json`.
Every run logs its version and records it in the `RUN_STATS` key-value record.

### 1.1.6 (2026-10-16)

- A run that returns nothing (every input bad, private, blocked or unreachable, or an empty input) now ends
  SUCCEEDED with an empty dataset and the reason as its status message and in the log, instead of FAILED. Only an
  unexpected error still fails the run. `RUN_STATS` keeps the reason as before.
- No change to output fields or price.

### 1.1.5 (2026-10-03)

- A run no longer fails when the store it remembers earlier runs in can't be opened (403: the account already has
  a store of that name that this actor didn't create). It falls back to `humble-echidna-<name>`, and if that is
  refused too it runs without memory for that run. Users' existing memory is untouched: the usual name is tried first.

### 1.1.4 (2026-10-01)

- **Waits out longer `Retry-After` answers:** when a site or API asks it to wait before retrying, it now waits up
  to 90 seconds (was 30), once per site, with at most 3 minutes of such long waits per run; a longer wait, or a
  site that asks again after it was waited out, is reported with the reason instead of stalling the run.
- No change to input, output or price.

### 1.1.3 (2026-09-28)

- 2 ready-to-run examples published on Apify Store and linked from the README.

### 1.1.2 (2026-09-28)

- Cheaper on paid Apify plans: $0.90 per 1,000 papers on Starter, $0.80 on Scale and $0.70 on Business ($1.00 on the Free plan).

### 1.1.1 (2026-09-25)

- Input field descriptions rewritten for AI agents (Apify's MCP server shows agents only the description, not the
  form): each now states its default, its allowed range, the value of each option and how it combines with other
  fields. No change to field names, types, defaults or behaviour.

### 1.1.0 (2026-09-25)

- **Newest first is no longer led by impossible dates.** Both sources sometimes date works years ahead (on
  2026-09-25 Crossref's newest "CRISPR base editing" results started with works dated 2047-04-07 and 2030-07-31,
  then dozens of genuine February-July 2027 journal issues; OpenAlex's started with a dissertation dated
  2027-01-01). Rule: a publication date after the end of next year (today: after 2027-12-31) is a data error.
  Dates up to then are kept, because journals publish articles online ahead of their dated issue.
  - With Newest first, both APIs are asked for works dated up to the end of next year at most (OpenAlex
    `to_publication_date`, Crossref `until-pub-date`; the user's own earlier bound still wins), and the merged list
    is sorted by publication date, newest first, undated works last. It used to be the two sources' lists
    interleaved by rank, which is only right for Best match and Most cited.
  - With any sort, a work whose date fails the rule is still returned, with `year` and `publicationDate` null and
    the source's value in the new field **`unreliablePublicationDate`** (null otherwise). Nulling was chosen over
    keeping the date and sorting it last: a wrong date left in `publicationDate` would mislead every later sort,
    filter or chart. When the other source has a credible date for the same work, that one is used.
- README: users can add their own free OpenAlex key, and why that matters on a schedule (OpenAlex doesn't
  document how keyless callers are told apart; if by IP, Apify's shared servers may share one keyless budget).

### 1.0.0 (2026-09-24)

First release.

- Searches OpenAlex (including the arXiv preprints it indexes) and Crossref through their public REST APIs, by
  keywords (everywhere or title only), author, publication date range and open access, sorted by best match,
  newest or most cited.
- Direct lookups: a DOI, a doi.org link, an arXiv id or an arxiv.org link returns that one work.
- One normalized record per work: title, author names, year and date, venue, type, DOI, arXiv / OpenAlex /
  PubMed ids, citation count, open-access status, licence, free PDF and landing page links, and which sources
  had it. arXiv papers always link to arxiv.org (`/pdf/<id>` and `/abs/<id>`), not to whichever mirror a
  catalogue lists; the links are built from the id, arXiv itself is never contacted (its robots.txt disallows
  its API). The abstract is included only when the work's licence allows reuse (CC BY, CC BY-SA, CC BY-ND, CC0,
  public domain).
- Works found by both sources, or by several searches in one run, are merged by DOI / arXiv id and returned once.
- "Only new works" remembers what each search (and filter set) already returned, in your Apify account.
- Optional OpenAlex API key for a larger daily OpenAlex budget; sent to OpenAlex only, in a header.
- Each API's published rate limit is respected (Crossref's public pool: 1 request per second, one at a time).
  If one source fails, the other's results are still returned and the run log says which one failed.
- Charged per work returned, through Apify's standard `apify-default-dataset-item` event.
- "Max results per run" input, and the maximum cost per run is honoured: once either is covered, searches still
  running are cancelled and the rest are skipped (listed as `queriesSkipped` in `RUN_STATS`).
- Failure isolation: a failing search only affects itself.
