KI BMS

Command line (CLI)

A native command-line client for KI BMS. One install line.

The KI BMS CLI is auto-generated from the same models the HTTP API exposes - every endpoint you can hit with curl is also a subcommand here. The script is one self-contained Python file (no pip install), checks for updates once a day, and authenticates with the same Bearer tokens the rest of the API accepts.

Install

One line, one file. The script lands under your home directory - no pip install, no system-wide changes. Pick your OS in the tabs below.

curl -fsSL https://www.ki-bewerber-management.de/xapi2/cli/install.sh | bash
Download script manuallyVersion: 1.2.8·Command: atscli·checksum: 3497b20292

Sign in

Every command except login / version / update requires a valid token. Two ways in: a personal access token (PAT) from the Integrations menu (recommended for scripts + CI), or interactive email + password (saved as a session token under ~/.atscli/credentials.json, mode 0600).

atscli login --token pat_…

Commands

Each data model is a subgroup. Click a model name to jump to its detail page; the available ops mirror the HTTP API one-to-one.

ModelCommands
application
atscli application listatscli application getatscli application createatscli application updateatscli application deleteatscli application upsert
application_note
atscli application_note listatscli application_note getatscli application_note createatscli application_note updateatscli application_note deleteatscli application_note upsert
candidate
atscli candidate listatscli candidate getatscli candidate createatscli candidate updateatscli candidate deleteatscli candidate upsert
email_template
atscli email_template listatscli email_template getatscli email_template createatscli email_template updateatscli email_template deleteatscli email_template upsert
evaluation
atscli evaluation listatscli evaluation getatscli evaluation createatscli evaluation updateatscli evaluation deleteatscli evaluation upsert
interview
atscli interview listatscli interview getatscli interview createatscli interview updateatscli interview deleteatscli interview upsert
job
atscli job listatscli job getatscli job createatscli job updateatscli job deleteatscli job upsert
message
atscli message listatscli message getatscli message createatscli message updateatscli message deleteatscli message upsert
offer
atscli offer listatscli offer getatscli offer createatscli offer updateatscli offer deleteatscli offer upsert
source
atscli source listatscli source getatscli source createatscli source updateatscli source deleteatscli source upsert
task
atscli task listatscli task getatscli task createatscli task updateatscli task deleteatscli task upsert
Useful flags: --filter name=Foo (repeatable), --all (auto-paginate), --fields id,name (project response), --cache N (local cache, N s), --file p.json / --csv p.csv / --stdin (bulk input; arrays + CSV rows), --continue-on-error (don't stop on bulk failure; exit 1 if any failed), --dry-run (preview the request), --idempotency-key K / --auto-idempotency (safe retries), --retry N + --backoff exp (auto-retry 429/5xx), --format json|ndjson|table (output shape), --stderr-json (machine-readable errors), --profile NAME (switch credentials).

Use with an AI assistant

Models like Claude, ChatGPT, or Gemini will write scripts that drive this CLI for you - they only need the context below. Copy the block into your chat, then describe what you want to do.

Help me write scripts using `atscli`, the CLI for the KI BMS app.
Install:
macOS/Linux: curl -fsSL https://www.ki-bewerber-management.de/xapi2/cli/install.sh | bash
Windows PS: irm https://www.ki-bewerber-management.de/xapi2/cli/install.ps1 | iex
Sign in (required before any data command):
atscli login --token pat_… # personal access token
atscli login # interactive (token or email + password)
Commands per model:
atscli application { list | get | create | update | delete | upsert }
fields: --job-id --candidate-id --stage --previous-stage --position --applied-at --last-stage-at --source-id --source-label --cover-letter --cv-blob-id --cv-url --answers --fit-score --fit-reasoning --fit-flags --fit-computed-at --rejected-reason --rejected-note --tags
atscli application_note { list | get | create | update | delete | upsert }
fields: --body --pinned --private --parent-kind --parent-id
atscli candidate { list | get | create | update | delete | upsert }
fields: --name --first-name --last-name --salutation --pronouns --email --phone --city --country --current-company --current-role --years-experience --available-from --salary-expectation --currency --linkedin --github --portfolio --cv-url --cv-blob-id --avatar-blob-id --summary --skills --languages --tags --source-id --source-label --pool-status --gdpr-consent --gdpr-consent-at --gdpr-retention-until --preferred-locale --last-touched-at --color
atscli email_template { list | get | create | update | delete | upsert }
fields: --name --category --subject --body --language --stage-trigger --auto-send --active --variables-doc
atscli evaluation { list | get | create | update | delete | upsert }
fields: --application-id --interview-id --interviewer-id --skills-score --culture-score --communication-score --potential-score --overall-score --recommendation --highlights --concerns --summary
atscli interview { list | get | create | update | delete | upsert }
fields: --application-id --candidate-id --job-id --kind --status --title --scheduled-at --duration-minutes --location --meeting-url --interviewer-id --interviewer-ids --agenda --notes --send-invite
atscli job { list | get | create | update | delete | upsert }
fields: --title --slug --department --location --country --remote --employment-type --seniority --headcount --salary-min --salary-max --currency --salary-visibility --summary --description --responsibilities --requirements --nice-to-have --benefits --language --status --public --ai-screen-enabled --ai-screen-prompt --knockout-questions --screening-questions --tags --hiring-manager-id --team-ids --opened-at --target-close-date --closed-at --external-apply-url --color
atscli message { list | get | create | update | delete | upsert }
fields: --candidate-id --application-id --channel --direction --subject --body --status --sent-at --delivered-at --read-at --template-id --from-address --to-address --cc-addresses --thread-id --error
atscli offer { list | get | create | update | delete | upsert }
fields: --application-id --candidate-id --job-id --salary-gross --salary-period --currency --bonus --bonus-note --vacation-days --start-date --expires-at --term --term-until --weekly-hours --remote-policy --status --sent-at --decided-at --letter-body --letter-blob-id --decline-reason
atscli source { list | get | create | update | delete | upsert }
fields: --name --kind --url --active --notes
atscli task { list | get | create | update | delete | upsert }
fields: --title --description --due-date --completed --completed-at --priority --assigned-to --parent-kind --parent-id
Output + flags:
- stdout is JSON (one object, or {data:[...], meta:{...}} on list).
- errors go to stderr; non-zero exit (3=auth, 5=not found, 6=validation, 7=conflict, 8=rate-limited).
- --filter name=Foo (friendly key, repeatable) on `list`.
- --all auto-paginates; --fields id,name projects; --cache N caches list/get for N s.
- writes accept --json '{...}', --file path.json (arrays = bulk), --stdin, or --csv path [--map k=COL,…].
- upsert needs --unique <field>; --dry-run previews any write.
- --retry N --backoff exp survives 429/5xx; --stderr-json gives machine-readable errors.
Field schemas + constraints per model: https://www.ki-bewerber-management.de/docs/types/<model>
Full CLI reference: https://www.ki-bewerber-management.de/docs/cli
Task: <describe what you want to do>

Examples

atscli login --token pat_…
atscli whoami

Recipes

End-to-end snippets for the workflows people actually run. Pick a tab.

# items.csv has columns: job_id,Full Name,status
# --map renames CSV headers to API field names; missing cells skipped.
atscli application create \
--csv items.csv \
--map name=Full Name \
--continue-on-error \
--retry 3 --backoff exp

Environment variables

VariablePurpose
XCLI_NO_AUTOUPDATESkip the once-per-day version check + self-replace.
XCLI_NO_TELEMETRYSkip the anonymous CLI usage analytics.
XCLI_BASE_URLOverride the baked-in server URL (testing only).
XCLI_TOKENUse this PAT for the current invocation without saving it.

Telemetry + auto-update

The CLI sends one anonymous analytics event per command (command name, version, OS - no request bodies, no field values) so the team running this app can see how it's used in the same dashboard as the web UI. The data is processed securely; an audit log of every event tied to you can be requested at any time from the company operating the app. We strongly encourage leaving telemetry on - it's how reliability issues surface and how the team prioritises improvements that affect you. It can be turned off with XCLI_NO_TELEMETRY=1. Separately, the CLI checks for a newer version at most once every 24 hours and updates itself in place; XCLI_NO_AUTOUPDATE=1 disables that.