6  Programmatic access (APIs)

R-universe offers several APIs.

6.1 Universe-specific APIs

The URL of these APIs start with the universe URL. Here we will often use https://jeroen.r-universe.dev as an example but you can replace it with any universe URL.

6.1.1 List of packages in an universe

URL: https://<username>.r-universe.dev/api/ls

Example

packages <- httr2::request("https://jeroen.r-universe.dev/api/ls") |>
  httr2::req_user_agent("R-universe docs") |>
  httr2::req_perform() |>
  httr2::resp_body_json()
str(packages)
List of 19
 $ : chr "RAppArmor"
 $ : chr "V8"
 $ : chr "badgen"
 $ : chr "base64"
 $ : chr "bcrypt"
 $ : chr "brotli"
 $ : chr "curl"
 $ : chr "gpg"
 $ : chr "js"
 $ : chr "jsonlite"
 $ : chr "maketools"
 $ : chr "mongolite"
 $ : chr "openssl"
 $ : chr "protolite"
 $ : chr "rjade"
 $ : chr "sys"
 $ : chr "unix"
 $ : chr "webp"
 $ : chr "webutils"

6.1.2 Information of all packages in an universe

URL: https://<username>.r-universe.dev/api/packages

Parameters:

  • limit: the number of results to return, by default a maximum of 100. You can use the ls endpoint to determine the total number of packages in the universe and set that as a limit.

Example:

packages <- httr2::request("https://jeroen.r-universe.dev/api/packages") |>
  httr2::req_user_agent("R-universe docs") |>
  httr2::req_perform() |>
  httr2::resp_body_json()
# The result is a list of packages
str(packages[[1]], max.level = 1)
List of 77
 $ Package           : chr "V8"
 $ Type              : chr "Package"
 $ Title             : chr "Embedded JavaScript and WebAssembly Engine for R"
 $ Version           : chr "5.9000"
 $ Authors@R         : chr "c(\nperson(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"[email protected]\",\ncomment = c(ORC"| __truncated__
 $ Description       : chr "An R interface to V8 <https://v8.dev>: Google's open\nsource JavaScript and WebAssembly engine. This package ca"| __truncated__
 $ License           : chr "MIT + file LICENSE"
 $ URL               : chr "https://jeroen.r-universe.dev/V8"
 $ BugReports        : chr "https://github.com/jeroen/v8/issues"
 $ SystemRequirements: chr "V8 engine version 6+ is needed for ES6 and WASM\nsupport. On Linux you can build against libv8-dev (Debian) or\"| __truncated__
 $ NeedsCompilation  : chr "yes"
 $ VignetteBuilder   : chr "knitr"
 $ RoxygenNote       : chr "7.3.1"
 $ Roxygen           : chr "list(load = \"installed\", markdown = TRUE)"
 $ Language          : chr "en-US"
 $ Encoding          : chr "UTF-8"
 $ Biarch            : chr "true"
 $ Repository        : chr "https://jeroen.r-universe.dev"
 $ RemoteUrl         : chr "https://github.com/jeroen/v8"
 $ RemoteRef         : chr "HEAD"
 $ RemoteSha         : chr "76e06b966dc721e2ea70826fc4a7a30ec645c005"
 $ Packaged          :List of 2
 $ Author            : chr "Jeroen Ooms [aut, cre] (<https://orcid.org/0000-0002-4035-0289>),\nJan Marvin Garbuszus [ctb]"
 $ Maintainer        : chr "Jeroen Ooms <[email protected]>"
 $ MD5sum            : chr "139888e8f2c4f21d5958117a9ac4b39f"
 $ _user             : chr "jeroen"
 $ _type             : chr "src"
 $ _file             : chr "V8_5.9000.tar.gz"
 $ _fileid           : chr "139888e8f2c4f21d5958117a9ac4b39f"
 $ _filesize         : int 196083
 $ _sha256           : chr "e30885ec90d2482549047080995c6788ecb0226a03e8740c95755fa0148a0916"
 $ _created          : chr "2024-10-09T10:19:30.000Z"
 $ _published        : chr "2024-10-09T10:24:11.463Z"
 $ _status           : chr "success"
 $ _buildurl         : chr "https://github.com/r-universe/jeroen/actions/runs/11252936058"
 $ _windevel         : chr "success"
 $ _linuxdevel       : chr "success"
 $ _wasmbinary       : chr "none"
 $ _macbinary        : chr "success"
 $ _winbinary        : chr "success"
 $ _pkgdocs          : chr "skipped"
 $ _upstream         : chr "https://github.com/jeroen/v8"
 $ _commit           :List of 5
 $ _maintainer       :List of 6
 $ _distro           : chr "noble"
 $ _host             : chr "GitHub-Actions"
 $ _registered       : logi TRUE
 $ _dependencies     :List of 8
 $ _owner            : chr "jeroen"
 $ _selfowned        : logi TRUE
 $ _usedby           : int 309
 $ _updates          :List of 13
 $ _tags             : list()
 $ _topics           :List of 3
 $ _stars            : int 199
 $ _contributions    :List of 10
 $ _userbio          :List of 4
 $ _downloads        :List of 2
 $ _mentions         : int 2
 $ _devurl           : chr "https://github.com/jeroen/v8"
 $ _searchresults    : int 496
 $ _assets           :List of 11
 $ _homeurl          : chr "https://github.com/jeroen/v8"
 $ _realowner        : chr "jeroen"
 $ _cranurl          : logi TRUE
 $ _releases         :List of 49
 $ _exports          :List of 6
 $ _help             :List of 3
 $ _readme           : chr "https://github.com/jeroen/v8/raw/HEAD/README.md"
 $ _rundeps          :List of 3
 $ _sysdeps          :List of 2
 $ _vignettes        :List of 2
 $ _score            : num 15.5
 $ _indexed          : logi TRUE
 $ _nocasepkg        : chr "v8"
 $ _universes        :List of 1
 $ _binaries         :List of 9

