{"_id":"@chanmeng666/linkedin-jobs-search-cli","_rev":"4-e09f2d0f8e1ffa21fb6d9b137d7692e9","name":"@chanmeng666/linkedin-jobs-search-cli","dist-tags":{"latest":"1.1.0"},"versions":{"0.1.0":{"name":"@chanmeng666/linkedin-jobs-search-cli","version":"0.1.0","license":"MIT","_id":"@chanmeng666/linkedin-jobs-search-cli@0.1.0","maintainers":[{"name":"chanmeng666","email":"tomoko230311@outlook.com"}],"bin":{"lja":"dist/index.js"},"dist":{"shasum":"e97e75d59828456bb6eba7e2db71eeb02f44f8c1","tarball":"https://registry.npmjs.org/@chanmeng666/linkedin-jobs-search-cli/-/linkedin-jobs-search-cli-0.1.0.tgz","fileCount":35,"integrity":"sha512-WflSoiKXTZDP0bTy7u2aud8gyJluaDv5gB/fYkHJqFfKRRUf3h5bofSRGj29BbVwtvfxv+bV86plVrRUsExYsg==","signatures":[{"sig":"MEUCIGjDqvxPy72wfa+MfL9yVbrFTJTWVXHVL9kNXvasLPgIAiEA9hdRE396nIoHGaAxEhALvBcGcGqjXtamW7Q4cuq9b9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45083},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1da3913a3d1e3badb0f82ff9ba45c2ac4826db89","scripts":{"build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"chanmeng666","email":"tomoko230311@outlook.com"},"_npmVersion":"11.12.1","description":"Agent-first CLI for the LinkedIn Jobs Search API. JSON to stdout, problem+json to stderr.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"cac":"^6.7.14"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-search-cli_0.1.0_1777968244183_0.6028193145858887","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Hosted service has been taken offline (project retired 2026-07). Self-host the worker and pass --base-url if you need this CLI."},"1.0.0":{"name":"@chanmeng666/linkedin-jobs-search-cli","version":"1.0.0","license":"MIT","_id":"@chanmeng666/linkedin-jobs-search-cli@1.0.0","maintainers":[{"name":"chanmeng666","email":"tomoko230311@outlook.com"}],"bin":{"lja":"dist/index.js"},"dist":{"shasum":"8ea0db77eafcc843158dec6d65812fd00b69396f","tarball":"https://registry.npmjs.org/@chanmeng666/linkedin-jobs-search-cli/-/linkedin-jobs-search-cli-1.0.0.tgz","fileCount":35,"integrity":"sha512-OlvN1iZ5rve7kNSbLgMdmjzWNb33DAjloux0wKdg4CYZ5iqSGMoiDa9VDs4wESBKNZPQvgRuANPCBqIZLFaAWA==","signatures":[{"sig":"MEYCIQCDxBlI0uS6PqhZnQmmq5eJeTMtRogdU5P3/zN+xSAo6gIhAOH539eokmELrWAeK3RskwYzStjxB2uTTkZGthL7syjX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47004},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a7ad6d8fe413a83971ff40132af4fcc83ce98855","scripts":{"build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"chanmeng666","email":"tomoko230311@outlook.com"},"_npmVersion":"10.8.2","description":"Agent-first CLI for the LinkedIn Jobs Search API. JSON to stdout, problem+json to stderr.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"cac":"^6.7.14"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-search-cli_1.0.0_1778333844923_0.47216922180284926","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Hosted service has been taken offline (project retired 2026-07). Self-host the worker and pass --base-url if you need this CLI."},"1.1.0":{"name":"@chanmeng666/linkedin-jobs-search-cli","version":"1.1.0","keywords":["linkedin","jobs","job-search","cli","agent","agentic","mcp","api","lja"],"author":{"name":"Chan Meng","email":"chanmeng.dev@gmail.com"},"license":"MIT","_id":"@chanmeng666/linkedin-jobs-search-cli@1.1.0","maintainers":[{"name":"chanmeng666","email":"tomoko230311@outlook.com"}],"homepage":"https://linkedin-jobs-search.chanmeng-dev.workers.dev","bugs":{"url":"https://github.com/ChanMeng666/linkedin-jobs-search/issues"},"bin":{"lja":"dist/index.js"},"dist":{"shasum":"1e7f180433cf5f3e2bdf2ee12b37915942dc1f5b","tarball":"https://registry.npmjs.org/@chanmeng666/linkedin-jobs-search-cli/-/linkedin-jobs-search-cli-1.1.0.tgz","fileCount":48,"integrity":"sha512-AkxhgeXTkUF9NKy56/ZwPXE2NBwz3mIxPc7Nbe5hpyGqsxwdYo47hzHuLXEfwQbBR2gCdFKWvtLCKqGy4yhZPg==","signatures":[{"sig":"MEUCIFHb8TbU1pWLk5bmPpLn1OERrnE4ChbgIkHkYw070A8ZAiEAvgfW82eUm3VD7sK0sXtiUYBi0B3Z/IZvwsFbncQqcKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86913},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"04b85fe76fbe322777db795a7e69bc4456c0e373","scripts":{"test":"node --test --experimental-transform-types \"src/**/*.test.ts\"","build":"tsc","typecheck":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"chanmeng666","email":"tomoko230311@outlook.com"},"repository":{"url":"git+https://github.com/ChanMeng666/linkedin-jobs-search.git","type":"git","directory":"cli"},"_npmVersion":"10.9.8","description":"Agent-first CLI for the LinkedIn Jobs Search API. JSON to stdout, problem+json to stderr.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"cac":"^6.7.14"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-search-cli_1.1.0_1781860732652_0.8165321491955193","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Hosted service has been taken offline (project retired 2026-07). Self-host the worker and pass --base-url if you need this CLI."}},"time":{"created":"2026-05-05T08:04:03.964Z","modified":"2026-07-06T21:43:49.846Z","0.1.0":"2026-05-05T08:04:04.328Z","1.0.0":"2026-05-09T13:37:25.102Z","1.1.0":"2026-06-19T09:18:52.796Z"},"bugs":{"url":"https://github.com/ChanMeng666/linkedin-jobs-search/issues"},"author":{"name":"Chan Meng","email":"chanmeng.dev@gmail.com"},"license":"MIT","homepage":"https://linkedin-jobs-search.chanmeng-dev.workers.dev","keywords":["linkedin","jobs","job-search","cli","agent","agentic","mcp","api","lja"],"repository":{"url":"git+https://github.com/ChanMeng666/linkedin-jobs-search.git","type":"git","directory":"cli"},"description":"Agent-first CLI for the LinkedIn Jobs Search API. JSON to stdout, problem+json to stderr.","maintainers":[{"name":"chanmeng666","email":"tomoko230311@outlook.com"}],"readme":"# `@chanmeng666/linkedin-jobs-search-cli`\n\nAgent-first CLI for the [LinkedIn Jobs Search](https://linkedin-jobs-search.chanmeng-dev.workers.dev) API. Binary: `lja`.\n\n```bash\nnpm i -g @chanmeng666/linkedin-jobs-search-cli\n# OR (no install):\nnpx @chanmeng666/linkedin-jobs-search-cli search --keyword rust\n```\n\n## Auth\n\nOnly one input is required:\n\n- `LJA_API_KEY` — `lja_<keyId>_<secret>` token. Mint via the [dashboard](https://linkedin-jobs-search.chanmeng-dev.workers.dev/dashboard) (cookie-auth only).\n\nThe base URL defaults to the live deployment, so this works out of the box:\n\n```bash\nexport LJA_API_KEY=\"lja_...\"\nlja search --keyword rust --location Remote\n```\n\nBoth values can also be passed as flags, and the base URL overridden for self-hosting. Precedence is **flag > env > default**:\n\n| Input | Flag | Env | Default |\n|---|---|---|---|\n| API key | `--api-key` | `LJA_API_KEY` | _(required)_ |\n| Base URL | `--base-url` | `LJA_BASE_URL` | `https://linkedin-jobs-search.chanmeng-dev.workers.dev` |\n\n## Quota\n\nBoth `lja search` and `lja export` are billable. Free tier: 50 searches + 5 exports per calendar month. Paid tier: 1,000 searches + 100 exports included on a metered Stripe subscription, plus per-event overage. Each command exits with code `5` if quota is exhausted (problem+json `code: \"quota_exceeded\"` printed to stderr). Pass `--verbose` to see remaining quota on every billable call.\n\n## Output contract\n\n- **Success**: JSON to **stdout**, no pretty-print, no color, envelope unwrapped — agents see the bare `data` payload directly.\n- **Error**: RFC 7807 `application/problem+json` to **stderr**, verbatim from the API. Local argument problems (unknown command/flag, missing `--id`, bad `--status`/`--format`) are emitted in the same shape with `code: \"validation_error\"` and exit `4`.\n- **`--verbose`**: emits one extra `lja:meta` line to **stderr** with quota / cache / rate-limit headers (`X-Quota-*`, `X-RateLimit-*`, `X-Cache`). stdout stays pure JSON, so `2>/dev/null` always leaves machine-readable output.\n- **Exit codes** (mirror the wire `code` field):\n  - `0` ok\n  - `1` unauthorized\n  - `2` forbidden\n  - `3` not_found\n  - `4` validation_error (server-side **or** local argument errors)\n  - `5` quota_exceeded\n  - `6` rate_limited\n  - `7` internal_error\n  - `8` network/IO error or missing API key\n  - `9` unknown\n  - `10` invalid_token (export download token signature invalid)\n  - `11` expired_token (export download token expired)\n  - `12` export_expired (R2 object lifecycle-deleted)\n\nThere is **no interactive mode**. No prompts, no spinners, no `--json` flag (always JSON). `--help` is plain text and stable — agents may cache it.\n\n## Commands\n\nCommands mirror the MCP tool names; `presets update`/`presets delete`, `history delete`, and `usage list` extend the set for full CRUD (the MCP tool names themselves stay locked).\n\n| Command | Backing route | MCP tool |\n|---|---|---|\n| `lja search` | `POST /api/jobs` | `search_jobs` |\n| `lja countries list` | `GET /api/jobs` | `list_countries` |\n| `lja saved list` | `GET /api/user/saved-jobs` | `list_saved_jobs` |\n| `lja saved save` | `POST /api/user/saved-jobs` | `save_job` |\n| `lja saved update` | `PUT /api/user/saved-jobs` | `update_saved_job_status` |\n| `lja saved delete` | `DELETE /api/user/saved-jobs` | `delete_saved_job` |\n| `lja export` | `POST /api/export` | `export_saved_jobs` |\n| `lja subscription get` | `GET /api/billing/subscription` | `get_subscription` |\n| `lja presets list` | `GET /api/user/presets` | `list_search_presets` |\n| `lja presets save` | `POST /api/user/presets` | `save_search_preset` |\n| `lja presets update` | `PUT /api/user/presets` | — (CRUD completeness) |\n| `lja presets delete` | `DELETE /api/user/presets` | — (CRUD completeness) |\n| `lja history list` | `GET /api/user/search-history` | `list_search_history` |\n| `lja history delete` | `DELETE /api/user/search-history` | — (CRUD completeness; omit `--id` to clear all) |\n| `lja usage list` | `GET /api/user/usage` | — (CRUD completeness) |\n| `lja keys list` | `GET /api/keys` | — (cookie-only; exits `2 forbidden`) |\n\nRun `lja <group> --help` (e.g. `lja saved --help`) for the options on each group.\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}