Lecture 4 | Basics of Data Analysis II

Max Pellert

IS 616: Large Scale Data Analysis and Visualization

Tidy data and tidy tools make data analysis easier…

…by easing the transitions between manipulation, visualization and modeling

Tidy data and tidy tools make data analysis easier…

…by easing the transitions between manipulation, visualization and modeling.

“The tidy data standard has been designed to facilitate initial exploration and analysis of the data, and to simplify the development of data analysis tools that work well together.

Current tools often require translation. You have to spend time munging the output from one tool so you can input it into another.

Tidy datasets and tidy tools work hand in hand to make data analysis easier, allowing you to focus on the interesting domain problem, not on the uninteresting logistics of data.”

Wickham, H. (2014). Tidy Data. Journal of Statistical Software, 59(10). https://doi.org/10.18637/jss.v059.i10

Definition

“Tidy data sets are all alike but every messy dataset is messy in its own way”

Tidy data sets provide a standardized way to link

the structure of a data set (its physical layout)

with its semantics (its meaning)

A special vocabulary

is used to describe the structure and the semantics of data sets

We will try to use this terms in the rest of the course when talking about data

The definitions of the vocabulary will us allow to define tidy data

Data structure

Statistical data sets are:

rectangular tables

that are made up of rows and columns

columns are always labelled

rows are sometimes labelled

Question: Is it enough just to describe structure of data sets?

Simple transpose of the same data, i.e. rows to columns and columns to rows, cannot be adequately described using just a rows and columns terminology

Different layout but both tables are actually representations of the same data

–> We also need to describe the underlying semantics of the data

Data Semantics

A data set is a collection of values, usually either numbers (if “quantitative”) or strings (if “qualitative”)

Values are organized in two ways

Every value belongs to a variable

and an observation

A variable contains all values that measure the same underlying attribute (like height or temperature or duration) across units (like a person or a day or a race)

An observation contains all values measured on the same unit (like a person or a day or a race) across attributes

The experimental design (or more general “the way we retrieved the data”) informs us about the structure of the observations

For example, we assumed a completely crossed design where every treatment was to be measured for each person

Here, the design says that each possible value should have been recorded, which we make explicit by adding a missing value

Depending on the design, missing values can also be just dropped

But, the absence of evidence doesn’t mean the evidence of absence! Only in very special circumstances it could be OK to replace NA by 0 for example

https://www.nature.com/articles/s41586-019-1043-4

It’s actually hard to define variables and observations precisely in general

But, usually it’s quite easy to figure out what are variables and what are observations for a given data set (although there can be some room for interpretation)

For example, two columns of “height” and “weight” would easily be called variables

But, what about “height” and “width”?

Those could also values of a “dimension” variable

Similarly, columns “home phone” and “office phone” can be thought of as variables

But for example in the context of fraud detection, we could think of variable “phone number” and “phone type” instead

This would for example allow to inspect duplicate numbers more easily, as individuals using the same phone number would be suspicious

Thinking in this way how to prepare the data in the best way for the type of problem that you face is one of the most important skills in data analysis!

Some rules of thumb

It is usually easier to describe functional relationships between variables

For example, “density” as the ratio of “weight” to “volume”

It is usually easier to make comparisons between groups of observations than by groups of variables

For example average of group a vs average of group b or by creating multiple subplots of the same variables for different groups (small multiples)

What makes data tidy?

Tidying messy datasets

https://github.com/hadley/tidy-data

Column headers are values not variable names

Multiple variables are stored in one column

Variables are stored in both rows and columns

Multiple types in one table

One type in multiple tables

“It is also common to find data values about a single type of observational unit spread out over multiple tables or files.

These tables and files are often split up by another variable, so that each represents a single year, person, or location.”

  1. Read the files into a list of tables

  2. For each table, add a new column that records the original file name (because the file name is often the value of an important variable)

  3. Combine all tables into a single table

Can be achieved in multiple ways, for example along the lines of

library(data.table)

together_dt <- rbindlist(lapply(paste0("filename_",1:10),function(x) fread(x)))
import pandas as pd

together_df = pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)

and in many other ways

Tidy visualization tools only need to be input-tidy as their output is visual

Domain specific languages work particularly well for the visualization of tidy datasets because they can describe a visualization as a mapping between variables and aesthetic properties of the graph (e.g., position, size, shape and color)

This is the idea behind the grammar of graphics (Wilkinson 2005), and the layered grammar of graphics (Wickham 2010), an extension tailored specifically for R

ggplot2 was also ported to Python with the package “plotnine”

One more command line tool

https://jqlang.github.io/

https://jqlang.github.io/jq/tutorial/

GitHub has a JSON API, so let’s play with that. This URL gets us the last 5 commits from the jq repo.