6.1.3 Information on a single package in an universe

URL: https://<username>.r-universe.dev/api/packages/<package>

Example:

v8 <- httr2::request("https://jeroen.r-universe.dev/api/packages/V8") |>
  httr2::req_user_agent("R-universe docs") |>
  httr2::req_perform() |>
  httr2::resp_body_json()

str(v8, max.level = 1)
List of 77
 $ Package           : chr "V8"
 $ Type              : chr "Package"
 $ Title             : chr "Embedded JavaScript and WebAssembly Engine for R"
 $ Version           : chr "5.9000"
 $ Authors@R         : chr "c(\nperson(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"[email protected]\",\ncomment = c(ORC"| __truncated__
 $ Description       : chr "An R interface to V8 <https://v8.dev>: Google's open\nsource JavaScript and WebAssembly engine. This package ca"| __truncated__
 $ License           : chr "MIT + file LICENSE"
 $ URL               : chr "https://jeroen.r-universe.dev/V8"
 $ BugReports        : chr "https://github.com/jeroen/v8/issues"
 $ SystemRequirements: chr "V8 engine version 6+ is needed for ES6 and WASM\nsupport. On Linux you can build against libv8-dev (Debian) or\"| __truncated__
 $ NeedsCompilation  : chr "yes"
 $ VignetteBuilder   : chr "knitr"
 $ RoxygenNote       : chr "7.3.1"
 $ Roxygen           : chr "list(load = \"installed\", markdown = TRUE)"
 $ Language          : chr "en-US"
 $ Encoding          : chr "UTF-8"
 $ Biarch            : chr "true"
 $ Repository        : chr "https://jeroen.r-universe.dev"
 $ RemoteUrl         : chr "https://github.com/jeroen/v8"
 $ RemoteRef         : chr "HEAD"
 $ RemoteSha         : chr "76e06b966dc721e2ea70826fc4a7a30ec645c005"
 $ Packaged          :List of 2
 $ Author            : chr "Jeroen Ooms [aut, cre] (<https://orcid.org/0000-0002-4035-0289>),\nJan Marvin Garbuszus [ctb]"
 $ Maintainer        : chr "Jeroen Ooms <[email protected]>"
 $ MD5sum            : chr "139888e8f2c4f21d5958117a9ac4b39f"
 $ _user             : chr "jeroen"
 $ _type             : chr "src"
 $ _file             : chr "V8_5.9000.tar.gz"
 $ _fileid           : chr "139888e8f2c4f21d5958117a9ac4b39f"
 $ _filesize         : int 196083
 $ _sha256           : chr "e30885ec90d2482549047080995c6788ecb0226a03e8740c95755fa0148a0916"
 $ _created          : chr "2024-10-09T10:19:30.000Z"
 $ _published        : chr "2024-10-09T10:24:11.463Z"
 $ _status           : chr "success"
 $ _buildurl         : chr "https://github.com/r-universe/jeroen/actions/runs/11252936058"
 $ _windevel         : chr "success"
 $ _linuxdevel       : chr "success"
 $ _wasmbinary       : chr "none"
 $ _macbinary        : chr "success"
 $ _winbinary        : chr "success"
 $ _pkgdocs          : chr "skipped"
 $ _upstream         : chr "https://github.com/jeroen/v8"
 $ _commit           :List of 5
 $ _maintainer       :List of 6
 $ _distro           : chr "noble"
 $ _host             : chr "GitHub-Actions"
 $ _registered       : logi TRUE
 $ _dependencies     :List of 8
 $ _owner            : chr "jeroen"
 $ _selfowned        : logi TRUE
 $ _usedby           : int 309
 $ _updates          :List of 13
 $ _tags             : list()
 $ _topics           :List of 3
 $ _stars            : int 199
 $ _contributions    :List of 10
 $ _userbio          :List of 4
 $ _downloads        :List of 2
 $ _mentions         : int 2
 $ _devurl           : chr "https://github.com/jeroen/v8"
 $ _searchresults    : int 496
 $ _assets           :List of 11
 $ _homeurl          : chr "https://github.com/jeroen/v8"
 $ _realowner        : chr "jeroen"
 $ _cranurl          : logi TRUE
 $ _releases         :List of 49
 $ _exports          :List of 6
 $ _help             :List of 3
 $ _readme           : chr "https://github.com/jeroen/v8/raw/HEAD/README.md"
 $ _rundeps          :List of 3
 $ _sysdeps          :List of 2
 $ _vignettes        :List of 2
 $ _score            : num 15.5
 $ _indexed          : logi TRUE
 $ _nocasepkg        : chr "v8"
 $ _universes        :List of 1
 $ _binaries         :List of 9

