Cavuno CLI

Manage Cavuno from the terminal — pipeable commands and exit codes

Install

The CLI is published on npm as cavuno. Install it globally, or run it once with npx.

bash
npm install -g cavuno
# or
npx cavuno --help

Authentication

Set two environment variables. Mint a key in the Cavuno dashboard under Settings → API keys. The plaintext secret is shown once at creation — copy it to your secrets manager immediately.

bash
export CAVUNO_API_KEY='cavuno_live_xxxxxxxxxxxxxxxx_yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
export CAVUNO_API_URL='https://api.cavuno.com/v1'
cavuno usage get

The CLI fails fast at startup if CAVUNO_API_KEY is missing or doesn’t match the cavuno_live_* format — you don’t wait on a 401 round-trip to see the error.

Global flags

FlagPurpose
--api-url <url>Override CAVUNO_API_URL for this invocation
--format <json|table>Output format. Default json (pipe-friendly)
--helpPrint help for the command or subcommand
--versionPrint the CLI version

Output formats

The default json output is the API response body verbatim — pipe it into jq for scripts. The optional table format pretty-prints key fields for terminal viewing.

bash
cavuno jobs list --status published --format table

Exit codes

The CLI exits with a stable code per error class. Scripts can branch on these without parsing stderr.

CodeReason
0Success
1Authentication failure — missing or malformed CAVUNO_API_KEY, 401 auth_unauthenticated
2Validation error — 400 validation_bad_request, missing required CLI flag
3Authorization failure — 403 auth_forbidden
4Resource not found — 404 *_not_found
5Plan / quota — 409 jobs_quota_exceeded, 403 jobs_plan_cannot_publish
6Rate limited — 429 rate_limited (Retry-After printed)
7State conflict — 409 jobs_already_published, jobs_not_published, jobs_already_archived
10Unknown server error — 500 or unmapped
11Network error — DNS failure, connection refused, timeout

Failure messages on stderr include the API code, message, validation issues (when present), Retry-After (on 429), and X-Request-Id (when present). Echo the request ID when filing support tickets.

jobs

Manage jobs in the authenticated account.

cavuno jobs list

List jobs (paginated).

Maps to GET /v1/jobs (POST /v1/jobs/search when --search is set)

Synopsis

bash
cavuno jobs list [options]

Options

FlagRequiredDescription
--status <status>noFilter by status (draft|published|expired|archived)
--company-id <id>noFilter by company ID
--search <query>noFree-text search; routes through POST /v1/jobs/search
--limit <n>noPage size 1-100 (default 50)
--cursor <cursor>noPagination cursor from previous response

Examples

bash
# All jobs (first page)
cavuno jobs list
bash
# Published only
cavuno jobs list --status published --limit 100
bash
# Published jobs at a single company
cavuno jobs list --status published --company-id k17abc...

cavuno jobs get

Fetch a single job by ID (enriched with description, company, places).

Maps to GET /v1/jobs/:id

Synopsis

bash
cavuno jobs get <id>

Arguments

NameRequiredDescription
idyesJob ID

Examples

bash
cavuno jobs get k17abc...
bash
cavuno jobs get k17abc... | jq -r .title

cavuno jobs create

Create a draft job.

Maps to POST /v1/jobs

Synopsis

bash
cavuno jobs create [options]

Options

FlagRequiredDescription
--title <title>yesJob title (required)
--description <text>noDescription (markdown/HTML)
--slug <slug>noURL slug; auto-derived from title if omitted
--company-id <id>noCompany ID (must belong to your account)
--application-url <url>noApplication URL or `mailto:`/email
--employment-type <type>nofull_time|part_time|contract|internship|temporary|volunteer|other
--remote-option <opt>noon_site|hybrid|remote
--seniority <level>noentry_level|associate|mid_level|senior|lead|principal|director|executive
--remote-sponsorship <opt>noyes|no|unknown — visa sponsorship for remote candidates
--remote-permits <json>noJSON array, e.g. '[{"type":"country","value":"US"}]' — work-permit scope
--remote-timezones <json>noJSON array, e.g. '[{"type":"all","value":"all"}]' — timezone constraint (auto-derived from --remote-permits when omitted)
--office-locations <json>noJSON array, e.g. '[{"city":"Berlin","country":"DE"}]' — required for on_site/hybrid
--in-office-period <opt>noper_week|per_month|per_year — denominator for --in-office-frequency (hybrid)
--in-office-frequency <n>noIn-office count per period (hybrid)
--salary-min <n>noMinimum salary
--salary-max <n>noMaximum salary
--salary-currency <code>noISO 4217 currency (e.g. USD, EUR, GBP)
--salary-timeframe <opt>noper_year|per_month|per_week|per_day|per_hour
--education-requirements <list>noComma-separated values: high_school,associate_degree,bachelor_degree,professional_certificate,postgraduate_degree,no_requirements
--experience-months <n>noMinimum experience required, in months
--experience-in-place-of-educationnoAllow equivalent experience to substitute for education
--is-featurednoMark as a featured job on the public board
--expires-at <iso>noExpiry as ISO 8601 datetime (parsed to epoch ms)

