doc_id, read it, optionally send feedback:
doc_id, search_id, capture_id, canonical_url) are stable handles — thread them between commands and cite them. See provenance.
Commands
| Command | Does | Key flags |
|---|---|---|
search <query|-> | Web search | --mode, --max-results, --format, --objective |
read <url|doc_id|-> | Read a page as markdown (aliases: fetch, extract) | --query, --max-chars, --start-char, --include |
feedback | Send result feedback | --event-type (required), --search-id, --doc-id, --passage-id, --query, --rank, --notes |
auth status|login|logout | Manage the stored API key | --key |
config get|set|unset|list|path | Manage config keys api_key and base_url | — |
api <method> <path> | Raw authenticated API call (escape hatch) | --input <file|-> |
update | Channel-aware self-update | --check |
version | Print version, commit, and build date | — |
completion <shell> | Completion script for bash, zsh, or fish | — |
Global flags
Available on every command:| Flag | Meaning | Default |
|---|---|---|
--json | Machine output: data on stdout, JSON error envelope on stderr | off (human output) |
-o, --output <file> | Write data output to a file and suppress stdout | — |
--key <key> | API key (overrides CAESAR_API_KEY and the config file) | — |
--base-url <url> | API base URL (overrides CAESAR_BASE_URL) | https://search-api-staging-779189860552.europe-west1.run.app |
--no-retry | Disable rate-limit/5xx retries | retries on |
--timeout <seconds> | Request timeout in seconds | 30 |
--format is not a global flag — it belongs to search only.
search
| Flag | Values | Default |
|---|---|---|
--mode | fast, standard, research | standard |
--max-results | integer 1–50 | 10 |
--objective | free text — the broader task, to steer retrieval | — |
--format | ids_only, compact, standard, full | standard |
--format maps to the API’s response shaping verbosity: compact is the token-efficient choice for search-then-read loops, standard adds quotable passages, full adds capture provenance.
read
The target should be a full URL (https://…) or a doc_id UUID; a scheme-less target (e.g. example.com) is normalized to https:// by the API.
| Flag | Values | Default |
|---|---|---|
--query | focus content selection on this question | — |
--max-chars | content character cap, 1–50000 | 12000 |
--start-char | resume a truncated read from this offset | 0 |
--include | comma list of metadata,content,passages,capture_history | metadata,content |
content.truncated: true plus content.char_count and content.start_char (omitted when 0). Continue with --start-char set to start plus count — don’t retry with a bigger --max-chars:
feedback
--event-type is required. Values: result_helpful, result_not_helpful, passage_used, read_abandoned, duplicate_result, stale_result, spam_or_low_quality, missing_expected_source, unsafe_or_policy_issue. Pair it with --search-id and/or --doc-id so the event lands on the right target.
Reading from stdin
- reads stdin to EOF for the search query, the read target, auth login --key -, and api --input -:
JSON output
With--json, data is a single JSON object on stdout and errors are a JSON envelope on stderr (hint only when present):
--json) output is not a stable interface — never parse it.
-o <file> writes the data payload to the file and suppresses stdout entirely, so output limits can’t truncate JSON mid-parse. The agent pattern is write-then-read:
Exit codes
| Code | Meaning |
|---|---|
| 0 | success (includes --help and --version) |
| 2 | bad input (validation errors, unknown flags, usage errors) |
| 3 | auth error (HTTP 401/403) |
| 4 | API error (other HTTP errors, network failures, update failures) |
| 5 | timeout |
For agents
| Mistake | Correction |
|---|---|
--results, --limit, -n | The flag is --max-results |
--response-format | The flag is --format (values: ids_only, compact, standard, full) |
--mode deep / --mode quick | Modes are exactly fast, standard, research |
Passing a bare domain to read | read needs a full URL (https://…) or a doc_id UUID |
Retrying a truncated read with bigger --max-chars | Use --start-char to continue from where it stopped |
| Parsing human output | Use --json; human output is not a stable interface |
| Shell-redirecting and also reading stdout | Use -o <file>; it suppresses stdout so nothing competes with the file |
npm update -g / brew upgrade by hand | caesar-search update picks the right channel itself |
| Expecting camelCase JSON | All fields are snake_case, exactly as the API returns them |
caesar search | The binary is caesar-search |