OpenOpps docs / Reference
CLI
Command groups, workflow order, filters, and output modes for the OpenOpps CLI.
OpenOpps exposes the openopps console script from openopps.cli:app. Treat the CLI as a local data pipeline: source catalogs become durable board records, board records become executable provider routes, provider routes become normalized jobs, and exports preserve the resulting ledger for audit or analysis.
Zoom 100%, pan 0, 0
Invocation
Run through the repository environment during development:
uv sync
just --list
uv run openopps --help
uv run openopps statusInstall the current checkout as an editable uv tool when you want to call openopps directly:
uv tool install -e .
openopps --help
openopps statusThe editable tool uses the same runtime settings as uv run, including OPENOPPS_DB_URL, plugin allow lists, cache settings, and current working-directory-relative SQLite paths.
Workflow
The normal sequence is:
- Run
syncfor source discovery, board route resolution, and job sync in order. - Use
sources sync,boards sync, orjobs syncwhen rerunning one stage. - Inspect
providers coverage,providers audit, oradmin providers registrywhen route metadata is incomplete. - Use
jobs list,boards export, orjobs exportfor analysis.
Use status or doctor between steps to see counts, route readiness, cache state, plugin load state, and the next recommended action.
Safety Classes
| Class | Examples | What changes |
|---|---|---|
| Read-only local inspection | status, doctor, sources list, providers coverage, plugins list, cache status | Reads local SQLite/catalog state only. |
| Writes local SQLite state | examples seed, sources sync, boards sync, jobs sync, admin boards add, admin db init | Creates or updates records under OPENOPPS_DB_URL and cache settings. |
| Live upstream diagnostics | admin sources test, providers health, admin providers probe-routes | Calls public source or provider endpoints; dry-run unless the command documents --apply. |
| Destructive local maintenance | admin cache purge | Deletes local cache records; scope with --namespace when possible. |
--apply is intentionally absent from most everyday commands. When it appears on diagnostics such as route probing or health checks, treat it as the boundary between inspection and persistence.
Command Groups
| Surface | Commands | Purpose |
|---|---|---|
sync | top-level | Run source discovery, board route resolution, and job sync in order. |
status | top-level | Report database, cache, plugin, route readiness, and next action. |
doctor | top-level | Same status payload with setup-oriented framing. |
sources | list, show, sync | Inspect aggregate discovery catalogs and import board records. |
boards | sync, list, show, export | Resolve, inspect, and export firm or company hiring board records. |
jobs | sync, list, show, history, export | Fetch, inspect, version, and export normalized public postings. |
providers | health, coverage, audit | Inspect live health, persisted coverage gaps, and adoption evidence. |
cache | status | Inspect the SQLite request cache. |
plugins | list | Inspect installed plugin entry points, capabilities, and failures. |
examples | seed | Seed deterministic synthetic demo data. |
admin | sources, boards, providers, cache, db | Advanced registration, route diagnostics, cache purge, and DB maintenance. |
Option Conventions
Examples use long flags for readability. The CLI also exposes script-friendly short aliases for high-traffic options:
| Long flag | Aliases | Used by |
|---|---|---|
--source | -s, -S | Source, board, job, provider, and audit scopes. |
--board | -b, -B | Job sync/list/export and route diagnostics. |
--provider | -p, -P | Board, job, provider, and route scopes. |
--limit | -n, -N | List and diagnostic result limits. |
--json | -j, -J | Machine-readable command output. |
--output | -o, -O | Export or no-DB output paths. |
--format | -f, -F | Export format selection. |
--metrics-json | -m, -M | Sync metrics output. |
--refresh-cache | -r, -R | Fresh upstream reads for cacheable request paths. |
--verbose | -v, -V | Detailed sync warnings instead of compact progress. |
--provider any and --provider all both remove the provider filter. They are useful in reusable scripts that always pass a provider argument, but they do not mean “only providers named any/all.”
Common Commands
uv run openopps status --json
uv run openopps doctor --json
uv run openopps sync a16z --metrics-json --refresh-cache
uv run openopps sources sync a16z --metrics-json
uv run openopps boards sync --source a16z --provider any --metrics-json
uv run openopps jobs sync --provider ashbyhq --metrics-json --refresh-cache
uv run openopps providers coverage --source a16z --provider any --json
uv run openopps admin providers probe-routes --source a16z --provider any --limit 25 --jsonProvider hints from source catalogs may lack the token or URL needed for job fetching. admin providers probe-routes tries candidate tokens from upstream slugs, remote ids, names, domains, and websites, then reports both matched routes and unknown boards. It is read-only unless --apply is passed.
Board Filters
boards list and boards export share these filters:
| Flag | Semantics |
|---|---|
--source | Exact source key, such as a16z or yc. |
--provider | Exact detected board-provider route id. any and all remove the filter. |
--market | Case-insensitive substring match against board market tags. |
--location | Case-insensitive substring match against normalized board locations. |
--domain | Case-insensitive substring match against normalized board domains. |
--has-jobs | Keep boards with a source job hint, provider job hint, or synced job. |
--min-staff | Keep boards with staff_count greater than or equal to the value. |
--max-staff | Keep boards with staff_count less than or equal to the value. |
--limit | Apply a final limit after filters. |
--json | JSON output mode for boards list. |
Use the exact persisted board key shown by boards list; provider requests are deduped before probing or job sync when overlapping source coverage points at the same provider route.
Job Filters
jobs list and jobs export default to current active jobs with --status open across all boards and providers. Use --status closed or --status all for lifecycle audits.
| Flag | Semantics |
|---|---|
--source | Exact source key via the job's board record. |
--board | Exact persisted board key from boards list. |
--provider | Exact job provider id. any and all remove the filter. |
--location | Case-insensitive substring match against normalized job locations. |
--department | Case-insensitive substring match against normalized department. |
--team | Case-insensitive substring match against normalized team. |
--workplace-type | Case-insensitive substring match against normalized workplace type. |
--remote | Case-insensitive exact match against normalized remote level: Full, Hybrid, or None. |
--employment-type, --type | Case-insensitive substring match against normalized employment type. |
--salary-min | Keep jobs whose normalized salary range overlaps this lower bound. |
--salary-max | Keep jobs whose normalized salary range overlaps this upper bound. |
--skill | Case-insensitive substring match against normalized skill name, level, or keywords. |
--query | Case-insensitive substring match across normalized title, company, and plain-text description. |
--posted-after | Inclusive YYYY-MM-DD lower bound for normalized posted_at dates. |
--posted-before | Inclusive YYYY-MM-DD upper bound for normalized posted_at dates. |
--status | Lifecycle filter: open, closed, or all. Defaults to open. |
--limit | Apply a final limit after filters. |
--json | JSON output mode for jobs list. |
Date filters intentionally only match jobs whose normalized posted_at starts with YYYY-MM-DD, such as ISO timestamps. Relative provider text such as Posted Yesterday is not used for public filtering semantics.
Exports
uv run openopps boards export --provider ashbyhq --has-jobs --format csv --output /tmp/openopps-boards.csv
uv run openopps jobs export --source a16z --type full --format parquet --output /tmp/openopps-jobs.parquetboards export and jobs export support:
| Format | Use case |
|---|---|
jsonl | Streaming and audit-friendly line-delimited records. |
csv | Spreadsheet inspection and lightweight exchange. |
parquet | Analytics workflows with Polars, DuckDB, or warehouse ingestion. |
sqlite | Local relational handoff, reproducible filtered extracts, or direct SQLite clients. |
JSONL exports stream line-delimited records and empty JSONL/CSV exports produce empty files. Empty Parquet exports produce a readable empty Parquet table. CSV exports neutralize spreadsheet formula-leading strings by prefixing a single quote. SQLite exports should keep the same flattened field contract as CSV/Parquet and store nested values as stable JSON strings.
For schema, SQLite, and search-index details, see Data Model.
Troubleshooting Map
| Symptom | Command to run first |
|---|---|
| Local state looks empty | uv run openopps status --json |
| A source returns no boards | uv run openopps admin sources test <source> --page-size 5 --refresh-cache |
| A board has provider hints but no jobs | uv run openopps admin providers registry --include-missing --json |
| Route metadata is missing | uv run openopps admin providers probe-routes --source <source> --provider any --limit 25 --json |
| Cached data looks stale | Rerun the command with --refresh-cache or purge a specific namespace. |
| Export output is empty | Check status, then rerun the matching list command with the same filters and --json. |