{
  "_id": "6af0e0051c36d7c6403e2d0f",
  "Package": "abstractExtractR",
  "Type": "Package",
  "Title": "Retrieve and Audit Scholarly Metadata from Multiple Sources",
  "Version": "0.3.0",
  "Authors@R": "person(\n\"Diogo\", \"Ribeiro\",\nemail = \"dfr@esmad.ipp.pt\",\nrole = c(\"aut\", \"cre\", \"cph\"),\ncomment = c(\nORCID = \"0009-0001-2022-7072\",\naffiliation = \"Faculty of Media Arts and Design of the Technical University of Porto\"\n)\n)",
  "Description": "Retrieves and normalizes scholarly article metadata and\nabstracts from the 'Crossref' REST API\n<https://www.crossref.org/documentation/retrieve-metadata/rest-api/>,\nthe 'OpenAlex' API <https://help.openalex.org/> and the\n'Scopus' Search API <https://dev.elsevier.com/sc_apis.html>.\nProvides bibliographic searches, cursor pagination, publication\ndate and author filtering, abstract retrieval by Digital Object\nIdentifier (DOI), cached batch enrichment, merging of duplicate\nrecords, metadata-quality audits, reproducible search\nsnapshots, local archives with integrity verification, and\nexport to comma-separated values (CSV), 'BibTeX' and 'RIS'\ncitation files. Network requests support configurable timeouts\nand test callbacks. 'Scopus' searches require an 'Elsevier' API\nkey; 'Crossref' queries do not. 'OpenAlex' supports limited\nkeyless searches and authenticated pagination.",
  "License": "MIT + file LICENSE",
  "Config/testthat/edition": "3",
  "Encoding": "UTF-8",
  "Language": "en-US",
  "RoxygenNote": "7.3.3",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-11-08 20:45:29 UTC",
    "User": "root"
  },
  "Author": "Diogo Ribeiro [aut, cre, cph] (ORCID:\n<https://orcid.org/0009-0001-2022-7072>, affiliation: Faculty\nof Media Arts and Design of the Technical University of Porto)",
  "Maintainer": "Diogo Ribeiro <dfr@esmad.ipp.pt>",
  "Repository": "https://cran.r-universe.dev",
  "Date/Publication": "2026-11-08 19:51:04 UTC",
  "RemoteUrl": "https://github.com/cran/abstractExtractR",
  "RemoteRef": "HEAD",
  "RemoteSha": "399d350f7568953a62a46b2886303ec31a2b22c8",
  "_user": "cran",
  "_type": "src",
  "_file": "abstractExtractR_0.3.0.tar.gz",
  "_fileid": "https://r2.ropensci.org/66b9bce22e196ffa6fb2a539a0da2ffec86d73f9d11e5829003ab9e5301cccd3",
  "_filesize": 290467,
  "_sha256": "66b9bce22e196ffa6fb2a539a0da2ffec86d73f9d11e5829003ab9e5301cccd3",
  "_expires": "2027-02-16T20:48:03.000Z",
  "_created": "2026-11-08T20:45:29.000Z",
  "_published": "2026-11-08T20:48:05.294Z",
  "_upstream": "https://github.com/cran/abstractExtractR",
  "_status": "success",
  "_maintainer": {
    "name": "Diogo Ribeiro",
    "email": "dfr@esmad.ipp.pt",
    "login": "diogoribeiro7",
    "linkedin": "in/diogo-ribeiro-9094604a",
    "orcid": "0009-0001-2022-7072",
    "description": "Lead Data Scientist | AI Engineer | Professor | LLMs, RAG, AI Agents, Forecasting, Anomaly Detection | End to End Production AI Systems | Mathematical Engineer",
    "uuid": 15965640
  },
  "_jobs": [
    {
      "job": 128856607045,
      "time": 108,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "13633453375"
    },
    {
      "job": 128856606929,
      "time": 117,
      "config": "linux-release-x86_64",
      "r": "4.6.2",
      "check": "OK",
      "artifact": "13633871770"
    },
    {
      "job": 128855823620,
      "time": 182,
      "config": "source",
      "r": "4.6.2",
      "check": "OK",
      "artifact": "13633383433"
    },
    {
      "job": 128856606962,
      "time": 99,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "13632994082"
    },
    {
      "job": 128856606950,
      "time": 71,
      "config": "windows-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "13633143672"
    },
    {
      "job": 128856606944,
      "time": 82,
      "config": "windows-release-x86_64",
      "r": "4.6.2",
      "check": "OK",
      "artifact": "13633935798"
    }
  ],
  "_buildurl": "https://github.com/r-universe/cran/actions/runs/42521480800",
  "_commit": {
    "id": "399d350f7568953a62a46b2886303ec31a2b22c8",
    "author": "Diogo Ribeiro <dfr@esmad.ipp.pt>",
    "committer": "cran-robot <csardi.gabor+cran@gmail.com>",
    "message": "version 0.3.0\n",
    "time": 1794167464
  },
  "_distro": "resolute",
  "_host": "GitHub-Actions",
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.2.0",
      "role": "Depends"
    },
    {
      "package": "httr2",
      "role": "Imports"
    },
    {
      "package": "jsonlite",
      "role": "Imports"
    },
    {
      "package": "openssl",
      "role": "Imports"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    }
  ],
  "_owner": "cran",
  "_selfowned": false,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-45",
      "n": 1
    }
  ],
  "_tags": [
    {
      "name": "0.3.0",
      "date": "2026-11-08"
    }
  ],
  "_stars": 0,
  "_contributors": [
    {
      "user": "diogoribeiro7",
      "count": 1,
      "uuid": 15965640
    }
  ],
  "_userbio": {
    "uuid": 6899542,
    "type": "organization",
    "name": "cran",
    "followers": 636,
    "description": "Unofficial read-only mirror of all CRAN R packages"
  },
  "_downloads": {
    "count": 0,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/abstractExtractR"
  },
  "_searchresults": 0,
  "_rbuild": "4.6.2",
  "_assets": [
    "extra/abstractExtractR.html",
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/manual.pdf",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "LICENSE"
  ],
  "_cranurl": false,
  "_releases": [
    {
      "version": "0.3.0",
      "date": "2026-11-08"
    }
  ],
  "_exports": [
    "append_search_archive",
    "Article",
    "article_metadata_timeline",
    "articles_to_bibtex",
    "articles_to_data_frame",
    "articles_to_ris",
    "assess_article_quality",
    "compare_recent_archive_runs",
    "compare_search_archive_runs",
    "compare_search_history",
    "compare_search_snapshots",
    "create_search_archive",
    "deduplicate_articles",
    "enrich_articles_with_crossref",
    "export_articles",
    "fetch_all_from_scopus",
    "fetch_from_crossref",
    "fetch_from_openalex",
    "fetch_from_scopus",
    "get_abstract_from_doi",
    "get_abstracts_from_dois",
    "list_search_archive_runs",
    "new_crossref_cache",
    "new_search_plan",
    "normalize_doi",
    "process_crossref_entries",
    "process_crossref_response",
    "process_openalex_entries",
    "process_openalex_response",
    "process_scopus_entries",
    "process_scopus_response",
    "read_search_archive",
    "read_search_archive_run",
    "read_search_snapshot",
    "reconstruct_openalex_abstract",
    "recover_search_archive",
    "refresh_search_archive",
    "refresh_search_snapshot",
    "run_search_plan",
    "save_search_snapshot",
    "search_articles",
    "search_crossref",
    "search_openalex",
    "search_snapshot_manifest",
    "trace_archive_dois",
    "verify_search_archive",
    "write_search_history_report",
    "write_search_manifest"
  ],
  "_help": [
    {
      "page": "append_search_archive",
      "title": "Append an observation to a research archive",
      "topics": [
        "append_search_archive"
      ]
    },
    {
      "page": "Article",
      "title": "Construct a normalized scholarly article",
      "topics": [
        "Article"
      ]
    },
    {
      "page": "article_metadata_timeline",
      "title": "Follow scholarly article metadata across archived searches",
      "topics": [
        "article_metadata_timeline"
      ]
    },
    {
      "page": "articles_to_bibtex",
      "title": "Render article records as BibTeX",
      "topics": [
        "articles_to_bibtex"
      ]
    },
    {
      "page": "articles_to_data_frame",
      "title": "Convert article records to a data frame",
      "topics": [
        "articles_to_data_frame"
      ]
    },
    {
      "page": "articles_to_ris",
      "title": "Render article records as RIS citations",
      "topics": [
        "articles_to_ris"
      ]
    },
    {
      "page": "assess_article_quality",
      "title": "Evaluate structural quality of scholarly article metadata",
      "topics": [
        "assess_article_quality"
      ]
    },
    {
      "page": "compare_recent_archive_runs",
      "title": "Compare only the most recent archive observations",
      "topics": [
        "compare_recent_archive_runs"
      ]
    },
    {
      "page": "compare_search_archive_runs",
      "title": "Compare two selected archive observations",
      "topics": [
        "compare_search_archive_runs"
      ]
    },
    {
      "page": "compare_search_history",
      "title": "Compare a chronological series of literature-search snapshots",
      "topics": [
        "compare_search_history"
      ]
    },
    {
      "page": "compare_search_snapshots",
      "title": "Compare two literature-search snapshots conservatively",
      "topics": [
        "compare_search_snapshots"
      ]
    },
    {
      "page": "create_search_archive",
      "title": "Create an append-only research archive from a saved search",
      "topics": [
        "create_search_archive"
      ]
    },
    {
      "page": "deduplicate_articles",
      "title": "Deduplicate and reconcile scholarly articles using exact DOI identity",
      "topics": [
        "deduplicate_articles"
      ]
    },
    {
      "page": "enrich_articles_with_crossref",
      "title": "Fill missing article abstracts from Crossref",
      "topics": [
        "enrich_articles_with_crossref"
      ]
    },
    {
      "page": "export_articles",
      "title": "Export article records to CSV, BibTeX, or RIS",
      "topics": [
        "export_articles"
      ]
    },
    {
      "page": "fetch_all_from_scopus",
      "title": "Fetch all Scopus results through cursor pagination",
      "topics": [
        "fetch_all_from_scopus"
      ]
    },
    {
      "page": "fetch_from_crossref",
      "title": "Fetch one page of Crossref bibliographic search results",
      "topics": [
        "fetch_from_crossref"
      ]
    },
    {
      "page": "fetch_from_openalex",
      "title": "Request one page of OpenAlex works",
      "topics": [
        "fetch_from_openalex"
      ]
    },
    {
      "page": "fetch_from_scopus",
      "title": "Fetch one page of Scopus search results",
      "topics": [
        "fetch_from_scopus"
      ]
    },
    {
      "page": "get_abstract_from_doi",
      "title": "Retrieve an abstract from Crossref using its DOI",
      "topics": [
        "get_abstract_from_doi"
      ]
    },
    {
      "page": "get_abstracts_from_dois",
      "title": "Retrieve a batch of Crossref abstracts by DOI",
      "topics": [
        "get_abstracts_from_dois"
      ]
    },
    {
      "page": "list_search_archive_runs",
      "title": "List research-archive runs without loading their saved RDS evidence",
      "topics": [
        "list_search_archive_runs"
      ]
    },
    {
      "page": "new_crossref_cache",
      "title": "Create a reusable in-memory Crossref abstract cache",
      "topics": [
        "new_crossref_cache"
      ]
    },
    {
      "page": "new_search_plan",
      "title": "Create a reproducible multi-provider search plan",
      "topics": [
        "new_search_plan"
      ]
    },
    {
      "page": "normalize_doi",
      "title": "Normalize DOI identifiers for equality comparisons",
      "topics": [
        "normalize_doi"
      ]
    },
    {
      "page": "process_crossref_entries",
      "title": "Normalize raw Crossref works into Article objects",
      "topics": [
        "process_crossref_entries"
      ]
    },
    {
      "page": "process_crossref_response",
      "title": "Normalize a Crossref works search response",
      "topics": [
        "process_crossref_response"
      ]
    },
    {
      "page": "process_openalex_entries",
      "title": "Normalize OpenAlex works as Article records",
      "topics": [
        "process_openalex_entries"
      ]
    },
    {
      "page": "process_openalex_response",
      "title": "Normalize an OpenAlex search response",
      "topics": [
        "process_openalex_response"
      ]
    },
    {
      "page": "process_scopus_entries",
      "title": "Normalize raw Scopus search entries",
      "topics": [
        "process_scopus_entries"
      ]
    },
    {
      "page": "process_scopus_response",
      "title": "Normalize a complete Scopus search response",
      "topics": [
        "process_scopus_response"
      ]
    },
    {
      "page": "read_search_archive",
      "title": "Inspect an existing append-only research archive",
      "topics": [
        "read_search_archive"
      ]
    },
    {
      "page": "read_search_archive_run",
      "title": "Read a single research-archive observation",
      "topics": [
        "read_search_archive_run"
      ]
    },
    {
      "page": "read_search_snapshot",
      "title": "Read and validate a previously saved search snapshot",
      "topics": [
        "read_search_snapshot"
      ]
    },
    {
      "page": "reconstruct_openalex_abstract",
      "title": "Restore an OpenAlex abstract from its inverted index",
      "topics": [
        "reconstruct_openalex_abstract"
      ]
    },
    {
      "page": "recover_search_archive",
      "title": "Inspect and explicitly clean up interrupted archive staging directories",
      "topics": [
        "recover_search_archive"
      ]
    },
    {
      "page": "refresh_search_archive",
      "title": "Refresh an archive on demand and append the new search evidence",
      "topics": [
        "refresh_search_archive"
      ]
    },
    {
      "page": "refresh_search_snapshot",
      "title": "Refresh a literature search and preserve its evidence",
      "topics": [
        "refresh_search_snapshot"
      ]
    },
    {
      "page": "run_search_plan",
      "title": "Execute a search plan and capture a versioned evidence snapshot",
      "topics": [
        "run_search_plan"
      ]
    },
    {
      "page": "save_search_snapshot",
      "title": "Persist a search snapshot without overwriting existing evidence",
      "topics": [
        "save_search_snapshot"
      ]
    },
    {
      "page": "search_articles",
      "title": "Search Scopus, Crossref, and OpenAlex with provenance",
      "topics": [
        "search_articles"
      ]
    },
    {
      "page": "search_crossref",
      "title": "Discover articles from Crossref without known DOIs",
      "topics": [
        "search_crossref"
      ]
    },
    {
      "page": "search_openalex",
      "title": "Discover scholarly articles from OpenAlex",
      "topics": [
        "search_openalex"
      ]
    },
    {
      "page": "search_snapshot_manifest",
      "title": "Summarize a scholarly search as a structured manifest",
      "topics": [
        "search_snapshot_manifest"
      ]
    },
    {
      "page": "trace_archive_dois",
      "title": "Trace DOI observations across a research archive",
      "topics": [
        "trace_archive_dois"
      ]
    },
    {
      "page": "verify_search_archive",
      "title": "Inspect checksums and interrupted writes in a research archive",
      "topics": [
        "verify_search_archive"
      ]
    },
    {
      "page": "write_search_history_report",
      "title": "Export an auditable search-history report to CSV files",
      "topics": [
        "write_search_history_report"
      ]
    },
    {
      "page": "write_search_manifest",
      "title": "Write a structured JSON search manifest",
      "topics": [
        "write_search_manifest"
      ]
    }
  ],
  "_rundeps": [
    "askpass",
    "cli",
    "curl",
    "glue",
    "httr2",
    "jsonlite",
    "lifecycle",
    "magrittr",
    "openssl",
    "R6",
    "rlang",
    "sys",
    "vctrs",
    "withr"
  ],
  "_score": 1,
  "_indexed": true,
  "_nocasepkg": "abstractextractr",
  "_universes": [
    "cran",
    "diogoribeiro7"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.3.0",
      "date": "2026-11-08T20:47:19.000Z",
      "distro": "resolute",
      "commit": "399d350f7568953a62a46b2886303ec31a2b22c8",
      "fileid": "https://r2.ropensci.org/9da9d4f62f9f74e3fb5fffb85f0fa3158bb7402f0774dab26d7d74cc03bce287",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/42521480800"
    },
    {
      "r": "4.6.2",
      "os": "linux",
      "version": "0.3.0",
      "date": "2026-11-08T20:47:31.000Z",
      "distro": "resolute",
      "commit": "399d350f7568953a62a46b2886303ec31a2b22c8",
      "fileid": "https://r2.ropensci.org/94fad7f1aa895c2a7a52965fa06bb699855acc18258c8e674e7dc934d97c7262",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/42521480800"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.3.0",
      "date": "2026-11-08T20:47:28.000Z",
      "commit": "399d350f7568953a62a46b2886303ec31a2b22c8",
      "fileid": "https://r2.ropensci.org/67f952c5169074f6bb1f52f5510c1b52b53262c9d500f15666b2f423cfff508d",
      "status": "success",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/42521480800"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.3.0",
      "date": "2026-11-08T20:46:33.000Z",
      "commit": "399d350f7568953a62a46b2886303ec31a2b22c8",
      "fileid": "https://r2.ropensci.org/ae4c6e810524f4442cd1c6fa93191948cd5615f54e7ed195b7b6a288d327d9b8",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/42521480800"
    },
    {
      "r": "4.6.2",
      "os": "win",
      "version": "0.3.0",
      "date": "2026-11-08T20:46:39.000Z",
      "commit": "399d350f7568953a62a46b2886303ec31a2b22c8",
      "fileid": "https://r2.ropensci.org/7e304bd64ef571305acb5f56cc8e0a2a92acbf16f2c9be2bd851d1e8bede4750",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/42521480800"
    }
  ]
}