OpenOpps

OpenOpps docs / Reference

CLI

Command groups, workflow order, filters, and output modes for the OpenOpps CLI.

CLI-onlylocal ledgercli

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.

Route map
100%
CLI command OPENOPPS settings Source catalogs Durable boards Board provider routes Normalized jobs JSONL CSV Parquet SQLite Coverage and audit Dry-run health

Zoom 100%, pan 0, 0

Invocation

Run through the repository environment during development:

uv sync
just --list
uv run openopps --help
uv run openopps status

Install the current checkout as an editable uv tool when you want to call openopps directly:

uv tool install -e .
openopps --help
openopps status

The 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:

  1. Run sync for source discovery, board route resolution, and job sync in order.
  2. Use sources sync, boards sync, or jobs sync when rerunning one stage.
  3. Inspect providers coverage, providers audit, or admin providers registry when route metadata is incomplete.
  4. Use jobs list, boards export, or jobs export for analysis.

Use status or doctor between steps to see counts, route readiness, cache state, plugin load state, and the next recommended action.

Safety Classes

ClassExamplesWhat changes
Read-only local inspectionstatus, doctor, sources list, providers coverage, plugins list, cache statusReads local SQLite/catalog state only.
Writes local SQLite stateexamples seed, sources sync, boards sync, jobs sync, admin boards add, admin db initCreates or updates records under OPENOPPS_DB_URL and cache settings.
Live upstream diagnosticsadmin sources test, providers health, admin providers probe-routesCalls public source or provider endpoints; dry-run unless the command documents --apply.
Destructive local maintenanceadmin cache purgeDeletes 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

SurfaceCommandsPurpose
synctop-levelRun source discovery, board route resolution, and job sync in order.
statustop-levelReport database, cache, plugin, route readiness, and next action.
doctortop-levelSame status payload with setup-oriented framing.
sourceslist, show, syncInspect aggregate discovery catalogs and import board records.
boardssync, list, show, exportResolve, inspect, and export firm or company hiring board records.
jobssync, list, show, history, exportFetch, inspect, version, and export normalized public postings.
providershealth, coverage, auditInspect live health, persisted coverage gaps, and adoption evidence.
cachestatusInspect the SQLite request cache.
pluginslistInspect installed plugin entry points, capabilities, and failures.
examplesseedSeed deterministic synthetic demo data.
adminsources, boards, providers, cache, dbAdvanced 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 flagAliasesUsed by
--source-s, -SSource, board, job, provider, and audit scopes.
--board-b, -BJob sync/list/export and route diagnostics.
--provider-p, -PBoard, job, provider, and route scopes.
--limit-n, -NList and diagnostic result limits.
--json-j, -JMachine-readable command output.
--output-o, -OExport or no-DB output paths.
--format-f, -FExport format selection.
--metrics-json-m, -MSync metrics output.
--refresh-cache-r, -RFresh upstream reads for cacheable request paths.
--verbose-v, -VDetailed 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 --json

Provider 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:

FlagSemantics
--sourceExact source key, such as a16z or yc.
--providerExact detected board-provider route id. any and all remove the filter.
--marketCase-insensitive substring match against board market tags.
--locationCase-insensitive substring match against normalized board locations.
--domainCase-insensitive substring match against normalized board domains.
--has-jobsKeep boards with a source job hint, provider job hint, or synced job.
--min-staffKeep boards with staff_count greater than or equal to the value.
--max-staffKeep boards with staff_count less than or equal to the value.
--limitApply a final limit after filters.
--jsonJSON 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.

FlagSemantics
--sourceExact source key via the job's board record.
--boardExact persisted board key from boards list.
--providerExact job provider id. any and all remove the filter.
--locationCase-insensitive substring match against normalized job locations.
--departmentCase-insensitive substring match against normalized department.
--teamCase-insensitive substring match against normalized team.
--workplace-typeCase-insensitive substring match against normalized workplace type.
--remoteCase-insensitive exact match against normalized remote level: Full, Hybrid, or None.
--employment-type, --typeCase-insensitive substring match against normalized employment type.
--salary-minKeep jobs whose normalized salary range overlaps this lower bound.
--salary-maxKeep jobs whose normalized salary range overlaps this upper bound.
--skillCase-insensitive substring match against normalized skill name, level, or keywords.
--queryCase-insensitive substring match across normalized title, company, and plain-text description.
--posted-afterInclusive YYYY-MM-DD lower bound for normalized posted_at dates.
--posted-beforeInclusive YYYY-MM-DD upper bound for normalized posted_at dates.
--statusLifecycle filter: open, closed, or all. Defaults to open.
--limitApply a final limit after filters.
--jsonJSON 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.parquet

boards export and jobs export support:

FormatUse case
jsonlStreaming and audit-friendly line-delimited records.
csvSpreadsheet inspection and lightweight exchange.
parquetAnalytics workflows with Polars, DuckDB, or warehouse ingestion.
sqliteLocal 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

SymptomCommand to run first
Local state looks emptyuv run openopps status --json
A source returns no boardsuv run openopps admin sources test <source> --page-size 5 --refresh-cache
A board has provider hints but no jobsuv run openopps admin providers registry --include-missing --json
Route metadata is missinguv run openopps admin providers probe-routes --source <source> --provider any --limit 25 --json
Cached data looks staleRerun the command with --refresh-cache or purge a specific namespace.
Export output is emptyCheck status, then rerun the matching list command with the same filters and --json.

On this page