API and integrations
Use the zl command line
I want to …
… read and change this workspace's tasks from a terminal or a script with the zl command.
Before you start
- You need Node.js 22 or newer and an API key of this workspace, see "Create and revoke API keys".
- The key's permissions decide what
zlmay do.Read onlyreads.Read and writealso changes tasks and fills in testing.Full accessalso deletes. - API keys need the Ultra plan of the
OwnerorAdminwho creates them, and they are in beta.
Here's how
- Install it with
npm install -g zeitlicht-cli, or run a single command withnpx zeitlicht-cli. - Save the key in a file, run
zl auth login < key.txt, then delete the file.zlchecks the key and keeps it in your system's keychain, or where there is none, in a file only you can read. In CI, set the environment variableZEITLICHT_API_KEYinstead. zl auth statusshows the key's name, workspace, permissions, and end date.zlonly ever shows the start of the key.zl boardslists the boards with their IDs, andzl boardfollowed by a board ID lists its columns.zl members,zl tags, andzl topicslist people, tags, and topics. With a key for selected boards,zl membersshows no email addresses.zl tasks --assignee me --openlists your open tasks. Filter with--board,--column,--tester,--done,--since, and--query.--allloads every page.zl task show 3f2a9c1eshows one task, named by its short ID, its ID, or its link.- Create a task with
zl task create --title "Check the login" --board BOARD_IDand, if you like,--description-file notes.md,--assignee me,--tag TAG_ID,--due 2026-12-24, or--priority high. Change it withzl task update, move it withzl task move 3f2a9c1e --column COLUMN_ID, and delete it withzl task delete 3f2a9c1e --yes. - Hand a task to testing with
zl test request 3f2a9c1e --instructions-file TESTING.md --tester mia@example.com --move-to COLUMN_ID.zl test status 3f2a9c1eshows testers, verdicts, and bugs. - There is more:
zl comment add,zl checklist add,zl checklist check,zl bug report,zl bug status,zl link add, andzl attachfor files of up to 10 MiB. As in the app, Zeitlicht takes the file type from the extension; blocked types such as.exeor.svgcannot be attached.zl task id-fromreads a branch name or pull request title and prints the task ID in it.zl --helplists every command. - Add
--jsonto any command for output a script can read. zl auth logoutforgets the stored key.
The result
zl reads and changes the tasks on the boards the key allows, as you. Every request shows up in the key's access log.
Common questions
Which exit codes does zl use?
0 done, 1 refused by the API, 2 wrong usage, 3 no key or the key was refused, 4 no connection. The error line names the reason, such as key-expired.
Can a script safely retry zl task create?
Yes. Add --idempotency-key with a value of your own, such as your CI run ID (up to 200 letters, digits, or _.:-). If the same command with the same key runs again within 24 hours, Zeitlicht returns the first task instead of creating a second one. While the first request still runs, a repeat gets 409 (idempotency-in-progress), for at most 60 seconds. The same key with different details gets 422.
Can zl talk to a test setup?
Yes. ZEITLICHT_API_URL points zl at another address. Plain HTTP works only for your own computer (localhost).
Where exactly is my key?
In the keychain of macOS, Windows, or Linux. Without one, in ~/.config/zeitlicht/credentials.json, which only you can read. zl warns when others could read that file. ZL_NO_KEYRING=1 skips the keychain.