Skip to main content
With --json, every command prints one line of JSON on standard output: an envelope with the same six fields, whether it succeeds or fails.

The envelope

This command renames the account wrong to right:
It prints this on one line:
integer
required
The version of the envelope, 1. It goes up only when a field changes shape. Adding a field or a code, such as an error code, is not a breaking change; renaming or removing one is.
string | null
required
The command that ran, such as rename. The three schedule commands give schedule, and completions and manpage give generate. null when pitboard could not parse the command line.
boolean
required
true when the command succeeded and its exit status is 0. For the other statuses, see Exit codes.
object | null
required
What the command found or did, as listed in Data by command. null when the command failed, except for doctor and generate.
object[]
required
One object per warning, with code and message, or an empty array. A failed command still lists the warnings it gathered before it failed. For the codes, see Warning codes.
object | null
required
Set when ok is false, and null otherwise.
If pitboard cannot parse a command line that contains --json, command and data are null, error.code is usage and the exit status is 2. A label refused after parsing also gives usage and exit status 2, but command is set: pitboard enroll codx/work --json gives enroll. In two cases, data is set although the command failed, and error has no cause field:
  • doctor with a failed check: data holds the whole report, error.code is checks_failed and the exit status is 3.
  • completions or manpage with --json: command is generate, data is {}, error.code is output_is_not_a_report and the exit status is 2.
Times are Unix times in seconds, such as 1790474400, except at in log entries, a local time such as 2026-09-22T01:01:00+07:00. The JSON of status, enroll, forget and rename holds email addresses, as does the message of errors such as label_taken. The JSON of status also holds account ids, and that of repair holds parked login names, which contain account ids. Only doctor --json hides such values, with placeholders such as <email 1a2b3c4d>.

Data by command

The data of each command, in the order of pitboard --help: adoption says how sessions already running pick up a switch. For Claude Code it is {"follows":"polling","within_seconds":33}, and adoption_ceiling_seconds is 33. For Codex it is {"follows":"restart","program":"codex"}, and adoption_ceiling_seconds is null.

Status data

The data of pitboard status has four fields: For Codex, the account in use is the object in accounts with provider set to codex and signed_in set to true. Each object in accounts has these fields: In usage, source is live when pitboard asked the service this time. It is claude_code_cache for a reading copied from Claude Code’s own cache, and remembered for the last reading pitboard took itself. Each object in windows is one limit:

Stale codes

stale says why a reading is not live. pitboard status prints the Text column under the account, after its usage. Codes marked None print nothing. For a Codex account, the text says Codex, OpenAI and codex where the table says Claude Code, Anthropic and claude.