6.1.4 Search in an universe

URL: https://<username>.r-universe.dev/api/search Parameters:

  • q: the query string. You can use the advanced fields.
  • limit: the number of results to return, by default a maximum of 100 but you can
    • do a first request to determine the total number of hits N, returned in the response as the total field,
    • then do a second request using limit=N.

Example:

How many packages in the rOpenSci universe depend on httr2?

deps <- httr2::request("https://ropensci.r-universe.dev/api/search") |>
  httr2::req_url_query(q = 'needs:httr2') |> # packages depending on {httr2}
  httr2::req_user_agent("R-universe docs") |>
  httr2::req_perform() |>
  httr2::resp_body_json()

str(deps, max.level = 1)
List of 5
 $ results:List of 32
 $ query  :List of 2
 $ skip   : int 0
 $ limit  : int 100
 $ total  : int 32
deps$total
[1] 32

6.2 Search all universes

URL: https://r-universe.dev/api/search Parameters:

  • q: the query string. You can use the advanced fields.
  • limit: the number of results to return, by default a maximum of 100 but you can
    • do a first request to determine the total number of hits N, returned in the response as the total field,
    • then do a second request using limit=N.

Example:

packages <- httr2::request("https://r-universe.dev/api/search") |>
  httr2::req_url_query(q = '"weather data"') |>
  httr2::req_user_agent("R-universe docs") |>
  httr2::req_perform() |>
  httr2::resp_body_json()