curl -s 'https://api.github.com/repos/jqlang/jq/commits?per_page=5'
## [
##   {
##     "sha": "8f81668014f4df2654aa9ab674b5498aa9446441",
##     "node_id": "C_kwDOAE3WVdoAKDhmODE2NjgwMTRmNGRmMjY1NGFhOWFiNjc0YjU0OThhYTk0NDY0NDE",
##     "commit": {
##       "author": {
##         "name": "taoky",
##         "email": "taoky99@outlook.com",
##         "date": "2023-09-22T00:18:41Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-22T00:18:41Z"
##       },
##       "message": "Fix the default colors to use 39, the default foreground color (#2904)",
##       "tree": {
##         "sha": "223b8e8db917ea45390102bfff4c9b34b00e2563",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/223b8e8db917ea45390102bfff4c9b34b00e2563"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/8f81668014f4df2654aa9ab674b5498aa9446441",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlDN1hCRBK7hj4Ov3rIwAAqqwIACweocODkDgM90mr1OFE0LHi\n61jMtGZEUvy/pscOxHlRR99A5Z+1C4c5rvMYt/dnZRVAOoyczTt9i/YGpZ/+7iYM\nOQnCr41EbvsWWN/lpfvcbFPCGP8OLgwdSMb76/JJroT50jWieEBFYJkqaoU884wS\nM9C714Cobo3KkCL4lyveB6obqOiOdufM5pjOPaa9m28UOWEew0HGgHT6eXR+/+cy\nQGbwHiuAYoPOSOWc5zkaWTNWcS5DxSGuNHlZphXG5FdSK3H2kN2bGTyYUEndYzZq\nVOlECUNy9qTmoqq/5Nj+ZWLNWxcpo16SYa8ZYqjjMkbKUhcu792A7bZMdzdoufw=\n=3nf1\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree 223b8e8db917ea45390102bfff4c9b34b00e2563\nparent de1c10ca8a5e333102a00bfcb06ff98f40c774c3\nauthor taoky <taoky99@outlook.com> 1695341921 +0800\ncommitter GitHub <noreply@github.com> 1695341921 +0900\n\nFix the default colors to use 39, the default foreground color (#2904)\n\n"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441",
##     "html_url": "https://github.com/jqlang/jq/commit/8f81668014f4df2654aa9ab674b5498aa9446441",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441/comments",
##     "author": {
##       "login": "taoky",
##       "id": 2109893,
##       "node_id": "MDQ6VXNlcjIxMDk4OTM=",
##       "avatar_url": "https://avatars.githubusercontent.com/u/2109893?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/taoky",
##       "html_url": "https://github.com/taoky",
##       "followers_url": "https://api.github.com/users/taoky/followers",
##       "following_url": "https://api.github.com/users/taoky/following{/other_user}",
##       "gists_url": "https://api.github.com/users/taoky/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/taoky/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/taoky/subscriptions",
##       "organizations_url": "https://api.github.com/users/taoky/orgs",
##       "repos_url": "https://api.github.com/users/taoky/repos",
##       "events_url": "https://api.github.com/users/taoky/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/taoky/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##         "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3"
##       }
##     ]
##   },
##   {
##     "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##     "node_id": "C_kwDOAE3WVdoAKGRlMWMxMGNhOGE1ZTMzMzEwMmEwMGJmY2IwNmZmOThmNDBjNzc0YzM",
##     "commit": {
##       "author": {
##         "name": "dependabot[bot]",
##         "email": "49699333+dependabot[bot]@users.noreply.github.com",
##         "date": "2023-09-18T09:20:43Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-18T09:20:43Z"
##       },
##       "message": "Bump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##       "tree": {
##         "sha": "a9ae5a8adc5c344000884a4c5876e806265e867f",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/a9ae5a8adc5c344000884a4c5876e806265e867f"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBZrCRBK7hj4Ov3rIwAADRUIAJU/fKComvCurTD2RzT4Ynzr\n2ANEOsvaNZlc5o/OfwInsbh+fLA/aFzCWn7kjdPe34q5C2o0npXw/zENL7WwwqbN\nJu1QpCLNNpqbMW1qQEOwxc6lag9dM3Zf4/DUkD3Is7SDKc0QgUHGM5ZmojHShvY/\nmcVZNVF1FskEncWmD+6WGRWzgyu/lFKNiGkxlYULElRUJRKUSYh7j7Fe+Mj88X4l\nwqqLBRGYAUkTAddXwyGSn4Nn/MJRTzmHw7vnv95N2h0lzYrECTAr7fKcWedcu/qR\n2n192nZC5suwYOKK1QNUI1KXzoWfWV5eROJrkkfVJyami2NcND4917TX4k5dFdk=\n=6tsc\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree a9ae5a8adc5c344000884a4c5876e806265e867f\nparent a5afeea0a63ced3f192c2c93586496a247860931\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028843 +0900\ncommitter GitHub <noreply@github.com> 1695028843 +0900\n\nBump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##     "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3/comments",
##     "author": {
##       "login": "dependabot[bot]",
##       "id": 49699333,
##       "node_id": "MDM6Qm90NDk2OTkzMzM=",
##       "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/dependabot%5Bbot%5D",
##       "html_url": "https://github.com/apps/dependabot",
##       "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers",
##       "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}",
##       "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions",
##       "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs",
##       "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos",
##       "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events",
##       "type": "Bot",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "a5afeea0a63ced3f192c2c93586496a247860931",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931",
##         "html_url": "https://github.com/jqlang/jq/commit/a5afeea0a63ced3f192c2c93586496a247860931"
##       }
##     ]
##   },
##   {
##     "sha": "a5afeea0a63ced3f192c2c93586496a247860931",
##     "node_id": "C_kwDOAE3WVdoAKGE1YWZlZWEwYTYzY2VkM2YxOTJjMmM5MzU4NjQ5NmEyNDc4NjA5MzE",
##     "commit": {
##       "author": {
##         "name": "dependabot[bot]",
##         "email": "49699333+dependabot[bot]@users.noreply.github.com",
##         "date": "2023-09-18T09:20:20Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-18T09:20:20Z"
##       },
##       "message": "Bump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##       "tree": {
##         "sha": "d037b9271768a1668880a8e1d6fcd121793e7121",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/d037b9271768a1668880a8e1d6fcd121793e7121"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/a5afeea0a63ced3f192c2c93586496a247860931",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBZUCRBK7hj4Ov3rIwAATHkIAE96bdd+osR7RIOPKCOXewT1\nhwICtPU7PXZ8KM+Y+72LweDu+gX2/YJwoJUXwPySEki/EtNs7fefJTm2OXmZwyAy\nADdDYu05lz3mTgVosyMBK9iU0K6E+hTYno+WQdZsFWF+OLe+mnfU80kZ65CiK+ks\nWAnJI/7oxxYF4cmEO/ijzVgpczWttP2qmU7P1ieabwTZHFXkk4vd6chxRmbNyEYL\nOtFVX5JRRo7+eXhfxrqpLAi0hi8UBg1uumJRNkOAXn23lwSlK2/vFNpI4Mic4E2k\nLdUVAQ4+PnVCcMUDf6c6KnVdcvqkQ9CZ9FHtv1at7XCt/z7yaetZGum8Ptntflo=\n=1yh2\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree d037b9271768a1668880a8e1d6fcd121793e7121\nparent b0b7614daf4007262562c152b456981707c99d4a\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028820 +0900\ncommitter GitHub <noreply@github.com> 1695028820 +0900\n\nBump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931",
##     "html_url": "https://github.com/jqlang/jq/commit/a5afeea0a63ced3f192c2c93586496a247860931",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931/comments",
##     "author": {
##       "login": "dependabot[bot]",
##       "id": 49699333,
##       "node_id": "MDM6Qm90NDk2OTkzMzM=",
##       "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/dependabot%5Bbot%5D",
##       "html_url": "https://github.com/apps/dependabot",
##       "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers",
##       "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}",
##       "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions",
##       "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs",
##       "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos",
##       "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events",
##       "type": "Bot",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "b0b7614daf4007262562c152b456981707c99d4a",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a",
##         "html_url": "https://github.com/jqlang/jq/commit/b0b7614daf4007262562c152b456981707c99d4a"
##       }
##     ]
##   },
##   {
##     "sha": "b0b7614daf4007262562c152b456981707c99d4a",
##     "node_id": "C_kwDOAE3WVdoAKGIwYjc2MTRkYWY0MDA3MjYyNTYyYzE1MmI0NTY5ODE3MDdjOTlkNGE",
##     "commit": {
##       "author": {
##         "name": "dependabot[bot]",
##         "email": "49699333+dependabot[bot]@users.noreply.github.com",
##         "date": "2023-09-18T09:19:51Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-18T09:19:51Z"
##       },
##       "message": "Bump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##       "tree": {
##         "sha": "0fe6688bc0e8d1922bd8456d5719616976a81db3",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/0fe6688bc0e8d1922bd8456d5719616976a81db3"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/b0b7614daf4007262562c152b456981707c99d4a",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBY3CRBK7hj4Ov3rIwAAxxYIACPnrC4pFboUzCn4SXSQEsam\n3CP9thhIlIc/stSW0hgFoAwAEO6rbQuedCwFzE7R5qphL0zih+JkqBttm9Eu9pF7\n2+mv3KhRM0XqZIv1QZAkc7JjLwUQ61UCX4wIy7hQf325PbqphEn2yXBNi+Uxs4bt\njZu5xNJOmzQKPR9P9HEJ8T0U8N61VyFCji+WP/HHbAhE4sxwCDPojeLJBTDQgIbh\n7RJnEsvB4u3hNsgV17RfTl3E5ziuhG+fPJ1WCfRbtMpDsTqRoeXG3ZdijDy1lCDD\ntRZfKAf1bzDfcHkL7/v/zGru4QUkGiK5fJUJ17uuB8AL3WLdlLOQjT6Xdkbo+CI=\n=KQJ5\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree 0fe6688bc0e8d1922bd8456d5719616976a81db3\nparent d3a356fa1c366a4f80f4abd7434d3bfa746723e7\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028791 +0900\ncommitter GitHub <noreply@github.com> 1695028791 +0900\n\nBump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a",
##     "html_url": "https://github.com/jqlang/jq/commit/b0b7614daf4007262562c152b456981707c99d4a",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a/comments",
##     "author": {
##       "login": "dependabot[bot]",
##       "id": 49699333,
##       "node_id": "MDM6Qm90NDk2OTkzMzM=",
##       "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/dependabot%5Bbot%5D",
##       "html_url": "https://github.com/apps/dependabot",
##       "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers",
##       "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}",
##       "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions",
##       "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs",
##       "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos",
##       "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events",
##       "type": "Bot",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##         "html_url": "https://github.com/jqlang/jq/commit/d3a356fa1c366a4f80f4abd7434d3bfa746723e7"
##       }
##     ]
##   },
##   {
##     "sha": "d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##     "node_id": "C_kwDOAE3WVdoAKGQzYTM1NmZhMWMzNjZhNGY4MGY0YWJkNzQzNGQzYmZhNzQ2NzIzZTc",
##     "commit": {
##       "author": {
##         "name": "Kamontat Chantrachirathumrong",
##         "email": "14089557+kamontat@users.noreply.github.com",
##         "date": "2023-09-17T11:55:56Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-17T11:55:56Z"
##       },
##       "message": "Fix checksum file spacing for shasum command (#2899)",
##       "tree": {
##         "sha": "0f85772c0fa0bc906262ec42cc82933b8fd8bba9",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/0f85772c0fa0bc906262ec42cc82933b8fd8bba9"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlBulMCRBK7hj4Ov3rIwAAFEsIAJWWYhXdgoE5y0npp5ks2tjg\nvFX8aHrtYkmNqw0TYRFXmNC5srfMLXSdT6g9EYnFHDRkRZXOjUm/owgzxP/d6U+0\nZUOAlkrhUkPYSgqNM3kxuiMVlefvV4T90lB6cGGnZj1rYmN/8KPVOaRM5EDkPNsd\nhcZyTCvq7g/HjgmYr8Finy7y1f50qbqRGhQOcDPmJ5qmFdC1AFsBuOQYo38BuPkC\n/91p+ZlfwmmBL+qLoyYHxSHQ4g80kavbyc5GDSnqWOsNS3M8SXIC6V/NmfHpmiZg\nTwDTL2DdTkfMzPRzng1nybE1kkzwD3OxTVpPYjxNHZ3ZZdzQ9cTVxGG8PHHZ5Fk=\n=mX6J\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree 0f85772c0fa0bc906262ec42cc82933b8fd8bba9\nparent 24e6e6ea3989ccd1b83be9e61f2666d016bac330\nauthor Kamontat Chantrachirathumrong <14089557+kamontat@users.noreply.github.com> 1694951756 +0700\ncommitter GitHub <noreply@github.com> 1694951756 +0900\n\nFix checksum file spacing for shasum command (#2899)\n\n"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##     "html_url": "https://github.com/jqlang/jq/commit/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7/comments",
##     "author": {
##       "login": "kamontat",
##       "id": 14089557,
##       "node_id": "MDQ6VXNlcjE0MDg5NTU3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/14089557?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/kamontat",
##       "html_url": "https://github.com/kamontat",
##       "followers_url": "https://api.github.com/users/kamontat/followers",
##       "following_url": "https://api.github.com/users/kamontat/following{/other_user}",
##       "gists_url": "https://api.github.com/users/kamontat/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/kamontat/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/kamontat/subscriptions",
##       "organizations_url": "https://api.github.com/users/kamontat/orgs",
##       "repos_url": "https://api.github.com/users/kamontat/repos",
##       "events_url": "https://api.github.com/users/kamontat/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/kamontat/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "24e6e6ea3989ccd1b83be9e61f2666d016bac330",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/24e6e6ea3989ccd1b83be9e61f2666d016bac330",
##         "html_url": "https://github.com/jqlang/jq/commit/24e6e6ea3989ccd1b83be9e61f2666d016bac330"
##       }
##     ]
##   }
## ]

