CLI command reference¶
Auto-generated from zero ... --help. For agent workflows and MCP usage, see
MCP connector docs and
SKILL.md.
zero¶
Usage: zero [OPTIONS] COMMAND [ARGS]...
Zero Hiring — AI-powered candidate screening.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --version -v Show version and exit. │
│ --quiet Suppress spinners and progress output. │
│ --json Emit machine-readable JSON on stdout. Human prose (progress, prompts, banners) is routed to stderr. Errors become {"error": {"code": ..., "message": ...}} on stdout │
│ with non-zero exit. │
│ --envelope Wrap --json output as {"schema_version": "1", "data": ...}. Off by default for backward compat with consumers that expect bare arrays/objects. │
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ login Log in or sign up. Uses device code flow by default. │
│ whoami Show current login status. │
│ logout Log out: revoke the CLI token server-side, then remove local credentials. │
│ update Download the latest standalone CLI binary into ~/.zerohiring/bin/zero. │
│ account Account-wide activity. │
│ audit-log Customer-visible audit log (security, access, hiring events). │
│ ats ATS candidate phone-review workflow. │
│ hire Open a new role. │
│ status Check your jobs and pipeline. │
│ candidates View candidates for a job. │
│ invite Invite candidates for AI interviews. │
│ results View interview results. │
│ offers Inspect and manage offer letters. │
│ close Legacy alias for sending a candidate offer; charge a hire's close fee. │
│ team Manage team members. │
│ demo Demo mode — simulate the hiring pipeline. │
│ jobs List and switch between jobs. │
│ billing View billing and spend. │
│ clients Manage RPO clients. │
│ reviewers Manage client-scoped reviewers (Hiring Managers). │
│ integrations ATS connection status, sync, write-back and job selection. │
│ outreach Multi-step candidate outreach sequences. │
│ sourcing Search sourced candidates and add them to jobs. │
│ pipeline Run and inspect end-to-end hiring pipeline runs. │
│ payments Refund charges (approval-gated). │
│ interviews Schedule and manage human (hiring-manager) interviews. │
│ hiring-flow Configure the hiring pipeline stages (stage plan) for a role. │
│ references Request references from a candidate and see how many have responded. │
│ changelog See what's new on the platform. │
│ help Show CLI help, or search/read Help Center articles. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account¶
Usage: zero account [OPTIONS] COMMAND [ARGS]...
Account-wide activity.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ timeline Show everything that happened on this account, in order. │
│ export Export the signed-in user's own account data (right of access). │
│ rejection-reasons The standardized rejection-reason vocabulary recruiters pick from. │
│ sender-domain This employer's own candidate-email sending domain. │
│ reporting Analytics sections: roles, funnel, stages, timing, interviews, rejections. `ai-overrides` reports how often reviewers' decisions differed from the AI recommendation. │
│ calendars Calendars connected for interview scheduling. │
│ mailboxes Mailboxes connected for sending candidate outreach. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account calendars¶
Usage: zero account calendars [OPTIONS] COMMAND [ARGS]...
Calendars connected for interview scheduling.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List the calendars connected for interview scheduling, and their status. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account calendars list¶
Usage: zero account calendars list [OPTIONS]
List the calendars connected for interview scheduling, and their status.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account export¶
Usage: zero account export [OPTIONS]
Export the signed-in user's own account data (right of access).
Returns your own profile, the organizations you own or belong to, and
(if this login is also a candidate profile) that candidate record.
Scoped to the caller only; it cannot export a colleague's account.
Every export is recorded in the security audit log.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account mailboxes¶
Usage: zero account mailboxes [OPTIONS] COMMAND [ARGS]...
Mailboxes connected for sending candidate outreach.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List connected sending mailboxes: status, daily cap and last-7-day activity. │
│ routing-impact Preview what connecting one more mailbox at this scope would change. │
│ test-send Send one real test email from a connected mailbox. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account mailboxes list¶
Usage: zero account mailboxes list [OPTIONS]
List connected sending mailboxes: status, daily cap and last-7-day activity.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account mailboxes routing-impact¶
Usage: zero account mailboxes routing-impact [OPTIONS]
Preview what connecting one more mailbox at this scope would change.
Read-only. Reports how many active roles would start sending from it and
the daily send capacity before vs after, so the operator is told before
connecting that it reroutes outreach rather than just adding capacity.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --client <str> Client UUID the new mailbox would serve. Omit for an agency-level mailbox. │
│ --cap <int range> [1<=x<=400] Daily send cap the new mailbox would carry (default 100). │
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account mailboxes test-send¶
Usage: zero account mailboxes test-send [OPTIONS] {connection_id}
Send one real test email from a connected mailbox.
The email goes out immediately from the connected address and cannot be
unsent. Use it to check a newly connected mailbox delivers; address it
to yourself or a teammate. Requires `--yes` after explicit human
approval in this turn; never invent it.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * connection_id <str> Mailbox connection UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --to <str> Recipient address for the test email. [required] │
│ * --subject <str> Subject line (max 255 chars). [required] │
│ * --body <str> Plain-text body. [required] │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account rejection-reasons¶
Usage: zero account rejection-reasons [OPTIONS] COMMAND [ARGS]...
The standardized rejection-reason vocabulary recruiters pick from.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show the employer's rejection-reason vocabulary (what `candidates reject` picks from). │
│ stats Rejection counts per reason over the last 90 days. │
│ set Replace the employer's rejection-reason vocabulary. Owner only (the backend 403s otherwise). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account rejection-reasons set¶
Usage: zero account rejection-reasons set [OPTIONS]
Replace the employer's rejection-reason vocabulary. Owner only (the backend 403s otherwise).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --reasons-json <str> Full replacement list as JSON: '[{"id":"not-a-fit","label":"Not a fit","active":true}, ...]'. This replaces the whole vocabulary; keep an existing reason's id to │
│ rename it in place, or set active:false to retire it without losing historic labels. │
│ [required] │
│ --employer-id <str> Employer UUID (system-key credentials only; auto-scoped otherwise). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account rejection-reasons show¶
Usage: zero account rejection-reasons show [OPTIONS]
Show the employer's rejection-reason vocabulary (what `candidates reject` picks from).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (system-key credentials only; auto-scoped otherwise). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account rejection-reasons stats¶
Usage: zero account rejection-reasons stats [OPTIONS]
Rejection counts per reason over the last 90 days.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (system-key credentials only; auto-scoped otherwise). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account reporting¶
Usage: zero account reporting [OPTIONS] COMMAND [ARGS]...
Analytics sections: roles, funnel, stages, timing, interviews, rejections. `ai-overrides` reports how often reviewers' decisions differed from the AI recommendation.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Read one reporting section: counts, rates (each with its numerator/denominator), and rows. │
│ ai-overrides How often reviewers' decisions differed from the AI recommendation. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account reporting ai-overrides¶
Usage: zero account reporting ai-overrides [OPTIONS]
How often reviewers' decisions differed from the AI recommendation.
Override rate per job, per reviewer and per pipeline stage, each carrying
the sample count (n) it was taken from, plus a flag on a reviewer who
almost never overrides over a meaningful sample -- a sign they may be
deferring to the AI rather than judging. Rates and counts only: no raw
AI score is ever returned. Same access rule as `reporting show`
(another employer's report is a 403, reviewers are denied).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --job-id <str> Scope to one job. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account reporting show¶
Usage: zero account reporting show [OPTIONS] {section}
Read one reporting section: counts, rates (each with its numerator/denominator), and rows.
Scoped to the caller's employer. Every rate carries its own numerator
and denominator rather than a bare percentage.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * section <str> One of: roles, funnel, stages, timing, interviews, rejections. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --client-id <str> Scope to one RPO client. │
│ --job-id <str> Scope to one job. │
│ --location-region <str> │
│ --recruiter-user-id <str> │
│ --date-from <str> ISO date/datetime, window start. │
│ --date-to <str> ISO date/datetime, window end. │
│ --compare <str> Pass 'previous' to also return the immediately preceding window of equal length (requires both --date-from and --date-to). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account sender-domain¶
Usage: zero account sender-domain [OPTIONS] COMMAND [ARGS]...
This employer's own candidate-email sending domain.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show this employer's own sending-domain state (not an RPO client's -- see `clients sender-domain`). │
│ set Provision (or reuse) this employer's sending domain for the given from-address. │
│ verify Validate the published DNS records and set `verified` from the result. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account sender-domain set¶
Usage: zero account sender-domain set [OPTIONS]
Provision (or reuse) this employer's sending domain for the given from-address.
Returns the DNS records to publish before `verify` will pass; nothing is
sent to candidates by this call itself.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> The from-address candidate email this employer should send as [required] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account sender-domain show¶
Usage: zero account sender-domain show [OPTIONS]
Show this employer's own sending-domain state (not an RPO client's -- see `clients sender-domain`).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account sender-domain verify¶
Usage: zero account sender-domain verify [OPTIONS]
Validate the published DNS records and set `verified` from the result.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
account timeline¶
Usage: zero account timeline [OPTIONS]
Show everything that happened on this account, in order.
Merges job creation, stage changes, notes, interviews, scores, feedback,
ATS sync, AI decisions, email outreach, and team member changes across
every job on the account into one reverse-chronological feed -- "what
has happened on this account". Use `jobs timeline <job_id>` instead when
the question is scoped to a single role, or `candidates timeline
<applicant_id>` when it's scoped to one person.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID. Only needed for a system-key credential with no default employer (auto-scoped for a normal per-user CLI token). │
│ --page <int> Page number (1-based). [default: 1] │
│ --limit <int> Results per page. [default: 20] │
│ --since <str> Only events on or after this ISO-8601 datetime (or a date like 2026-09-01). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ats¶
Usage: zero ats [OPTIONS] COMMAND [ARGS]...
ATS candidate phone-review workflow.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ phone-review Candidates whose phone number needs a recruiter's review before an AI phone interview. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ats phone-review¶
Usage: zero ats phone-review [OPTIONS] COMMAND [ARGS]...
Candidates whose phone number needs a recruiter's review before an AI phone interview.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List ATS candidates flagged for phone-number review. │
│ update-phone Correct a flagged candidate's phone number. │
│ resume-interview Resume the AI phone interview for a candidate whose phone number was just corrected. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ats phone-review list¶
Usage: zero ats phone-review list [OPTIONS]
List ATS candidates flagged for phone-number review.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ats phone-review resume-interview¶
Usage: zero ats phone-review resume-interview [OPTIONS] {ats_candidate_id}
Resume the AI phone interview for a candidate whose phone number was just corrected.
Idempotent: if an active phone-call interview already exists for this
candidate's most recent application, this re-sends the invite rather
than creating a duplicate. Requires a valid, non-blocked phone number on
file -- fix it first with `phone-review update-phone` if this errors.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * ats_candidate_id <str> The ATS candidate id (from `phone-review list`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ats phone-review update-phone¶
Usage: zero ats phone-review update-phone [OPTIONS] {ats_candidate_id}
Correct a flagged candidate's phone number.
This only saves the number; it does not restart the AI phone interview --
run `phone-review resume-interview` afterward for that.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * ats_candidate_id <str> The ATS candidate id (from `phone-review list`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --phone <str> Corrected phone number (normalized to E.164 on save) [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
audit-log¶
Usage: zero audit-log [OPTIONS] COMMAND [ARGS]...
Customer-visible audit log (security, access, hiring events).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List the employer's audit log: security, candidate-data access, and │
│ hiring-timeline events, newest first. │
│ export Export the audit log as CSV, same filters as `audit-log list`. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
audit-log export¶
Usage: zero audit-log export [OPTIONS]
Export the audit log as CSV, same filters as `audit-log list`.
Admin and account manager only. Every export is itself recorded as a
security event (`audit_log.exported`) on the account it was pulled
from. Writes raw CSV to stdout by default so it's pipeable; pass
--output FILE to write it to disk instead.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --category <str> Filter by category: security | access | hiring. │
│ --actor-user-id <str> Only events performed by this user. │
│ --since <str> Only events on or after this ISO-8601 datetime. │
│ --until <str> Only events on or before this ISO-8601 datetime. │
│ --output -o <str> Write the CSV to this file instead of stdout. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
audit-log list¶
Usage: zero audit-log list [OPTIONS]
List the employer's audit log: security, candidate-data access, and hiring-timeline events, newest first.
Admin and account manager only -- the backend 403s any other role.
Paginated with a keyset `cursor` rather than a page number: pass the
previous call's `next_cursor` to continue; a missing/null `next_cursor`
means there is nothing further back. Use `audit-log export` for the
same filters as a CSV file.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --category <str> Filter by category: security | access | hiring. │
│ --actor-user-id <str> Only events performed by this user. │
│ --since <str> Only events on or after this ISO-8601 datetime. │
│ --until <str> Only events on or before this ISO-8601 datetime. │
│ --cursor <str> Keyset page cursor from a previous call's `next_cursor`. │
│ --limit <int> Results per page. [default: 50] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing¶
Usage: zero billing [OPTIONS] COMMAND [ARGS]...
View billing and spend.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ docs Print local billing command and spend-safety notes. │
│ show One-screen view of spend across all your jobs. │
│ costs Line-itemized per-tenant vendor cost sheet for one calendar month. │
│ usage Plan plus this month's usage: sourced profiles and interview minutes. │
│ invoices The employer's monthly invoices, newest first (last 24). │
│ sourcing-usage This month's sourced-profile usage against the plan cap. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing costs¶
Usage: zero billing costs [OPTIONS]
Line-itemized per-tenant vendor cost sheet for one calendar month.
Joins sourcing usage, interview vendor costs, an agent-inference cost
placeholder, and payment charges into one call (ZER-668) -- no manual
joining of separate usage/billing endpoints required.
This hits an admin-only endpoint gated by the shared backend system key,
not a regular per-employer `zero login` token: it can read any tenant's
spend, not just the caller's own employer. Configure
ZEROHIRING_API_KEY to the system key when running this as an internal
tool. Cost lines with no configured $ rate (sourcing, agent inference)
come back as `cost_usd: null` with an explanatory note rather than being
silently omitted -- see `cost_note` / `note` fields in --json output.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected if not passed) │
│ * --month <str> Calendar month to report on, YYYY-MM (e.g. 2026-06) [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing docs¶
Usage: zero billing docs [OPTIONS]
Print local billing command and spend-safety notes.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing invoices¶
Usage: zero billing invoices [OPTIONS]
The employer's monthly invoices, newest first (last 24).
Read-only. Empty for card-billed accounts -- those are charged per
role-open/close event (see `billing show`), not invoiced monthly.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing show¶
Usage: zero billing show [OPTIONS]
One-screen view of spend across all your jobs.
Shows charged open/close fees per job plus employer totals, pulled from
the `job_payments` ledger. Also shows each job's budgeted compensation
when the backend returns it (ZER-3277) -- the basis for its open fee
(3% x budgeted compensation x positions). If the employer hasn't paid
anything yet, the backend returns `source=estimate` and we print a
banner so the user isn't misled into thinking we have real billing
data.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing sourcing-usage¶
Usage: zero billing sourcing-usage [OPTIONS]
This month's sourced-profile usage against the plan cap.
Read-only. Shows used / quota / remaining for the current calendar
month plus a per-channel breakdown of search calls and billed matches.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
billing usage¶
Usage: zero billing usage [OPTIONS]
Plan plus this month's usage: sourced profiles and interview minutes.
Read-only. Use it to answer "how much of our plan have we used this
month?" before a large sourcing run or a batch of AI interviews.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates¶
Usage: zero candidates [OPTIONS] COMMAND [ARGS]...
View candidates for a job.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List all candidates for a job with scores and rankings. │
│ search Search ALL of the employer's candidates across every job and integration. │
│ count How many candidates in the database match exact criteria. │
│ filter List the candidates matching exact criteria (same filters as `count`). │
│ export-csv Generate a downloadable file of the candidates matching exact │
│ criteria (same filters as `count`/`filter`) -- built server-side from │
│ the query, not from paging `filter` rows into context and re-typing │
│ them into a file by hand. │
│ detail Show detailed info for a specific candidate, including full parsed │
│ resume (contact, experience, education, skills, languages, certs) and │
│ the excerpts that explain the candidate's ranking. │
│ reject Reject a candidate. │
│ unreject Undo a rejection. │
│ text Send one text message to a candidate. │
│ discard Discard a sourced candidate from active sourcing and stop outreach. │
│ timeline Show what happened with this candidate, in order. │
│ export Export everything on file for a candidate (GDPR Art. 15 / 20). │
│ delete Erase ALL personal data for a candidate (GDPR Art. 17 right to erasure). │
│ hire Send an offer. Candidate signature triggers hired status and billing. │
│ notes Freeform notes on a candidate (ZER-2175). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates count¶
Usage: zero candidates count [OPTIONS]
How many candidates in the database match exact criteria.
The count is the answer, not a by-product of listing: use this for "how
many people do we have who ..." questions instead of paging
`candidates filter` and counting rows. Filters compose with AND.
This is the exact-criteria path. For fuzzy intent ("who has fintech
experience") use `candidates search`, which runs semantic + keyword
search.
`--applied-within-days` / `--applied-before` (ZER-3446) add a recency
dimension -- "how many applied this week", "who is still fresh", "who
has gone cold" -- and may be combined into a window. Sourced-only
candidates have no application date, so they fall out of scope for
either flag; the coverage table and headline say so.
ALWAYS report the returned `headline` alongside the number. Several of
the filterable fields are unknown for part of the population, and the
headline is where the backend states how many candidates were excluded
only because a field is unknown for them rather than because they fail
the filter. A bare count is a confidently wrong answer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --source <str> Restrict to one source: applied | sourced | ats. │
│ --location-country <str> 2-letter country code, exact match on the structured column. │
│ --location-region <str> Region/state, exact match on the structured column. │
│ --location-contains <str> Substring match on the freeform location text (looser, higher coverage). │
│ --title <str> Substring match on current title. │
│ --company <str> Substring match on current company. │
│ --min-years <float> Minimum years of experience (inclusive). │
│ --max-years <float> Maximum years of experience (inclusive). │
│ --skill <str> Skill to require; repeatable, or one comma-separated value. │
│ --skills-mode <str> Require 'all' listed skills (default) or 'any'. [default: all] │
│ --applied-within-days <int> Only candidates who last applied to you within the last N days. │
│ --applied-before <str> Only candidates whose most recent application is before this date (YYYY-MM-DD). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates delete¶
Usage: zero candidates delete [OPTIONS] {applicant_id}
Erase ALL personal data for a candidate (GDPR Art. 17 right to erasure).
IRREVERSIBLE. Deletes the applicant together with their applications,
interviews, transcripts, recordings, and derived embeddings across every
store. There is no undo and no soft-delete — unlike `jobs delete`, this
is a hard erasure intended to satisfy a right-to-be-forgotten request.
Requires the explicit `--confirm` flag; without it the command refuses to
act.
The erasure itself runs as a background job on the backend (the DELETE
only accepts the request). This command waits up to a minute for it to
resolve before printing anything: "Erased" is only ever printed once the
backend confirms completion (ZER-3826) -- never on the strength of the
202 alone, since a background failure must not be reported to a
recruiter (or Jenny) as a completed GDPR erasure.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * applicant_id <str> Applicant UUID to erase (the `applicant_id` field from `candidates detail --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --confirm Required. Confirms the IRREVERSIBLE erasure of all data for this candidate. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates detail¶
Usage: zero candidates detail [OPTIONS] [candidate_number]
Show detailed info for a specific candidate, including full parsed resume (contact, experience, education, skills, languages, certs) and the excerpts that explain the candidate's ranking.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ candidate_number <str> Candidate number (1-based) or application UUID │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates discard¶
Usage: zero candidates discard [OPTIONS] {candidate_ref}
Discard a sourced candidate from active sourcing and stop outreach.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * candidate_ref <str> Candidate name, email, number, or application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Optional note stored on the discarded sourced application. │
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates export¶
Usage: zero candidates export [OPTIONS] {applicant_id}
Export everything on file for a candidate (GDPR Art. 15 / 20).
Produces a machine-readable subject-access / portability bundle for one
applicant: identity, applications, interviews, transcripts, scores, and
resume references. Use this to fulfil a data-subject access or portability
request.
The bundle contains sensitive candidate PII. Write it to a secure location,
hand only the relevant subset to the requesting data subject, and delete
your local copy once the request is fulfilled — do not leave export files
lying around or paste them into an LLM context you don't control.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * applicant_id <str> Applicant UUID (the `applicant_id` field from `candidates detail --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --output -o <str> Write the export bundle to this file instead of stdout. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates export-csv¶
Usage: zero candidates export-csv [OPTIONS]
Generate a downloadable file of the candidates matching exact criteria (same filters as `count`/`filter`) -- built server-side from the query, not from paging `filter` rows into context and
re-typing them into a file by hand.
This is how to deliver "a CSV/file of these candidates" to someone:
run this command and link the `permalink` it prints, in that order.
Never page `candidates filter` and reconstruct a file from what you
read -- that costs more tokens and risks a transcription mistake the
server-generated file cannot make, since it comes straight from the
same query `count`/`filter` run.
`permalink` is durable and login-gated -- link THAT, never
`download_url` (a short-lived direct link that expires). `row_count`
always equals what `candidates count` reports for the same flags, and
the file's rows always match what `candidates filter` would page
through, because both run the identical filter definition.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --source <str> Restrict to one source: applied | sourced | ats. │
│ --location-country <str> 2-letter country code, exact match. │
│ --location-region <str> Region/state, exact match. │
│ --location-contains <str> Substring match on the freeform location text. │
│ --title <str> Substring match on current title. │
│ --company <str> Substring match on current company. │
│ --min-years <float> Minimum years of experience (inclusive). │
│ --max-years <float> Maximum years of experience (inclusive). │
│ --skill <str> Skill to require; repeatable, or one comma-separated value. │
│ --skills-mode <str> Require 'all' listed skills (default) or 'any'. [default: all] │
│ --applied-within-days <int> Only candidates who last applied to you within the last N days. │
│ --applied-before <str> Only candidates whose most recent application is before this date (YYYY-MM-DD). │
│ --format <str> Export file format (csv is the only one supported today). [default: csv] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates filter¶
Usage: zero candidates filter [OPTIONS]
List the candidates matching exact criteria (same filters as `count`).
Run `candidates count` first while assembling criteria -- it returns no
candidate PII and is cheap enough to re-run on every change. Reach for
this command once the population is the right size and the actual people
are wanted. Both commands send an identically-built filter body to the
same backend definition, so `total` here always equals `count` there for
the same flags.
`--applied-within-days` / `--applied-before` (ZER-3446) filter on
recency of the candidate's most recent application; see `candidates
count --help` for the "gone cold" / window semantics.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --source <str> Restrict to one source: applied | sourced | ats. │
│ --location-country <str> 2-letter country code, exact match. │
│ --location-region <str> Region/state, exact match. │
│ --location-contains <str> Substring match on the freeform location text. │
│ --title <str> Substring match on current title. │
│ --company <str> Substring match on current company. │
│ --min-years <float> Minimum years of experience (inclusive). │
│ --max-years <float> Maximum years of experience (inclusive). │
│ --skill <str> Skill to require; repeatable, or one comma-separated value. │
│ --skills-mode <str> Require 'all' listed skills (default) or 'any'. [default: all] │
│ --applied-within-days <int> Only candidates who last applied to you within the last N days. │
│ --applied-before <str> Only candidates whose most recent application is before this date (YYYY-MM-DD). │
│ --page <int> Page number. [default: 1] │
│ --limit <int> Results per page (max 100). [default: 20] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates hire¶
Usage: zero candidates hire [OPTIONS] {candidate_ref}
Send an offer. Candidate signature triggers hired status and billing.
Refused with HTTP 409 (code `hire_requires_candidate_contact`) if
there is no recorded evidence this candidate has ever engaged with us
(no direct application, no reply to outreach, no interview they
engaged with) -- a deliberate backend guard, not a transient error.
There is no flag to override it; contact must be recorded first.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * candidate_ref <str> Candidate number (from 'zero candidates list') or application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --expect-id <str> Assert the resolved job matches this UUID or short ID │
│ --expect-title <str> Assert the resolved job's title contains this substring (case-insensitive) │
│ --idempotency-key <str> Retry key retained for backward compatibility; offer signing triggers billing. │
│ --compensation <str> Offer compensation text │
│ --guaranteed-cash-compensation <int> The hire's actual guaranteed annual cash compensation, in whole USD dollars (base + signing bonus + any guaranteed/non-discretionary bonus). Captured │
│ on the offer and used for the Final Payment (6% of this, less the role-open fee already paid) once the candidate signs (ZER-3277). Falls back to the │
│ role's budgeted compensation if omitted. │
│ --start-date <str> Offer start date │
│ --location <str> Offer work location │
│ --employment-type <str> Offer employment type │
│ --notes <str> Additional offer notes │
│ --force Allow sending an offer even when another offer for this role is still in flight. │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates list¶
Usage: zero candidates list [OPTIONS] [job_id]
List all candidates for a job with scores and rankings.
By default prints one compact line per candidate. Pass `--resume` to
also render each candidate's full parsed resume inline — useful when
you want to evaluate the pool in a single call instead of running
`candidates detail` N times. `--json` always returns parsed data
regardless of `--resume`.
Power-user flags (`--min-score`, `--max-score`, `--skill`, `--search`,
`--sort`, `--order`, `--limit`) are applied client-side over the full
payload so you can pipe `--json` through jq if you need something more
specific than these flags offer.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_id <str> Job UUID (uses current job if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --resume -r Include full parsed resume data for each candidate (contact, experience, education, skills, excerpts). │
│ --min-score <float> Only show candidates with score >= N. │
│ --max-score <float> Only show candidates with score <= N. │
│ --skill <str> Case-insensitive substring match against resume summary + excerpts (repeatable; all must match). │
│ --search <str> Case-insensitive substring match over name + summary + excerpts. │
│ --sort <str> Sort by: score | name | applied_at. │
│ --order <str> Sort order: asc | desc (default: desc). [default: desc] │
│ --limit <int> Maximum number of candidates to show (applied after filters+sort). │
│ --json Raw JSON output (always includes parsed_resume and relevant_resume_excerpts) │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates notes¶
Usage: zero candidates notes [OPTIONS] COMMAND [ARGS]...
Freeform notes on a candidate (ZER-2175).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List notes left on a candidate, newest first. │
│ add Leave a note on a candidate. │
│ edit Edit the text of an existing note. │
│ delete Permanently delete a note. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates notes add¶
Usage: zero candidates notes add [OPTIONS] {applicant_id}
Leave a note on a candidate.
Notes are freeform, attributed, and timestamped. There is no flag to
set the author: a human CLI token attributes the note to the signed-in
user, and Jenny's credential attributes it to her automatically -- the
backend decides this from the credential, never from a CLI argument.
Use this for the same kind of prior-context note a recruiter would jot
down before or during a candidate interview.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * applicant_id <str> Applicant UUID (the `applicant_id` field from `candidates detail --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --body <str> Note text (freeform). [required] │
│ --job-id <str> Optional job UUID this note was taken in the context of. │
│ --employer-id <str> Employer UUID. Only needed for a system-key credential with no default employer (auto-scoped for a normal per-user CLI token). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates notes delete¶
Usage: zero candidates notes delete [OPTIONS] {note_id}
Permanently delete a note.
Irreversible -- there is no undo and no "deleted" status to restore
from, unlike `candidates reject` / `candidates unreject`. Use this to
remove a note added to the wrong candidate, or one that should never
have been written down, not to correct its wording (use `candidates
notes edit` for that instead -- it keeps a single record rather than
leaving a stray deleted-then-recreated one).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * note_id <str> Note UUID (the `note_id` field from `candidates notes list --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --applicant <str> Applicant UUID the note belongs to (the `applicant_id` field on the note, from `candidates notes list --json`). Required. │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates notes edit¶
Usage: zero candidates notes edit [OPTIONS] {note_id}
Edit the text of an existing note.
Author-only server-side: the backend returns 403 if the acting
credential did not author this note. Replaces the whole body -- there
is no partial/append edit.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * note_id <str> Note UUID (the `note_id` field from `candidates notes list --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --body <str> New note text (replaces the existing body). [required] │
│ --applicant <str> Applicant UUID the note belongs to (the `applicant_id` field on the note, from `candidates notes list --json`). Required. │
│ --employer-id <str> Employer UUID. Only needed for a system-key credential with no default employer (auto-scoped for a normal per-user CLI token). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates notes list¶
Usage: zero candidates notes list [OPTIONS] {applicant_id}
List notes left on a candidate, newest first.
Use this for prior context before or during a candidate interview --
what a recruiter (or Jenny) already knows about this person. For the
full chronological record of everything that happened with them (stage
changes, outreach, interviews, scores, notes included), use
`candidates timeline` instead.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * applicant_id <str> Applicant UUID (the `applicant_id` field from `candidates detail --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID. Only needed for a system-key credential with no default employer (auto-scoped for a normal per-user CLI token). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates reject¶
Usage: zero candidates reject [OPTIONS] {candidate_ref}
Reject a candidate.
Sets the application's status to `rejected`. `--reason` is REQUIRED
(ZER-3637: the backend 422s a `rejected` write with no reason) and is
persisted to `applications.rejection_reason` for audit purposes.
`--rejected-by` (ZER-4002, optional) records who actually made the
call -- recruiter, candidate or hiring_manager; omitted, the platform
records recruiter on its own. This is a per-candidate action. Hiring
another candidate does not automatically reject the rest of the pool.
When Loxo is the candidate's only connected ATS, the rejection is also
written to Loxo first (and the command fails if Loxo refuses it).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * candidate_ref <str> Candidate number (from 'zero candidates list') or application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Reason for rejection (required; persisted to applications.rejection_reason for audit) -- ZER-3637. │
│ --rejected-by <str> Who made the call: recruiter, candidate, or hiring_manager (ZER-4002). Omit to let the platform record recruiter, its own default. │
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates search¶
Usage: zero candidates search [OPTIONS] {query}
Search ALL of the employer's candidates across every job and integration.
Unlike `candidates list`, which is scoped to one job, this searches the
employer's entire candidate pool (applied, sourced, and ATS-synced) by
name, email, title, skills, and resume content. The backend runs a
hybrid semantic + keyword search server-side (the query embedding
happens on the backend) -- this command only forwards the free text.
There is no `--employer-id` flag on this command and none is ever sent
to the backend: the employer scope is derived entirely from the
authenticated CLI token (`require_employer_access` pins CLI callers to
their own employer).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * query <str> Free-text search over name, email, title, skills, and resume content. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --source <str> Filter by source: applied | sourced | ats. │
│ --page <int> Page number. [default: 1] │
│ --limit <int> Results per page (max 100). [default: 20] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates text¶
Usage: zero candidates text [OPTIONS] {candidate_ref}
Send one text message to a candidate.
Goes only to a candidate who agreed to text messages when they applied
and has not replied STOP since, and only between 08:00 and 21:00 in
their local time; otherwise nothing is sent and the reason is shown
(exit 1). The company name and a "Reply STOP to opt out." line are
added. The send is recorded on the candidate's timeline. Requires
--yes in JSON mode, like `candidates reject`.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * candidate_ref <str> Candidate number (from 'zero candidates list') or application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --body <str> The text message (max 1,600 characters). [required] │
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates timeline¶
Usage: zero candidates timeline [OPTIONS] {applicant_id}
Show what happened with this candidate, in order.
Merges stage changes, notes, interviews, scores, feedback, ATS sync,
AI decisions, and email outreach into one reverse-chronological feed --
"what has happened with this person". Use `candidates notes list`
instead when you just need prior notes for interview context, not the
full history.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * applicant_id <str> Applicant UUID (the `applicant_id` field from `candidates detail --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job-id <str> Accepted for API-shape symmetry; does not yet narrow the person-grain timeline to one job. │
│ --employer-id <str> Employer UUID. Only needed for a system-key credential with no default employer (auto-scoped for a normal per-user CLI token). │
│ --page <int> Page number (1-based). [default: 1] │
│ --limit <int> Results per page. [default: 20] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
candidates unreject¶
Usage: zero candidates unreject [OPTIONS] {candidate_ref}
Undo a rejection.
Only works on a candidate whose current status is `rejected`; restores
whichever status the application had immediately before the reject
(usually `pending`) and clears the stored rejection reason. Does not
email the candidate -- there is no candidate-facing notice for undoing
a rejection. When Loxo is the candidate's only connected ATS, the
previous stage is also restored in Loxo (the reject was written there).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * candidate_ref <str> Candidate number (from 'zero candidates list') or application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Optional note for the audit trail. Never persisted to applications.rejection_reason -- that field is cleared, not replaced, when a rejection is undone. │
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
changelog¶
Usage: zero changelog [OPTIONS] COMMAND [ARGS]...
See what's new on the platform.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show recent releases, merged across the whole platform (backend + client). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
changelog show¶
Usage: zero changelog show [OPTIONS]
Show recent releases, merged across the whole platform (backend + client).
Always reads the live merged feed from `GET /api/v1/changelog` at call
time -- this deliberately has no local cache and no snapshot baked into
a prompt or SKILL.md, because the release cadence would make either one
stale within a day. Do NOT filter on a release's `highlight` field: it
only controls whether the in-app "What's New" modal auto-opens, not
whether the release shipped -- 93 of 102 backend releases are
`highlight: false`, so filtering on it would hide nearly everything.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --since <str> ISO date (e.g. 2026-07-01). Keep releases dated on/after this day. │
│ --limit <int> Max number of releases to return, most recent first. [default: 10] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients¶
Usage: zero clients [OPTIONS] COMMAND [ARGS]...
Manage RPO clients.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List all RPO clients for the current employer. │
│ add Add a new RPO client. │
│ show Show details for a single RPO client. │
│ remove Remove an RPO client (soft delete). │
│ profile Read the caller's OWN saved company profile. Writes nothing. │
│ generate-company-info Draft a company description/FAQ text (`company_information`) from a │
│ website. Makes no write -- this only generates; save the result with │
│ `confirm-company-profile --company-information`. │
│ propose-company-profile Preview a company profile before saving it. │
│ confirm-company-profile Save the company profile staged by propose-company-profile. │
│ update Partial-update an RPO client (ZER-3251). Pass only the fields to change. │
│ refresh-company-profile Re-read the caller's OWN website into the saved company profile (ZER-3676/3677). │
│ complete-onboarding Mark the caller's OWN employer as having finished onboarding. │
│ fetch-logo Look up a company's logo from its website and store a hosted copy. │
│ mine-company-questions Scan recent finished interview transcripts for candidate questions │
│ about the company and fold them into the FAQ inbox (ZER-2762). │
│ parse-company-info Check freeform company information for completeness. │
│ parse-context-answers Split one spoken transcript into answers for the given question keys. │
│ preview-company-answer Answer one candidate-style question from the caller's OWN composed │
│ company context -- the "try your interviewer" check (ZER-2762). │
│ analyze-company-context Infer what the AI interviewer can already answer, and the three │
│ follow-up questions worth asking the employer next. │
│ sender-domain A client's own sending domain for candidate email (ZER-901). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients add¶
Usage: zero clients add [OPTIONS]
Add a new RPO client.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --name <str> Client company name [required] │
│ --email <str> Client contact email │
│ --website <str> Client website URL │
│ --company-info <str> Company background / information for AI context │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients analyze-company-context¶
Usage: zero clients analyze-company-context [OPTIONS]
Infer what the AI interviewer can already answer, and the three follow-up questions worth asking the employer next.
Makes no write -- this only analyzes; ask the operator the returned
follow-up questions and save answers with `clients confirm-company-profile`
or `clients update`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --company-info <str> Collected company context to analyze [required] │
│ --company-name <str> │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients complete-onboarding¶
Usage: zero clients complete-onboarding [OPTIONS]
Mark the caller's OWN employer as having finished onboarding.
This is the one write path that satisfies the dashboard's
"needs onboarding" check (ZER-onboarding-prompt) without going through
the legacy `/onboarding` wizard. Idempotent: calling it again after
onboarding is already complete returns the original timestamp
unchanged. Does not touch terms-of-service acceptance, a separate gate.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients confirm-company-profile¶
Usage: zero clients confirm-company-profile [OPTIONS]
Save the company profile staged by propose-company-profile.
Call this only immediately after propose-company-profile and an
explicit, unambiguous yes to the previewed values, in the same
conversation turn. The backend resolves the employer from the caller's
own identity (X-User-Id) -- there is no --employer-id flag here and
none should be added; this command only ever writes the caller's own
company profile, never another employer's.
A verbal "yeah, that's right" from the operator is not itself a save --
the write only happens when this call actually executes and succeeds.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --company-name <str> Company name to save [required] │
│ * --website-url <str> Company website URL to save [required] │
│ --company-information <str> Company description/FAQ text (what the AI interviewer uses to answer candidate questions about the company). Optional and independent of the name/website │
│ propose-then-confirm discipline above -- this is Zero's own read of public content (see `generate-company-info`), not something the operator dictates word │
│ for word, so it doesn't need the same exact-preview confirmation. Omit it to leave company_information untouched. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients fetch-logo¶
Usage: zero clients fetch-logo [OPTIONS]
Look up a company's logo from its website and store a hosted copy.
Makes no write to a client or employer row -- it only returns the
hosted `logo_url` for the caller to save with `clients update
--logo-url` or `clients confirm-company-profile`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --website-url <str> Company website URL [required] │
│ --folder <str> Which asset bucket to store it under: 'clients' or 'employers' [default: clients] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients generate-company-info¶
Usage: zero clients generate-company-info [OPTIONS]
Draft a company description/FAQ text (`company_information`) from a website. Makes no write -- this only generates; save the result with `confirm-company-profile --company-information`.
Scrapes the given URL and runs it through the hosted generator (the
same one the employer dashboard's onboarding wizard uses). Best-effort:
a thin wrapper, no local fallback if the backend call fails.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --website-url <str> Company website URL to generate a description from [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients list¶
Usage: zero clients list [OPTIONS]
List all RPO clients for the current employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients mine-company-questions¶
Usage: zero clients mine-company-questions [OPTIONS]
Scan recent finished interview transcripts for candidate questions about the company and fold them into the FAQ inbox (ZER-2762).
Bounded per call and incremental -- safe to run any number of times.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients parse-company-info¶
Usage: zero clients parse-company-info [OPTIONS]
Check freeform company information for completeness.
Returns which of the standard company-context questions the text
already answers, which are missing, and a completeness score. Makes
no write.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --company-info <str> Freeform company information text to check [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients parse-context-answers¶
Usage: zero clients parse-context-answers [OPTIONS]
Split one spoken transcript into answers for the given question keys.
Makes no write -- save any resulting text yourself (e.g. with
`clients confirm-company-profile --company-information`).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --transcript <str> Spoken transcript answering one or more questions [required] │
│ * --questions-json <str> JSON array of {"key": ..., "question": ...} objects (max 10) [required] │
│ --company-name <str> │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients preview-company-answer¶
Usage: zero clients preview-company-answer [OPTIONS]
Answer one candidate-style question from the caller's OWN composed company context -- the "try your interviewer" check (ZER-2762).
Uses the exact composition the live interview paths read, so this
preview and the real interviewer can't drift. Makes no write.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --question <str> A candidate-style question to answer from company context [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients profile¶
Usage: zero clients profile [OPTIONS]
Read the caller's OWN saved company profile. Writes nothing.
ZER-2462/ZER-2463: never ask the operator to (re)supply a company name,
website, or description before checking whether it's already on file --
that is the same "asking for a value you can already read" mistake as
inviting a candidate whose email is already on the application record.
Call this first, every time first contact comes up (including on a
later, separate conversation with the same employer): only ask for, or
regenerate, whatever comes back empty.
Implemented as a PATCH to `/api/clients/company-profile` with an empty
body. The backend documents this as a deliberate no-op read (a caller
with no fields to change still gets the current row back, no special
case needed) -- so this never writes and never touches `updated_at`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients propose-company-profile¶
Usage: zero clients propose-company-profile [OPTIONS]
Preview a company profile before saving it.
Makes no backend call and saves nothing. Show this preview to the
operator once, in your own words, and get an explicit yes before
calling confirm-company-profile. Don't restate values you already
showed them earlier in the same reply -- this command only echoes
back what you passed in.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --company-name <str> Company name to preview [required] │
│ * --website-url <str> Company website URL to preview [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients refresh-company-profile¶
Usage: zero clients refresh-company-profile [OPTIONS]
Re-read the caller's OWN website into the saved company profile (ZER-3676/3677).
Merges onto the stored profile -- a hand-edited item always survives.
Nothing is written when the site could not be read at all; the command
fails loudly instead of wiping an existing profile.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --website-url <str> Website to re-read; defaults to the employer's saved website │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients remove¶
Usage: zero clients remove [OPTIONS] {client_id}
Remove an RPO client (soft delete).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * client_id <str> Client UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --yes -y Skip confirmation │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients sender-domain¶
Usage: zero clients sender-domain [OPTIONS] COMMAND [ARGS]...
A client's own sending domain for candidate email (ZER-901).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show a client's sending-domain state: the from-address domain, whether │
│ it's verified, and the DNS records it still needs (if any). │
│ set Provision (or reuse) this client's sending domain for the given │
│ from-address. Returns the DNS records to publish before `verify` will │
│ pass; nothing is sent to candidates by this call itself. │
│ verify Validate the published DNS records and set `verified` from the │
│ result. Run `sender-domain set` first if none are on file yet. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients sender-domain set¶
Usage: zero clients sender-domain set [OPTIONS] {client_id}
Provision (or reuse) this client's sending domain for the given from-address. Returns the DNS records to publish before `verify` will pass; nothing is sent to candidates by this call itself.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * client_id <str> Client UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> The from-address candidate email for this client should send as [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients sender-domain show¶
Usage: zero clients sender-domain show [OPTIONS] {client_id}
Show a client's sending-domain state: the from-address domain, whether it's verified, and the DNS records it still needs (if any).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * client_id <str> Client UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients sender-domain verify¶
Usage: zero clients sender-domain verify [OPTIONS] {client_id}
Validate the published DNS records and set `verified` from the result. Run `sender-domain set` first if none are on file yet.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * client_id <str> Client UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients show¶
Usage: zero clients show [OPTIONS] {client_id}
Show details for a single RPO client.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * client_id <str> Client UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
clients update¶
Usage: zero clients update [OPTIONS] {client_id}
Partial-update an RPO client (ZER-3251). Pass only the fields to change.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * client_id <str> Client UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --name <str> New client company name │
│ --email <str> New client contact email │
│ --website <str> New client website URL │
│ --logo-url <str> New client logo URL │
│ --company-info <str> New company background / information for AI context │
│ --public-slug <str> New public job-board URL segment (/jobs/at/<slug>); must be unique across clients and employers │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
close¶
Usage: zero close [OPTIONS] COMMAND [ARGS]...
Legacy alias for sending a candidate offer; charge a hire's close fee.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ run Send an offer. Candidate signature triggers hired status and billing. │
│ charge-fee Record a hire made outside the offer flow and charge its close fee. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
close charge-fee¶
Usage: zero close charge-fee [OPTIONS] {job_id}
Record a hire made outside the offer flow and charge its close fee.
Charges the saved payment method right away and marks the candidate
hired. Use `candidates hire` / `offers send` instead when the candidate
should sign an offer first (that path charges only after signature).
Owners, or members with billing access, only. Always requires `--yes`
after explicit human approval in this turn; never invent it.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID the hire was made on. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --application-id <str> The hired candidate's application UUID (marked hired once the charge succeeds). [required] │
│ --guaranteed-cash-compensation <int range> [x>=1] The hire's actual guaranteed annual cash compensation, in whole USD dollars. The close fee is your plan's total fee (6% by default) │
│ of this, less the role-open fee already paid. If omitted, the signed offer's figure is used, then the role's budgeted compensation. │
│ --idempotency-key <str> Retry key (default: role-close:<application_id>, same as the web app). │
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --yes -y Required; confirms the charge after explicit human approval. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
close run¶
Usage: zero close run [OPTIONS] [job_id]
Send an offer. Candidate signature triggers hired status and billing.
Refused with HTTP 409 (code `hire_requires_candidate_contact`) if
there is no recorded evidence this candidate has ever engaged with us
(no direct application, no reply to outreach, no interview they
engaged with) -- a deliberate backend guard, not a transient error.
There is no flag to override it; contact must be recorded first.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_id <str> Job UUID (uses current job if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --candidate <str> Candidate number (1-based) or application UUID │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --expect-id <str> Assert the resolved job matches this UUID or short ID │
│ --expect-title <str> Assert the resolved job's title contains this substring (case-insensitive) │
│ --idempotency-key <str> Retry key retained for backward compatibility; offer signing triggers billing. │
│ --compensation <str> Offer compensation text │
│ --guaranteed-cash-compensation <int> The hire's actual guaranteed annual cash compensation, in whole USD dollars (base + signing bonus + any guaranteed/non-discretionary bonus; excludes │
│ equity, variable/discretionary bonus, relocation, benefits). Captured on the offer and used for the Final Payment (6% of this, less the role-open fee │
│ already paid) once the candidate signs (ZER-3277). Falls back to the role's budgeted compensation if omitted. │
│ --start-date <str> Offer start date │
│ --location <str> Offer work location │
│ --employment-type <str> Offer employment type │
│ --notes <str> Additional offer notes │
│ --force Allow sending an offer even when another offer for this role is still in flight. │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo¶
Usage: zero demo [OPTIONS] COMMAND [ARGS]...
Demo mode — simulate the hiring pipeline.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --keep Retain the demo job instead of soft-deleting it. │
│ --title <str> Title for the demo job. [default: Demo Role [auto]] │
│ --employer-id <str> Employer UUID to run the demo under (defaults to your logged-in employer). Lets an admin-authed session drive a freshly provisioned org without changing the local │
│ login. │
│ --json Emit a structured JSON result. │
│ --quiet Suppress spinner output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ run Run a full demo: create job → seed candidates → simulate interviews → summary. │
│ populate Realistically populate a job's demo pipeline in one call. │
│ build Build a complete demo org in ONE command (ZER-3104). │
│ mode Turn demo tenant mode on or off for an employer. │
│ login Manage a demo org's shareable login (ZER-1192). │
│ client-account Create a real client account from a prospect (Zero staff only). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo build¶
Usage: zero demo build [OPTIONS]
Build a complete demo org in ONE command (ZER-3104).
Creates the demo org (or resumes one with --employer-id), opens one job
per --role with an AI-generated JD, populates each with a realistic demo
pipeline, and mints the customer-facing login -- so an MCP client needs
exactly ONE write-tool approval for the whole build (on `manage_demo`),
instead of the ~7 separate approvals the equivalent `internal employers
create --demo` + N x `hire run --demo` + N x `demo populate` + `demo
login create` sequence needs.
Org creation failing aborts immediately -- nothing else has happened
yet. Runs in two phases (ZER-3104 follow-up): every role's job is
opened SEQUENTIALLY first (reusing an existing job of the same title in
this org instead of creating a duplicate, so re-running this command --
including its own printed `resume_command` -- is always safe), then
every opened job is populated concurrently (capped at
_DEMO_BUILD_POPULATE_MAX_WORKERS). A single role's JD generation,
job-existence lookup, job creation, or populate call failing is
recorded and the remaining roles still run; the login is still minted
(unless --skip-login) even if a role failed. A populate or JD-generation
call that hits a 5xx/502/503/504 or a timeout is retried once after a
short wait before being recorded as a failure (populate is idempotent
server-side). The command exits non-zero if anything failed, and both
the JSON summary's `resume_command` field and the human-readable footer
name the exact `zero demo build --employer-id ...` invocation that
finishes just the part that didn't.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --company <str> Company name for a NEW demo org. Required unless --employer-id resumes an existing one. │
│ --website <str> Company website (full URL or bare domain, e.g. 'acme.com'). Passed straight through to org creation so the backend resolves a real logo server-side (logo lookup │
│ re-host, favicon fallback) -- never construct a logo URL yourself. Recommended; ignored (with a warning) when --employer-id resumes an existing org. │
│ --role <str> Job title to open as a demo role, e.g. --role "Senior Backend Engineer". Repeatable -- pass it once per role. At least one is required. Each becomes its own job: │
│ an AI-generated JD (same generator `hire run` uses), opened live immediately, then populated with a demo pipeline. │
│ --location <str> Location applied to every role. [default: Remote] │
│ --salary-min <float> Applied to every role. Optional -- omit all four salary flags to use a placeholder demo range. │
│ --salary-max <float> Applied to every role. │
│ --salary-currency <str> Three-letter ISO 4217 currency code. Applied to every role. │
│ --salary-period <str> One of YEAR, MONTH, WEEK, DAY, HOUR. Applied to every role. │
│ --scale <str> Demo pipeline scale for every role's `demo populate` call: one of auto, high, mid, senior. [default: auto] │
│ --employer-id <str> Resume an existing demo org instead of creating a new one -- skips org creation and just adds the --role jobs to it (e.g. resuming a build that died partway │
│ through, or adding roles to an org created some other way). --company becomes optional (used only as JD context and in the printed summary), and --website is │
│ ignored. │
│ --skip-login Don't mint a demo login as part of this build. Run `zero demo login create --employer-id <id>` separately when you want one. │
│ --json Emit one structured JSON summary object. │
│ --quiet Suppress spinner output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo client-account¶
Usage: zero demo client-account [OPTIONS] COMMAND [ARGS]...
Create a real client account from a prospect (Zero staff only).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Create a real (non-demo) client organization. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo client-account create¶
Usage: zero demo client-account create [OPTIONS]
Create a real (non-demo) client organization.
Zero staff only. The new organization is billable (not a demo), you join
it as its account manager, the client admin gets an email invitation to
become its owner, and the client's website is read into the company
profile in the background. Pass --from-demo to link the demo org the
deal came from; that demo org keeps running unchanged.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --company <str> Client's company name. [required] │
│ * --website <str> Client's website; it is read into the company profile. [required] │
│ * --billing-email <str> Client's own billing address (a Zero address is refused). [required] │
│ * --admin-email <str> Client admin to invite as the organization's owner. [required] │
│ --from-demo <str> Demo employer UUID this account grows out of. The link is stored; the demo org itself is left untouched. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo interviews¶
Usage: zero demo interviews [OPTIONS] [job_id]
[Retired] Simulate AI interviews for demo candidates -- use `zero demo populate`.
ZER-2673: the backend endpoint this called (`/api/demo/interviews/{job_id}`)
was retired by ZER-2536; `demo populate` creates candidates already spread
across stages including AI-interviewed ones. Kept registered, but hidden
from help, so the operator gets a pointer instead of a bare 404.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_id <str> Job UUID (uses current job if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --application-ids <str> Retired -- see `zero demo populate`. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo login¶
Usage: zero demo login [OPTIONS] COMMAND [ARGS]...
Manage a demo org's shareable login (ZER-1192).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Mint (or rotate) a ready-to-use employer-owner login for a demo tenant. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo login create¶
Usage: zero demo login create [OPTIONS]
Mint (or rotate) a ready-to-use employer-owner login for a demo tenant.
Returns generated ``{email, password, login_url}`` credentials that can be
handed directly to a customer -- no team invite, no email verification
click-through, no onboarding wizard. Only works for employers flagged
``is_demo=true`` (400 otherwise). Safe to call again for the same
employer: it rotates the password on the existing minted login instead
of creating a second account.
Distinct from ``team invite`` (ZER-1185), which stays the way to add
*named* internal people (presenters, sales) to a demo org -- this mints
the single generic login that becomes the customer handoff.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Demo employer UUID to mint (or rotate) a login for (defaults to your logged-in employer). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo mode¶
Usage: zero demo mode [OPTIONS] [on|off]
Turn demo tenant mode on or off for an employer.
Demo mode suppresses charges, cold outreach, and real sourcing
for this employer. It never deletes data: seeded/demo rows created while
demo mode was on stay permanently excluded from analytics and billing via
their own row markers, even after this is turned off.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * [on|off] <str> Target state: 'on' or 'off'. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID to toggle (defaults to your logged-in employer). Lets an admin-authed session flip demo mode on a freshly provisioned org. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo populate¶
Usage: zero demo populate [OPTIONS] {job_id}
Realistically populate a job's demo pipeline in one call.
Asks the backend to build out a realistic-looking pipeline --
candidates across stages, scores, and interview activity -- sized by
``--scale``. This is THE demo-seeding command (``demo seed`` /
``demo interviews`` were retired backend-side, ZER-2536 / ZER-2673).
``--reset`` (ZER-3153) purges this job's seeded applications and
everything hanging off them (interviews, results, human interviews,
candidate feedback, offer letters, the cached LLM roster) before
populating -- demo employers only, the backend rejects it otherwise.
Use it when a role's roster is wrong (e.g. it drew from the wrong
fixture pool) rather than swapping the role or leaving it broken.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID to populate with a demo pipeline. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --scale <str> Populate scale: one of auto, high, mid, senior. [default: auto] │
│ --reset Purge this job's own seeded pipeline and cached LLM roster first, then populate fresh. Use to re-roll a job whose roster came out wrong (ZER-3153) instead of rebuilding the │
│ whole demo org. │
│ --json Raw JSON output │
│ --quiet Suppress spinner output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo run¶
Usage: zero demo run [OPTIONS]
Run a full demo: create job → seed candidates → simulate interviews → summary.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --keep Retain the demo job instead of soft-deleting it. │
│ --title <str> Title for the demo job. [default: Demo Role [auto]] │
│ --employer-id <str> Employer UUID to run the demo under (defaults to your logged-in employer). Lets an admin-authed session drive a freshly provisioned org without changing the local │
│ login. │
│ --json Emit a structured JSON result. │
│ --quiet Suppress spinner output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
demo seed¶
Usage: zero demo seed [OPTIONS] [job_id]
[Retired] Seed a job with demo candidates -- use `zero demo populate`.
ZER-2673: the backend endpoint this called (`/api/demo/seed/{job_id}`)
was retired by ZER-2536; `demo populate` supersedes it (candidates plus
scores and interview activity, sized by --scale). Kept registered, but
hidden from help, so the operator gets a pointer instead of a bare 404.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_id <str> Job UUID (uses current job if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
help¶
Usage: zero help [OPTIONS] COMMAND [ARGS]...
Show CLI help, or search/read Help Center articles.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ articles Search or fetch Help Center articles. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
help articles¶
Usage: zero help articles [OPTIONS] COMMAND [ARGS]...
Search or fetch Help Center articles.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ search Search Help Center articles by a plain-language question or keywords. │
│ show Fetch one Help Center article's full text and canonical URL. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
help articles search¶
Usage: zero help articles search [OPTIONS] {query}...
Search Help Center articles by a plain-language question or keywords.
Always call this before answering a product-knowledge question ("how
does X work", "what can you do", "why did a candidate get that score")
rather than guessing, reading your own skill file over bash, or running
`--help` -- an answer that isn't traceable to a real help article is the
failure mode this command exists to prevent. Each result's `url` is the
canonical Help Center link; cite it so the operator can click through.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * query <str> Free-text question, e.g. "how does sourcing work" (quote it, or pass multiple words). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --limit <int> Max results, most relevant first. [default: 5] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
help articles show¶
Usage: zero help articles show [OPTIONS] {category} {slug}
Fetch one Help Center article's full text and canonical URL.
Pass the `category`/`url` from a `help articles search` result -- don't
guess a slug. A category/slug pair that doesn't exist fails cleanly with
a 404-shaped error, not a crash.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * category <str> Help category, e.g. 'candidates'. [required] │
│ * slug <str> Article slug, e.g. 'source-candidates-with-ai-search'. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
hire¶
Usage: zero hire [OPTIONS] COMMAND [ARGS]...
Open a new role.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ run Open a new role — guided flow with AI and payment. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
hire run¶
Usage: zero hire run [OPTIONS]
Open a new role — guided flow with AI and payment.
Power-user flags (`--salary`, `--remote`, `--skills`, `--seniority`,
`--experience-years`, `--tags`) and `--description` are passed as
source material to the backend JD generator. `--use-description-as-jd`
preserves only already-formatted HTML JDs; plain text is still formatted
with AI.
`--remote` also sets the structured `is_remote` field, and
`--location-street/-locality/-region/-postal-code/-country` and
`--salary-min/-max/-currency/-period` (ZER-1083 phase 2) feed the
structured Google-for-Jobs fields on the created job. The four salary
flags are required to actually open a role (ZER-2420): interactive runs
prompt for them, and `--yes`/`--json` runs must pass all four or the
command errors before creating anything. The location flags stay
optional, but for non-remote roles, once any of them is set the backend
requires country plus locality-or-region (422 otherwise). In interactive
mode (no `--yes`), the guided flow prompts for these after asking whether
the role is remote.
`--budgeted-compensation` (ZER-3277) is the annual USD budget for this
role, in whole dollars -- the basis for the role-open fee (3% of this
times positions; 6% total at hire, less what was already paid). It
defaults to the middle of the range when `--salary-period` is YEAR and
`--salary-currency` is USD; otherwise it's required to open a paid
role (prompted interactively, or the command errors under `--yes`
naming the flag). Not needed with `--skip-payment`/`--demo`/`--dry-run`.
`--stage-plan-json` threads an approved hiring flow (see `hiring-flow
draft`/`hiring-flow show`) into job creation atomically; its
resume_assessment stage governs the job's auto-invite threshold. Omit
it to get the backend's default plan, or set/change it afterwards with
`hiring-flow set <job_id>`.
`--dry-run` generates the JD (when one isn't supplied) and prints the
job payload as JSON without creating a payable job. It does not trigger
payment and does not POST to `/api/jobs`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --title -t <str> Job title │
│ --description -d <str> Hiring brief or source notes for the AI-generated JD. Use --use-description-as-jd only for an already-formatted final JD. │
│ --location -l <str> Job location (e.g. 'Remote, US') │
│ --employment-type <str> Employment type: Full-time, Part-time, Contract, Temporary or Internship. │
│ --salary <str> Salary or salary range (e.g. '$150k-$180k'). │
│ --remote --no-remote Flag the role as fully remote. Feeds the JD generator and also sets the structured is_remote field (Google for Jobs jobLocationType: │
│ TELECOMMUTE), skipping the physical-address prompt below. Prompts interactively if omitted (defaults to false with --yes). │
│ --location-street <str> Street address. Always optional. │
│ --location-locality <str> City/locality for the structured public listing. For non-remote roles, required (with --location-country) once any structured location field is │
│ set, unless --location-region is given instead. │
│ --location-region <str> State/region/province. May substitute for --location-locality. │
│ --location-postal-code <str> Postal/ZIP code. Always optional. │
│ --location-country <str> Two-letter ISO 3166-1 country code (e.g. 'US'). For non-remote roles, required together with --location-locality or --location-region once any │
│ structured location field is set. │
│ --salary-min <float> Structured minimum base salary for the public listing (distinct from --salary's freeform text). Required to open a role (ZER-2420): │
│ --salary-min, --salary-max, --salary-currency and --salary-period must all be set. Interactive runs prompt for them; with --yes/--json, pass │
│ all four. Use `zero internal ai suggest-salary` during intake if the operator has no range in mind. │
│ --salary-max <float> Structured maximum base salary. Must be >= --salary-min. Required to open a role (ZER-2420): --salary-min, --salary-max, --salary-currency and │
│ --salary-period must all be set. Interactive runs prompt for them; with --yes/--json, pass all four. Use `zero internal ai suggest-salary` │
│ during intake if the operator has no range in mind. │
│ --salary-currency <str> Three-letter ISO 4217 currency code (e.g. 'USD'). Required to open a role (ZER-2420): --salary-min, --salary-max, --salary-currency and │
│ --salary-period must all be set. Interactive runs prompt for them; with --yes/--json, pass all four. Use `zero internal ai suggest-salary` │
│ during intake if the operator has no range in mind. │
│ --salary-period <str> Pay period: one of YEAR, MONTH, WEEK, DAY, HOUR. Required to open a role (ZER-2420): --salary-min, --salary-max, --salary-currency and │
│ --salary-period must all be set. Interactive runs prompt for them; with --yes/--json, pass all four. Use `zero internal ai suggest-salary` │
│ during intake if the operator has no range in mind. │
│ --salary-visibility <str> 'public' (default) or 'private'. Private keeps the pay range off the public job posting and other candidate-facing surfaces; it still shows on │
│ employer views and still prices the open fee. Refused with a 422 naming the law wherever a pay-transparency rule requires the range in the │
│ posting. │
│ --budgeted-compensation <int> Budgeted annual guaranteed cash compensation for this role, in whole USD dollars (e.g. 200000 for $200,000/year) -- the basis for the role-open │
│ fee (3% x this x positions; ZER-3277). Defaults to the middle of the range (--salary-min/--salary-max) when --salary-period is YEAR and │
│ --salary-currency is USD. Otherwise required to open a paid role: interactive runs prompt for it, --yes/--json runs error naming this flag. Not │
│ needed with --skip-payment/--demo/--dry-run, which never charge anything. │
│ --skills <str> Comma-separated list of required skills. │
│ --seniority <str> Seniority level (e.g. 'Senior', 'Staff'). │
│ --experience-years <int> Minimum years of experience. │
│ --tags <str> Comma-separated freeform tags. │
│ --client-id <str> RPO client UUID to create this role under. │
│ --role-summary-json <str> Structured role intake as a JSON object (must include 'title'). Threaded into both JD generation and job creation so the JD, the job, and any │
│ pipeline brief trace back to the same confirmed intake. Assemble this from the operator's answers before opening the role. │
│ --stage-plan-json <str> Approved hiring flow (stage plan) to persist atomically with the job -- either a bare JSON array of stage objects, or a full {"stages": [...], │
│ "source": "..."} object, e.g. the output of `hiring-flow draft` (optionally edited). Its resume_assessment stage governs the job's auto-invite │
│ threshold. Optional; omit to get the backend's default plan (or set/change it later with `hiring-flow set`). │
│ --dry-run Generate the JD and return JSON without creating a payable job. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --skip-payment Skip payment (for testing) │
│ --yes -y Auto-confirm all prompts (non-interactive) │
│ --demo Demo/testing shortcut: implies --skip-payment --yes │
│ --force Create the job even if a recent active job with the same title exists. │
│ --yes-duplicate Skip the duplicate-title check entirely (implied by --force). │
│ --idempotency-key <str> Retry key for safe role-open payment creation. │
│ --use-description-as-jd Preserve --description directly only when it is already a polished HTML JD. Plain text is still formatted with AI. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
hiring-flow¶
Usage: zero hiring-flow [OPTIONS] COMMAND [ARGS]...
Configure the hiring pipeline stages (stage plan) for a role.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show the saved hiring flow (stage plan) for a job. │
│ draft Draft a stage plan with AI. Stateless -- does not save anything. │
│ set Save the hiring flow (stage plan) for a job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
hiring-flow draft¶
Usage: zero hiring-flow draft [OPTIONS]
Draft a stage plan with AI. Stateless -- does not save anything.
Present the draft to the operator (stages + rationales; note it is
fully automated by default) before saving it with `hiring-flow set`
or threading it into `hire run --stage-plan-json`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --role-summary-json <str> Structured role intake as a JSON object (must include 'title'), same shape as `hire run --role-summary-json`. Tailors the draft; omit for the fully-automated │
│ smart default. │
│ --job-title <str> Job title, used when no --role-summary-json is given. │
│ --feedback <str> Freeform feedback to steer the draft (e.g. after showing a prior draft to the operator). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
hiring-flow set¶
Usage: zero hiring-flow set [OPTIONS] {job_id}
Save the hiring flow (stage plan) for a job.
Enabling the resume_assessment stage syncs its `config.threshold` into
the job's real auto-invite gate; disabling it sets the gate to 0.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --stages-json <str> Either a bare JSON array of stage objects, or a full {"stages": [...], "source": "...", "reference_check": {...}} object (e.g. an edited `hiring-flow draft` │
│ output). │
│ [required] │
│ --source <str> Plan source: ai, manual, or default (default: manual). │
│ --reference-check-json <str> Reference-check config, e.g. '{"enabled": true, "count": 2}' (count 1-5, default 2). Overrides any reference_check already present in --stages-json. If │
│ neither is given, the job's existing saved reference_check is preserved as-is -- omitting this flag does NOT disable an already-configured reference check. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
hiring-flow show¶
Usage: zero hiring-flow show [OPTIONS] {job_id}
Show the saved hiring flow (stage plan) for a job.
Returns the fully-automated smart default (resume gate -> AI
interview) if the job has no saved plan yet.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations¶
Usage: zero integrations [OPTIONS] COMMAND [ARGS]...
ATS connection status, sync, write-back and job selection.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ status Show whether an ATS (Greenhouse, Loxo, Lever, Ashby, Workable...) is connected and its sync state. │
│ connections List every ATS connection on the account (one per RPO client, plus the workspace one). │
│ connect Explain how to connect an ATS. This does not connect one. │
│ sync Start a resync from the connected ATS now. Runs in the background; check `integrations status`. │
│ disconnect Disconnect the connected ATS (Greenhouse, Lever, Ashby, Workable...). │
│ advance Move an application to a new stage in the connected ATS. │
│ reject Reject an application in the connected ATS. │
│ note Attach a note to a candidate in the connected ATS. │
│ write-back-report Attach the Zero interview score-report PDF to the candidate's record in the connected ATS. │
│ writeback Show or change the ATS write-back and auto-invite settings. │
│ job-selection Choose which ATS jobs Zero imports and manages. │
│ loxo Loxo-specific settings (company scope). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations advance¶
Usage: zero integrations advance [OPTIONS]
Move an application to a new stage in the connected ATS.
Write-back support is provider-dependent: a read-only ATS (e.g. Workable) answers with a
clean error instead of silently doing nothing.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --ats-application-id <str> Zero's own ats_application_id for this application. │
│ --external-id <str> The connected ATS's own application id, instead of Zero's. │
│ * --stage-id <str> Target stage UUID in the connected ATS. [required] │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Confirm writing a stage change into the customer's connected ATS. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations connect¶
Usage: zero integrations connect [OPTIONS]
Explain how to connect an ATS. This does not connect one.
Connecting needs the customer's own consent (signing in to their ATS, or
pasting its API key), so a person does it in the dashboard.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations connections¶
Usage: zero integrations connections [OPTIONS]
List every ATS connection on the account (one per RPO client, plus the workspace one).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations disconnect¶
Usage: zero integrations disconnect [OPTIONS]
Disconnect the connected ATS (Greenhouse, Lever, Ashby, Workable...).
Revokes the linked account on the ATS side and drops the stored
credential. Historical synced data (candidates, applications) is kept --
only the connection itself is removed. Re-linking later needs the
customer's own sign-in again (`zero integrations connect`). ZER-2349:
without `--client-id` this disconnects only the employer-level "self"
connection, never every client's connection on an RPO account.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations job-selection¶
Usage: zero integrations job-selection [OPTIONS] COMMAND [ARGS]...
Choose which ATS jobs Zero imports and manages.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show whether Zero imports every ATS job or only a chosen list. │
│ catalog List every job in the ATS (fetched live) and whether Zero currently manages it. │
│ set Replace the job selection and start a resync. Dropping a job stops future syncs; it deletes nothing. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations job-selection catalog¶
Usage: zero integrations job-selection catalog [OPTIONS]
List every job in the ATS (fetched live) and whether Zero currently manages it.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations job-selection set¶
Usage: zero integrations job-selection set [OPTIONS]
Replace the job selection and start a resync. Dropping a job stops future syncs; it deletes nothing.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --mode <str> 'all' imports every ATS job; 'selected' only the listed ones. [required] │
│ --job-remote-id <str> ATS job id to manage (the `remote_id` from `job-selection catalog`). Repeat per job. This REPLACES the whole list. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations job-selection show¶
Usage: zero integrations job-selection show [OPTIONS]
Show whether Zero imports every ATS job or only a chosen list.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo¶
Usage: zero integrations loxo [OPTIONS] COMMAND [ARGS]...
Loxo-specific settings (company scope).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ companies List the Loxo companies an agency connection can be scoped to. │
│ scope Scope a non-RPO employer's Loxo sync to one company, or clear the scope (RPO accounts scope per client). │
│ connect Connect a Loxo agency using its API key. │
│ disconnect Disconnect one Loxo agency connection, removing its webhook subscriptions first. │
│ sub-agencies List the brand/sub-agencies visible under a connected Loxo agency. │
│ write-back-interview Write an interview's results as a note on the candidate in Loxo. │
│ webhooks Loxo webhook subscriptions for one connected agency. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo companies¶
Usage: zero integrations loxo companies [OPTIONS]
List the Loxo companies an agency connection can be scoped to.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --agency-id <int> Loxo agency id (from `integrations status`) [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo connect¶
Usage: zero integrations loxo connect [OPTIONS]
Connect a Loxo agency using its API key.
Unlike the other supported ATSs (which need an OAuth sign-in a human
must do in the dashboard), Loxo authenticates with an agency-scoped API
key that can be pasted directly, so this one -- unlike `integrations
connect` -- actually connects it.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --slug <str> Loxo agency API slug [required] │
│ * --api-key <str> Agency-scoped Loxo API key [required] │
│ --name <str> Display name for the Loxo agency │
│ --base-url <str> Tenant Loxo base URL (defaults to the standard one) │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo disconnect¶
Usage: zero integrations loxo disconnect [OPTIONS]
Disconnect one Loxo agency connection, removing its webhook subscriptions first.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --agency-id <int> Loxo agency id (from `integrations status`) [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo scope¶
Usage: zero integrations loxo scope [OPTIONS]
Scope a non-RPO employer's Loxo sync to one company, or clear the scope (RPO accounts scope per client).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --agency-id <int> Loxo agency id (from `integrations status`) [required] │
│ --company-id <int> Loxo company id to scope the sync to │
│ --company-name <str> Display name of that company │
│ --clear Sync the whole agency instead of one company │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo sub-agencies¶
Usage: zero integrations loxo sub-agencies [OPTIONS]
List the brand/sub-agencies visible under a connected Loxo agency.
This is Loxo's own multi-brand "agencies" list -- distinct from
`integrations connections`, which lists Zero's own ATS connection rows.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --agency-id <int> Loxo agency id to scope to. Omit to use the account's first connection. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo webhooks¶
Usage: zero integrations loxo webhooks [OPTIONS] COMMAND [ARGS]...
Loxo webhook subscriptions for one connected agency.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List the Loxo webhook subscriptions registered for one connected agency. │
│ register Register (or confirm) Loxo webhook subscriptions for a connected agency. │
│ unregister Remove Loxo webhook subscriptions for a connected agency. Sync falls back to the periodic poll. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo webhooks list¶
Usage: zero integrations loxo webhooks list [OPTIONS]
List the Loxo webhook subscriptions registered for one connected agency.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --agency-id <int> Loxo agency id (from `integrations status`) [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo webhooks register¶
Usage: zero integrations loxo webhooks register [OPTIONS]
Register (or confirm) Loxo webhook subscriptions for a connected agency.
Lets Loxo-side changes sync in near real time instead of waiting for the
periodic poll. Safe to re-run: already-registered subscriptions are
reported, not duplicated.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --agency-id <int> Loxo agency id (from `integrations status`) [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo webhooks unregister¶
Usage: zero integrations loxo webhooks unregister [OPTIONS]
Remove Loxo webhook subscriptions for a connected agency. Sync falls back to the periodic poll.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --agency-id <int> Loxo agency id (from `integrations status`) [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Skip the confirmation prompt │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations loxo write-back-interview¶
Usage: zero integrations loxo write-back-interview [OPTIONS] {interview_id}
Write an interview's results as a note on the candidate in Loxo.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID whose results to write back to Loxo. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Confirm writing this interview's results as a note in Loxo. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations note¶
Usage: zero integrations note [OPTIONS]
Attach a note to a candidate in the connected ATS.
NOT the same as `candidates notes add` -- that writes to Zero's own candidate_notes table.
This writes a note into the customer's own connected ATS record for the candidate.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --ats-candidate-id <str> Zero's own ats_candidate_id for this candidate. │
│ --external-id <str> The connected ATS's own candidate id, instead of Zero's. │
│ * --body <str> Note content to attach to the candidate in the connected ATS. [required] │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Confirm attaching this note to the candidate in the connected ATS. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations reject¶
Usage: zero integrations reject [OPTIONS]
Reject an application in the connected ATS.
Zero never rejects a candidate automatically on an AI assessment alone -- a human always
confirms this call, and the Slack bridge holds it for one too. Today's connected-ATS
integration layer has no rejection endpoint for any provider, so this always comes back a
clean 422; reject the candidate directly in the ATS and the next sync picks up the change.
Kept so the CLI/MCP surface matches the dashboard's -- not a no-op you should expect to
succeed.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --ats-application-id <str> Zero's own ats_application_id for this application. │
│ --external-id <str> The connected ATS's own application id, instead of Zero's. │
│ --reject-reason <str> Reason recorded for the rejection attempt. │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Confirm attempting to reject this application in the connected ATS. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations status¶
Usage: zero integrations status [OPTIONS]
Show whether an ATS (Greenhouse, Loxo, Lever, Ashby, Workable...) is connected and its sync state.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations sync¶
Usage: zero integrations sync [OPTIONS]
Start a resync from the connected ATS now. Runs in the background; check `integrations status`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --force Also re-queue candidates whose scoring previously failed for a fresh attempt (non-Loxo connections only). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations write-back-report¶
Usage: zero integrations write-back-report [OPTIONS]
Attach the Zero interview score-report PDF to the candidate's record in the connected ATS.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --ats-application-id <str> Zero's own ats_application_id for this application. │
│ --external-id <str> The connected ATS's own application id, instead of Zero's. │
│ --interview-id <str> Specific interview to write back; omit to use the application's most recently scored interview. │
│ --force Re-issue a corrected report even though one already sent successfully for this interview. │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --yes -y Confirm attaching the score-report PDF in the connected ATS. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations writeback¶
Usage: zero integrations writeback [OPTIONS] COMMAND [ARGS]...
Show or change the ATS write-back and auto-invite settings.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show write-back mode, stage names, auto-invite, and whether each active job has those stages. │
│ set Change write-back / auto-invite settings. Only the flags you pass change. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations writeback set¶
Usage: zero integrations writeback set [OPTIONS]
Change write-back / auto-invite settings. Only the flags you pass change.
Turning on `--mode auto` writes to the customer's own ATS, and turning on
`--auto-invite` emails candidates without a further check-in, so both need
an explicit `--yes` after the operator agrees. Turning either off, or
renaming a stage, does not.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --mode <str> 'auto' moves candidates to the named stages in the ATS as they are invited / finish; 'off' stops. │
│ --invited-stage <str> ATS stage name for candidates who were invited to an AI interview. │
│ --completed-stage <str> ATS stage name for candidates who finished the AI interview. │
│ --auto-invite --no-auto-invite Automatically email an AI-interview invite to new ATS applications. Only applications created after it is switched on are invited. Independent of │
│ --mode. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --yes -y Confirm switching on a setting that writes to the customer's ATS or emails candidates. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
integrations writeback show¶
Usage: zero integrations writeback show [OPTIONS]
Show write-back mode, stage names, auto-invite, and whether each active job has those stages.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --client-id <str> RPO client UUID. Agency/RPO accounts connect one ATS per client; omit for the workspace-level connection. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal¶
Usage: zero internal [OPTIONS] COMMAND [ARGS]...
Internal/advanced commands.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ configure Manually configure API credentials. │
│ jobs Manage jobs. │
│ applications Manage applications. │
│ interviews Manage interviews. │
│ employers Manage employers. │
│ applicants Manage applicants. │
│ ai AI-powered generation tools. │
│ files Upload files. │
│ jenny Debug Jenny live-call transcripts and chat logs (dev/staging only). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai¶
Usage: zero internal ai [OPTIONS] COMMAND [ARGS]...
AI-powered generation tools.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ generate-jd Generate or refine a job description using AI. │
│ generate-questions Generate or refine interview questions using AI. │
│ extract-skills Extract skills from a job description. │
│ suggest-salary Compute a recommended salary range for a role (ZER-2467). │
│ draft-job-from-intake Turn free-text intake into structured job fields (nothing is saved). │
│ plan-job-changes Plan edits to a role from a plain-language instruction (nothing is saved). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai draft-job-from-intake¶
Usage: zero internal ai draft-job-from-intake [OPTIONS]
Turn free-text intake into structured job fields (nothing is saved).
Returns the extracted fields, which required fields are still missing,
and up to three follow-up questions to ask. Creating the role is a
separate step (`internal jobs create`).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --text <str> Free-text intake (a client's brief, call notes, an email). [required] │
│ --company-context <str> Short company context to ground the draft. │
│ --default-country <str> Country to assume when the text names none. │
│ --known-json <str> JSON object of job fields already confirmed (e.g. '{"title": "SRE"}'). │
│ --latest-instruction <str> The operator's latest reply or instruction. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai extract-skills¶
Usage: zero internal ai extract-skills [OPTIONS]
Extract skills from a job description.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --description -d <str> Job description text [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai generate-jd¶
Usage: zero internal ai generate-jd [OPTIONS]
Generate or refine a job description using AI.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --title -t <str> Job title [required] │
│ --skills <str> Required skills │
│ --company <str> Company name │
│ --feedback <str> Refinement feedback │
│ --language <str> Language to write the job description in: 'en' (default), 'es' or 'pl'. Use the role's language so the JD matches the interview and the candidate pages. │
│ --role-summary-json <str> Structured role intake as a JSON object (must include 'title'). Folded into the JD source material so the JD matches the confirmed intake. │
│ --markdown Convert the generated JD from HTML to Markdown before printing (ZER-2468). Use this when the draft is going straight into a chat reply -- Jenny's chat │
│ renderer deliberately refuses raw HTML, so paste the Markdown form, never the raw job_description field. `--json` still returns the original HTML unless this │
│ is also set; the job-creation path (hire run) is unaffected -- it always stores the generator's real HTML output. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai generate-questions¶
Usage: zero internal ai generate-questions [OPTIONS]
Generate or refine interview questions using AI.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --title -t <str> Job title [required] │
│ --skills <str> Required skills │
│ --company <str> Company name │
│ --feedback <str> Refinement feedback │
│ --structured Return structured screening question objects alongside legacy text. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai plan-job-changes¶
Usage: zero internal ai plan-job-changes [OPTIONS]
Plan edits to a role from a plain-language instruction (nothing is saved).
Returns a sparse diff: only the fields, questions and stage settings the
instruction changes. Applying it is a separate step (`internal jobs update`).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --instruction <str> What to change, in plain language. [required] │
│ --current-json <str> JSON object with the job's current state: any of current_fields, current_screening_questions, current_behavioral_mode, current_behavioral_questions, │
│ current_stage_plan, current_description. │
│ --locale <str> Reply language: en or es. [default: en] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal ai suggest-salary¶
Usage: zero internal ai suggest-salary [OPTIONS]
Compute a recommended salary range for a role (ZER-2467).
Product decision, verbatim (Alan): don't make salary optional -- compute
it and propose it. Returns an ESTIMATE for the operator to react to
(accept / give a different number / not disclose), never something to
present as market data Zero measured -- there is no benchmark data
source behind this, it's an LLM estimate. When the response's
`disclosure_required` is true, the "don't disclose" option is not legally
available for that posting; say so instead of silently omitting salary.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --title -t <str> Job title [required] │
│ * --location -l <str> Job location [required] │
│ --seniority <str> Seniority level (e.g. 'Senior', 'Staff'). │
│ --employment-type <str> Employment type (e.g. 'Full-time'). │
│ --company-context <str> Short company context (stage, size, industry) to refine the estimate. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applicants¶
Usage: zero internal applicants [OPTIONS] COMMAND [ARGS]...
Manage applicants.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Create (or get) an applicant by email. │
│ update-phone Update an existing applicant phone number. │
│ update-email Replace a candidate's email in Zero (the old address is not kept). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applicants create¶
Usage: zero internal applicants create [OPTIONS]
Create (or get) an applicant by email.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> Applicant email [required] │
│ * --first-name <str> First name [required] │
│ * --last-name <str> Last name [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applicants update-email¶
Usage: zero internal applicants update-email [OPTIONS]
Replace a candidate's email in Zero (the old address is not kept).
Optionally re-sends the candidate's pending AI interview invite to the new
address. Editing the email in the ATS (Loxo) does not reliably reach Zero;
use this command instead.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --application-id <str> Application UUID [required] │
│ * --email <str> New candidate email address [required] │
│ --previous-email <str> Current email, as a guard: refuses if it changed since you read it │
│ --resend-invite Also cancel the pending AI invite and send a fresh one to the new address │
│ --employer-id <str> Employer UUID │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applicants update-phone¶
Usage: zero internal applicants update-phone [OPTIONS]
Update an existing applicant phone number.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --phone <str> New candidate phone number [required] │
│ --email <str> Applicant email │
│ --application-id <str> Application UUID │
│ --job-id <str> Optional job UUID to disambiguate by role │
│ --employer-id <str> Employer UUID │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications¶
Usage: zero internal applications [OPTIONS] COMMAND [ARGS]...
Manage applications.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List applications, optionally filtered by job, status, or pipeline stage. │
│ create Create a new application (with optional resume). │
│ rank Manually set an application's ranking. │
│ transfer Move a candidate's application to another role of the same employer (ZER-4035). │
│ stage-counts Per-stage candidate counts for a job's pipeline (ZER-1128). │
│ assessment-rationale Read the stored assessment rationale for an application. │
│ decisions List the AI decision trail for an application, each with its linked human reviews. │
│ decisions-review Record a human's uphold/override of one AI decision (ZER-1784). │
│ human-review-request Flag an application's automated screening for human review. │
│ record-contact Record that a recruiter reached this candidate outside Zero. │
│ reprocess Re-drive a stuck/failed application through background processing. │
│ automation-exemption Set or clear the per-candidate automated-scoring/advancement exemption. │
│ score-resume Score one resume against a job description, without creating anything. │
│ same-title-interview Does this applicant already have this job title covered by another │
│ application at this employer (ZER-3941)? │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications assessment-rationale¶
Usage: zero internal applications assessment-rationale [OPTIONS]
{application_id}
Read the stored assessment rationale for an application.
Interview-report reasoning, additional-score reasoning, ConFit data, and
the stored rejection reason -- what a candidate is entitled to see as a
GDPR Art 22 explanation of an automated decision.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications automation-exemption¶
Usage: zero internal applications automation-exemption [OPTIONS]
{application_id}
Set or clear the per-candidate automated-scoring/advancement exemption.
An excluded candidate (MSA §3(c)/§8(c), DPA §10(d)) is never
automatically scored or advanced.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --excluded --no-excluded Mark (or clear) this candidate as excluded from automated scoring/advancement. [required] │
│ --reason <str> Optional reason, stored when --excluded is set. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications create¶
Usage: zero internal applications create [OPTIONS]
Create a new application (with optional resume).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --applicant-id <str> Applicant UUID [required] │
│ * --job-id <str> Job UUID [required] │
│ --resume <str> Path to resume file │
│ --resume-url <str> URL to resume │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications decisions¶
Usage: zero internal applications decisions [OPTIONS] {application_id}
List the AI decision trail for an application, each with its linked human reviews.
What a reviewer needs to see before upholding or overriding a decision
with `applications decisions-review`, and what a Hiring Manager needs to
understand why a candidate scored the way they did (ZER-1784).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications decisions-review¶
Usage: zero internal applications decisions-review [OPTIONS] {application_id}
{decision_id}
Record a human's uphold/override of one AI decision (ZER-1784).
Reserved for full employer team members (owner/member), not the
Hiring Manager / reviewer role. Also closes the candidate's open
human-review request for this application, if one exists, resolving
the Art 22 "contest" loop.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
│ * decision_id <str> Decision UUID (from `applications decisions`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --outcome <str> 'upheld' or 'overridden'. [required] │
│ * --reason <str> Required rationale for the audit trail. [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications human-review-request¶
Usage: zero internal applications human-review-request [OPTIONS]
{application_id}
Flag an application's automated screening for human review.
The right not to be subject to a solely-automated decision (GDPR Art
22). Review it with `applications decisions`, then resolve it with
`applications decisions-review`.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --reason <str> Why human review is being requested. [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications list¶
Usage: zero internal applications list [OPTIONS]
List applications, optionally filtered by job, status, or pipeline stage.
Omitting --job-id searches across every role of the employer in one
call. This is the direct fix for the worst measured Jenny tool loop:
"give me a list of candidates stuck at resume screening" used to cost a
`jobs list` call plus one job-scoped `applications list` call per role,
filtered by hand -- roughly 200 model requests for one question.
`--stage-type`/`--stage-status`/`--status` answer that in a single
tenant-scoped, paginated call instead.
A cross-role --status count (--job-id omitted) defaults to OPEN roles
only (ZER-3813) -- pass --include-closed for every role. Every
--job-id-omitted read also prints/echoes which scope its number covers,
so that is never left to be inferred.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --job-id <str> Filter by job UUID. OMIT this to search across every role of the employer in one call (ZER-3448) -- combine with --stage-type/--stage-status/--status for the │
│ cross-role candidate-by-stage read; see those flags. │
│ --status <str> Filter by application status: pending|hired|rejected|transferred. `pending` across every role (job_id omitted) is the definition of "who is awaiting a decision". │
│ --stage-type <str> Filter by the current pipeline-stage cursor: applied|resume_assessment|ai_interview|human_interview|hired|rejected. Combined with an omitted --job-id, this is the │
│ ONE-CALL answer to "who is stuck at resume screening" (or any stage) across every role (ZER-3448) -- do NOT answer that by listing jobs and then paging `applications │
│ list --job <job>` once per role: that loop measured ~200 model requests for one question in September's Jenny production traffic, the single worst tool loop found. │
│ This one call is tenant-scoped and paginated; the printed/`--json` total is authoritative for these exact filters (never re-derive it by summing per-role counts). │
│ --stage-status <str> Narrow further within --stage-type: 'entered' (not yet advanced/scored) or 'completed' (finished this stage's own work, not yet moved to the next). REQUIRES │
│ --stage-type -- rejected with an error otherwise, since a bare status matches every stage at once. │
│ --include-closed Count/list closed roles too. Default (ZER-3813): with --job-id omitted and --status set, this reads open roles ONLY -- a cross-role status count used to silently │
│ count closed roles too, inflating 'how many rejected/pending' answers. Pass --include-closed for the old every-role total. No effect with --job-id set, or when │
│ --status is not set (a --stage-type-only cross-role read, ZER-3448, has always covered every role). │
│ --page <int> Page number [default: 1] │
│ --limit <int> Results per page [default: 20] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications rank¶
Usage: zero internal applications rank [OPTIONS] {application_id}
Manually set an application's ranking.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --ranking -r <int> New ranking position [required] │
│ * --reason <str> Reason for ranking change [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications record-contact¶
Usage: zero internal applications record-contact [OPTIONS] {application_id}
Record that a recruiter reached this candidate outside Zero.
The escape hatch for the sourced-never-responded outbound-action guard
that blocks `candidates hire`, invite sends, and reference checks until
there is recorded evidence of candidate contact -- a phone call,
LinkedIn message, referral, or an in-person conversation. Recording it
here legitimately unlocks every one of those guards at once; there is
no other way past them. Sends nothing to the candidate.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --note <str> Optional free-text note on how contact happened (e.g. 'spoke by phone', 'referred by Jane'). Never shown to the candidate. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications reprocess¶
Usage: zero internal applications reprocess [OPTIONS] {application_id}
Re-drive a stuck/failed application through background processing.
For an application left in `failed` (or otherwise stalled) by a
transient error. Only re-drives sources the pipeline can read back on
its own (a sourced candidate's cached profile, or a demo-fixture resume
URL) -- a plain stored resume_url cannot be re-read, so the backend
409s when there is nothing re-scorable left. This is a re-drive, not a
new application: no thank-you email or employer notification is sent.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications same-title-interview¶
Usage: zero internal applications same-title-interview [OPTIONS]
{application_id}
Does this applicant already have this job title covered by another application at this employer (ZER-3941)?
Read-only. Answers two questions: whether to show a sibling
application's AI-interview result on a candidate with no interview of
their own, and whether to warn a recruiter before a manual invite that
this person already has the title covered (manual invites stay allowed
either way -- this only supplies the warning data). Derived fresh on
every call; there is nothing here to go stale.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications score-resume¶
Usage: zero internal applications score-resume [OPTIONS]
Score one resume against a job description, without creating anything.
Returns a 0-1 match score. Nothing is saved: no applicant, application
or job is created, so this is for a quick "how well does this resume
fit?" check. A score is input for a human decision, never grounds on its
own to reject a candidate.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --resume <str> Path to the resume PDF. [required] │
│ --job-description <str> Job description text. │
│ --job-description-file <str> Read the job description from this file. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications stage-counts¶
Usage: zero internal applications stage-counts [OPTIONS]
Per-stage candidate counts for a job's pipeline (ZER-1128).
Server-side source for an applicants-page funnel/stage filter: counts
come from the candidate-stage-tracking cursor
(``pipeline_stage_type``/``pipeline_stage_status``), not a client-side
re-derivation from a full candidate list.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --job-id <str> Job UUID. [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal applications transfer¶
Usage: zero internal applications transfer [OPTIONS] {application_id}
Move a candidate's application to another role of the same employer (ZER-4035).
A reason is mandatory. The source application becomes ``transferred``
and a new ``pending`` application is created on the target role; its
resume is assessed against that role in the background (no candidate
email, no employer notification). Any AI interview stays attached to
the original application -- the new one shows where the candidate came
from. The connected ATS is NOT updated by a move.
409 ``same_job``/``target_job_closed``/``already_on_target_job``/
``source_not_movable``/``status_changed`` means the move was refused;
the error message explains which.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID (the candidate's current application). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --target-job <str> Role to move the candidate to (job UUID or short id, same ref `jobs show` accepts). [required] │
│ * --reason <str> Required reason for the move (max 1000 chars). [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal configure¶
Usage: zero internal configure [OPTIONS]
Manually configure API credentials.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --api-url <str> [default: https://dev.api.zerohiring.com] │
│ * --api-key <str> [required] │
│ --employer-id <str> │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal employers¶
Usage: zero internal employers [OPTIONS] COMMAND [ARGS]...
Manage employers.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Create a new employer account. │
│ analytics Get analytics for an employer. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal employers analytics¶
Usage: zero internal employers analytics [OPTIONS] {employer_id}
Get analytics for an employer.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * employer_id <str> Employer UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --start-date <str> Start date (ISO format) │
│ --end-date <str> End date (ISO format) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal employers create¶
Usage: zero internal employers create [OPTIONS]
Create a new employer account.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> Employer email [required] │
│ * --first-name <str> First name [required] │
│ * --last-name <str> Last name [required] │
│ * --company <str> Company name [required] │
│ --demo --no-demo Provision as a demo tenant (employers.is_demo=true): charges, cold outreach, and real sourcing are suppressed for this employer; demo-seeded rows stay │
│ permanently excluded from analytics/billing even after demo mode is turned off. Toggle later with `zero demo mode on|off --employer-id`. For a full one-call │
│ demo build (org + jobs + pipelines + login), prefer `zero demo build` instead of assembling this by hand. │
│ [default: no-demo] │
│ --logo-url <str> Company logo URL (optional) │
│ --website-url <str> Company website URL (optional) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal files¶
Usage: zero internal files [OPTIONS] COMMAND [ARGS]...
Upload files.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ upload Upload a file to S3. │
│ publish-url Get a one-time upload URL and a download link for a file you produced. │
│ publish Publish a file you produced: upload it and print a download link. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal files publish¶
Usage: zero internal files publish [OPTIONS] {path}
Publish a file you produced: upload it and print a download link.
Gets an upload URL from the backend, PUTs the file's bytes to it with
exactly the headers the backend returned, then prints the permanent
link to share (``permalink``) plus the short-lived signed
``download_url``. Nothing is printed if the upload itself fails.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * path <str> Path to the file you produced. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --name <str> Published filename (defaults to the file's own name). │
│ --conversation-id <str> Conversation this file belongs to, if any. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal files publish-url¶
Usage: zero internal files publish-url [OPTIONS] {filename}
Get a one-time upload URL and a download link for a file you produced.
You still have to PUT the bytes to ``upload_url`` yourself (with exactly
``upload_headers``) before either link will serve anything. Link the
``permalink`` in a reply -- it never expires; ``download_url`` is the
short-lived signed URL for an immediate fetch. Use ``files publish``
instead if the CLI can already read the file itself.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * filename <str> Name of the file you want to publish. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --byte-size <int> Size of the file, in bytes. [required] │
│ --conversation-id <str> Conversation this file belongs to, if any. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal files upload¶
Usage: zero internal files upload [OPTIONS] {file}
Upload a file to S3.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * file <str> Path to file [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --folder <str> Target folder (resumes, avatars, etc.) [default: resumes] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews¶
Usage: zero internal interviews [OPTIONS] COMMAND [ARGS]...
Manage interviews.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Create a new interview, or trigger a video reference check. │
│ create-reference Manual fallback: record a referee the EMPLOYER typed in. │
│ test Create an employer preview interview and print the launch URL. │
│ results Get results for a completed interview. │
│ transcript-translate Translate this interview's scored Q&A transcript (ZER-3929). │
│ trigger-call Trigger an outbound phone call for an interview. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews create¶
Usage: zero internal interviews create [OPTIONS]
Create a new interview, or trigger a video reference check.
Same candidate-contact-evidence gate as `manage_candidates` hire/invite
actions applies here: with `--use-case reference`, the backend returns
HTTP 409 (`reference_request_requires_candidate_contact`) if there is no
recorded evidence this candidate has ever engaged with us. That is a
deliberate refusal, not a transient error -- there is no override flag.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --interview-type <str> Interview type (e.g. realtime, video, four_models) [required] │
│ * --applicant-id <str> Applicant UUID [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ * --job-id <str> Job UUID [required] │
│ --application-id <str> Application UUID │
│ --avatar-id <str> Avatar ID │
│ --is-test --no-is-test Mark as test/preview interview [default: no-is-test] │
│ --use-case <str> interview (default) or reference -- reference triggers a video reference interview (with the referee) instead of a candidate interview; requires │
│ --reference-id from `interviews create-reference`. Reference checks are video only, so phone_call is not accepted with it. Manual fallback only: the │
│ automatic path is `zero references request`. │
│ [default: interview] │
│ --reference-id <str> Reference record ID (from `interviews create-reference`). Required when --use-case reference. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews create-reference¶
Usage: zero internal interviews create-reference [OPTIONS]
Manual fallback: record a referee the EMPLOYER typed in.
The normal path is automatic and candidate-led: `zero references request
<APPLICATION_ID>` (or the stage trigger) asks the candidate to list their
own referees with consent, and each referee is then invited for you. Use
this command only when you already have a referee's details and need to
add one by hand.
Returns a `reference_id` -- pass it to `interviews create --use-case
reference --reference-id <id>` to actually trigger the reference-check
video interview. This step alone does not contact the reference or the
candidate.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --application-id <str> Application UUID [required] │
│ * --job-id <str> Job UUID [required] │
│ * --name <str> Reference's full name [required] │
│ * --email <str> Reference's email address [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --custom-questions <str> Optional free-text custom questions for the reference │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews results¶
Usage: zero internal interviews results [OPTIONS] {interview_id}
Get results for a completed interview.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews test¶
Usage: zero internal interviews test [OPTIONS]
Create an employer preview interview and print the launch URL.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --job-id,--job <str> Job UUID [required] │
│ --interview-type <str> Test interview type: video or audio [default: video] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews transcript-translate¶
Usage: zero internal interviews transcript-translate [OPTIONS] {interview_id}
Translate this interview's scored Q&A transcript (ZER-3929).
Repeat calls for the same (interview, target_language) are served from a
cache with no LLM call -- the response's `cached` field says which
happened. `translation_needed=False` means the transcript's own
language already matches the target (or there was nothing to
translate); `turns` then holds the original, untranslated text.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --target-language <str> Lowercase BCP-47 primary subtag (e.g. 'en', 'es'). Defaults to English. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal interviews trigger-call¶
Usage: zero internal interviews trigger-call [OPTIONS] {interview_id}
Trigger an outbound phone call for an interview.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny¶
Usage: zero internal jenny [OPTIONS] COMMAND [ARGS]...
Debug Jenny live-call transcripts and chat logs (dev/staging only).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ calls Jenny live voice/video call debugging. │
│ chats Jenny text-chat conversation debugging. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny calls¶
Usage: zero internal jenny calls [OPTIONS] COMMAND [ARGS]...
Jenny live voice/video call debugging.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List Jenny live voice/video calls for an employer (dev/staging only). │
│ show Show a Jenny live call's metadata and transcript (dev/staging only). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny calls list¶
Usage: zero internal jenny calls list [OPTIONS]
List Jenny live voice/video calls for an employer (dev/staging only).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer <str> Employer UUID (auto-detected from login) │
│ --limit <int> Max rows to return [default: 50] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny calls show¶
Usage: zero internal jenny calls show [OPTIONS] {call_id}
Show a Jenny live call's metadata and transcript (dev/staging only).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * call_id <str> Live-call UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny chats¶
Usage: zero internal jenny chats [OPTIONS] COMMAND [ARGS]...
Jenny text-chat conversation debugging.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List Jenny text-chat conversations for an employer (dev/staging only). │
│ show Show a Jenny text-chat conversation and its messages (dev/staging only). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny chats list¶
Usage: zero internal jenny chats list [OPTIONS]
List Jenny text-chat conversations for an employer (dev/staging only).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer <str> Employer UUID (auto-detected from login) │
│ --limit <int> Max rows to return [default: 50] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jenny chats show¶
Usage: zero internal jenny chats show [OPTIONS] {conversation_id}
Show a Jenny text-chat conversation and its messages (dev/staging only).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * conversation_id <str> Conversation UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs¶
Usage: zero internal jobs [OPTIONS] COMMAND [ARGS]...
Manage jobs.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List jobs for an employer. │
│ get Get details for a single job. │
│ create Create a new job. │
│ update Update a job (only provided fields are changed). │
│ delete Soft-delete a job by UUID (no confirmation — intended for scripting). │
│ parse-jd Check a job description for completeness. │
│ set-scorecard-template Assign or clear this job's scorecard template. │
│ external-postings Where a job was posted on external boards by hand (ZER-3916). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs create¶
Usage: zero internal jobs create [OPTIONS]
Create a new job.
The four salary flags are mandatory (ZER-2420): they are kept as
``Optional`` typer options only so all of the missing ones are named in
one actionable, JSON-coded ``missing_salary`` error (see
``validate_structured_salary``) instead of typer's one-flag-at-a-time
usage error.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ * --title -t <str> Job title [required] │
│ * --description -d <str> Job description [required] │
│ --active --no-active Whether the job is active [default: active] │
│ --custom-questions <str> Custom interview questions │
│ --screening-questions-json <str> Structured screening questions as JSON, e.g. '[{"text":"Can you work UTC hours?","order":1,"source":"jenny"}]'. 'source' is optional │
│ but if set must be one of ['ai', 'ats', 'jenny', 'legacy', 'manual'] — any other value is rejected client-side before it reaches the │
│ backend (ZER-1154: unrecognized 'source' values used to be silently dropped, persisting an empty question list with no error). │
│ --employer-information <str> Company info for candidates │
│ --location <str> Job location │
│ --employment-type <str> Employment type (full-time, part-time, etc.) │
│ --is-remote --no-is-remote Whether the role is fully remote (Google for Jobs jobLocationType: TELECOMMUTE). When true, the structured physical-address fields │
│ below are not required. │
│ [default: no-is-remote] │
│ --location-street <str> Street address. Always optional. │
│ --location-locality <str> City/locality. For non-remote roles, required (together with --location-country) once any structured location field is set, unless │
│ --location-region is given instead. │
│ --location-region <str> State/region/province. May substitute for --location-locality. │
│ --location-postal-code <str> Postal/ZIP code. Always optional. │
│ --location-country <str> Two-letter ISO 3166-1 country code (e.g. 'US'). For non-remote roles, required together with --location-locality or --location-region │
│ once any structured location field is set. 422 from the backend if omitted when required, or not 2 letters. │
│ --salary-min <float> Minimum base salary. Required on job creation (ZER-2420): the backend rejects a new job unless --salary-min, --salary-max, │
│ --salary-currency and --salary-period are all set. Use `zero internal ai suggest-salary` during intake if the operator has no range in │
│ mind. │
│ --salary-max <float> Maximum base salary. Must be >= --salary-min. Required on job creation (ZER-2420): the backend rejects a new job unless --salary-min, │
│ --salary-max, --salary-currency and --salary-period are all set. Use `zero internal ai suggest-salary` during intake if the operator │
│ has no range in mind. │
│ --salary-currency <str> Three-letter ISO 4217 currency code (e.g. 'USD'). Required on job creation (ZER-2420): the backend rejects a new job unless │
│ --salary-min, --salary-max, --salary-currency and --salary-period are all set. Use `zero internal ai suggest-salary` during intake if │
│ the operator has no range in mind. │
│ --salary-period <str> Pay period: one of YEAR, MONTH, WEEK, DAY, HOUR. Required on job creation (ZER-2420): the backend rejects a new job unless │
│ --salary-min, --salary-max, --salary-currency and --salary-period are all set. Use `zero internal ai suggest-salary` during intake if │
│ the operator has no range in mind. │
│ --salary-visibility <str> 'public' (default) or 'private'. Private keeps the pay range off the public job posting and other candidate-facing surfaces; it still │
│ shows on employer views and still prices the open fee. Refused with a 422 naming the law wherever a pay-transparency rule requires the │
│ range in the posting. │
│ --client-id <str> RPO client UUID to create this job under │
│ --role-summary-json <str> Structured role intake as a JSON object (must include 'title'). Persisted on the job under additional_data['role_summary']. │
│ --interview-language <str> The role's language: 'en' (default), 'es' or 'pl'. One setting for the AI interview, the AI-written job description and the │
│ candidate-facing pages and emails (languages without a translation yet fall back to English). 422 from the backend on other values. │
│ --use-description-as-jd Preserve --description directly only when it is already a polished HTML JD. Plain text is still formatted with AI. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs delete¶
Usage: zero internal jobs delete [OPTIONS] {job_id}
Soft-delete a job by UUID (no confirmation — intended for scripting).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs external-postings¶
Usage: zero internal jobs external-postings [OPTIONS] COMMAND [ARGS]...
Where a job was posted on external boards by hand (ZER-3916).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list Where this role is listed on external job boards, newest first. │
│ create Record that this role was posted on an external board by hand. │
│ update Edit a posting. │
│ delete Remove a posting recorded by mistake (no confirmation -- intended │
│ for scripting, same convention as `internal jobs delete`). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs external-postings create¶
Usage: zero internal jobs external-postings create [OPTIONS] {job_id}
Record that this role was posted on an external board by hand.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --board <str> One of: linkedin, indeed, glassdoor, other. [required] │
│ --board-label <str> Board display name -- required when --board is 'other'. │
│ * --posting-url <str> URL of the listing on the board. [required] │
│ --posted-on <str> Day the listing went up, YYYY-MM-DD (defaults to today). │
│ --closed-on <str> Day the listing was taken down, YYYY-MM-DD, if it already was. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs external-postings delete¶
Usage: zero internal jobs external-postings delete [OPTIONS] {job_id}
{posting_id}
Remove a posting recorded by mistake (no confirmation -- intended for scripting, same convention as `internal jobs delete`).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
│ * posting_id <str> Posting UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs external-postings list¶
Usage: zero internal jobs external-postings list [OPTIONS] {job_id}
Where this role is listed on external job boards, newest first.
Read-only. Each posting carries the `utm_source` its apply link should
use, so applicants arriving from that listing are attributed to the
board.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs external-postings update¶
Usage: zero internal jobs external-postings update [OPTIONS] {job_id}
{posting_id}
Edit a posting.
Every field is optional; only the ones passed are applied. `--reopen`
marks a taken-down listing as up again (sends `closed_on: null`);
`--closed-on` and `--reopen` are mutually exclusive.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
│ * posting_id <str> Posting UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --board <str> One of: linkedin, indeed, glassdoor, other. │
│ --board-label <str> │
│ --posting-url <str> │
│ --posted-on <str> YYYY-MM-DD │
│ --closed-on <str> YYYY-MM-DD the listing was taken down. │
│ --reopen Mark a taken-down listing as up again (clears closed_on). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs get¶
Usage: zero internal jobs get [OPTIONS] {job_id}
Get details for a single job.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs list¶
Usage: zero internal jobs list [OPTIONS]
List jobs for an employer.
A single page never implies completeness: pass --all (or read the
printed/JSON pagination facts) before concluding a job does not exist.
Rows carry ``description_chars`` rather than the description body. A row
with ``description_omitted: true`` HAS a description -- it just is not in
this payload. Use --search to match on description text server-side,
``zero jobs show <job>`` to read one, or --with-description to opt the
whole list back in.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --status <str> Filter by status │
│ --search <str> Search term, matched server-side against job title, DESCRIPTION text, and location. This is the supported way to answer 'which of my roles mention X?' without │
│ pulling description bodies into the response. │
│ --client-id <str> Filter by RPO client UUID │
│ --with-description Include each job's full description body. Off by default: descriptions average ~4 kB, so a few dozen jobs is enough to blow past an agent's tool-result limit. │
│ Prefer --search, or `zero jobs show <job>` for a single description. │
│ --page <int> Page number [default: 1] │
│ --limit <int> Results per page [default: 20] │
│ --all Auto-paginate and return every job (up to 500 rows) instead of a single page. Overrides --page/--limit. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs parse-jd¶
Usage: zero internal jobs parse-jd [OPTIONS]
Check a job description for completeness.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --description -d <str> Job description text [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs set-scorecard-template¶
Usage: zero internal jobs set-scorecard-template [OPTIONS] {job_id}
Assign or clear this job's scorecard template.
List the employer's templates with `interviews scorecard-templates`.
Omitting `--template-id` clears the job's own assignment and falls back
to the employer's default template (or no template, if none is marked
default) -- the response's `source` field says which happened: "job",
"default", or "none". Archived templates are refused with a 409.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --template-id <str> Scorecard template UUID to assign. Omit to clear the job's own template and fall back to the employer's default. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
internal jobs update¶
Usage: zero internal jobs update [OPTIONS] {job_id}
Update a job (only provided fields are changed).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --title -t <str> New title │
│ --description -d <str> New description │
│ --active --no-active Not supported: the update endpoint deliberately excludes `active` (ZER-561), so passing this always errors before any request is sent. │
│ See `zero internal jobs delete` for the closest existing lever (soft-delete, not deactivate). │
│ --custom-questions <str> Custom interview questions │
│ --screening-questions-json <str> Structured screening questions as JSON, e.g. '[{"text":"Can you work UTC hours?","order":1,"source":"jenny"}]'. 'source' is optional but │
│ if set must be one of ['ai', 'ats', 'jenny', 'legacy', 'manual'] — any other value is rejected client-side before it reaches the backend │
│ (ZER-1154: unrecognized 'source' values used to be silently dropped, persisting an empty question list with no error). │
│ --employer-information <str> Company info for candidates │
│ --location <str> Job location │
│ --is-remote --no-is-remote Whether the role is fully remote (Google for Jobs jobLocationType: TELECOMMUTE). Omit to leave unchanged. When set true, the structured │
│ physical-address fields below are not required. │
│ --location-street <str> Street address. Always optional. │
│ --location-locality <str> City/locality. For non-remote roles, required (together with --location-country) once any structured location field is set on this call, │
│ unless --location-region is given instead. │
│ --location-region <str> State/region/province. May substitute for --location-locality. │
│ --location-postal-code <str> Postal/ZIP code. Always optional. │
│ --location-country <str> Two-letter ISO 3166-1 country code (e.g. 'US'). For non-remote roles, required together with --location-locality or --location-region │
│ once any structured location field is set on this call. 422 from the backend if omitted when required, or not 2 letters. │
│ --salary-min <float> Minimum base salary. Optional on update; omit to leave unchanged. │
│ --salary-max <float> Maximum base salary. Must be >= --salary-min. │
│ --salary-currency <str> Three-letter ISO 4217 currency code (e.g. 'USD'). Required together with --salary-period once --salary-min or --salary-max is set on this │
│ call; 422 from the backend otherwise. │
│ --salary-period <str> Pay period: one of YEAR, MONTH, WEEK, DAY, HOUR. Required together with --salary-currency once --salary-min or --salary-max is set on │
│ this call. │
│ --salary-visibility <str> 'public' (default) or 'private'. Private keeps the pay range off the public job posting and other candidate-facing surfaces; it still │
│ shows on employer views and still prices the open fee. Refused with a 422 naming the law wherever a pay-transparency rule requires the │
│ range in the posting. Omit to leave unchanged. │
│ --interview-language <str> The role's language: 'en' (default), 'es' or 'pl'. One setting for the AI interview, the AI-written job description and the │
│ candidate-facing pages and emails (languages without a translation yet fall back to English). 422 from the backend on other values. │
│ --use-description-as-jd Preserve --description directly only when it is already a polished HTML JD. Plain text is still formatted with AI. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews¶
Usage: zero interviews [OPTIONS] COMMAND [ARGS]...
Schedule and manage human (hiring-manager) interviews.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Create a human interview for an application. │
│ list List human interviews, newest first (soonest-first with --upcoming). │
│ show Show a human interview, including proposed/selected slots. │
│ propose-slots Propose (or replace) slots on an interview and email the candidate. │
│ reschedule Reschedule a scheduled (or awaiting_candidate) interview. │
│ cancel Cancel a human interview from any non-terminal status. │
│ nudge Re-send the candidate's scheduling link for an interview. │
│ complete Mark a scheduled interview as completed. │
│ no-show Mark a scheduled interview whose start has passed as a no-show. │
│ availability Check Google Calendar availability for an interviewer. │
│ feedback DEPRECATED: use `interviews scorecard` instead. │
│ scorecard Submit your scorecard for a human interview (replaces `interviews feedback`). │
│ scorecard-templates List the employer's scorecard templates and their attributes. │
│ needs-reply Interviews still waiting for the candidate to pick a time, oldest first. │
│ completed Completed interviews with their latest feedback, newest first. │
│ feedback-list Every scorecard left on one application (plus earlier legacy ratings). │
│ legacy-feedback The raw legacy 1-5 rating/note records left on one application. │
│ accommodations List candidates' interview accommodation requests, newest first. │
│ hours Interviewer working hours, date overrides and public holidays. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews accommodations¶
Usage: zero interviews accommodations [OPTIONS]
List candidates' interview accommodation requests, newest first.
Read-only. Granting or denying a request is a human decision made in the
web app; it is not available from here.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --status <str> Filter by status: pending, granted, denied. │
│ --application-id <str> Filter by application UUID. │
│ --interview-id <str> Filter by interview UUID. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews availability¶
Usage: zero interviews availability [OPTIONS]
Check Google Calendar availability for an interviewer.
Returns free 30-min-aligned slots inside business hours over --days
days (default 7) starting from --from (default: today), pulled from
the interviewer's connected Google Calendar via freebusy. Pass --from
to look at a specific future window (e.g. "next week") instead of
always getting this week's slots. If neither --interviewer-user-id nor
--interviewer-email resolves a connected calendar, `connected` comes
back false -- propose times manually instead, or ask the interviewer
to connect Google Calendar in Company Settings. Feed the returned
start times straight into `interviews create --slot` or `interviews
propose-slots --slot`.
`--window-days`/`--window-start`/`--window-end` (ZER-3774) preview a
booking link's window instead: every open time in the window (no
30-result cap), summarized as a total/day count plus a per-day
breakdown -- the same preview `interviews create --booking-link` is
about to send the candidate.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --interviewer-user-id <str> Platform user UUID whose calendar to check. │
│ --interviewer-email <str> Ad-hoc interviewer email whose calendar to check. Use --interviewer-user-id when the interviewer is a platform member/reviewer; falls back to │
│ the acting user's own calendar when neither is set. │
│ --duration <int range> [5<=x<=480] Duration in minutes, 5-480 (default 45). │
│ --days <int range> [1<=x<=30] How many days ahead of --from (default: today) to search (default 7). │
│ --from <str> Start date, YYYY-MM-DD, interpreted in the --timezone zone (default: today in that zone). --days counts forward from this date. Must be within │
│ 90 days of today (the backend rejects anything further out). │
│ --timezone <str> IANA timezone to compute business hours and display suggested times in, e.g. America/New_York (default: this machine's timezone, else UTC). │
│ --window-days <int> Booking-link preview: summarize every open time in a window of this many work days (10, 15, or 20; today is day 1). Overrides --days/--from. │
│ Mutually exclusive with --window-start/--window-end. │
│ --window-start <str> Booking-link preview: custom window start date, YYYY-MM-DD. Requires --window-end; mutually exclusive with --window-days. │
│ --window-end <str> Booking-link preview: custom window end date, YYYY-MM-DD. Requires --window-start. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews cancel¶
Usage: zero interviews cancel [OPTIONS] {interview_id}
Cancel a human interview from any non-terminal status.
Notifies the candidate (and the interviewer too, if it was scheduled).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Reason for cancellation (audit trail, shown to the candidate). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews complete¶
Usage: zero interviews complete [OPTIONS] {interview_id}
Mark a scheduled interview as completed.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews completed¶
Usage: zero interviews completed [OPTIONS]
Completed interviews with their latest feedback, newest first.
Read-only. `feedback_due` is yes when you have not left feedback on an
interview yet (`interviews feedback <interview_id>` adds it).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job-id <str> Filter by job UUID. │
│ --mine Only interviews where you were the interviewer. │
│ --search <str> Match on candidate name. │
│ --limit <int range> [1<=x<=200] Page size (max 200). [default: 50] │
│ --offset <int range> [x>=0] Rows to skip. [default: 0] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews create¶
Usage: zero interviews create [OPTIONS]
Create a human interview for an application.
Requires --interviewer-user-id OR --interviewer-email. Only one active
(non-terminal) human interview is allowed per application at a time;
the backend returns a conflict if one already exists. Once that
interview reaches a terminal status (completed, cancelled, declined,
expired), creating another succeeds and starts the next round -- the
backend auto-increments a `round` number per application, returned on
`interviews show`/`interviews list --json`. The job's `human_interview`
stage config may separately carry an advisory `expected_rounds`.
`--booking-link` (ZER-3774) sends one link the candidate uses to book
any open time on the interviewer's calendar, inside a window --
`--window-days` (10/15/20, default 10) or a custom
`--window-start`/`--window-end`. Without `--booking-link`, behavior is
unchanged: propose up to 5 `--slot` times (or none, for later
`interviews propose-slots`).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --application-id <str> Application UUID. [required] │
│ --interviewer-user-id <str> Platform user UUID to interview (member or reviewer). │
│ --interviewer-email <str> Ad-hoc interviewer email. Use with --interviewer-name, or instead of --interviewer-user-id. │
│ --interviewer-name <str> Ad-hoc interviewer display name. │
│ --title <str> Interview title (default: 'Interview'). │
│ --duration <int range> [5<=x<=480] Duration in minutes, 5-480 (default 45). │
│ --location-type <str> video, phone, or onsite (default video). │
│ --location-details <str> Meeting URL, phone note, or physical address. │
│ --timezone <str> IANA timezone, e.g. America/New_York (default: this machine's timezone, else UTC). │
│ --message <str> Optional note shown to the candidate. │
│ --slot <str> Proposed start time, ISO8601 with timezone (repeatable, max 5). Passing any slots proposes them immediately and emails the candidate │
│ (status -> awaiting_candidate); omit to create in pending_slots and propose later with `interviews propose-slots`. Mutually exclusive with │
│ --booking-link. │
│ --booking-link Send one link so the candidate books any open time on the interviewer's calendar, instead of picking from --slot times (status -> │
│ awaiting_candidate immediately, no slot rows). Requires the interviewer (else you, for an ad-hoc interviewer) to have an active calendar │
│ connection, or the backend 409s with no_calendar/needs_reauth. Mutually exclusive with --slot. │
│ --window-days <int> Booking-link window length in work days: 10, 15, or 20 (default 10; today counts as day 1). Only with --booking-link; mutually exclusive │
│ with --window-start/--window-end. │
│ --window-start <str> Booking-link custom window start date, YYYY-MM-DD, local to --timezone. Requires --window-end; mutually exclusive with --window-days. │
│ --window-end <str> Booking-link custom window end date, YYYY-MM-DD. Requires --window-start. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews feedback¶
Usage: zero interviews feedback [OPTIONS] {interview_id}
DEPRECATED: use `interviews scorecard` instead.
Leave a legacy 1-5 rating and/or note tied to this interview. Provide
--rating and/or --note (at least one is required). Looks up the
interview's application_id automatically.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --rating <int range> [1<=x<=5] Rating 1-5. │
│ --note <str> Free-text feedback note. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews feedback-list¶
Usage: zero interviews feedback-list [OPTIONS] {application_id}
Every scorecard left on one application (plus earlier legacy ratings).
Read-only. Scorecards from other interviewers stay hidden until you submit
your own; the output says how many are hidden.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours¶
Usage: zero interviews hours [OPTIONS] COMMAND [ARGS]...
Interviewer working hours, date overrides and public holidays.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show weekly hours, date overrides and public-holiday settings. │
│ set Set weekly interview hours, timezone and/or holiday country. │
│ set-rules Set booking rules: notice, buffer, start-time interval, daily limit, change cut-off. │
│ override-add Add or replace a one-day override of the weekly hours. │
│ override-remove Remove a date override, restoring the weekly hours for that day. │
│ holiday-countries List country codes usable with `interviews hours set --holiday-country`. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours holiday-countries¶
Usage: zero interviews hours holiday-countries [OPTIONS]
List country codes usable with `interviews hours set --holiday-country`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours override-add¶
Usage: zero interviews hours override-add [OPTIONS] {date}
Add or replace a one-day override of the weekly hours.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * date <str> Date, YYYY-MM-DD (interviewer-local). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --hours <str> Hours that day: HH:MM-HH:MM[,HH:MM-HH:MM], or 'off' (default) to block the whole day. Replaces any existing override for that date. [default: off] │
│ --note <str> Optional reason (max 500 chars), e.g. 'Vacation'. │
│ --user-id <str> Colleague's user UUID (owner/member only). Default: you. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours override-remove¶
Usage: zero interviews hours override-remove [OPTIONS] {override_id}
Remove a date override, restoring the weekly hours for that day.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * override_id <str> Override UUID (from `interviews hours show --json`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours set¶
Usage: zero interviews hours set [OPTIONS]
Set weekly interview hours, timezone and/or holiday country.
Reads the current settings first and changes only what you pass, so
`--day fri=09:00-13:00` leaves every other day as it was. The backend
replaces the whole schedule on write; times are 24h on a 15-minute grid.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --day <str> Repeatable. <day>=<HH:MM-HH:MM[,HH:MM-HH:MM]|off>, e.g. mon=09:00-12:00,13:00-17:00 or sat=off. Day is mon..sun, 'weekdays' or 'weekend'. Days you do not name keep │
│ their current hours. │
│ --timezone <str> IANA zone the hours are in (e.g. Europe/Warsaw). │
│ --holiday-country <str> 2-letter country code whose public holidays are skipped, or 'none' to stop skipping. See `interviews hours holiday-countries`. │
│ --user-id <str> Colleague's user UUID (owner/member only). Default: you. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours set-rules¶
Usage: zero interviews hours set-rules [OPTIONS]
Set booking rules: notice, buffer, start-time interval, daily limit, change cut-off.
Changes only the rules you pass; the others (and the weekly hours) stay as
they are. Applies to every booking link for that interviewer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --min-notice <str> Earliest a candidate can book: 1h, 2h, 4h, 8h, 12h, 24h or 48h (or the same in minutes: 60, 120, 240, 480, 720, 1440, 2880). │
│ --buffer <int> Minutes kept free around each interview: 0, 5, 10, 15, 30, 45 or 60. │
│ --step <int> Start-time interval in minutes: 15, 30 or 60. │
│ --daily-cap <str> Most interviews per day, 1-10, or 'none' for no limit. │
│ --change-cutoff <str> Hours before the interview when candidates can no longer reschedule or cancel themselves: 2, 4, 12, 24, 48, or 'none'. │
│ --user-id <str> Colleague's user UUID (owner/member only). Default: you. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews hours show¶
Usage: zero interviews hours show [OPTIONS]
Show weekly hours, date overrides and public-holiday settings.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --user-id <str> Colleague's user UUID (owner/member only). Default: you. │
│ --timezone <str> IANA zone to show when nothing is saved yet (ignored once saved). │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews legacy-feedback¶
Usage: zero interviews legacy-feedback [OPTIONS] {application_id}
The raw legacy 1-5 rating/note records left on one application.
Read-only. Distinct from `interviews feedback-list`: this is the audit
record itself (feedback_id, author, which interview it was tied to, when
it was last updated) rather than the merged scorecards+legacy view --
use `feedback-list` for the everyday read, this one when you need the
underlying record. Deprecated server-side for new writes (superseded by
scorecards), but still the only source for feedback left before the
scorecard switch-over.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews list¶
Usage: zero interviews list [OPTIONS]
List human interviews, newest first (soonest-first with --upcoming).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job-id <str> Filter by job UUID. │
│ --application-id <str> Filter by application UUID. │
│ --status <str> Filter by status: awaiting_candidate, cancelled, completed, declined, expired, no_show, pending_slots, scheduled. │
│ --upcoming Only scheduled interviews with a future start time, soonest first. │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews needs-reply¶
Usage: zero interviews needs-reply [OPTIONS]
Interviews still waiting for the candidate to pick a time, oldest first.
Read-only. Use it to find who needs a nudge (`interviews nudge`) or new
slots (`interviews propose-slots`).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job-id <str> Filter by job UUID. │
│ --interviewer-user-id <str> Filter by interviewer user UUID. │
│ --search <str> Match on candidate name. │
│ --limit <int range> [1<=x<=200] Page size (max 200). [default: 50] │
│ --offset <int range> [x>=0] Rows to skip. [default: 0] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews no-show¶
Usage: zero interviews no-show [OPTIONS] {interview_id}
Mark a scheduled interview whose start has passed as a no-show.
ZER-3835. Terminal, like cancelled: it frees the application for a
replacement interview and does not consume a round. No email is sent to
the candidate. The backend returns HTTP 409 `invalid_state` if the
interview is not `scheduled`, or `not_started` if its start time has not
passed yet -- relay that rather than retrying. There is no undo.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --note <str> Optional note for the record (max 2000 chars). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews nudge¶
Usage: zero interviews nudge [OPTIONS] {interview_id}
Re-send the candidate's scheduling link for an interview.
Sends exactly one reminder email pointing the candidate back at their
existing pick link -- it does NOT propose new slots or change anything
about the interview. Use this for "nudge them" / "remind them to pick a
time" requests instead of re-running `interviews propose-slots` or
`interviews reschedule` with the same slots, which would re-propose
(and could reset) the offer rather than just re-emailing it.
Only valid while the interview is `awaiting_candidate` (slots already
proposed, no pick yet); the backend returns HTTP 409 with a
plain-English reason otherwise (e.g. already scheduled, or no slots
proposed yet) -- relay that message to the operator rather than
retrying or falling back to reschedule. Not confirmation-gated (no
`--yes`): it sends one email the operator explicitly asked for, the
same as the initial proposal.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews propose-slots¶
Usage: zero interviews propose-slots [OPTIONS] {interview_id}
Propose (or replace) slots on an interview and email the candidate.
Allowed from pending_slots, awaiting_candidate, declined, or expired.
Any previously proposed (not yet selected) slots are withdrawn. Moves
the interview to awaiting_candidate.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --slot <str> Proposed start time, ISO8601 with timezone (repeatable, 1-5). [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews reschedule¶
Usage: zero interviews reschedule [OPTIONS] {interview_id}
Reschedule a scheduled (or awaiting_candidate) interview.
Clears any existing selection and notifies the candidate of the change.
With `--slot` (unchanged from before, 1-5 new proposed times), moves the
interview back to awaiting_candidate with those slots.
`--booking-link` (ZER-3799) sends one new link instead, so the candidate
books any open time on the interviewer's calendar within a window --
`--window-days` (10/15/20, default 10) or a custom
`--window-start`/`--window-end` -- same options as `interviews create
--booking-link`. Mutually exclusive with --slot.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --slot <str> New proposed start time, ISO8601 with timezone (repeatable, 1-5). Mutually exclusive with --booking-link. │
│ --booking-link Send one link so the candidate books any open time on the interviewer's calendar, instead of picking from --slot times. Requires the interviewer │
│ (else you, for an ad-hoc interviewer) to have an active calendar connection, or the backend 409s with no_calendar/needs_reauth. Mutually │
│ exclusive with --slot. │
│ --window-days <int> Booking-link window length in work days: 10, 15, or 20 (default 10; today counts as day 1). Only with --booking-link; mutually exclusive with │
│ --window-start/--window-end. │
│ --window-start <str> Booking-link custom window start date, YYYY-MM-DD, local to --timezone. Requires --window-end; mutually exclusive with --window-days. Only with │
│ --booking-link. │
│ --window-end <str> Booking-link custom window end date, YYYY-MM-DD. Requires --window-start. Only with --booking-link. │
│ --duration <int range> [5<=x<=480] Duration in minutes, 5-480. Only with --booking-link. │
│ --location-type <str> video, phone, or onsite. Only with --booking-link. │
│ --location-details <str> Meeting URL, phone note, or physical address. Only with --booking-link. │
│ --timezone <str> IANA timezone, e.g. America/New_York (default: this machine's timezone, else UTC). Only with --booking-link. │
│ --message <str> Optional note shown to the candidate. Only with --booking-link. │
│ --reason <str> Reason for the reschedule (shown to the candidate). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews scorecard¶
Usage: zero interviews scorecard [OPTIONS] {interview_id}
Submit your scorecard for a human interview (replaces `interviews feedback`).
Scores each attribute of the job's scorecard template (see `interviews
scorecard-templates`) 1-5 plus an overall recommendation. Attribute names
match case-insensitively; a 1-based position number also works. If you
already submitted a scorecard for this interview it is updated in place.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Human interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --recommendation <str> One of: strong_no, no, yes, strong_yes. [required] │
│ --score <str> "<attribute name or position>=<1-5>"; repeat once per template attribute. │
│ --note <str> "<attribute name or position>=<text>"; optional per-attribute note. │
│ --summary <str> Overall summary. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews scorecard-templates¶
Usage: zero interviews scorecard-templates [OPTIONS]
List the employer's scorecard templates and their attributes.
Read-only.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
interviews show¶
Usage: zero interviews show [OPTIONS] {interview_id}
Show a human interview, including proposed/selected slots.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
invite¶
Usage: zero invite [OPTIONS] COMMAND [ARGS]...
Invite candidates for AI interviews.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ send Invite candidates to AI interviews for a job. │
│ cancel Cancel a pending interview invite (revert primitive, ZER-660). │
│ manual Manually invite candidates by email (not from existing applicant pool). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
invite cancel¶
Usage: zero invite cancel [OPTIONS] {interview_id}
Cancel a pending interview invite (revert primitive, ZER-660).
Only valid while the interview is still in `invited` status --
started, finished, or already-cancelled interviews are rejected by
the backend with a 409.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * interview_id <str> Interview UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Reason for cancellation (audit trail). │
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
invite manual¶
Usage: zero invite manual [OPTIONS]
Manually invite candidates by email (not from existing applicant pool).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --job-id <str> Job UUID [required] │
│ * --email <str> Candidate email (repeatable) [required] │
│ * --first-name <str> First name (one per email) [required] │
│ * --last-name <str> Last name (one per email) [required] │
│ --phone <str> Candidate phone for AI Telephony invites (repeatable, E.164 preferred) │
│ --interview-type <str> Interview type (realtime, phone_call, video, telephony, ai_telephony) [default: realtime] │
│ --avatar-id <str> Video avatar UUID. Defaults to Jenny's video avatar for video interviews. │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
invite send¶
Usage: zero invite send [OPTIONS] [job_id]
Invite candidates to AI interviews for a job.
Use --candidate to invite specific candidates by number or UUID.
`--demo` is retired (ZER-2536 / ZER-2673) and only prints a pointer;
fill a demo pipeline with `zero demo populate <job_id> --scale auto`.
Bulk selection (mutually exclusive with each other, but all compose
with `--candidate` being absent): `--top N`, `--min-score X`, `--all`.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_id <str> Job UUID (uses current job if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --candidate <str> Candidate number (1-based) or application UUID (repeatable) │
│ --top <int> Invite the top N candidates by score (highest first). │
│ --min-score <float> Invite every candidate with score >= N. │
│ --all Invite every candidate who hasn't already been interviewed. │
│ --interview-type <str> Interview type (realtime, phone_call, video, telephony, ai_telephony) [default: realtime] │
│ --avatar-id <str> Video avatar UUID. Defaults to Jenny's video avatar for video interviews. │
│ --demo [Retired] Use 'zero demo populate <job_id> --scale auto' instead │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs¶
Usage: zero jobs [OPTIONS] COMMAND [ARGS]...
List and switch between jobs.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List all your jobs (sorted by creation date, newest first). │
│ current Print the resolved current job and where the pointer came from. │
│ use Switch to a different job (makes it the default for all commands). │
│ show Show full details for a job: JD, status, applicant count, dashboard URL. │
│ requisition Full requisition summary for ONE role, in a single call (ZER-3448): │
│ JD, screening questions, hiring-flow (stage) config, and pipeline │
│ counts. │
│ delete Delete a job. │
│ close Close a job without deleting it. │
│ reopen Reopen a role you previously closed (ZER-3305). │
│ timeline Show everything that happened on this job, in order. │
│ invite-candidates Add existing candidates (from `candidates list`) to this job's normal │
│ sourcing/outreach pipeline (ZER-2732). │
│ approve-description Record that a named human approves this job's CURRENT description │
│ text (ZER-1866/ZER-2489) -- the human floor for jobs created outside │
│ the hiring pipeline (the pipeline's own `awaiting_jd` phase records │
│ this automatically for jobs run through it). │
│ talent-pool Talent-pool candidates (applied elsewhere) scored against this job (ZER-3215). │
│ followup-rules Set up and manage scheduled follow-up emails or text messages to candidates already in a job's pipeline. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs approve-description¶
Usage: zero jobs approve-description [OPTIONS] {JOB_REF}
Record that a named human approves this job's CURRENT description text (ZER-1866/ZER-2489) -- the human floor for jobs created outside the hiring pipeline (the pipeline's own `awaiting_jd` phase
records this automatically for jobs run through it).
Only call this immediately after a real human has actually read the
job's current description and said yes -- it attributes the approval
to a named person on the audit record, exactly like a `hire`/`offer`
confirmation. It records the text as it reads right now; it does not
accept new description text.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --approver-user-id <str> The human who approved this, when calling as a trusted proxy on their behalf. Verified against this job's employer server-side. Omit to attribute the approval to │
│ the authenticated caller. │
│ --yes -y Skip the confirmation prompt │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs close¶
Usage: zero jobs close [OPTIONS] {JOB_REF}
Close a job without deleting it.
The role stops being publicly listed, stops accepting applications and
stops any outreach or sourcing running on it, but stays in your lists
as a closed role with every application and interview intact. Use this
when a role is filled or paused; use ``jobs delete`` to archive it out
of your lists entirely. Closing an already-closed job is harmless.
A role that still owes its close fee (a hire whose fee hasn't cleared
yet) is refused until the fee is settled; the error says so.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Optional free-text reason, kept on the job (e.g. 'filled', 'budget cut') │
│ --yes -y Skip the confirmation prompt │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --expect-id <str> Assert the resolved job matches this UUID or short ID │
│ --expect-title <str> Assert the resolved job's title contains this substring (case-insensitive) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs current¶
Usage: zero jobs current [OPTIONS]
Print the resolved current job and where the pointer came from.
Useful when debugging a shared-token setup: you can see at a glance
whether the selection is coming from ``ZERO_JOB_ID``, local config, or a
legacy server-side value.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs delete¶
Usage: zero jobs delete [OPTIONS] {JOB_REF}
Delete a job.
This soft-deletes the job: it is removed from all listings and cannot be
interacted with, but existing applications and interview records are
retained in the database for audit purposes.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --yes -y Skip the confirmation prompt │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --expect-id <str> Assert the resolved job matches this UUID or short ID │
│ --expect-title <str> Assert the resolved job's title contains this substring (case-insensitive) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules¶
Usage: zero jobs followup-rules [OPTIONS] COMMAND [ARGS]...
Set up and manage scheduled follow-up emails or text messages to candidates already in a job's pipeline.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Create a follow-up rule for this job's pipeline. │
│ list List follow-up rules on this job's pipeline. │
│ pause Pause a follow-up rule. Already-scheduled sends for it are stopped; `resume` restarts it. │
│ resume Resume a paused follow-up rule from its next scheduled check. │
│ delete Delete a follow-up rule. Pending sends for it are stopped; already-sent emails stay on record. │
│ preview Show who this rule would email right now, plus a rendered sample email. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules create¶
Usage: zero jobs followup-rules create [OPTIONS] {JOB_ID}
Create a follow-up rule for this job's pipeline.
Does not send anything by itself: the rule schedules future sends,
eligibility is rechecked candidate-by-candidate right before each send,
and nothing goes out until a mailbox is connected (check
`sending_identity_ready` on `preview`/`list`).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_ID <str> Job UUID or short ID (as shown by `jobs list`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --name <str> Human-readable name for the rule. [required] │
│ * --trigger <str> What makes a candidate due for this follow-up: one of stage_age, ai_interview_not_started. `stage_age` needs --stage; `ai_interview_not_started` │
│ fires on anyone invited to the AI interview who hasn't started it yet. │
│ [required] │
│ --stage <str> Pipeline stage to watch, required for --trigger stage_age. One of applied, resume_assessment, ai_interview, reference_interview, human_interview. │
│ --stage-status <str> Whether min-days counts from entering or completing the stage. One of entered, completed (default entered). [default: entered] │
│ * --min-days <int range> [0<=x<=365] Days before this rule fires (0-365). [required] │
│ --schedule <str> One of once, weekly (default once). `weekly` requires --weekday and --time. [default: once] │
│ --weekday <int range> [0<=x<=6] 0=Monday .. 6=Sunday. Required for --schedule weekly. │
│ --time <str> Send time, 24-hour HH:MM. Required for --schedule weekly. │
│ --timezone <str> IANA timezone name for --time, e.g. Europe/Warsaw. [default: UTC] │
│ --subject <str> Email subject template, required for --channel email (not used for sms). See module docs for allowed {{placeholder}} tokens. │
│ * --body <str> Email body, or for --channel sms the text message (max 300 characters). See module docs for allowed {{placeholder}} tokens. [required] │
│ --channel <str> email (default) or sms: a text message, sent only to candidates who agreed to texts when they applied, never 21:00-08:00 their local time. │
│ [default: email] │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules delete¶
Usage: zero jobs followup-rules delete [OPTIONS] {JOB_ID} {RULE_ID}
Delete a follow-up rule. Pending sends for it are stopped; already-sent emails stay on record.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_ID <str> Job UUID or short ID. [required] │
│ * RULE_ID <str> Follow-up rule UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules list¶
Usage: zero jobs followup-rules list [OPTIONS] {JOB_ID}
List follow-up rules on this job's pipeline.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_ID <str> Job UUID or short ID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules pause¶
Usage: zero jobs followup-rules pause [OPTIONS] {JOB_ID} {RULE_ID}
Pause a follow-up rule. Already-scheduled sends for it are stopped; `resume` restarts it.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_ID <str> Job UUID or short ID. [required] │
│ * RULE_ID <str> Follow-up rule UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules preview¶
Usage: zero jobs followup-rules preview [OPTIONS] {JOB_ID} {RULE_ID}
Show who this rule would email right now, plus a rendered sample email.
Works on a paused rule too, so you can check "what would happen if I
resume this" before doing so. `sending_identity_ready: false` means no
mailbox is connected yet -- nothing will actually send until one is.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_ID <str> Job UUID or short ID. [required] │
│ * RULE_ID <str> Follow-up rule UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --application-id <str> Render the sample email for this candidate instead of the first match. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs followup-rules resume¶
Usage: zero jobs followup-rules resume [OPTIONS] {JOB_ID} {RULE_ID}
Resume a paused follow-up rule from its next scheduled check.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_ID <str> Job UUID or short ID. [required] │
│ * RULE_ID <str> Follow-up rule UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs invite-candidates¶
Usage: zero jobs invite-candidates [OPTIONS] {JOB_REF}
Add existing candidates (from `candidates list`) to this job's normal sourcing/outreach pipeline (ZER-2732).
Always succeeds on a well-formed request: a candidate that can't be
added shows up in `skipped` with a reason (already on this job, not
found, wrong employer, or no usable email) instead of failing the call.
If this job has a default outreach sequence, each newly-added candidate
with a usable email is auto-enrolled and may get the first email right
away -- the same real-world effect as `outreach enroll`, so this
requires an explicit human --yes exactly like that command.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --applicant <str> Applicant UUID to add (repeat for multiple; 1-500 per call). [required] │
│ --yes -y Skip the confirmation prompt │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs list¶
Usage: zero jobs list [OPTIONS]
List all your jobs (sorted by creation date, newest first).
All filters compose (``--mine --tag backend --since 2026-04-01``). When
``--json`` is passed, the payload after filtering/sorting is printed
(enriched with the derived ``short_id``) so scripts can keep reading it.
Rows carry ``description_chars`` rather than the description body. A row
with ``description_omitted: true`` HAS a description -- it just is not in
this payload; read it with ``zero jobs show <job>``. ``--with-description``
opts the whole list back in, at the size cost described on that flag.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --active-only Show only active jobs │
│ --mine Show only jobs you created. Requires the backend to expose `created_by_user_id` (ZER-563); if it doesn't, a warning is printed to stderr and all employer jobs are │
│ shown. │
│ --tag <str> Filter to jobs tagged [<name>] in the title (case-insensitive). │
│ --since <str> ISO date (e.g. 2026-04-01). Keep jobs created on/after this date. │
│ --search <str> Case-insensitive substring match on job title or location. This filter runs locally and does NOT look inside job descriptions -- to search description text use │
│ `zero internal jobs list --search <term>`, which matches server-side. │
│ --with-description Include each job's full description body. Off by default: descriptions average ~4 kB, so a few dozen jobs is enough to blow past an agent's tool-result limit. │
│ Prefer `zero jobs show <job>` for one description, or `zero internal jobs list --search <term>` to find jobs by description text. │
│ --client-id <str> Filter to jobs belonging to an RPO client UUID. │
│ --sort <str> Sort by: created, title, applicants, status. │
│ --order <str> Sort direction: asc, desc. Only used with --sort. [default: desc] │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs reopen¶
Usage: zero jobs reopen [OPTIONS] {JOB_REF}
Reopen a role you previously closed (ZER-3305).
Makes the role publicly listed and open to applications again -- the
counterpart to ``jobs close``, for a role closed by mistake or one
that later found more budget. Reopening an already-active job is
harmless.
A role that was never paid for in the first place (its checkout was
never completed) can't be reopened until it's paid -- the error says
so. A role that WAS paid and later closed reopens with no new charge.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --yes -y Skip the confirmation prompt │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --expect-id <str> Assert the resolved job matches this UUID or short ID │
│ --expect-title <str> Assert the resolved job's title contains this substring (case-insensitive) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs requisition¶
Usage: zero jobs requisition [OPTIONS] [job_ref]
Full requisition summary for ONE role, in a single call (ZER-3448): JD, screening questions, hiring-flow (stage) config, and pipeline counts.
Use this INSTEAD of `jobs show` + `hiring-flow show` + `applications
stage-counts` for "summarize the requisition for role X" -- that fan-out
is exactly the shape this endpoint replaces, and it is also the first
read path this CLI has ever had for screening questions after they were
saved (previously only echoed back by `internal jobs create/update`,
never readable afterwards).
Defaults to the currently-selected job when no argument is given.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_ref <str> Job number (from 'zero jobs list') or job UUID. Defaults to current job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs show¶
Usage: zero jobs show [OPTIONS] [job_ref]
Show full details for a job: JD, status, applicant count, dashboard URL.
If the job is unpaid we also surface the short payment link (so the user
can finish activating the role without having to dig through email).
Defaults to the currently-selected job when no argument is given.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_ref <str> Job number (from 'zero jobs list') or job UUID. Defaults to current job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs talent-pool¶
Usage: zero jobs talent-pool [OPTIONS] COMMAND [ARGS]...
Talent-pool candidates (applied elsewhere) scored against this job (ZER-3215).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List candidates who applied to a DIFFERENT role and were scored against │
│ this one (ZER-3215) -- people already reachable about this role under a │
│ recorded lawful basis (`reuse_basis` on each row), without a new sourcing │
│ search. `--view all` also shows rows already dismissed on this job. │
│ dismiss Mark one talent-pool match "not a fit for this role" (ZER-3703). │
│ undismiss Undo a `talent-pool dismiss` (ZER-3703): the match returns to the │
│ default `talent-pool list` view if it still otherwise qualifies. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs talent-pool dismiss¶
Usage: zero jobs talent-pool dismiss [OPTIONS] {JOB_REF} {match_id}
Mark one talent-pool match "not a fit for this role" (ZER-3703).
Hides it from this job's default `talent-pool list` only -- the
candidate's other applications, matches on other jobs, and consent are
untouched. Reversible with `talent-pool undismiss`. Idempotent.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
│ * match_id <str> Talent-pool match UUID (from `talent-pool list`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs talent-pool list¶
Usage: zero jobs talent-pool list [OPTIONS] {JOB_REF}
List candidates who applied to a DIFFERENT role and were scored against this one (ZER-3215) -- people already reachable about this role under a recorded lawful basis (`reuse_basis` on each row),
without a new sourcing search. `--view all` also shows rows already dismissed on this job.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --view <str> 'default' (curated, non-dismissed, top-scoring) or 'all' (every row, dismissed included). [default: default] │
│ --limit <int> Max rows to return (1-200). [default: 50] │
│ --offset <int> Only used with --view all. [default: 0] │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs talent-pool undismiss¶
Usage: zero jobs talent-pool undismiss [OPTIONS] {JOB_REF} {match_id}
Undo a `talent-pool dismiss` (ZER-3703): the match returns to the default `talent-pool list` view if it still otherwise qualifies.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
│ * match_id <str> Talent-pool match UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs timeline¶
Usage: zero jobs timeline [OPTIONS] {JOB_REF}
Show everything that happened on this job, in order.
Merges job creation, stage changes, notes, interviews, scores, feedback,
ATS sync, AI decisions, and email outreach across every candidate on the
job into one reverse-chronological feed -- "what has happened on this
role". Use `candidates timeline <applicant_id>` instead when the question
is about one person, not the whole job.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID, full UUID, 1-based list number (deprecated), or title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID. Only needed for a system-key credential with no default employer (auto-scoped for a normal per-user CLI token). │
│ --page <int> Page number (1-based). [default: 1] │
│ --limit <int> Results per page. [default: 20] │
│ --since <str> Only events on or after this ISO-8601 datetime (or a date like 2026-09-01). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
jobs use¶
Usage: zero jobs use [OPTIONS] {JOB_REF}
Switch to a different job (makes it the default for all commands).
Prefer short IDs (printed by ``zero jobs list``) — they're derived from
the UUID and stay stable even when jobs are added or deleted. Numeric
list positions and title substrings still work, but positions shift and
substrings can match multiple jobs; scripts should use short IDs or UUIDs.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * JOB_REF <str> Short ID (from 'zero jobs list'), full UUID, 1-based list number (deprecated), or case-insensitive title substring [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --expect-id <str> Assert the resolved job matches this UUID or short ID │
│ --expect-title <str> Assert the resolved job's title contains this substring (case-insensitive) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
login¶
Usage: zero login [OPTIONS]
Log in or sign up. Uses device code flow by default.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --app-url <str> Override app URL (e.g. http://localhost:3300 for local testing) │
│ --browser Use browser callback flow instead of device code │
│ --token <str> Log in with an API token directly │
│ --no-wait Print device code and exit without waiting (for non-interactive use) │
│ --complete <str> Complete a pending device code login with the given session ID │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
logout¶
Usage: zero logout [OPTIONS]
Log out: revoke the CLI token server-side, then remove local credentials.
Best-effort: if the backend revocation fails (network error, already-revoked
token, etc.) we still wipe the local config so the CLI appears logged out.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers¶
Usage: zero offers [OPTIONS] COMMAND [ARGS]...
Inspect and manage offer letters.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List offers. Not yet supported by the backend. │
│ show Show a single offer by ID. │
│ cancel Withdraw an in-flight offer. │
│ create Draft an offer letter for an application. Sends nothing. │
│ update Edit a draft offer. Sends nothing. │
│ send Send a draft offer to the candidate for e-signature. │
│ template Offer letter template: show, edit, preview, import an existing letter, and list the {{variables}} a letter can use. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers cancel¶
Usage: zero offers cancel [OPTIONS] {offer_id}
Withdraw an in-flight offer.
Voids the e-signature document and emails the candidate that the offer
has been withdrawn. Only valid while the offer is in `sent` status.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * offer_id <str> Offer UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> Reason for cancellation (audit trail). │
│ --yes -y Skip the confirmation prompt. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers create¶
Usage: zero offers create [OPTIONS] {application_id}
Draft an offer letter for an application. Sends nothing.
Renders the offer template against the candidate and role and saves it
as a draft. Review it with `offers show`, adjust with `offers update`,
then deliver it with `offers send`. Nothing reaches the candidate until
`offers send`.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID to draft an offer for [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --guaranteed-cash-compensation <int> The hire's actual guaranteed annual cash compensation in whole USD dollars (base + signing + guaranteed bonus). Used for the close fee once the │
│ candidate signs. │
│ --low-evidence-reason <str> Why you are hiring on thin evidence: referral, known_candidate, rehire or other. Recorded on the application. │
│ --low-evidence-note <str> Free text, meaningful with reason 'other'. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers list¶
Usage: zero offers list [OPTIONS]
List offers. Not yet supported by the backend.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job <str> Job UUID to filter offers by. │
│ --status <str> Status to filter offers by (e.g. sent, signed). │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers send¶
Usage: zero offers send [OPTIONS] {offer_id}
Send a draft offer to the candidate for e-signature.
Candidate-facing: the candidate receives the offer by email, and their
signature marks them hired and triggers the close fee. Requires `--yes`
after explicit human approval in this turn; never invent it. The server
still refuses an incomplete offer (it returns the missing fields) and a
second in-flight offer on the same role unless `--force`.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * offer_id <str> Draft offer UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --force Send even when another offer for this role is still in flight. │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers show¶
Usage: zero offers show [OPTIONS] {offer_id}
Show a single offer by ID.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * offer_id <str> Offer UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers template¶
Usage: zero offers template [OPTIONS] COMMAND [ARGS]...
Offer letter template: show, edit, preview, import an existing letter, and list the {{variables}} a letter can use.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show the offer letter template (body and per-offer defaults). │
│ update Edit the offer letter template used for future offers. │
│ preview Render the template with sample candidate data and list what is missing. │
│ variables List the {{variables}} an offer letter body can use and where each comes from. │
│ import Convert an existing offer letter into a {{variable}} template body. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers template import¶
Usage: zero offers template import [OPTIONS] {file}
Convert an existing offer letter into a {{variable}} template body.
Nothing is saved unless you pass `--save`; review the returned body and
warnings first, then save it with `offers template update --body-file`.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * file <str> Path to an existing offer letter (PDF or Word) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --save Also save the converted body as the company offer template. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers template preview¶
Usage: zero offers template preview [OPTIONS]
Render the template with sample candidate data and list what is missing.
`missing_fields` names what must be set before an offer can be sent
(legal entity, compensation, start date, hiring manager, employment clause).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --client <str> Client UUID; omit for the company default. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers template show¶
Usage: zero offers template show [OPTIONS]
Show the offer letter template (body and per-offer defaults).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --client <str> Client UUID (RPO/white-label); omit for the company default. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers template update¶
Usage: zero offers template update [OPTIONS]
Edit the offer letter template used for future offers.
Pass only the fields to change; the rest are kept. Existing drafts and
sent offers are not rewritten. Run `offers template variables` for the
placeholders a body can use and `offers template preview` to check it.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --client <str> Client UUID; omit for the company default. │
│ --name <str> Template name │
│ --title <str> Letter title │
│ --body <str> Letter body with {{variable}} placeholders │
│ --body-file <str> Read the letter body from this file │
│ --compensation <str> Default compensation │
│ --start-date <str> Default start date │
│ --location <str> Default work location │
│ --employment-type <str> Default employment type │
│ --notes <str> Default notes │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers template variables¶
Usage: zero offers template variables [OPTIONS]
List the {{variables}} an offer letter body can use and where each comes from.
Source: generated, candidate, role, company (set in company settings),
or offer (entered per offer with `offers update`). A line whose variables
are all empty is dropped from the letter.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
offers update¶
Usage: zero offers update [OPTIONS] {offer_id}
Edit a draft offer. Sends nothing.
Only drafts can be edited; once an offer is sent, withdraw it with
`offers cancel` and draft a new one. Pass only the fields to change.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * offer_id <str> Offer UUID (must still be a draft) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --body <str> Full letter body text │
│ --body-file <str> Read the full letter body from this file │
│ --compensation <str> Compensation text │
│ --start-date <str> Start date │
│ --location <str> Work location │
│ --employment-type <str> Employment type │
│ --notes <str> Additional notes │
│ --equity-terms <str> Equity paragraph │
│ --bonus-terms <str> Bonus paragraph │
│ --conditions <str> Extra conditions │
│ --position-description <str> Role description paragraph │
│ --hiring-manager-name <str> Hiring manager who signs the letter │
│ --hiring-manager-title <str> Hiring manager's title │
│ --guaranteed-cash-compensation <int> Actual guaranteed annual cash compensation, whole USD dollars. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach¶
Usage: zero outreach [OPTIONS] COMMAND [ARGS]...
Multi-step candidate outreach sequences.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ enroll Enroll a shortlisted candidate into an outreach sequence. │
│ cancel Cancel an outreach enrollment (revert primitive, ZER-660). │
│ send-status Whether this employer is at today's outreach sending cap. │
│ throughput How many new people this employer can still contact this month. │
│ stats Show a sequence-level engagement rollup (sent/opened/clicked/replied). │
│ sequences Create and manage outreach sequences. │
│ enrollments View and control per-candidate enrollments. │
│ jobs Job-scoped outreach: results, preview variables, and the role's default sequence. │
│ company-sequence The employer's one company-wide default outreach sequence. │
│ linkedin-tasks LinkedIn manual-step outreach tasks. │
│ talent-pool Candidates reachable about a role they did not apply to. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach cancel¶
Usage: zero outreach cancel [OPTIONS] {enrollment_id}
Cancel an outreach enrollment (revert primitive, ZER-660).
Unlike ``outreach enrollments stop``, this is the support/ops-facing
"undo" for an enrollment: it works on `active` or `paused`
enrollments and can optionally burn bridges so the same candidate is
never re-enrolled into the same sequence/job again. Mirrors the
``offers cancel`` shape (top-level verb on the group's Typer app).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * enrollment_id <str> Enrollment UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --reason <str> Reason for cancellation (audit trail, max 2000 chars). │
│ --burn-bridges Also block this candidate from being re-enrolled into this sequence/job in the future (outreach_do_not_contact). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach company-sequence¶
Usage: zero outreach company-sequence [OPTIONS] COMMAND [ARGS]...
The employer's one company-wide default outreach sequence.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show the employer's one company-wide sequence, creating it on first use. │
│ reset Regenerate the company sequence's steps from the current template. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach company-sequence reset¶
Usage: zero outreach company-sequence reset [OPTIONS]
Regenerate the company sequence's steps from the current template.
Affects every role currently linked to it. In-flight enrollments keep
the step text they already started with; nothing already sent is
re-sent.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach company-sequence show¶
Usage: zero outreach company-sequence show [OPTIONS]
Show the employer's one company-wide sequence, creating it on first use.
Every new role links to this sequence unless it has its own; edit it
with `outreach sequences update` to change the template for every role
that uses it.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enroll¶
Usage: zero outreach enroll [OPTIONS] [shortlist_id]
Enroll a shortlisted candidate into an outreach sequence.
The candidate's email + personalization fields are snapshotted server-
side, so the sequence keeps working even if the underlying sourced
profile is later refreshed.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ shortlist_id <str> Legacy shortlist entry UUID. For a candidate already in the job's pipeline (anyone promoted with `sourcing add`, or any applicant), pass --application instead. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --sequence <str> Sequence UUID to enroll into. [required] │
│ --application <str> Application UUID (from `candidates list --json`) to enroll. This is the normal path: sourced candidates become applications the moment they are added to a job. │
│ --employer-id <str> │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enrollments¶
Usage: zero outreach enrollments [OPTIONS] COMMAND [ARGS]...
View and control per-candidate enrollments.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List enrollments, optionally filtered by sequence and/or status. │
│ pause Pause an enrollment — no further steps will send until resumed. │
│ resume Resume a previously paused enrollment. │
│ stop Permanently stop an enrollment. Terminal — not reversible via │
│ ``resume`` (enroll the candidate again if you really need to restart). │
│ stop-by-candidate Stop future outreach for a sourced candidate without discarding them. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enrollments list¶
Usage: zero outreach enrollments list [OPTIONS]
List enrollments, optionally filtered by sequence and/or status.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --sequence <str> Filter by sequence UUID. │
│ --status <str> Filter by status: active | paused | replied | stopped | completed. │
│ --limit <int range> [1<=x<=500] [default: 100] │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enrollments pause¶
Usage: zero outreach enrollments pause [OPTIONS] {enrollment_id}
Pause an enrollment — no further steps will send until resumed.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * enrollment_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enrollments resume¶
Usage: zero outreach enrollments resume [OPTIONS] {enrollment_id}
Resume a previously paused enrollment.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * enrollment_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enrollments stop¶
Usage: zero outreach enrollments stop [OPTIONS] {enrollment_id}
Permanently stop an enrollment. Terminal — not reversible via ``resume`` (enroll the candidate again if you really need to restart).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * enrollment_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach enrollments stop-by-candidate¶
Usage: zero outreach enrollments stop-by-candidate [OPTIONS] {candidate_ref}
Stop future outreach for a sourced candidate without discarding them.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * candidate_ref <str> Candidate name, email, number, or application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach jobs¶
Usage: zero outreach jobs [OPTIONS] COMMAND [ARGS]...
Job-scoped outreach: results, preview variables, and the role's default sequence.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ results Outreach counts across every sequence attached to this role. │
│ preview-variables Show how {{job_title}}, {{role_summary}} and {{company_name}} will │
│ render for this role -- the exact values a sequence send would use. │
│ default-sequence The one default outreach sequence attached to a job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach jobs default-sequence¶
Usage: zero outreach jobs default-sequence [OPTIONS] COMMAND [ARGS]...
The one default outreach sequence attached to a job.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ensure Attach this role's default sequence if it has none yet. │
│ reset Reset this role's default sequence steps to the recommended template. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach jobs default-sequence ensure¶
Usage: zero outreach jobs default-sequence ensure [OPTIONS] {job_id}
Attach this role's default sequence if it has none yet.
The first time this actually attaches a sequence (the role had none),
it also enrolls every candidate already sourced onto the role who isn't
enrolled yet, and starts sending them the first email right away. Safe
to re-run: a role that already has a sequence, or whose sourced
candidates are already all enrolled, reports zero newly enrolled.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID (or the short id shown by `jobs list`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --yes -y Required in JSON/MCP mode; skip the confirmation prompt. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach jobs default-sequence reset¶
Usage: zero outreach jobs default-sequence reset [OPTIONS] {job_id}
Reset this role's default sequence steps to the recommended template.
Only rewrites step wording and cadence; it never enrolls or re-enrolls
anyone. Rejected (409) if this role shares the employer's one
company-wide sequence -- reset that instead with
`outreach company-sequence reset`, since it is shared by every role
that has no sequence of its own.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID (or the short id shown by `jobs list`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach jobs preview-variables¶
Usage: zero outreach jobs preview-variables [OPTIONS] {job_id}
Show how {{job_title}}, {{role_summary}} and {{company_name}} will render for this role -- the exact values a sequence send would use.
Check this before activating a sequence that uses those placeholders.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID (or the short id shown by `jobs list`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach jobs results¶
Usage: zero outreach jobs results [OPTIONS] {job_id}
Outreach counts across every sequence attached to this role.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * job_id <str> Job UUID (or the short id shown by `jobs list`). [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach linkedin-tasks¶
Usage: zero outreach linkedin-tasks [OPTIONS] COMMAND [ARGS]...
LinkedIn manual-step outreach tasks.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List LinkedIn manual-step outreach tasks waiting on a recruiter. │
│ complete Mark a LinkedIn manual-step task sent and resume the sequence. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach linkedin-tasks complete¶
Usage: zero outreach linkedin-tasks complete [OPTIONS] {task_id}
Mark a LinkedIn manual-step task sent and resume the sequence.
Call this right after you have sent the pre-written message yourself,
from your own LinkedIn account -- this command does not send anything
on your behalf, it only records that it was sent and lets the sequence
continue to its next step.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * task_id <str> LinkedIn task UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach linkedin-tasks list¶
Usage: zero outreach linkedin-tasks list [OPTIONS]
List LinkedIn manual-step outreach tasks waiting on a recruiter.
Each row is one pre-written message a sequence step wants sent from a
recruiter's own LinkedIn account; mark it done with
`outreach linkedin-tasks complete` once you've actually sent it.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job <str> Filter to one job UUID (or short id). │
│ --status <str> Filter by status: pending | done | cancelled. │
│ --limit <int range> [1<=x<=500] [default: 100] │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach send-status¶
Usage: zero outreach send-status [OPTIONS]
Whether this employer is at today's outreach sending cap.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences¶
Usage: zero outreach sequences [OPTIONS] COMMAND [ARGS]...
Create and manage outreach sequences.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ example-steps Print a working 3-step Day 0/3/7 starter template. │
│ create Create a multi-step sequence from a JSON step file or inline JSON. │
│ list List outreach sequences for the current employer. │
│ show Show a sequence's header and steps. │
│ update Edit an existing sequence. Pass only the fields to change. │
│ results Enrollment/reply/interview counts for one sequence, by step. │
│ activate Activate a sequence so it can accept new enrollments. │
│ deactivate Deactivate a sequence. Existing enrollments keep running; new │
│ enrollments are rejected until re-activated. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences activate¶
Usage: zero outreach sequences activate [OPTIONS] {sequence_id}
Activate a sequence so it can accept new enrollments.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * sequence_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences create¶
Usage: zero outreach sequences create [OPTIONS]
Create a multi-step sequence from a JSON step file or inline JSON.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --name <str> Human-readable name for the sequence. [required] │
│ --from-file <str> Path to a JSON file with the step list. Use '-' to read from stdin. │
│ --steps-json,--steps <str> Inline JSON array or {'steps': [...]} object. Prefer this for MCP/Jenny. │
│ --description <str> Optional internal description. │
│ --job <str> Scope this sequence to a job UUID (optional). │
│ --sender-email <str> From-address (stubbed; falls back to platform sender). │
│ --sender-name <str> From-name. │
│ --reply-to <str> Reply-To address for candidate replies. │
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences deactivate¶
Usage: zero outreach sequences deactivate [OPTIONS] {sequence_id}
Deactivate a sequence. Existing enrollments keep running; new enrollments are rejected until re-activated.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * sequence_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences example-steps¶
Usage: zero outreach sequences example-steps [OPTIONS]
Print a working 3-step Day 0/3/7 starter template.
Pipe this straight into a file and then into ``sequences create``:
zero outreach sequences example-steps --json > steps.json
zero outreach sequences create --name 'Founder intro' --from-file steps.json
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output (convenient for `... > steps.json`). │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences list¶
Usage: zero outreach sequences list [OPTIONS]
List outreach sequences for the current employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job <str> Filter by job UUID (still shows employer-wide sequences too). │
│ --limit <int range> [1<=x<=500] [default: 100] │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences results¶
Usage: zero outreach sequences results [OPTIONS] {sequence_id}
Enrollment/reply/interview counts for one sequence, by step.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * sequence_id <str> Sequence UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences show¶
Usage: zero outreach sequences show [OPTIONS] {sequence_id}
Show a sequence's header and steps.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * sequence_id <str> Sequence UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach sequences update¶
Usage: zero outreach sequences update [OPTIONS] {sequence_id}
Edit an existing sequence. Pass only the fields to change.
The step list is only replaced when you pass ``--from-file`` or
``--steps-json``; omit both to keep the current steps as-is. Editing an
active sequence changes what the NEXT unsent step says for everyone
enrolled in it -- it does not re-send anything already delivered.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * sequence_id <str> Sequence UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --name <str> New name for the sequence. │
│ --from-file <str> Path to a JSON file with the replacement step list. Use '-' for stdin. │
│ --steps-json,--steps <str> Inline JSON array or {'steps': [...]} to replace the step list. Prefer this for MCP/Jenny. │
│ --description <str> New description. │
│ --job <str> Re-scope this sequence to a different job UUID. │
│ --sender-email <str> New from-address. │
│ --sender-name <str> New from-name. │
│ --reply-to <str> New Reply-To address for candidate replies. │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach stats¶
Usage: zero outreach stats [OPTIONS] {sequence_id}
Show a sequence-level engagement rollup (sent/opened/clicked/replied).
Aggregates client-side over all enrollments for the sequence — the
backend already returns per-enrollment engagement counts in the list
endpoint, so a dedicated stats endpoint isn't needed yet.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * sequence_id <str> Sequence UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach talent-pool¶
Usage: zero outreach talent-pool [OPTIONS] COMMAND [ARGS]...
Candidates reachable about a role they did not apply to.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list Candidates this employer may contact about a role they did not apply to. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach talent-pool list¶
Usage: zero outreach talent-pool list [OPTIONS]
Candidates this employer may contact about a role they did not apply to.
Each row ticked the explicit cross-role opt-in on another employer's
apply form; an unticked box excludes that candidate from this list
entirely.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --limit <int range> [1<=x<=200] [default: 50] │
│ --offset <int range> [x>=0] [default: 0] │
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
outreach throughput¶
Usage: zero outreach throughput [OPTIONS]
How many new people this employer can still contact this month.
The same number the sourcing allocator plans against -- sourcing more
profiles than this can reach builds a backlog, not a pipeline.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected). │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
payments¶
Usage: zero payments [OPTIONS] COMMAND [ARGS]...
Refund charges (approval-gated).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ refund Refund a charge (revert primitive, ZER-660). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
payments refund¶
Usage: zero payments refund [OPTIONS] {charge_id}
Refund a charge (revert primitive, ZER-660).
This is irreversible real-money movement. Beyond the ordinary
confirmation prompt (skippable with --yes/--force), this command
ALWAYS interactively prompts for a human approver name/handle and
sends it to the backend as `approved_by` -- the backend itself
rejects the request with 400 if `approved_by` is missing or blank,
and the CLI enforces the same rule client-side before ever making
the request (see `_prompt_refund_approval`).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * charge_id <str> Payment charge ID for the role-open or close fee to refund. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login). │
│ --reason <str> Reason for the refund (audit trail). │
│ --yes,--force -y Skip the ordinary 'are you sure?' confirmation. Does NOT skip the mandatory human-approval capture below -- refunds always require a live human to type their │
│ name/handle, even with --yes/--force. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline¶
Usage: zero pipeline [OPTIONS] COMMAND [ARGS]...
Run and inspect end-to-end hiring pipeline runs.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ run Create a pipeline run for a job. │
│ status Show one pipeline run. │
│ list List recent pipeline runs. │
│ summary Show the candidate pipeline across all roles in one call. │
│ role-activity Per-role last-activity timestamp + pipeline state, plus cross-role │
│ totals, in one call (ZER-3441). │
│ advance Advance a pipeline run after approval. │
│ autopilot Show or set Autopilot (experimental) for the employer. │
│ abort Abort a pipeline run. │
│ pending-approvals List pipeline runs waiting on a human approval right now. │
│ record-approval Record a human decision on a pipeline run's current phase and advance │
│ (or halt) the run accordingly. │
│ set-slack-thread Record the Slack thread a pipeline run's future updates should post │
│ into (ZER-662). Called by the Jenny bridge when a run starts from Slack. │
│ reports Schedule a recurring pipeline report (daily or weekly). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline abort¶
Usage: zero pipeline abort [OPTIONS] {run_id}
Abort a pipeline run.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * run_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --reason <str> │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline advance¶
Usage: zero pipeline advance [OPTIONS] {run_id}
Advance a pipeline run after approval.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * run_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --approve <str> Approve the current phase. │
│ --reject <str> Reject the current phase and abort. │
│ --reason <str> │
│ --employer-id <str> │
│ --json │
│ --yes -y Required in JSON/MCP mode to approve the JD, sequence, or hire step. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline autopilot¶
Usage: zero pipeline autopilot [OPTIONS]
Show or set Autopilot (experimental) for the employer.
Autopilot lets the pipeline advance the reversible sourcing and shortlist
phases without a human. The job-description approval, outbound sending and
the hire decision always stay human-gated -- the JD approval because it is
the contractual record of what the client signed off (ZER-1879).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --on --off Enable or disable Autopilot. Omit to show the current setting. │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline list¶
Usage: zero pipeline list [OPTIONS]
List recent pipeline runs.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Filter to a job UUID. │
│ --limit <int range> [1<=x<=250] [default: 50] │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline pending-approvals¶
Usage: zero pipeline pending-approvals [OPTIONS]
List pipeline runs waiting on a human approval right now.
Each row's `pending_approval` names the phase (e.g.
`awaiting_sequence_approval`, `awaiting_hire_approval`) -- approve or
reject it with `pipeline advance --approve/--reject <phase>`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job-id <str> Limit to one job UUID. │
│ --limit <int> Max rows to return (1-250). [default: 50] │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline record-approval¶
Usage: zero pipeline record-approval [OPTIONS] {run_id}
Record a human decision on a pipeline run's current phase and advance (or halt) the run accordingly.
This is a second door onto the same floor `pipeline advance
--approve/--reject` guards -- `--phase` must match the run's CURRENT
phase or the backend 400s. Approving `awaiting_jd`, `awaiting_sequence_approval`
or `awaiting_hire_approval` is a human floor (ZER-3748/ZER-3889) even on
Autopilot, so an 'approved' decision on any of them requires an explicit
human --yes exactly like `pipeline advance` does; rejecting never does.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * run_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --phase <str> Phase this decision is for (must match the run's current phase). [required] │
│ * --decision <str> 'approved' or 'rejected'. [required] │
│ --approver-user-id <str> Named human, when calling as a trusted proxy on their behalf. │
│ --slack-ts <str> Slack message timestamp this decision came from, if any. │
│ --reason <str> │
│ --employer-id <str> │
│ --json │
│ --yes -y Required in JSON/MCP mode to approve the JD, sequence, or hire step. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports¶
Usage: zero pipeline reports [OPTIONS] COMMAND [ARGS]...
Schedule a recurring pipeline report (daily or weekly).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Subscribe to a recurring pipeline report for one job or the whole account. │
│ list List this account's scheduled pipeline reports (active and paused). │
│ show Show one scheduled pipeline report. │
│ update Change a scheduled report's channel, cadence, day, time or timezone. │
│ pause Pause a scheduled report without deleting it (`resume` restarts it). │
│ resume Resume a paused scheduled report from its next scheduled slot. │
│ cancel Cancel (permanently delete) a scheduled report. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports cancel¶
Usage: zero pipeline reports cancel [OPTIONS] {subscription_id}
Cancel (permanently delete) a scheduled report.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * subscription_id <str> Report subscription id. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports create¶
Usage: zero pipeline reports create [OPTIONS]
Subscribe to a recurring pipeline report for one job or the whole account.
"Send me this pipeline report every Monday" is one call:
`pipeline reports create --job <job> --channel dashboard_chat --day monday`.
Deliver to the channel the user asked from unless they name another.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Report on one job (UUID or short ref). Omit for the whole account. │
│ --current-job Report on the current job (see `jobs use`). │
│ * --channel <str> Where the report is delivered: dashboard_chat (a thread in the dashboard chat), email (to you), or slack (your team's connected chat workspace; rejected until it │
│ is connected). │
│ [required] │
│ --cadence <str> daily or weekly (default weekly). [default: weekly] │
│ --day <str> Weekday for a weekly report: a name (monday, mon) or 0-6 with 0 = Monday. Default Monday. │
│ --time <str> Send time, 24-hour HH:MM in --timezone (default 08:00). │
│ --timezone <str> IANA timezone name for the send time, e.g. Europe/London (default UTC). [default: UTC] │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports list¶
Usage: zero pipeline reports list [OPTIONS]
List this account's scheduled pipeline reports (active and paused).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports pause¶
Usage: zero pipeline reports pause [OPTIONS] {subscription_id}
Pause a scheduled report without deleting it (`resume` restarts it).
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * subscription_id <str> Report subscription id. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports resume¶
Usage: zero pipeline reports resume [OPTIONS] {subscription_id}
Resume a paused scheduled report from its next scheduled slot.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * subscription_id <str> Report subscription id. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports show¶
Usage: zero pipeline reports show [OPTIONS] {subscription_id}
Show one scheduled pipeline report.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * subscription_id <str> Report subscription id. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline reports update¶
Usage: zero pipeline reports update [OPTIONS] {subscription_id}
Change a scheduled report's channel, cadence, day, time or timezone.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * subscription_id <str> Report subscription id. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --channel <str> Where the report is delivered: dashboard_chat (a thread in the dashboard chat), email (to you), or slack (your team's connected chat workspace; rejected until it is │
│ connected). │
│ --cadence <str> daily or weekly. │
│ --day <str> Weekday for a weekly report: a name (monday, mon) or 0-6 with 0 = Monday. │
│ --time <str> Send time, 24-hour HH:MM in --timezone (default 08:00). │
│ --timezone <str> IANA timezone name for the send time, e.g. Europe/London (default UTC). │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline role-activity¶
Usage: zero pipeline role-activity [OPTIONS]
Per-role last-activity timestamp + pipeline state, plus cross-role totals, in one call (ZER-3441).
Use this INSTEAD of `jobs list` plus one `candidates list`/`jobs
timeline` per role for any "which of my roles has gone quiet" or "what's
the state of my roles" question -- that per-role fan-out cost 30-173s and
11-39 tool calls for one question (managed-agent benchmark
RESULTS-2026-08-15-effort-ab.md, finding 3), and the hand-rolled
cross-role arithmetic it needed produced a different grand total on every
ask -- 550, 610, 610, ~620, and 700 candidates for the SAME unchanged
data (finding 4). This is one aggregate read: each role's
`last_activity_at`, `total_candidates`, `interviewed_count`, and stage
breakdown, with the grand totals computed server-side.
No `--days`/`--since` flag on purpose: `last_activity_at` is a raw
timestamp, not a pre-thresholded "quiet" flag. Compare it to the
response's own `generated_at` yourself -- "quiet for how long" is your
question to answer, not this command's to bake in.
Narrow with --client-id and/or --search exactly like `pipeline summary`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --include-closed Include closed/inactive roles (default: open roles only). │
│ --client-id <str> Limit to one RPO client UUID. │
│ --search <str> Filter to roles whose title, description, or location match this text (same as `pipeline summary --search`). │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline run¶
Usage: zero pipeline run [OPTIONS]
Create a pipeline run for a job.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --brief <str> Hiring brief or run note. │
│ --sequence <str> Default outreach sequence UUID for this run. │
│ --employer-id <str> │
│ --idempotency-key <str> Accepted for agent retry contracts; ignored until backend idempotency lands. │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline set-slack-thread¶
Usage: zero pipeline set-slack-thread [OPTIONS] {run_id}
Record the Slack thread a pipeline run's future updates should post into (ZER-662). Called by the Jenny bridge when a run starts from Slack.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * run_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --thread-ts <str> Slack message timestamp this run's future updates should post into. [required] │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline status¶
Usage: zero pipeline status [OPTIONS] {run_id}
Show one pipeline run.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * run_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
pipeline summary¶
Usage: zero pipeline summary [OPTIONS]
Show the candidate pipeline across all roles in one call.
One aggregate read: per-role stage counts plus the authoritative grand
total. Use this for any "how many candidates do we have" question instead
of listing jobs and then paging candidates per role -- the per-role reads
are paginated, and adding them up is what makes the total drift between
identical questions (ZER-2590).
Narrow with --client-id and/or --search instead of listing everything and
filtering yourself -- "the Ashley client's sales manager roles" is
`--client-id <Ashley's UUID> --search "sales manager"`, still one call.
Each role also reports `awaiting_decision` (applications nobody has
hired/rejected yet) alongside its stage breakdown.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --include-closed Include closed/inactive roles (default: open roles only). │
│ --client-id <str> Limit to one RPO client UUID. │
│ --search <str> Filter to roles whose title, description, or location match this text (same as `jobs list --search`) -- e.g. "sales manager". Combine with --client-id to scope to │
│ one RPO client's matching roles in a single call. │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
references¶
Usage: zero references [OPTIONS] COMMAND [ARGS]...
Request references from a candidate and see how many have responded.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ request Ask the candidate to submit their references (with consent). │
│ status Show the reference request, N of M responded, and the AI summary. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
references request¶
Usage: zero references request [OPTIONS] {application_id}
Ask the candidate to submit their references (with consent).
Emails the candidate a link to a page where they list the role's
references-per-candidate count of referees and agree to Zero contacting
them. Referees are contacted only after the candidate submits. Safe to
repeat: an existing live request is returned unchanged.
Refused with HTTP 409 (code `reference_request_requires_candidate_contact`)
if there is no recorded evidence this candidate has ever engaged with us
-- a deliberate backend guard, not a transient error. No override flag.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
references status¶
Usage: zero references status [OPTIONS] {application_id}
Show the reference request, N of M responded, and the AI summary.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * application_id <str> Application UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
results¶
Usage: zero results [OPTIONS] COMMAND [ARGS]...
View interview results.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show interview results and scores for all candidates in a job. │
│ detail Show detailed interview results for a specific candidate. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
results detail¶
Usage: zero results detail [OPTIONS] [candidate]
Show detailed interview results for a specific candidate.
`--output csv|tsv|ndjson|json` flattens the transcript into rows so
the detail view is as pipeable as `results show`. CSV/TSV columns
track `rank` (1-based question index), `name` (candidate),
`resume_score` (empty for detail rows), `interview_score` (overall score),
`application_id` — plus extra `question`/`answer`/`question_score` columns
tacked on the end so you don't lose the text payload.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ candidate <str> Candidate number (1-based) or interview UUID (shows top candidate if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted) │
│ --json Raw JSON output │
│ --output <str> Structured output format: csv | tsv | ndjson | json (flattens answers into rows). │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
results show¶
Usage: zero results show [OPTIONS] [job_id]
Show interview results and scores for all candidates in a job.
`--output csv|tsv|ndjson|json` emits a flat, machine-friendly view
with columns: rank, name, resume_score, interview_score,
application_id. This is the recommended way to pipe results into a
spreadsheet or downstream tool.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ job_id <str> Job UUID (uses current job if omitted) │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --json Raw JSON output │
│ --output <str> Structured output format: csv | tsv | ndjson | json. CSV is the default export format. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers¶
Usage: zero reviewers [OPTIONS] COMMAND [ARGS]...
Manage client-scoped reviewers (Hiring Managers).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List accepted and invited reviewers for the caller's employer. │
│ remove Remove a reviewer's membership and job-access grants. │
│ invitations Pending reviewer invitations. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers invitations¶
Usage: zero reviewers invitations [OPTIONS] COMMAND [ARGS]...
Pending reviewer invitations.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List outstanding reviewer invitations for the caller's employer. │
│ send Invite someone as a client-scoped Hiring Manager. │
│ revoke Revoke a pending reviewer invitation. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers invitations list¶
Usage: zero reviewers invitations list [OPTIONS]
List outstanding reviewer invitations for the caller's employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers invitations revoke¶
Usage: zero reviewers invitations revoke [OPTIONS] {invitation_id}
Revoke a pending reviewer invitation.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * invitation_id <str> Invitation UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers invitations send¶
Usage: zero reviewers invitations send [OPTIONS]
Invite someone as a client-scoped Hiring Manager.
They can review and leave feedback only on jobs under this client, not
the employer's whole account. 409s if an outstanding invitation for
this email already exists.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> Email to invite as a Hiring Manager [required] │
│ * --client <str> RPO client UUID this reviewer is scoped to [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers list¶
Usage: zero reviewers list [OPTIONS]
List accepted and invited reviewers for the caller's employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --client <str> Limit to reviewers scoped to one RPO client UUID. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
reviewers remove¶
Usage: zero reviewers remove [OPTIONS] {hiring_manager_id}
Remove a reviewer's membership and job-access grants.
Does not touch any candidate data or feedback the reviewer already
left -- only their ability to log in and see jobs going forward.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * hiring_manager_id <str> Hiring-manager UUID (from `reviewers list`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --yes -y Skip confirmation │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing¶
Usage: zero sourcing [OPTIONS] COMMAND [ARGS]...
Search sourced candidates and add them to jobs.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ search Run a natural-language people search. │
│ status Show the status of an async sourcing search job. │
│ show Replay a saved sourcing search. │
│ add Add a sourced profile to the current job's applicants list. │
│ invite Promote a shortlisted sourced profile into an AI interview invite. │
│ estimate Estimate how many candidates could be sourced for a role, before it exists. │
│ shortlist Legacy alias for adding sourced candidates to jobs. │
│ applicants Promote sourced candidates into job applicants. │
│ test-candidate Create safe test sourced candidates. │
│ demo-candidates Create deterministic fake sourced candidates. │
│ experimental Experimental paper-mining sourcing (sources researchers from academic papers). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing add¶
Usage: zero sourcing add [OPTIONS] {profile_id}
Add a sourced profile to the current job's applicants list.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * profile_id <str> Sourced profile UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing applicants¶
Usage: zero sourcing applicants [OPTIONS] COMMAND [ARGS]...
Promote sourced candidates into job applicants.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ add Add a sourced profile to the current job's applicants list. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing applicants add¶
Usage: zero sourcing applicants add [OPTIONS] {profile_id}
Add a sourced profile to the current job's applicants list.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * profile_id <str> Sourced profile UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing demo-candidates¶
Usage: zero sourcing demo-candidates [OPTIONS] COMMAND [ARGS]...
Create deterministic fake sourced candidates.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ add Create or reuse the fixed five fake sourced candidates for a job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing demo-candidates add¶
Usage: zero sourcing demo-candidates add [OPTIONS]
Create or reuse the fixed five fake sourced candidates for a job.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing estimate¶
Usage: zero sourcing estimate [OPTIONS]
Estimate how many candidates could be sourced for a role, before it exists.
Count only: no profiles are returned or saved and no job is needed.
Repeat checks of the same criteria within 24 hours are free; a fresh
check uses one sourced-profile credit, capped at 50 checks a day.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --title -t <str> Role title to size the pool for. [required] │
│ --city <str> City / locality. │
│ --region <str> State / region. │
│ --country <str> Country. │
│ --remote --onsite Only remote (or only on-site) candidates. │
│ --seniority <str> intern, entry, mid, senior, staff, principal, manager, director, vp, c_level. │
│ --skill <str> Required skill (repeatable, max 50). │
│ --min-years <int range> [0<=x<=60] Minimum years of experience. │
│ --json Raw JSON output. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing experimental¶
Usage: zero sourcing experimental [OPTIONS] COMMAND [ARGS]...
Experimental paper-mining sourcing (sources researchers from academic papers).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ search Run the experimental paper-mining sourcing pipeline for the linked job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing experimental search¶
Usage: zero sourcing experimental search [OPTIONS] [emphasis]
Run the experimental paper-mining sourcing pipeline for the linked job.
Mines recent academic papers relevant to the job's field, ranks the
authoring researchers by citation velocity, enriches their contact
details, and adds them as sourced candidates on the job. Experimental:
contact-data coverage varies by field, unlike standard `sourcing search`.
The backend runs this asynchronously and returns a search_job_id. Pass
--wait to poll until the saved search_id is ready.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ emphasis <str> Optional emphasis to sharpen the academic search (the linked job's description is always used). │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --limit <int range> [x>=1] [default: 10] │
│ --wait Poll until the background search completes. │
│ --poll-interval <float range> [0.5<=x<=10.0] [default: 2.0] │
│ --wait-timeout <float range> [x>=5.0] Seconds to keep polling with --wait before giving up and returning the search_job_id to poll manually (default 180). Set this below your own │
│ caller's timeout: the search keeps running either way. │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing invite¶
Usage: zero sourcing invite [OPTIONS] {shortlist_id}
Promote a shortlisted sourced profile into an AI interview invite.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * shortlist_id <str> Shortlist UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> [required] │
│ * --first-name <str> [required] │
│ * --last-name <str> [required] │
│ --interview-type <str> [default: realtime] │
│ --avatar-id <str> │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing search¶
Usage: zero sourcing search [OPTIONS] {query}
Run a natural-language people search.
The backend runs searches asynchronously and returns a search_job_id.
Pass --wait to poll until the saved search_id is ready, optionally with
--wait-timeout to cap how long that poll blocks.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * query <str> Natural-language candidate search. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --limit <int range> [x>=1] [default: 50] │
│ --depth <str> cheap or deep ranking. [default: cheap] │
│ --location <str> Explicit country, city, or region constraint from the user's request (repeatable; overrides job-derived sourcing location). │
│ --real In dev/staging, bypass demo candidates and run a small live provider search. │
│ --source-more Continue the latest successful search for the linked job. Use only when the user explicitly asks for more candidates. │
│ --query-only,--exact-query Use only the provided query for provider filters. Keep the linked job for ranking/attribution, but do not reuse prior source-more │
│ filters. │
│ --wait Poll until the background search completes. │
│ --poll-interval <float range> [0.5<=x<=10.0] [default: 2.0] │
│ --wait-timeout <float range> [x>=5.0] Seconds to keep polling with --wait before giving up and returning the search_job_id to poll manually (default 180). Set this │
│ below your own caller's timeout: the search keeps running either way. │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing shortlist¶
Usage: zero sourcing shortlist [OPTIONS] COMMAND [ARGS]...
Legacy alias for adding sourced candidates to jobs.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ add Legacy alias for adding a sourced profile to applicants. │
│ list Legacy command removed: use `zero candidates list --source sourced`. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing shortlist add¶
Usage: zero sourcing shortlist add [OPTIONS] {profile_id}
Legacy alias for adding a sourced profile to applicants.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * profile_id <str> Sourced profile UUID. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing shortlist list¶
Usage: zero sourcing shortlist list [OPTIONS]
Legacy command removed: use `zero candidates list --source sourced`.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ --status <str> │
│ --limit <int range> [1<=x<=500] [default: 100] │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing show¶
Usage: zero sourcing show [OPTIONS] {search_id}
Replay a saved sourcing search.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * search_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing status¶
Usage: zero sourcing status [OPTIONS] {search_job_id}
Show the status of an async sourcing search job.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * search_job_id <str> [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing test-candidate¶
Usage: zero sourcing test-candidate [OPTIONS] COMMAND [ARGS]...
Create safe test sourced candidates.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ add Create or reuse a sourced-style test candidate for a job. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
sourcing test-candidate add¶
Usage: zero sourcing test-candidate add [OPTIONS]
Create or reuse a sourced-style test candidate for a job.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --job -j <str> Job UUID (uses current job if omitted). │
│ * --email <str> Safe test candidate email [required] │
│ * --phone <str> Safe test candidate phone [required] │
│ --first-name <str> First name [default: Jenny] │
│ --last-name <str> Last name [default: Outreach Test Candidate] │
│ --current-title <str> Current title [default: Junior Sales Representative] │
│ --current-company <str> Current company [default: Demo Candidate Co] │
│ --location <str> Candidate location [default: Remote] │
│ --employer-id <str> │
│ --json │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
status¶
Usage: zero status [OPTIONS] COMMAND [ARGS]...
Check your jobs and pipeline.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show all your jobs with applicant counts and progress. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
status show¶
Usage: zero status show [OPTIONS]
Show all your jobs with applicant counts and progress.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected) │
│ --active-only Drop inactive rows. Does NOT restrict to jobs you created; use --mine for that. │
│ --mine Show only jobs you created. Requires the backend to expose `created_by_user_id` (ZER-563); if it doesn't, a warning is printed to stderr and all employer jobs are │
│ shown. │
│ --tag <str> Filter to jobs tagged [<name>] in the title (case-insensitive). │
│ --since <str> ISO date (e.g. 2026-04-01). Keep jobs created on/after this date. │
│ --search <str> Case-insensitive substring match on job title. │
│ --sort <str> Sort by: created, title, applicants, status. │
│ --order <str> Sort direction: asc, desc. Only used with --sort. [default: desc] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team¶
Usage: zero team [OPTIONS] COMMAND [ARGS]...
Manage team members.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List team members for an employer. │
│ add Backward-compatible alias for ``team invite``. │
│ invite Send a team invitation email. │
│ remove Remove a team member from an employer. │
│ member-add Add an existing Zero user directly to your team -- no invitation email. │
│ set-role Promote a team member to co-owner, or demote them back to member. │
│ set-billing-access Turn a team member's billing access on or off. Owner-only (ZER-3820). │
│ billing-activity Billing changes made by non-owners, newest first. Owner-only (ZER-3820). │
│ my-employers List the employer(s) your Zero account is associated with. │
│ invitations Pending team invitations. │
│ join-requests Requests to join your team by verified email domain. │
│ join-setting Whether people on your company's verified email domain may ask to join. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team add¶
Usage: zero team add [OPTIONS]
Backward-compatible alias for ``team invite``.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> Email of user to add [required] │
│ --employer-id <str> Deprecated; invitations use the employer bound to your login. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team billing-activity¶
Usage: zero team billing-activity [OPTIONS]
Billing changes made by non-owners, newest first. Owner-only (ZER-3820).
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --limit <int> Max rows to return (1-500). [default: 100] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team invitations¶
Usage: zero team invitations [OPTIONS] COMMAND [ARGS]...
Pending team invitations.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List outstanding invitations for your employer. │
│ resend Re-send a pending invitation with a fresh link. Owner-only. │
│ revoke Revoke a pending invitation. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team invitations list¶
Usage: zero team invitations list [OPTIONS]
List outstanding invitations for your employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team invitations resend¶
Usage: zero team invitations resend [OPTIONS] {invitation_id}
Re-send a pending invitation with a fresh link. Owner-only.
The previous link stops working, so a forwarded copy of the earlier
email can't be redeemed after a visible re-issue. 409s once the
invitation has been accepted or revoked.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * invitation_id <str> Invitation UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team invitations revoke¶
Usage: zero team invitations revoke [OPTIONS] {invitation_id}
Revoke a pending invitation.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * invitation_id <str> Invitation UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team invite¶
Usage: zero team invite [OPTIONS]
Send a team invitation email.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> Email of user to invite [required] │
│ --employer-id <str> Target employer UUID (ZER-1185). Defaults to your own employer when omitted. Only an allowlisted demo-admin may target a different employer, and only when it's │
│ flagged is_demo=true (e.g. inviting a presenter to a demo org created via `demo account`/MCP) -- anyone else passing a non-own employer gets a 403 from the backend. │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-requests¶
Usage: zero team join-requests [OPTIONS] COMMAND [ARGS]...
Requests to join your team by verified email domain.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ list List pending requests to join your team. Owners/admins only. │
│ approve Approve a pending join request. The requester becomes a team member. │
│ decline Decline a pending join request. The requester may create their own account instead. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-requests approve¶
Usage: zero team join-requests approve [OPTIONS] {request_id}
Approve a pending join request. The requester becomes a team member.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * request_id <str> Join-request UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-requests decline¶
Usage: zero team join-requests decline [OPTIONS] {request_id}
Decline a pending join request. The requester may create their own account instead.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * request_id <str> Join-request UUID [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-requests list¶
Usage: zero team join-requests list [OPTIONS]
List pending requests to join your team. Owners/admins only.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-setting¶
Usage: zero team join-setting [OPTIONS] COMMAND [ARGS]...
Whether people on your company's verified email domain may ask to join.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ show Show whether 'ask to join with a verified email' is on for your team. │
│ set Turn 'ask to join with a verified email' on or off. Owners/admins only. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-setting set¶
Usage: zero team join-setting set [OPTIONS]
Turn 'ask to join with a verified email' on or off. Owners/admins only.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --on --off Turn 'ask to join with a verified email' on or off. [required] │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team join-setting show¶
Usage: zero team join-setting show [OPTIONS]
Show whether 'ask to join with a verified email' is on for your team.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team list¶
Usage: zero team list [OPTIONS]
List team members for an employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team member-add¶
Usage: zero team member-add [OPTIONS]
Add an existing Zero user directly to your team -- no invitation email.
The email must already belong to a Zero user account; for anyone who
does not yet have one, use `team invite` instead (sends an email with a
signup/accept link). 409s if they are already a member of this employer.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --email <str> Email of an EXISTING Zero user to add directly. [required] │
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team my-employers¶
Usage: zero team my-employers [OPTIONS]
List the employer(s) your Zero account is associated with.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team remove¶
Usage: zero team remove [OPTIONS] {user_id}
Remove a team member from an employer.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * user_id <str> User UUID to remove [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --employer-id <str> Employer UUID (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team set-billing-access¶
Usage: zero team set-billing-access [OPTIONS] {user_id}
Turn a team member's billing access on or off. Owner-only (ZER-3820).
400s if the target is an owner -- owners always have billing access.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * user_id <str> User UUID (from `team list`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --on --off Grant or revoke this member's billing access. [required] │
│ --employer-id <str> Employer UUID the membership belongs to (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
team set-role¶
Usage: zero team set-role [OPTIONS] {user_id}
Promote a team member to co-owner, or demote them back to member.
Owner-only (ZER-3312). The target's primary ownership (if any) is not
revoked by this -- it 400s instead; a change that would leave the
employer with no owner 409s.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * user_id <str> User UUID (from `team list`) [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --role <str> 'owner' or 'member'. [required] │
│ --employer-id <str> Employer UUID the membership belongs to (auto-detected from login) │
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
update¶
Usage: zero update [OPTIONS]
Download the latest standalone CLI binary into ~/.zerohiring/bin/zero.
Re-run this after releases to replace stale PyInstaller installs. Also
removes broken legacy ``zerohiring`` pip shims that shadow the real CLI.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --force Re-download the latest binary even if the running version matches. │
│ --json Emit machine-readable JSON. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
whoami¶
Usage: zero whoami [OPTIONS]
Show current login status.
Hits the backend `/api/cli-auth/whoami` endpoint so the answer reflects
the *actual* identity of the stored token — not whatever got cached in
the local config file. This matters because a stale `employer_id` in
`~/.zerohiring/config.json` previously made it look like the CLI was
acting on one account while actually hitting another.
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --json Raw JSON output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