Skip to main content

Alcedo logo: a kingfisher in flight
Alcedo: open metadata extractor

Alcedo

Alcedo is the Latin name of the kingfisher, which dives and picks out exactly what it wants.

Alcedo turns a list of literature search queries into DOIs grouped by query. Put your boolean queries in a file and run one command. The results are a text file with one block per query. There is no export to reference managers yet.

Status: alpha. Options may change. See the roadmap and the changelog. Documentation in other languages: Russian, Ukrainian.

What it does

  • Takes up to 5 result pages (50 results) per query, or all of them if there are fewer.
  • Searches Google Scholar through a search API with your own key. Without a working API it uses Semantic Scholar and OpenAlex, plus direct Google Scholar search if you turned that on. See Which source to use.
  • A source that fails is left out, and the block says so.
  • Scholar gives links rather than DOIs, so Alcedo looks for the DOI in the URL, Europe PMC and publisher meta tags, then by title in Crossref and OpenAlex.
  • Saves after every query. --resume continues after an interruption and collects failed queries again.
  • Writes a second file listing each DOI once, with the queries that found it. Papers found by the most queries come first.
  • With --verify-dois, checks every DOI in the doi.org registry and marks the ones that do not exist.

Install

Requires Python 3.10 or newer.

pip install alcedo-lit

For direct Google Scholar search, which most people will not need, install the extra as well: pip install "alcedo-lit[scholar]".

Then choose how to search. This explains the options and saves your key, which is not shown as you type:

alcedo setup

Quick start

The repository includes a sample: queries.txt has two queries about the kingfisher, and alcedo_results.txt and alcedo_results_unique.csv are their results. There is another set of queries in examples/queries.txt.

For your own search, create a queries.txt in any folder, with ; after each query:

biomimetic nacre ("brick-and-mortar" OR "layered structure") composite fracture toughness;
gecko-inspired dry adhesive (micropillar OR "hierarchical microstructure") adhesion;

From that folder, check the queries for common mistakes and then run them:

alcedo check
alcedo

The results go to alcedo_results.txt in the current folder:

=== Query: gecko-inspired dry adhesive (micropillar OR "hierarchical microstructure") adhesion ===
Source: OpenAlex
https://doi.org/10.1039/c3sm52921e
https://doi.org/10.1098/rsif.2018.0681

The Source: line appears when the results did not all come from a search API. Records with no DOI are listed as DOI not found: <title>, and a query that failed has a Query error line. If DOI lookups failed along the way, the final message says how many, because those records may still have a DOI.

Alcedo will not replace an existing results file: use --resume to continue it or --overwrite to start again.

alcedo_results_unique.csv lists each DOI once, with the number of queries that found it and the queries themselves. It is built from the results file and uses no extra searches. Cells are separated by ;, which Excel in European locales expects.

To check DOIs against the doi.org registry, add --verify-dois. This also works on results you already have: alcedo --resume --verify-dois. A DOI the registry does not know becomes DOI not registered: <doi>, and one that could not be checked stays in the results and is counted in the final message. The check uses no OpenAlex budget.

To check the wording of a query quickly, look at its first 10 results:

alcedo --pages 1 -i test.txt -o test_results.txt --overwrite

Read how to write queries before a large run. Some mistakes fail silently: a lowercase or, for example, is treated as AND. alcedo check finds the common ones.

Which source to use

With a working API key, a query uses only the API. Otherwise it uses the free sources together, in this order: Semantic Scholar, OpenAlex, and direct search if you turned it on. Each gives up to 50 results and repeats are removed, so a block can hold more than 50 records. A source that fails is left out, and the Source: line says so. If every source fails, the block has a Query error line and --resume collects it again.

The free options do not give the same results as an API. The figures below come from small tests with relevance judged by an AI assistant, not by a domain expert. Treat them as a rough guide. Results vary a lot by query.

Source What you need Cost at the time of writing How it did
Google Scholar via SearchApi Your key, no phone number 100 free requests to try it, then from $40 a month Best first results: 13 of the first 20 were exactly on topic. Same first results as a browser in our check
Google Scholar via Serper Your key, no card 2,500 free queries, which is about 500 queries of 50 results, then one-off packs from $50 for 50,000, valid for 6 months Same first 10 results as SearchApi on both test queries, and 13 of the first 20 exactly on topic. Later results differed
Google Scholar via SerpApi Your key and a phone number 250 free searches a month, paid plans from $25 a month Not measured; Alcedo has not yet been run against the live service
Semantic Scholar Nothing; a free key gives you your own limit Free 9 of the first 10 exactly on topic on one query, no results on a stricter one. Finds few but precise papers, most cited first. Not measured inside Alcedo
OpenAlex Nothing; a free key raises the daily budget Free 5 of the first 20 exactly on topic. Its share of on-topic results ranged from 34% against 73% for the API to about equal. It also found papers Scholar missed
Google Scholar directly pip install "alcedo-lit[scholar]" and your agreement Free Changes a lot between runs and networks, see below

