{"id":17022,"plugin_id":"plugins_6a71ba177f448191b11fc1352bc2ed9e","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:13:56.084Z","digest":"1e458fe52feeca17743e7d5c5f6a34c6abd2a23bb02ae43facdc13ac9045770a","against":null,"payload":{"description":"Search live job postings and detect a company's tech stack with the JobsPipe API. Use when an agent needs real hiring data (open roles, hiring signals, sourcing, salary and location) or to identify which technologies a domain runs.","included_files":[],"name":"jobspipe","skill_md_contents":"---\nname: jobspipe\ndescription: Search live job postings and detect a company's tech stack with the JobsPipe API. Use when an agent needs real hiring data (open roles, hiring signals, sourcing, salary and location) or to identify which technologies a domain runs.\n---\n\n# JobsPipe\n\nJobsPipe is a developer API with two functions over one host and one key:\n\n1. **Job search** — live, normalized job postings from 30+ ATS and job-board\n   sources (Workday, Greenhouse, Lever, Ashby, LinkedIn, and more), deduplicated\n   into one JSON schema.\n2. **Tech search (stack scan)** — detect the technologies a given domain runs\n   (frameworks, CDNs, analytics, payments, and more), with confidence scores.\n\nBase URL: `https://api.jobspipe.dev`\n\n## When to use\n\n- Find, list, or analyze open job postings (by title, skill/tech, location,\n  remote, seniority, company, recency).\n- Use open roles as a hiring/buying signal for a company.\n- Identify which technologies a company or domain uses.\n\n## Authentication\n\nEvery request needs an API key sent as a Bearer token. Keys start with\n`jp_live_`. Get one free at https://jobspipe.dev/signup (free tier: 1,000\njobs/month, 1 credit = 1 job returned).\n\n```\nAuthorization: Bearer jp_live_YOUR_KEY\n```\n\nSet it once:\n\n```bash\nexport JOBSPIPE_API_KEY=jp_live_YOUR_KEY\n```\n\n## Install the CLI\n\nInstalling this skill does **not** install the CLI — `npx skills add` only\ncopies this file. Install the CLI once (global), so the `jobspipe` command is\non PATH, then set your key:\n\n```bash\nnpm i -g jobspipe-cli\nexport JOBSPIPE_API_KEY=jp_live_YOUR_KEY\n```\n\nThen `jobspipe jobs ...` and `jobspipe stack ...` work directly. Run\n`jobspipe --help` for every flag; verify your key with `jobspipe jobs --limit 1`.\nCan't install globally? Prefix any command with `npx -y`, e.g.\n`npx -y jobspipe-cli jobs --limit 1`. No Node at all? Use the `curl` examples below.\n\n## Function 1 — Job search\n\n`POST /v1/jobs/search`. The body is a JSON object of filters; all fields are\noptional and combine with AND. Array filters ending in `_or` match any value.\nAn empty body returns the most recent postings.\n\n```bash\ncurl -s https://api.jobspipe.dev/v1/jobs/search \\\n  -H \"Authorization: Bearer $JOBSPIPE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"job_title_or\": [\"software engineer\", \"backend engineer\"],\n    \"job_country_code_or\": [\"US\"],\n    \"remote\": true,\n    \"posted_at_max_age_days\": 7,\n    \"limit\": 25,\n    \"include_total_results\": true\n  }'\n```\n\nCLI equivalent:\n\n```bash\njobspipe jobs --title \"software engineer\" --title \"backend engineer\" \\\n  --country US --remote --max-age-days 7 --limit 25 --total\n```\n\nPass a raw filter object for the full surface (overrides any flags, also read\nfrom stdin):\n\n```bash\njobspipe jobs '{\"description_or\":[\"rust\"],\"posted_at_max_age_days\":7,\"limit\":10}'\n```\n\nCommon filters: `job_title_or`, `job_title_not`, `description_or`\n(match a skill or tech in the description), `description_not`,\n`job_country_code_or`, `remote`, `posted_at_max_age_days`, `posted_at_gte` and\n`posted_at_lte` (`YYYY-MM-DD`), `company_name_or`,\n`company_name_partial_match_or`, `job_seniority_or`, `employment_type_or`\n(full-time, part-time, contract, temporary, internship), `source_or`,\n`limit`, `offset`, `include_total_results`.\n\nResponse:\n\n```json\n{\n  \"metadata\": {\n    \"total_results\": 412,\n    \"truncated_results\": 25,\n    \"next_cursor\": \"eyJvZmZzZXQiOjI1fQ\"\n  },\n  \"data\": [\n    {\n      \"id\": \"jp_3958211043\",\n      \"job_title\": \"Backend Engineer\",\n      \"company\": \"Acme Inc\",\n      \"company_domain\": \"acme.com\",\n      \"location\": \"Remote · United States\",\n      \"country_code\": \"US\",\n      \"remote\": true,\n      \"seniority\": \"Mid-Senior\",\n      \"min_annual_salary_usd\": 150000,\n      \"max_annual_salary_usd\": 190000,\n      \"date_posted\": \"2026-06-18\",\n      \"technology_slugs\": [\"go\", \"postgres\"],\n      \"final_url\": \"https://example.com/careers/3958211043\"\n    }\n  ]\n}\n```\n\n`limit` is capped by your plan (free 25, builder 100, scale and volume 500). Paginate with\n`offset` (or follow `metadata.next_cursor`) until fewer than `limit` rows return.\n\n## Function 2 — Tech search (stack scan)\n\n`POST /v1/stack/scan`. Give a domain; get the technologies detected on it.\n`mode` is optional: `auto` (default, fast HTTP then headless render if thin),\n`html`, or `render`.\n\n```bash\ncurl -s https://api.jobspipe.dev/v1/stack/scan \\\n  -H \"Authorization: Bearer $JOBSPIPE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"domain\": \"stripe.com\" }'\n```\n\nCLI equivalent:\n\n```bash\njobspipe stack stripe.com\njobspipe stack vercel.com --mode render\n```\n\nResponse:\n\n```json\n{\n  \"domain\": \"stripe.com\",\n  \"scanned_at\": \"2026-06-25T12:00:00.000Z\",\n  \"http_status\": 200,\n  \"render_path\": \"curl_cffi\",\n  \"detected\": [\n    {\n      \"slug\": \"react\",\n      \"name\": \"React\",\n      \"categories\": [\"JavaScript frameworks\"],\n      \"confidence\": 95,\n      \"version\": null,\n      \"signals\": [{ \"kind\": \"script\", \"match\": \"react.production.min.js\" }],\n      \"website\": \"https://react.dev\",\n      \"pricing\": [\"open source\"],\n      \"saas\": false,\n      \"oss\": true\n    }\n  ]\n}\n```\n\nScans are cached for about 14 days; a repeat within that window is served from\ncache and still counts as one request.\n\n## Errors\n\nBoth functions return `{ \"error\": \"...\" }` with these statuses:\n\n- `400` — invalid domain (stack scan only).\n- `401` — missing or invalid API key.\n- `402` — monthly request quota exceeded.\n- `429` — per-second rate limit exceeded; slow down and retry.\n- `502` — scanner failed (stack scan); retry or try `--mode render`.\n- `504` — upstream timed out; retry.\n\n## Notes\n\n- Job records are deduplicated across sources; the same role appears once.\n- Salary is parsed into structured ranges (`*_annual_salary*`) when present.\n- Full schema and guides: https://jobspipe.dev/docs\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}