GitHub returns nicely formatted JSON. For servers that don’t, it can be helpful to pipe the response through jq to pretty-print it. The simplest jq program is the expression “.”, which takes the input and produces it unchanged as output.

curl -s 'https://api.github.com/repos/jqlang/jq/commits?per_page=5' | jq '.'
## [
##   {
##     "sha": "8f81668014f4df2654aa9ab674b5498aa9446441",
##     "node_id": "C_kwDOAE3WVdoAKDhmODE2NjgwMTRmNGRmMjY1NGFhOWFiNjc0YjU0OThhYTk0NDY0NDE",
##     "commit": {
##       "author": {
##         "name": "taoky",
##         "email": "taoky99@outlook.com",
##         "date": "2023-09-22T00:18:41Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-22T00:18:41Z"
##       },
##       "message": "Fix the default colors to use 39, the default foreground color (#2904)",
##       "tree": {
##         "sha": "223b8e8db917ea45390102bfff4c9b34b00e2563",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/223b8e8db917ea45390102bfff4c9b34b00e2563"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/8f81668014f4df2654aa9ab674b5498aa9446441",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlDN1hCRBK7hj4Ov3rIwAAqqwIACweocODkDgM90mr1OFE0LHi\n61jMtGZEUvy/pscOxHlRR99A5Z+1C4c5rvMYt/dnZRVAOoyczTt9i/YGpZ/+7iYM\nOQnCr41EbvsWWN/lpfvcbFPCGP8OLgwdSMb76/JJroT50jWieEBFYJkqaoU884wS\nM9C714Cobo3KkCL4lyveB6obqOiOdufM5pjOPaa9m28UOWEew0HGgHT6eXR+/+cy\nQGbwHiuAYoPOSOWc5zkaWTNWcS5DxSGuNHlZphXG5FdSK3H2kN2bGTyYUEndYzZq\nVOlECUNy9qTmoqq/5Nj+ZWLNWxcpo16SYa8ZYqjjMkbKUhcu792A7bZMdzdoufw=\n=3nf1\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree 223b8e8db917ea45390102bfff4c9b34b00e2563\nparent de1c10ca8a5e333102a00bfcb06ff98f40c774c3\nauthor taoky <taoky99@outlook.com> 1695341921 +0800\ncommitter GitHub <noreply@github.com> 1695341921 +0900\n\nFix the default colors to use 39, the default foreground color (#2904)\n\n"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441",
##     "html_url": "https://github.com/jqlang/jq/commit/8f81668014f4df2654aa9ab674b5498aa9446441",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441/comments",
##     "author": {
##       "login": "taoky",
##       "id": 2109893,
##       "node_id": "MDQ6VXNlcjIxMDk4OTM=",
##       "avatar_url": "https://avatars.githubusercontent.com/u/2109893?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/taoky",
##       "html_url": "https://github.com/taoky",
##       "followers_url": "https://api.github.com/users/taoky/followers",
##       "following_url": "https://api.github.com/users/taoky/following{/other_user}",
##       "gists_url": "https://api.github.com/users/taoky/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/taoky/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/taoky/subscriptions",
##       "organizations_url": "https://api.github.com/users/taoky/orgs",
##       "repos_url": "https://api.github.com/users/taoky/repos",
##       "events_url": "https://api.github.com/users/taoky/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/taoky/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##         "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3"
##       }
##     ]
##   },
##   {
##     "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##     "node_id": "C_kwDOAE3WVdoAKGRlMWMxMGNhOGE1ZTMzMzEwMmEwMGJmY2IwNmZmOThmNDBjNzc0YzM",
##     "commit": {
##       "author": {
##         "name": "dependabot[bot]",
##         "email": "49699333+dependabot[bot]@users.noreply.github.com",
##         "date": "2023-09-18T09:20:43Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-18T09:20:43Z"
##       },
##       "message": "Bump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##       "tree": {
##         "sha": "a9ae5a8adc5c344000884a4c5876e806265e867f",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/a9ae5a8adc5c344000884a4c5876e806265e867f"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBZrCRBK7hj4Ov3rIwAADRUIAJU/fKComvCurTD2RzT4Ynzr\n2ANEOsvaNZlc5o/OfwInsbh+fLA/aFzCWn7kjdPe34q5C2o0npXw/zENL7WwwqbN\nJu1QpCLNNpqbMW1qQEOwxc6lag9dM3Zf4/DUkD3Is7SDKc0QgUHGM5ZmojHShvY/\nmcVZNVF1FskEncWmD+6WGRWzgyu/lFKNiGkxlYULElRUJRKUSYh7j7Fe+Mj88X4l\nwqqLBRGYAUkTAddXwyGSn4Nn/MJRTzmHw7vnv95N2h0lzYrECTAr7fKcWedcu/qR\n2n192nZC5suwYOKK1QNUI1KXzoWfWV5eROJrkkfVJyami2NcND4917TX4k5dFdk=\n=6tsc\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree a9ae5a8adc5c344000884a4c5876e806265e867f\nparent a5afeea0a63ced3f192c2c93586496a247860931\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028843 +0900\ncommitter GitHub <noreply@github.com> 1695028843 +0900\n\nBump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##     "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3/comments",
##     "author": {
##       "login": "dependabot[bot]",
##       "id": 49699333,
##       "node_id": "MDM6Qm90NDk2OTkzMzM=",
##       "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/dependabot%5Bbot%5D",
##       "html_url": "https://github.com/apps/dependabot",
##       "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers",
##       "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}",
##       "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions",
##       "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs",
##       "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos",
##       "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events",
##       "type": "Bot",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "a5afeea0a63ced3f192c2c93586496a247860931",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931",
##         "html_url": "https://github.com/jqlang/jq/commit/a5afeea0a63ced3f192c2c93586496a247860931"
##       }
##     ]
##   },
##   {
##     "sha": "a5afeea0a63ced3f192c2c93586496a247860931",
##     "node_id": "C_kwDOAE3WVdoAKGE1YWZlZWEwYTYzY2VkM2YxOTJjMmM5MzU4NjQ5NmEyNDc4NjA5MzE",
##     "commit": {
##       "author": {
##         "name": "dependabot[bot]",
##         "email": "49699333+dependabot[bot]@users.noreply.github.com",
##         "date": "2023-09-18T09:20:20Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-18T09:20:20Z"
##       },
##       "message": "Bump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##       "tree": {
##         "sha": "d037b9271768a1668880a8e1d6fcd121793e7121",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/d037b9271768a1668880a8e1d6fcd121793e7121"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/a5afeea0a63ced3f192c2c93586496a247860931",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBZUCRBK7hj4Ov3rIwAATHkIAE96bdd+osR7RIOPKCOXewT1\nhwICtPU7PXZ8KM+Y+72LweDu+gX2/YJwoJUXwPySEki/EtNs7fefJTm2OXmZwyAy\nADdDYu05lz3mTgVosyMBK9iU0K6E+hTYno+WQdZsFWF+OLe+mnfU80kZ65CiK+ks\nWAnJI/7oxxYF4cmEO/ijzVgpczWttP2qmU7P1ieabwTZHFXkk4vd6chxRmbNyEYL\nOtFVX5JRRo7+eXhfxrqpLAi0hi8UBg1uumJRNkOAXn23lwSlK2/vFNpI4Mic4E2k\nLdUVAQ4+PnVCcMUDf6c6KnVdcvqkQ9CZ9FHtv1at7XCt/z7yaetZGum8Ptntflo=\n=1yh2\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree d037b9271768a1668880a8e1d6fcd121793e7121\nparent b0b7614daf4007262562c152b456981707c99d4a\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028820 +0900\ncommitter GitHub <noreply@github.com> 1695028820 +0900\n\nBump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931",
##     "html_url": "https://github.com/jqlang/jq/commit/a5afeea0a63ced3f192c2c93586496a247860931",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931/comments",
##     "author": {
##       "login": "dependabot[bot]",
##       "id": 49699333,
##       "node_id": "MDM6Qm90NDk2OTkzMzM=",
##       "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/dependabot%5Bbot%5D",
##       "html_url": "https://github.com/apps/dependabot",
##       "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers",
##       "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}",
##       "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions",
##       "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs",
##       "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos",
##       "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events",
##       "type": "Bot",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "b0b7614daf4007262562c152b456981707c99d4a",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a",
##         "html_url": "https://github.com/jqlang/jq/commit/b0b7614daf4007262562c152b456981707c99d4a"
##       }
##     ]
##   },
##   {
##     "sha": "b0b7614daf4007262562c152b456981707c99d4a",
##     "node_id": "C_kwDOAE3WVdoAKGIwYjc2MTRkYWY0MDA3MjYyNTYyYzE1MmI0NTY5ODE3MDdjOTlkNGE",
##     "commit": {
##       "author": {
##         "name": "dependabot[bot]",
##         "email": "49699333+dependabot[bot]@users.noreply.github.com",
##         "date": "2023-09-18T09:19:51Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-18T09:19:51Z"
##       },
##       "message": "Bump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##       "tree": {
##         "sha": "0fe6688bc0e8d1922bd8456d5719616976a81db3",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/0fe6688bc0e8d1922bd8456d5719616976a81db3"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/b0b7614daf4007262562c152b456981707c99d4a",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBY3CRBK7hj4Ov3rIwAAxxYIACPnrC4pFboUzCn4SXSQEsam\n3CP9thhIlIc/stSW0hgFoAwAEO6rbQuedCwFzE7R5qphL0zih+JkqBttm9Eu9pF7\n2+mv3KhRM0XqZIv1QZAkc7JjLwUQ61UCX4wIy7hQf325PbqphEn2yXBNi+Uxs4bt\njZu5xNJOmzQKPR9P9HEJ8T0U8N61VyFCji+WP/HHbAhE4sxwCDPojeLJBTDQgIbh\n7RJnEsvB4u3hNsgV17RfTl3E5ziuhG+fPJ1WCfRbtMpDsTqRoeXG3ZdijDy1lCDD\ntRZfKAf1bzDfcHkL7/v/zGru4QUkGiK5fJUJ17uuB8AL3WLdlLOQjT6Xdkbo+CI=\n=KQJ5\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree 0fe6688bc0e8d1922bd8456d5719616976a81db3\nparent d3a356fa1c366a4f80f4abd7434d3bfa746723e7\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028791 +0900\ncommitter GitHub <noreply@github.com> 1695028791 +0900\n\nBump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a",
##     "html_url": "https://github.com/jqlang/jq/commit/b0b7614daf4007262562c152b456981707c99d4a",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a/comments",
##     "author": {
##       "login": "dependabot[bot]",
##       "id": 49699333,
##       "node_id": "MDM6Qm90NDk2OTkzMzM=",
##       "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/dependabot%5Bbot%5D",
##       "html_url": "https://github.com/apps/dependabot",
##       "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers",
##       "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}",
##       "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions",
##       "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs",
##       "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos",
##       "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events",
##       "type": "Bot",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##         "html_url": "https://github.com/jqlang/jq/commit/d3a356fa1c366a4f80f4abd7434d3bfa746723e7"
##       }
##     ]
##   },
##   {
##     "sha": "d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##     "node_id": "C_kwDOAE3WVdoAKGQzYTM1NmZhMWMzNjZhNGY4MGY0YWJkNzQzNGQzYmZhNzQ2NzIzZTc",
##     "commit": {
##       "author": {
##         "name": "Kamontat Chantrachirathumrong",
##         "email": "14089557+kamontat@users.noreply.github.com",
##         "date": "2023-09-17T11:55:56Z"
##       },
##       "committer": {
##         "name": "GitHub",
##         "email": "noreply@github.com",
##         "date": "2023-09-17T11:55:56Z"
##       },
##       "message": "Fix checksum file spacing for shasum command (#2899)",
##       "tree": {
##         "sha": "0f85772c0fa0bc906262ec42cc82933b8fd8bba9",
##         "url": "https://api.github.com/repos/jqlang/jq/git/trees/0f85772c0fa0bc906262ec42cc82933b8fd8bba9"
##       },
##       "url": "https://api.github.com/repos/jqlang/jq/git/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##       "comment_count": 0,
##       "verification": {
##         "verified": true,
##         "reason": "valid",
##         "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlBulMCRBK7hj4Ov3rIwAAFEsIAJWWYhXdgoE5y0npp5ks2tjg\nvFX8aHrtYkmNqw0TYRFXmNC5srfMLXSdT6g9EYnFHDRkRZXOjUm/owgzxP/d6U+0\nZUOAlkrhUkPYSgqNM3kxuiMVlefvV4T90lB6cGGnZj1rYmN/8KPVOaRM5EDkPNsd\nhcZyTCvq7g/HjgmYr8Finy7y1f50qbqRGhQOcDPmJ5qmFdC1AFsBuOQYo38BuPkC\n/91p+ZlfwmmBL+qLoyYHxSHQ4g80kavbyc5GDSnqWOsNS3M8SXIC6V/NmfHpmiZg\nTwDTL2DdTkfMzPRzng1nybE1kkzwD3OxTVpPYjxNHZ3ZZdzQ9cTVxGG8PHHZ5Fk=\n=mX6J\n-----END PGP SIGNATURE-----\n",
##         "payload": "tree 0f85772c0fa0bc906262ec42cc82933b8fd8bba9\nparent 24e6e6ea3989ccd1b83be9e61f2666d016bac330\nauthor Kamontat Chantrachirathumrong <14089557+kamontat@users.noreply.github.com> 1694951756 +0700\ncommitter GitHub <noreply@github.com> 1694951756 +0900\n\nFix checksum file spacing for shasum command (#2899)\n\n"
##       }
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##     "html_url": "https://github.com/jqlang/jq/commit/d3a356fa1c366a4f80f4abd7434d3bfa746723e7",
##     "comments_url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7/comments",
##     "author": {
##       "login": "kamontat",
##       "id": 14089557,
##       "node_id": "MDQ6VXNlcjE0MDg5NTU3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/14089557?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/kamontat",
##       "html_url": "https://github.com/kamontat",
##       "followers_url": "https://api.github.com/users/kamontat/followers",
##       "following_url": "https://api.github.com/users/kamontat/following{/other_user}",
##       "gists_url": "https://api.github.com/users/kamontat/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/kamontat/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/kamontat/subscriptions",
##       "organizations_url": "https://api.github.com/users/kamontat/orgs",
##       "repos_url": "https://api.github.com/users/kamontat/repos",
##       "events_url": "https://api.github.com/users/kamontat/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/kamontat/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "committer": {
##       "login": "web-flow",
##       "id": 19864447,
##       "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##       "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##       "gravatar_id": "",
##       "url": "https://api.github.com/users/web-flow",
##       "html_url": "https://github.com/web-flow",
##       "followers_url": "https://api.github.com/users/web-flow/followers",
##       "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##       "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##       "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##       "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##       "organizations_url": "https://api.github.com/users/web-flow/orgs",
##       "repos_url": "https://api.github.com/users/web-flow/repos",
##       "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##       "received_events_url": "https://api.github.com/users/web-flow/received_events",
##       "type": "User",
##       "site_admin": false
##     },
##     "parents": [
##       {
##         "sha": "24e6e6ea3989ccd1b83be9e61f2666d016bac330",
##         "url": "https://api.github.com/repos/jqlang/jq/commits/24e6e6ea3989ccd1b83be9e61f2666d016bac330",
##         "html_url": "https://github.com/jqlang/jq/commit/24e6e6ea3989ccd1b83be9e61f2666d016bac330"
##       }
##     ]
##   }
## ]

