Skip to content
Switch branches/tags
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

CRAN Check Results API

Base URL:

API Docs:

Authentication needed only on notifications routes

Check out cchecks for an R package interface to this API


  • language: Ruby
  • rest framework: Sinatra
  • scraping http requests: faraday
  • databases: mongodb, mariadb
  • container: all wrapped up in docker (docker-compose)
  • uses Gábor's API to get names of CRAN packages
  • for the history routes, we keep the last 30 days of checks for each package; each day we purge any checks data older than 30 days
  • A cron job:
    • scrapes pkg specific data every 3rd hour
    • scrapes maintainer level data every 4th hour
    • poplulates the history routes once a day
  • Notifications
    • Sidekiq for handling/scheduling/retrying notifications emails
    • Redis for Sidekiq storage
    • Sendgrid for sending emails

JSON API routes

  • /docs
  • /heartbeat
  • /pkgs
  • /pkgs/:pkg_name:
  • /pkgs/:pkg_name:/history
  • /history/:date:
  • /maintainers
  • /maintainers/:email:
  • /badges/:type/:package:
  • /badges/flavor/:flavor/:package:
  • notifications/token
  • notifications/rules (GET, POST; auth required)
  • notifications/rules/:id (GET, DELETE; auth required)

JSON API examples

To replicate the examples below as is, you'll need curl (which you likely have), and jq ( which you may not have. You can also just copy/paste the URLs into your browser 😏

All pkgs from a maintainer that have any checks not passing

curl | jq '.data.table[] | select(.any) | .package'

Similar but across all packages

curl | jq '.data[] | select(.summary.any) | .package'

Packages that have error status checks

curl | jq '.data[] | select(.summary.error > 0) | .package'

workflow for checking your own packages

Check if you have any packages have one or more of a current status across operating systems and R versions, e.g., errors

curl  | jq '.data.table[] | select(.error > 0)'
  "package": "rcmdcheck",
  "any": true,
  "ok": 9,
  "note": 0,
  "warn": 0,
  "error": 3
  "package": "secret",
  "any": true,
  "ok": 11,
  "note": 0,
  "warn": 0,
  "error": 1

Then grab the check details for a specific package

curl  | jq .data.check_details
  "version": "1.0.0",
  "check": "examples",
  "result": "ERROR",
  "output": "Running examples in 'secret-Ex.R' ... cutoff",
  "flavors": [
  "additional_issues": []

Optionally see the check details for previous CRAN checks in the /history route (up to 30 days prior to the current date)

curl | jq '.data.history[].check_details'
  "version": "1.0.0",
  "check": "examples",
  "result": "ERROR",
  "output": "Running examples in 'secret-Ex.R' ... cutoff",
  "flavors": [
  "additional_issues": []
  "version": "1.0.0",
  "check": "examples",
  "result": "ERROR",
  "output": "Running examples in 'secret-Ex.R' ... cutoff",
  "flavors": [
  "additional_issues": []
... cutoff


also check out badges from R-hub for CRAN versions, CRAN release dates, and CRAN downloads

markdown egs to use in your README

linking to cran checks page (likely want to use url since cran check will complain about a different mirror's base url)

cran checks -> [![cran checks](](

Or maybe link to JSON response for this API

cran checks -> [![cran checks](](

pkgs using the badges:

package status summaries

  • /badges/summary/:package all okay?, no notes, warnings, or errors
    • if any notes, warnings, or errors = Not OK (color:red)
    • if NO notes, warnings, or errors = OK (color:green)
  • /badges/worst/:package worst result:
    • if any errors = ERROR (color:red)
    • if any warnings, and no errors = WARN (color:yellow)
    • if any notes, and no errors or warnings = NOTE (color:blue)
    • if no errors, warnings, or notes = OK (color:green)


  • /badges/noerrors/:package no errors? but could have warnings or notes
  • /badges/nowarns/:package no warns? no errors, no warnings, but could have notes
  • /badges/nonotes/:package no notes? no errors, no warnings, and no notes

per flavor

  • /badges/flavor/:flavor/:package flavor + package, where flavors are any one of:

    operating systems

      - linux
      - windows
      - osx
      - solaris

    R versions

      - devel
      - oldrel
      - patched
      - release

With meanings:

  • if any notes, warnings, or errors = Not OK (color:red)
  • if NO notes, warnings, or errors = OK (color:green)

Query parameters

  • ignore: if true, ignore any NOTE's and get a green OK badge. supported by /badges/summary and /badges/flavor


both badges routes

package summary route

flavor route


Notifications builds on top of CRAN checks - it works by the user defining rules by which we scan CRAN checks results and check each user's rule; when a rule's conditions are met, we schedule and send an email notification.

The main user interface to cran checks notifications is through the cchecks R package. See its docs for details.