Examples

bash
# Minimal
cavuno jobs create --title "Senior Backend Engineer"
bash
# Common remote-only case
cavuno jobs create \
--title "Senior Platform Engineer" \
--description "We’re hiring..." \
--employment-type full_time \
--remote-option remote \
--seniority senior \
--company-id k18acme...
bash
# Hybrid role (requires --office-locations)
cavuno jobs create \
--title "Staff Engineer" \
--remote-option hybrid \
--in-office-period per_week \
--in-office-frequency 2 \
--office-locations '[{"city":"Berlin","country":"DE"}]'
bash
# Capture the new ID
NEW_ID=$(cavuno jobs create --title "Test" | jq -r .id)

cavuno jobs update

Update fields on an existing job.

Maps to PATCH /v1/jobs/:id

Synopsis

bash
cavuno jobs update <id> [options]

Arguments

NameRequiredDescription
idyesJob ID

Options

FlagRequiredDescription
--title <title>no1–200 chars
--description <text>noDescription (markdown/HTML)
--slug <slug>no
--company-id <id>noCompany ID (must belong to your account)
--application-url <url>noApplication URL or `mailto:`/email
--employment-type <type>no
--remote-option <opt>noon_site|hybrid|remote
--seniority <level>no
--remote-sponsorship <opt>noyes|no|unknown
--remote-permits <json>noJSON array; pass `[]` to clear
--remote-timezones <json>noJSON array; pass `[]` to clear (PATCH never auto-re-derives)
--office-locations <json>noJSON array; required when --remote-option is on_site/hybrid
--in-office-period <opt>noper_week|per_month|per_year
--in-office-frequency <n>noHybrid in-office count per period
--salary-min <n>noMinimum salary
--salary-max <n>noMaximum salary
--salary-currency <code>noISO 4217 currency (e.g. USD, EUR, GBP)
--salary-timeframe <opt>noper_year|per_month|per_week|per_day|per_hour
--education-requirements <list>noComma-separated list
--experience-months <n>noMinimum experience required, in months
--experience-in-place-of-education <bool>notrue|false (string accepted; PATCH semantics — explicit value required)
--is-featured <bool>notrue|false (string accepted; PATCH semantics — explicit value required)
--expires-at <iso>noISO 8601 datetime (parsed to epoch ms); pass `null` to clear

Examples

bash
# Rename
cavuno jobs update k17abc... --title "Renamed role"
bash
# Re-author the remote-permit set + sponsorship
cavuno jobs update k17abc... \
--remote-permits '[{"type":"country","value":"US"}]' \
--remote-sponsorship yes
bash
# Clear an existing expiry
cavuno jobs update k17abc... --expires-at null
bash
# Mark as featured
cavuno jobs update k17abc... --is-featured true

cavuno jobs publish

Publish a job (draft or expired → published).

Maps to POST /v1/jobs/:id/publish

Synopsis

bash
cavuno jobs publish <id> [options]

Arguments

NameRequiredDescription
idyesJob ID

Options

FlagRequiredDescription
--expires-at <iso>noOptional ISO 8601 expiry timestamp

Examples

bash
cavuno jobs publish k17abc...
bash
cavuno jobs publish k17abc... --expires-at 2026-12-31T23:59:59Z

cavuno jobs pause

Pause a published job (transition to draft).

Maps to POST /v1/jobs/:id/pause

Synopsis

bash
cavuno jobs pause <id>

Arguments

NameRequiredDescription
idyesJob ID

Examples

bash
cavuno jobs pause k17abc...

cavuno jobs expire

Expire a published job immediately (sets expiresAt = now).

Maps to POST /v1/jobs/:id/expire

Synopsis

bash
cavuno jobs expire <id>

Arguments

NameRequiredDescription
idyesJob ID

Examples

bash
cavuno jobs expire k17abc...

cavuno jobs duplicate

Duplicate a job (creates a new draft copy).