We can use jq to extract just the first commit.

curl -s 'https://api.github.com/repos/jqlang/jq/commits?per_page=5' | jq '.[0]'
## {
##   "sha": "8f81668014f4df2654aa9ab674b5498aa9446441",
##   "node_id": "C_kwDOAE3WVdoAKDhmODE2NjgwMTRmNGRmMjY1NGFhOWFiNjc0YjU0OThhYTk0NDY0NDE",
##   "commit": {
##     "author": {
##       "name": "taoky",
##       "email": "taoky99@outlook.com",
##       "date": "2023-09-22T00:18:41Z"
##     },
##     "committer": {
##       "name": "GitHub",
##       "email": "noreply@github.com",
##       "date": "2023-09-22T00:18:41Z"
##     },
##     "message": "Fix the default colors to use 39, the default foreground color (#2904)",
##     "tree": {
##       "sha": "223b8e8db917ea45390102bfff4c9b34b00e2563",
##       "url": "https://api.github.com/repos/jqlang/jq/git/trees/223b8e8db917ea45390102bfff4c9b34b00e2563"
##     },
##     "url": "https://api.github.com/repos/jqlang/jq/git/commits/8f81668014f4df2654aa9ab674b5498aa9446441",
##     "comment_count": 0,
##     "verification": {
##       "verified": true,
##       "reason": "valid",
##       "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlDN1hCRBK7hj4Ov3rIwAAqqwIACweocODkDgM90mr1OFE0LHi\n61jMtGZEUvy/pscOxHlRR99A5Z+1C4c5rvMYt/dnZRVAOoyczTt9i/YGpZ/+7iYM\nOQnCr41EbvsWWN/lpfvcbFPCGP8OLgwdSMb76/JJroT50jWieEBFYJkqaoU884wS\nM9C714Cobo3KkCL4lyveB6obqOiOdufM5pjOPaa9m28UOWEew0HGgHT6eXR+/+cy\nQGbwHiuAYoPOSOWc5zkaWTNWcS5DxSGuNHlZphXG5FdSK3H2kN2bGTyYUEndYzZq\nVOlECUNy9qTmoqq/5Nj+ZWLNWxcpo16SYa8ZYqjjMkbKUhcu792A7bZMdzdoufw=\n=3nf1\n-----END PGP SIGNATURE-----\n",
##       "payload": "tree 223b8e8db917ea45390102bfff4c9b34b00e2563\nparent de1c10ca8a5e333102a00bfcb06ff98f40c774c3\nauthor taoky <taoky99@outlook.com> 1695341921 +0800\ncommitter GitHub <noreply@github.com> 1695341921 +0900\n\nFix the default colors to use 39, the default foreground color (#2904)\n\n"
##     }
##   },
##   "url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441",
##   "html_url": "https://github.com/jqlang/jq/commit/8f81668014f4df2654aa9ab674b5498aa9446441",
##   "comments_url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441/comments",
##   "author": {
##     "login": "taoky",
##     "id": 2109893,
##     "node_id": "MDQ6VXNlcjIxMDk4OTM=",
##     "avatar_url": "https://avatars.githubusercontent.com/u/2109893?v=4",
##     "gravatar_id": "",
##     "url": "https://api.github.com/users/taoky",
##     "html_url": "https://github.com/taoky",
##     "followers_url": "https://api.github.com/users/taoky/followers",
##     "following_url": "https://api.github.com/users/taoky/following{/other_user}",
##     "gists_url": "https://api.github.com/users/taoky/gists{/gist_id}",
##     "starred_url": "https://api.github.com/users/taoky/starred{/owner}{/repo}",
##     "subscriptions_url": "https://api.github.com/users/taoky/subscriptions",
##     "organizations_url": "https://api.github.com/users/taoky/orgs",
##     "repos_url": "https://api.github.com/users/taoky/repos",
##     "events_url": "https://api.github.com/users/taoky/events{/privacy}",
##     "received_events_url": "https://api.github.com/users/taoky/received_events",
##     "type": "User",
##     "site_admin": false
##   },
##   "committer": {
##     "login": "web-flow",
##     "id": 19864447,
##     "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
##     "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
##     "gravatar_id": "",
##     "url": "https://api.github.com/users/web-flow",
##     "html_url": "https://github.com/web-flow",
##     "followers_url": "https://api.github.com/users/web-flow/followers",
##     "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
##     "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
##     "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
##     "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
##     "organizations_url": "https://api.github.com/users/web-flow/orgs",
##     "repos_url": "https://api.github.com/users/web-flow/repos",
##     "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
##     "received_events_url": "https://api.github.com/users/web-flow/received_events",
##     "type": "User",
##     "site_admin": false
##   },
##   "parents": [
##     {
##       "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##       "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3",
##       "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3"
##     }
##   ]
## }