str(packages, max.level = 1)
List of 5
 $ results:List of 70
 $ query  :List of 1
 $ skip   : int 0
 $ limit  : int 100
 $ total  : int 70
str(packages$results[[1]])
List of 16
 $ _id        : chr "66f8103d560cbda70e9de917"
 $ Package    : chr "weatherOz"
 $ Title      : chr "An API Client for Australian Weather and Climate Data Resources"
 $ Description: chr "Provides automated downloading, parsing and formatting of\nweather data for Australia through API endpoints pro"| __truncated__
 $ _user      : chr "ropensci"
 $ _owner     : chr "ropensci"
 $ _usedby    : int 0
 $ _score     : num 8.2
 $ _uuid      : int 1200269
 $ maintainer :List of 5
  ..$ name : chr "Rodrigo Pires"
  ..$ email: chr "[email protected]"
  ..$ login: chr "bozaah"
  ..$ uuid : int 11730095
  ..$ orcid: chr "0000-0001-7384-6849"
 $ updated    : int 1727530072
 $ stars      : int 22
 $ topics     :List of 19
  ..$ : chr "dpird"
  ..$ : chr "bom"
  ..$ : chr "meteorological-data"
  ..$ : chr "weather-forecast"
  ..$ : chr "australia"
  ..$ : chr "weather"
  ..$ : chr "weather-data"
  ..$ : chr "meteorology"
  ..$ : chr "western-australia"
  ..$ : chr "australia-bureau-of-meteorology"
  ..$ : chr "western-australia-agriculture"
  ..$ : chr "australia-agriculture"
  ..$ : chr "australia-climate"
  ..$ : chr "australia-weather"
  ..$ : chr "api-client"
  ..$ : chr "climate"
  ..$ : chr "data"
  ..$ : chr "rainfall"
  ..$ : chr "weather-api"
 $ rundeps    :List of 55
  ..$ : chr "abind"
  ..$ : chr "apsimx"
  ..$ : chr "bit"
  ..$ : chr "bit64"
  ..$ : chr "blob"
  ..$ : chr "cachem"
  ..$ : chr "class"
  ..$ : chr "classInt"
  ..$ : chr "cli"
  ..$ : chr "clock"
  ..$ : chr "cpp11"
  ..$ : chr "crayon"
  ..$ : chr "crul"
  ..$ : chr "curl"
  ..$ : chr "data.table"
  ..$ : chr "DBI"
  ..$ : chr "e1071"
  ..$ : chr "evaluate"
  ..$ : chr "fastmap"
  ..$ : chr "foreign"
  ..$ : chr "generics"
  ..$ : chr "glue"
  ..$ : chr "highr"
  ..$ : chr "httpcode"
  ..$ : chr "jsonlite"
  ..$ : chr "KernSmooth"
  ..$ : chr "knitr"
  ..$ : chr "lifecycle"
  ..$ : chr "lubridate"
  ..$ : chr "magick"
  ..$ : chr "magrittr"
  ..$ : chr "MASS"
  ..$ : chr "memoise"
  ..$ : chr "mime"
  ..$ : chr "pkgconfig"
  ..$ : chr "plogr"
  ..$ : chr "proxy"
  ..$ : chr "R6"
  ..$ : chr "Rcpp"
  ..$ : chr "rlang"
  ..$ : chr "RSQLite"
  ..$ : chr "s2"
  ..$ : chr "sf"
  ..$ : chr "stars"
  ..$ : chr "terra"
  ..$ : chr "timechange"
  ..$ : chr "triebeard"
  ..$ : chr "tzdb"
  ..$ : chr "units"
  ..$ : chr "urltools"
  ..$ : chr "vctrs"
  ..$ : chr "wk"
  ..$ : chr "xfun"
  ..$ : chr "xml2"
  ..$ : chr "yaml"
 $ match      : num 170
 $ rank       : num 1397

Note that searching globally only returns “indexed” packages: if a package is included in several universes, it still shows up only once in search results because of our deduplication efforts.