Maps to POST /v1/jobs/:id/duplicate

Synopsis

bash
cavuno jobs duplicate <id>

Arguments

NameRequiredDescription
idyesJob ID

Examples

bash
cavuno jobs duplicate k17abc...
bash
NEW_ID=$(cavuno jobs duplicate k17abc... | jq -r .id)

cavuno jobs delete

Hard-delete a job. Irreversible.

Maps to DELETE /v1/jobs/:id

Synopsis

bash
cavuno jobs delete <id>

Arguments

NameRequiredDescription
idyesJob ID

Examples

bash
cavuno jobs delete k17abc...

usage

Inspect account-level usage and limits.

cavuno usage get

Show the account's active-jobs usage and plan limit.

Maps to GET /v1/usage

Synopsis

bash
cavuno usage get

Examples

bash
cavuno usage get

companies

Manage companies in the authenticated account.

cavuno companies list

List companies (paginated).

Maps to GET /v1/companies

Synopsis

bash
cavuno companies list [options]

Options

FlagRequiredDescription
--search <query>noSubstring search on name
--limit <n>noPage size 1-100 (default 50)
--cursor <cursor>noPagination cursor

Examples

bash
cavuno companies list
bash
cavuno companies list --search acme --limit 10

cavuno companies get

Fetch a single company by ID.

Maps to GET /v1/companies/:id

Synopsis

bash
cavuno companies get <id>

Arguments

NameRequiredDescription
idyesCompany ID

Examples

bash
cavuno companies get k18acme...

cavuno companies create

Create a company.

Maps to POST /v1/companies

Synopsis

bash
cavuno companies create [options]

Options

FlagRequiredDescription
--name <name>yesCompany name (required)
--slug <slug>noURL slug; auto-derived from --name if omitted
--website <url>noWebsite URL
--summary <text>noShort summary (≤280 chars)
--description <text>noLong-form description (≤25,000 chars)
--x-url <handle-or-url>noX (Twitter) handle or profile URL
--linkedin-url <url-or-path>noLinkedIn company page URL or path
--facebook-url <url-or-path>noFacebook company page URL or path

Examples

bash
cavuno companies create --name "Acme Corp"
bash
cavuno companies create \
--name "Acme Corp" \
--website https://acme.com \
--summary "World-class widgets"

cavuno companies update

Update a company (partial).

Maps to PATCH /v1/companies/:id

Synopsis

bash
cavuno companies update <id> [options]

Arguments

NameRequiredDescription
idyesCompany ID

Options

FlagRequiredDescription
--name <name>noNew name
--slug <slug>noNew URL slug
--website <url>noNew website URL
--summary <text>noNew summary
--description <text>noNew long-form description
--x-url <handle-or-url>noNew X handle or profile URL
--linkedin-url <url-or-path>noNew LinkedIn URL or path
--facebook-url <url-or-path>noNew Facebook URL or path

Examples

bash
cavuno companies update k18acme... --name "Acme, Inc."
bash
cavuno companies update k18acme... --website https://acme.io

cavuno companies delete

Delete a company and cascade-delete its jobs.

Maps to DELETE /v1/companies/:id

Synopsis

bash
cavuno companies delete <id>

Arguments

NameRequiredDescription
idyesCompany ID

Examples

bash
cavuno companies delete k18acme...

cavuno companies find-by-domain

Resolve a company by website domain (uses search endpoint).

Maps to POST /v1/companies/search

Synopsis

bash
cavuno companies find-by-domain <domain>

Arguments

NameRequiredDescription
domainyesWebsite domain (e.g. acme.com)

Examples

bash
cavuno companies find-by-domain acme.com

cavuno companies find-or-create

Resolve to an existing company by domain or create one.

Maps to POST /v1/companies/find-or-create

Synopsis

bash
cavuno companies find-or-create [options]

Options

FlagRequiredDescription
--name <name>yesCompany name
--website <url>noWebsite URL (used for dedup)

Examples

bash
cavuno companies find-or-create --name "Acme Corp" --website acme.com

cavuno companies list-jobs

List jobs at a company (any status, optional filter).

Maps to GET /v1/companies/:id/jobs

Synopsis

bash
cavuno companies list-jobs <id> [options]

Arguments

NameRequiredDescription
idyesCompany ID

Options

FlagRequiredDescription
--status <status>noFilter by status (draft|published|expired|archived)
--limit <n>noPage size 1-100 (default 50)

Examples

bash
cavuno companies list-jobs k18acme... --status published

CLI version 0.2.0 · Generated 2026-05-05