jobspipe — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited jobspipe (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
JobsPipe is a developer API with two functions over one host and one key:
sources (Workday, Greenhouse, Lever, Ashby, LinkedIn, and more), deduplicated into one JSON schema.
(frameworks, CDNs, analytics, payments, and more), with confidence scores.
Base URL: https://api.jobspipe.dev
remote, seniority, company, recency).
Every request needs an API key sent as a Bearer token. Keys start with jp_live_. Get one free at https://jobspipe.dev/signup (free tier: 5,000 requests/month, no card).
Authorization: Bearer jp_live_YOUR_KEYSet it once:
export JOBSPIPE_API_KEY=jp_live_YOUR_KEYInstalling this skill does not install the CLI — npx skills add only copies this file. Install the CLI once (global), so the jobspipe command is on PATH, then set your key:
npm i -g jobspipe-cli
export JOBSPIPE_API_KEY=jp_live_YOUR_KEYThen jobspipe jobs ... and jobspipe stack ... work directly. Run jobspipe --help for every flag; verify your key with jobspipe jobs --limit 1. Can't install globally? Prefix any command with npx -y, e.g. npx -y jobspipe-cli jobs --limit 1. No Node at all? Use the curl examples below.
POST /v1/jobs/search. The body is a JSON object of filters; all fields are optional and combine with AND. Array filters ending in _or match any value. An empty body returns the most recent postings.
curl -s https://api.jobspipe.dev/v1/jobs/search \
-H "Authorization: Bearer $JOBSPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_title_or": ["software engineer", "backend engineer"],
"job_country_code_or": ["US"],
"remote": true,
"posted_at_max_age_days": 7,
"limit": 25,
"include_total_results": true
}'CLI equivalent:
jobspipe jobs --title "software engineer" --title "backend engineer" \
--country US --remote --max-age-days 7 --limit 25 --totalPass a raw filter object for the full surface (overrides any flags, also read from stdin):
jobspipe jobs '{"description_or":["rust"],"posted_at_max_age_days":7,"limit":10}'Common filters: job_title_or, job_title_not, description_or (match a skill or tech in the description), description_not, job_country_code_or, remote, posted_at_max_age_days, posted_at_gte and posted_at_lte (YYYY-MM-DD), company_name_or, company_name_partial_match_or, job_seniority_or, employment_type_or (full-time, part-time, contract, temporary, internship), source_or, limit, offset, include_total_results.
Response:
{
"metadata": {
"total_results": 412,
"truncated_results": 25,
"next_cursor": "eyJvZmZzZXQiOjI1fQ"
},
"data": [
{
"id": "jp_3958211043",
"job_title": "Backend Engineer",
"company": "Acme Inc",
"company_domain": "acme.com",
"location": "Remote · United States",
"country_code": "US",
"remote": true,
"seniority": "Mid-Senior",
"min_annual_salary_usd": 150000,
"max_annual_salary_usd": 190000,
"date_posted": "2026-06-18",
"technology_slugs": ["go", "postgres"],
"final_url": "https://example.com/careers/3958211043"
}
]
}limit is capped by your plan (free 25, builder 100, scale 500). Paginate with offset (or follow metadata.next_cursor) until fewer than limit rows return.
POST /v1/stack/scan. Give a domain; get the technologies detected on it. mode is optional: auto (default, fast HTTP then headless render if thin), html, or render.
curl -s https://api.jobspipe.dev/v1/stack/scan \
-H "Authorization: Bearer $JOBSPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "domain": "stripe.com" }'CLI equivalent:
jobspipe stack stripe.com
jobspipe stack vercel.com --mode renderResponse:
{
"domain": "stripe.com",
"scanned_at": "2026-06-25T12:00:00.000Z",
"http_status": 200,
"render_path": "curl_cffi",
"detected": [
{
"slug": "react",
"name": "React",
"categories": ["JavaScript frameworks"],
"confidence": 95,
"version": null,
"signals": [{ "kind": "script", "match": "react.production.min.js" }],
"website": "https://react.dev",
"pricing": ["open source"],
"saas": false,
"oss": true
}
]
}Scans are cached for about 14 days; a repeat within that window is served from cache and still counts as one request.
Both functions return { "error": "..." } with these statuses:
400 — invalid domain (stack scan only).401 — missing or invalid API key.402 — monthly request quota exceeded.429 — per-second rate limit exceeded; slow down and retry.502 — scanner failed (stack scan); retry or try --mode render.504 — upstream timed out; retry.*_annual_salary*) when present.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.