There’s a lot of info we don’t care about there, so we’ll restrict it down to the most interesting fields.

curl -s 'https://api.github.com/repos/jqlang/jq/commits?per_page=5' | jq '.[0] | {message: .commit.message, name: .commit.committer.name}'
## {
##   "message": "Fix the default colors to use 39, the default foreground color (#2904)",
##   "name": "GitHub"
## }

The | operator in jq feeds the output of one filter (.[0] which gets the first element of the array in the response) into the input of another ({…} which builds an object out of those fields). You can access nested attributes, such as .commit.message.

Now let’s get the rest of the commits (not only the first one).

curl -s 'https://api.github.com/repos/jqlang/jq/commits?per_page=5' | jq '.[] | {message: .commit.message, name: .commit.committer.name}'
## {
##   "message": "Fix the default colors to use 39, the default foreground color (#2904)",
##   "name": "GitHub"
## }
## {
##   "message": "Bump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##   "name": "GitHub"
## }
## {
##   "message": "Bump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##   "name": "GitHub"
## }
## {
##   "message": "Bump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n  dependency-type: direct:production\r\n  update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
##   "name": "GitHub"
## }
## {
##   "message": "Fix checksum file spacing for shasum command (#2899)",
##   "name": "GitHub"
## }

.[] returns each element of the array returned in the response, one at a time, which are all fed into {message: .commit.message, name: .commit.committer.name}.

Data in jq is represented as streams of JSON values - every jq expression runs for each value in its input stream, and can produce any number of values to its output stream.