{
  "_id": "6aaacf37ea78b3e62eace1d3",
  "Package": "biohttp",
  "Title": "Normalized HTTP Transport with Circuit Breaking and Caching",
  "Version": "0.1.3",
  "Authors@R": "c(\nperson(\"Samuel\", \"Bharti\", , \"samuelbharti.io@gmail.com\",\nrole = c(\"aut\", \"cre\", \"cph\"),\ncomment = c(ORCID = \"0000-0003-4190-7058\")),\nperson(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"ths\",\ncomment = c(ORCID = \"0000-0001-9986-114X\")),\nperson(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = \"ths\",\ncomment = c(ORCID = \"0000-0002-4958-2844\")),\nperson(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"),\ncomment = c(ROR = \"03wc8by49\"))\n)",
  "Description": "Web service calls return a normalized result value instead\nof raising a condition, so a caller branches on data rather\nthan on an error handler. Transport failure, a non-success\nstatus code, and an unreadable response body are reported as\nthree distinct outcomes. Per-host circuit breaking, retry with\na transient-failure predicate, optional throttling, redacted\nrequest headers, and a success-only cache come as defaults.\nMany questions to one source can be asked as a single batch,\nwhere only the entries the cache is missing reach the network.\nService-specific knowledge is left to the client packages built\non top. The circuit breaker is the pattern described in Nygard\n(2018, ISBN:9781680502398).",
  "License": "MIT + file LICENSE",
  "URL": "https://github.com/samuelbharti/biohttp,\nhttps://www.samuelbharti.com/biohttp/",
  "BugReports": "https://github.com/samuelbharti/biohttp/issues",
  "Encoding": "UTF-8",
  "Language": "en-US",
  "Roxygen": "list(markdown = TRUE)",
  "VignetteBuilder": "knitr",
  "Config/testthat/edition": "3",
  "Config/roxygen2/version": "8.0.0",
  "Config/pak/sysreqs": "libssl-dev",
  "Repository": "https://samuelbharti.r-universe.dev",
  "Date/Publication": "2026-09-16 15:00:17 UTC",
  "RemoteUrl": "https://github.com/samuelbharti/biohttp",
  "RemoteRef": "HEAD",
  "RemoteSha": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-09-16 17:14:12 UTC",
    "User": "root"
  },
  "Author": "Samuel Bharti [aut, cre, cph] (ORCID:\n<https://orcid.org/0000-0003-4190-7058>),\nBarret Schloerke [ths] (ORCID: <https://orcid.org/0000-0001-9986-114X>),\nCarson Sievert [ths] (ORCID: <https://orcid.org/0000-0002-4958-2844>),\nPosit Software, PBC [cph, fnd] (ROR: <https://ror.org/03wc8by49>)",
  "Maintainer": "Samuel Bharti <samuelbharti.io@gmail.com>",
  "_user": "samuelbharti",
  "_type": "src",
  "_file": "biohttp_0.1.3.tar.gz",
  "_fileid": "https://r2.ropensci.org/ec16f8214be6e2113ea17363f4aeb25c56ffbb417959f4fc83593ec74ae23787",
  "_filesize": 307822,
  "_sha256": "ec16f8214be6e2113ea17363f4aeb25c56ffbb417959f4fc83593ec74ae23787",
  "_expires": "2026-12-25T17:17:41.000Z",
  "_created": "2026-09-16T17:14:12.000Z",
  "_published": "2026-09-16T17:17:43.438Z",
  "_jobs": [
    {
      "job": 104898228865,
      "time": 159,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "10460375232"
    },
    {
      "job": 104898228892,
      "time": 161,
      "config": "linux-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "10459587832"
    },
    {
      "job": 104898228800,
      "time": 135,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "10459372874"
    },
    {
      "job": 104898228817,
      "time": 140,
      "config": "macos-release-arm64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "10460515123"
    },
    {
      "job": 104897055887,
      "time": 197,
      "config": "source",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "10458989956"
    },
    {
      "job": 104898228811,
      "time": 112,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "10459447806"
    },
    {
      "job": 104898228944,
      "time": 99,
      "config": "windows-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "10460180209"
    },
    {
      "job": 104898228967,
      "time": 91,
      "config": "windows-oldrel-x86_64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "10459950276"
    },
    {
      "job": 104898228974,
      "time": 112,
      "config": "windows-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "10460425055"
    }
  ],
  "_host": "GitHub-Actions",
  "_buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070",
  "_status": "success",
  "_upstream": "https://github.com/samuelbharti/biohttp",
  "_commit": {
    "id": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
    "author": "Samuel Bharti <samuelbharti.io@gmail.com>",
    "committer": "GitHub <noreply@github.com>",
    "message": "docs: use plain section names (#47)\n\n* docs: name the section Motivation\n\n\"Why\" as a heading says nothing about what is under it. Motivation is what the\nsection is, and it is what biocohort and plotomics already call theirs.\n\n* docs: use plain section names\n\n\"What it does\", \"What it does not do\", \"Using it\" and \"Citing biohttp\" become\nFeatures, Scope, Usage and Citation. The same names now appear across the\npackages, so a reader who knows one README can find their way around the next.",
    "time": 1789570817
  },
  "_maintainer": {
    "name": "Samuel Bharti",
    "email": "samuelbharti.io@gmail.com",
    "login": "samuelbharti",
    "bluesky": "@samuelbharti.com",
    "linkedin": "in/samuelbharti",
    "orcid": "0000-0003-4190-7058",
    "description": "Computational biologist building open-source tools for genomics, multi-omics, and scientific discovery.",
    "uuid": 58329032
  },
  "_distro": "resolute",
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.0",
      "role": "Depends"
    },
    {
      "package": "cachem",
      "role": "Imports"
    },
    {
      "package": "curl",
      "role": "Imports"
    },
    {
      "package": "httr2",
      "role": "Imports"
    },
    {
      "package": "jsonlite",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "role": "Imports"
    },
    {
      "package": "stats",
      "role": "Imports"
    },
    {
      "package": "tools",
      "role": "Imports"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    },
    {
      "package": "webfakes",
      "role": "Suggests"
    },
    {
      "package": "withr",
      "role": "Suggests"
    }
  ],
  "_owner": "samuelbharti",
  "_selfowned": true,
  "_usedby": 2,
  "_updates": [
    {
      "week": "2026-31",
      "n": 6
    },
    {
      "week": "2026-37",
      "n": 3
    },
    {
      "week": "2026-38",
      "n": 4
    }
  ],
  "_tags": [
    {
      "name": "v0.1.0",
      "date": "2026-08-01"
    },
    {
      "name": "v0.1.1",
      "date": "2026-08-01"
    },
    {
      "name": "v0.1.2",
      "date": "2026-08-23"
    }
  ],
  "_topics": [
    "api-client",
    "bioinformatics",
    "caching",
    "circuit-breaker",
    "http",
    "httr2",
    "retry"
  ],
  "_stars": 2,
  "_contributors": [
    {
      "user": "samuelbharti",
      "count": 94,
      "uuid": 58329032
    }
  ],
  "_userbio": {
    "uuid": 58329032,
    "type": "user",
    "name": "Samuel Bharti",
    "followers": 9,
    "description": "Computational biologist building open-source tools for genomics, multi-omics, and scientific discovery."
  },
  "_downloads": {
    "count": 212,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/biohttp"
  },
  "_devurl": "https://github.com/samuelbharti/biohttp",
  "_pkgdown": "https://www.samuelbharti.com/biohttp/",
  "_searchresults": 3,
  "_rbuild": "4.6.1",
  "_assets": [
    "extra/biohttp.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",
    "extra/readme.html",
    "extra/readme.md",
    "LICENSE"
  ],
  "_homeurl": "https://github.com/samuelbharti/biohttp",
  "_realowner": "samuelbharti",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.1.2",
      "date": "2026-09-08"
    }
  ],
  "_exports": [
    "as_legacy_envelope",
    "body_or_null",
    "breaker_open",
    "breaker_record",
    "breaker_reset",
    "cache",
    "cache_key",
    "cache_reset",
    "cached",
    "classify_condition",
    "classify_http",
    "envelope",
    "get_json",
    "get_json_many",
    "get_text",
    "get_text_many",
    "graphql_error",
    "http_error_message",
    "is_blank",
    "is_transient",
    "perform",
    "perform_many",
    "perform_text",
    "pluck_at",
    "post_json",
    "post_json_many",
    "ratelimit_record",
    "ratelimit_reset",
    "ratelimit_wait",
    "redact_secrets",
    "req_defaults",
    "status_error",
    "STATUS_LEVELS",
    "status_message",
    "status_no_data",
    "status_ok",
    "status_rate_limited",
    "status_skipped",
    "status_stale",
    "status_timeout",
    "transport_stats",
    "transport_stats_reset",
    "user_agent"
  ],
  "_help": [
    {
      "page": "as_legacy_envelope",
      "title": "Convert an envelope to the old four-field shape",
      "topics": [
        "as_legacy_envelope"
      ]
    },
    {
      "page": "body_or_null",
      "title": "The parsed body, or NULL",
      "topics": [
        "body_or_null"
      ]
    },
    {
      "page": "breaker_open",
      "title": "Is a host's breaker open",
      "topics": [
        "breaker_open"
      ]
    },
    {
      "page": "breaker_record",
      "title": "Record a call outcome against a host",
      "topics": [
        "breaker_record"
      ]
    },
    {
      "page": "breaker_reset",
      "title": "Clear all breaker state",
      "topics": [
        "breaker_reset"
      ]
    },
    {
      "page": "cache",
      "title": "The cache store",
      "topics": [
        "cache"
      ]
    },
    {
      "page": "cache_key",
      "title": "Build a cache key",
      "topics": [
        "cache_key"
      ]
    },
    {
      "page": "cache_reset",
      "title": "Empty the cache",
      "topics": [
        "cache_reset"
      ]
    },
    {
      "page": "cached",
      "title": "Serve from cache, or fetch and cache a success",
      "topics": [
        "cached"
      ]
    },
    {
      "page": "classify_condition",
      "title": "Turn a failed connection into a status",
      "topics": [
        "classify_condition"
      ]
    },
    {
      "page": "classify_http",
      "title": "Turn an HTTP status code into a status",
      "topics": [
        "classify_http"
      ]
    },
    {
      "page": "envelope",
      "title": "Build a result envelope",
      "topics": [
        "envelope"
      ]
    },
    {
      "page": "get_json",
      "title": "GET a JSON endpoint",
      "topics": [
        "get_json"
      ]
    },
    {
      "page": "get_json_many",
      "title": "GET many JSON endpoints as one batch",
      "topics": [
        "get_json_many"
      ]
    },
    {
      "page": "get_text",
      "title": "GET a text endpoint",
      "topics": [
        "get_text"
      ]
    },
    {
      "page": "get_text_many",
      "title": "GET many text endpoints as one batch",
      "topics": [
        "get_text_many"
      ]
    },
    {
      "page": "graphql_error",
      "title": "Catch a GraphQL query error inside a 200",
      "topics": [
        "graphql_error"
      ]
    },
    {
      "page": "http_error_message",
      "title": "A user-facing sentence for a failed call",
      "topics": [
        "http_error_message"
      ]
    },
    {
      "page": "is_blank",
      "title": "Is a value blank",
      "topics": [
        "is_blank"
      ]
    },
    {
      "page": "is_transient",
      "title": "Is a response worth retrying",
      "topics": [
        "is_transient"
      ]
    },
    {
      "page": "perform",
      "title": "Perform a request and normalize the result",
      "topics": [
        "perform"
      ]
    },
    {
      "page": "perform_many",
      "title": "Perform many requests as one batch",
      "topics": [
        "perform_many"
      ]
    },
    {
      "page": "perform_text",
      "title": "Perform a request and return the body as text",
      "topics": [
        "perform_text"
      ]
    },
    {
      "page": "pluck_at",
      "title": "Pull a value out of a nested list",
      "topics": [
        "pluck_at"
      ]
    },
    {
      "page": "post_json",
      "title": "POST a JSON body",
      "topics": [
        "post_json"
      ]
    },
    {
      "page": "post_json_many",
      "title": "POST many JSON bodies as one batch",
      "topics": [
        "post_json_many"
      ]
    },
    {
      "page": "ratelimit_record",
      "title": "Record a pause for a host",
      "topics": [
        "ratelimit_record"
      ]
    },
    {
      "page": "ratelimit_reset",
      "title": "Clear all recorded pauses",
      "topics": [
        "ratelimit_reset"
      ]
    },
    {
      "page": "ratelimit_wait",
      "title": "Wait out a host's recorded pause",
      "topics": [
        "ratelimit_wait"
      ]
    },
    {
      "page": "redact_secrets",
      "title": "Remove secret values from a string",
      "topics": [
        "redact_secrets"
      ]
    },
    {
      "page": "req_defaults",
      "title": "Apply the shared request options",
      "topics": [
        "req_defaults"
      ]
    },
    {
      "page": "status_constructors",
      "title": "Envelope constructors, one per status",
      "topics": [
        "status_constructors",
        "status_error",
        "status_no_data",
        "status_ok",
        "status_rate_limited",
        "status_skipped",
        "status_stale",
        "status_timeout"
      ]
    },
    {
      "page": "STATUS_LEVELS",
      "title": "The seven envelope statuses",
      "topics": [
        "STATUS_LEVELS"
      ]
    },
    {
      "page": "status_message",
      "title": "The user-facing sentence for an outcome",
      "topics": [
        "status_message"
      ]
    },
    {
      "page": "transport_stats",
      "title": "How many requests went out, per host",
      "topics": [
        "transport_stats"
      ]
    },
    {
      "page": "transport_stats_reset",
      "title": "Clear the request counts",
      "topics": [
        "transport_stats_reset"
      ]
    },
    {
      "page": "user_agent",
      "title": "Build a User-Agent that identifies your caller",
      "topics": [
        "user_agent"
      ]
    }
  ],
  "_pkglogo": "https://github.com/samuelbharti/biohttp/raw/HEAD/man/figures/logo.svg",
  "_readme": "https://github.com/samuelbharti/biohttp/raw/HEAD/README.md",
  "_rundeps": [
    "askpass",
    "cachem",
    "cli",
    "curl",
    "fastmap",
    "glue",
    "httr2",
    "jsonlite",
    "lifecycle",
    "magrittr",
    "openssl",
    "R6",
    "rlang",
    "sys",
    "vctrs",
    "withr"
  ],
  "_vignettes": [
    {
      "source": "biohttp.Rmd",
      "filename": "biohttp.html",
      "title": "Writing a client with biohttp",
      "engine": "knitr::rmarkdown",
      "headings": [
        "The one rule",
        "What comes back",
        "The seven statuses",
        "Branching",
        "Building a client",
        "Credentials",
        "Rate limits",
        "Asking many questions at once",
        "One source, not a mix",
        "Supply a throttle",
        "The circuit breaker",
        "Caching",
        "GraphQL",
        "Migrating an existing app",
        "Testing your client"
      ],
      "created": "2026-08-01 01:55:20",
      "modified": "2026-09-07 06:07:07",
      "commits": 3
    }
  ],
  "_score": 5.2552725051033065,
  "_indexed": true,
  "_nocasepkg": "biohttp",
  "_universes": [
    "samuelbharti"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.1.3",
      "date": "2026-09-16T17:16:38.000Z",
      "distro": "resolute",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/7fb88172a6f5bfe4eca9beac354b367f10474da51dd7cd732a182745bcf5533b",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.6.1",
      "os": "linux",
      "version": "0.1.3",
      "date": "2026-09-16T17:16:39.000Z",
      "distro": "resolute",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/02395579a36ad314cff3505a2e5aa8aa06c1ad891b8d034ed10fdccc7c2db0bb",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.1.3",
      "date": "2026-09-16T17:16:19.000Z",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/e9f9bd6112d473aaacd8dd3a50ba8ae877b8af4ca6bd311856423f092285cd7e",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.6.1",
      "os": "mac",
      "version": "0.1.3",
      "date": "2026-09-16T17:16:16.000Z",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/0db0e76b3a1f9e4ebe68e78f3a37c4bdefea9ec5c98fb362f4d44a2046587dfe",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.1.3",
      "date": "2026-09-16T17:16:28.000Z",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/e70fcbd1d9b3a3904c40412684f5dae4a1450bcde7f8646e73b0aa157103c77b",
      "status": "success",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.1.3",
      "date": "2026-09-16T17:15:30.000Z",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/2a0d42d32c72b9bd3e737d69af0939d7344c05e25471622b6293631cbf675da1",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.1.3",
      "date": "2026-09-16T17:15:26.000Z",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/457dc0294c24e283841e92da2ff0375b94da147a58bc7516f9c629de7623fdd5",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    },
    {
      "r": "4.6.1",
      "os": "win",
      "version": "0.1.3",
      "date": "2026-09-16T17:15:51.000Z",
      "commit": "5e8e5ebe7a2887f4e5f70f06354e2977dbf46ba9",
      "fileid": "https://r2.ropensci.org/0473a87d1448c9bc1ca3595433b20a87bb227dd7e1cfd6446b9616cc325cde05",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/samuelbharti/actions/runs/35126527070"
    }
  ]
}