A query with 50 results uses 3 requests on SearchApi and 5 on Serper. You create the key and accept the provider's terms, and the provider sees your queries. If you have neither a key nor a budget for one, the free catalogues still work, and direct search can add to them on a network Scholar accepts.

In a run where Scholar answered in full, the free sources together found 38 of the 45 exactly on-topic papers known from all our runs, against 29 for SearchApi. Their first results were weaker, with 9 of the first 20 exactly on topic against 13, and they took 15 minutes for 2 queries against 3.5, mostly on direct search and DOI lookups. A key gives you the best first results quickly, but going without one does not have to mean missing papers.

Publications that use results from Semantic Scholar should cite the Semantic Scholar Open Data Platform, as its API license asks.

It is free, and Scholar may simply refuse it. Scholar often refuses VPNs and shared networks: in our test, one VPN provider was refused even in a browser and another was accepted. If it refuses you, try without the VPN, and check the same search in a browser.

An answer from Scholar does not mean the list is complete. In some of our tests, the script got 6 to 27 results for queries that give 50 through an API, mostly recent papers, with key works missing, and repeating one query gave different lists. In a later run it got all 50, nearly all of them also in the API's list. Parsing does not explain the difference, we do not know the cause, and you cannot tell in advance which you will get. So Alcedo puts direct results after the free catalogues, where they can only add to the list, and marks those blocks in the results file. Do not rely on direct search for a literature review. If you add a key later, alcedo --redo-free collects those blocks again.

Alcedo asks once before using direct search, and remembers your answer. alcedo setup changes it, and --direct-scholar or --no-direct-scholar overrides it for one run.

Keys and everyday commands

alcedo setup stores keys as plain text in your user settings (%APPDATA%\alcedo\config.json on Windows, ~/.config/alcedo/config.json elsewhere). Run it again and type - to remove a key. The SEARCHAPI_KEY, SERPER_API_KEY, SERPAPI_KEY, OPENALEX_API_KEY and SEMANTIC_SCHOLAR_API_KEY environment variables take priority over that file, and command line options take priority over both.

alcedo --resume          # continue after an interruption
alcedo --redo-free   # collect blocks from the free sources again, for example after adding a key
alcedo --source openalex # OpenAlex only
alcedo --no-semantic-scholar  # leave Semantic Scholar out of the free sources
alcedo --help            # all options

Responsible use

  • Direct Google Scholar search is off until you agree to it. Scholar's robots.txt disallows automated search, and you are responsible for following Google's terms. Alcedo waits between queries and stops asking when Scholar refuses. The scholarly library it relies on sends a random browser User-Agent and may try to open a browser for a captcha, and it has no setting to turn that off.
  • Apart from that route, requests identify themselves as alcedo/<version>. With --mailto, your address goes to Crossref, OpenAlex, Semantic Scholar and Europe PMC, never to publisher sites.
  • Alcedo collects metadata. It does not download papers and will not integrate shadow libraries.

Development

pip install -e ".[dev]"
python -m pytest
ruff check .

The tests use no network. Git tracks the sample in the project root, so do not run your own queries there: queries.txt, alcedo_results.txt and alcedo_results_unique.csv would show up as changes. Use private/, which Git ignores, so your topic stays out of the repository.

License

The code is under the MIT license. The logo is not: see the third-party notices.

Special thanks

To kesha_xdd, who drew the Alcedo logo.

Metadata

Release files for alcedo-lit 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for alcedo-lit 0.1.0
File Size Uploaded Provenance Actions
alcedo_lit-0.1.0.tar.gz 56.8 kB With provenance Details for alcedo_lit-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for alcedo-lit 0.1.0
File Interpreter ABI Platform Actions
alcedo_lit-0.1.0-py3-none-any.whl Python 3 none any Details for alcedo_lit-0.1.0-py3-none-any.whl

Total release size: 98.0 kB

Release files / alcedo_lit-0.1.0.tar.gz

Download URL alcedo_lit-0.1.0.tar.gz
Size 56.8 kB
Tags Source
SHA-256 checksum
How to use checksums
dcc4d59e20e02e08166570a26f622fa5227fa4de7f30b9dd61fb752fbf39f3a0
BLAKE2b-256 checksum
How to use checksums
c28f806f76b8113f6c97453f960c3e4d9d74c3aa67274db02a1bbb4e5308b4a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / alcedo_lit-0.1.0-py3-none-any.whl

Download URL alcedo_lit-0.1.0-py3-none-any.whl
Size 41.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d043585bc4467c13730d59467318f0513b353063ce19945cbdb2216c108807be
BLAKE2b-256 checksum
How to use checksums
0fef8575d979cec5879498aea13803ee9d51d68633747f42ff54185409cc2783
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Security for alcedo-lit 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for alcedo_lit-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page