--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 accountwrong to right:
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.--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:
doctorwith a failed check:dataholds the whole report,error.codeischecks_failedand the exit status is 3.completionsormanpagewith--json:commandisgenerate,datais{},error.codeisoutput_is_not_a_reportand the exit status is 2.
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
Thedata 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
Thedata 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.