Detect buying intent from job postings. When a company posts a job in your problem area, they've allocated budget and are actively thinking about the problem. This skill finds those companies, qualifies them, extracts personalization context, and outputs everything to a Google Sheet. Does NOT do outreach — just delivers qualified leads with reasoning.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the job-posting-intent skill
Find companies that are hiring for roles related to the problem you solve. A job posting is a budget signal — the company has allocated money to solve a problem your product addresses.
Results are automatically exported to a Google Sheet with signal strength, decision-maker suggestions, outreach angles, and personalization context.
When a company posts a job, they've:
If your product helps solve that problem faster, cheaper, or better than a hire alone, the timing is perfect.
Apify Actor: harvestapi/linkedin-job-search (pay-per-event)
| Component | Cost |
|---|---|
| Actor start (per run) | $0.001 |
| Per job result | $0.001 |
| Apify platform fee | +20% |
Typical run costs:
| Scenario | Titles | Jobs/title | Runs | Est. Cost |
|---|---|---|---|---|
| Quick scan | 3 | 25 | 3 | ~$0.09 |
| Standard | 5 | 25 | 5 | ~$0.16 |
| Deep search | 5 | 100 | 5 | ~$0.60 |
| Multi-location | 5×3 | 25 | 15 | ~$0.47 |
Google Sheet creation is free (uses Rube/Composio integration).
Always run --estimate-only first to see the Apify cost before executing.
Track usage: https://console.apify.com/billing
# Get your token at https://console.apify.com/account/integrations
export APIFY_API_TOKEN="apify_api_YOUR_TOKEN_HERE"pip3 install requestsGoogle Sheet creation uses Rube MCP with Composio. The token is preconfigured.
If it stops working, update the RUBE_TOKEN env var or the default in search_jobs.py.
Think about it this way: "If a company is hiring for [role], it means they're investing in [problem area you solve]."
Examples:
python3 scripts/search_jobs.py \
--titles "GTM Engineer,SDR Manager,Head of Demand Gen" \
--locations "United States" \
--max-per-title 25 \
--estimate-onlyThe script searches LinkedIn Jobs, groups results by company, qualifies leads, and creates a Google Sheet automatically.
# Standard search (creates Google Sheet)
python3 scripts/search_jobs.py \
--titles "GTM Engineer,SDR Manager,RevOps Engineer" \
--locations "United States" \
--max-per-title 25
# Deep search with custom sheet name
python3 scripts/search_jobs.py \
--titles "AI Engineer,ML Ops Engineer,Prompt Engineer" \
--locations "United States" \
--max-per-title 50 \
--sheet-name "AI Hiring Signals - Feb 2026"
# Filter results to only relevant titles (LinkedIn search is fuzzy)
python3 scripts/search_jobs.py \
--titles "GTM Engineer,Growth Marketing Manager,SDR Manager" \
--locations "United States" \
--relevance-keywords "gtm,growth,sdr,marketing,demand gen,revops"
# Also save raw JSON alongside the sheet
python3 scripts/search_jobs.py \
--titles "GTM Engineer,SDR Manager" \
--locations "United States" \
--output results.json
# Skip Google Sheet, console + JSON only
python3 scripts/search_jobs.py \
--titles "GTM Engineer" \
--no-sheet --jsonRequired:
--titles Comma-separated job titles to search
Optional:
--locations Comma-separated locations (default: no filter)
--max-per-title Max jobs per title per location (default: 25)
--posted-limit Recency: 1h, 24h, week, month (default: week)
--output, -o Also save raw JSON to this file path
--json Print JSON output to console
--estimate-only Show cost estimate without running
--no-sheet Skip Google Sheet creation
--sheet-name Custom Google Sheet title (default: "Job Posting Intent Signals - {date}")
--relevance-keywords Comma-separated keywords to filter truly relevant postings| Column | Description |
|---|---|
| Signal | HIGH / MEDIUM / LOW based on # postings + seniority |
| Company | Company name |
| Employees | Employee count |
| Industry | Company industry |
| Website | Company website |
| Company LinkedIn URL | |
| # Postings | Number of relevant job postings found |
| Job Titles | The actual job titles posted |
| Job URL | Link to the primary job posting |
| Location | Job location(s) |
| Decision Maker | Suggested title of person to contact |
| Outreach Angle | Accelerate / Replace / Multiply the hire |
| Tech Stack | Technologies mentioned in job descriptions |
| Growth Signals | Growth indicators (first hire, scaling, series stage) |
| Pain Points | Pain indicators (automate, optimize, manual processes) |
| Description | Company description snippet |
When using this skill as an agent, the typical flow is:
--estimate-only and confirms cost with userExample prompt:
"Find companies hiring growth marketers and SDRs in the US this week. These are signals they need GTM help. We sell AI-powered GTM systems to Series A-C B2B SaaS companies with 20-200 employees."
The agent should NOT:
The agent SHOULD:
The script auto-assigns an angle based on job posting context:
"Accelerate while you hire" — Best when: posting is recent, role is junior/mid
They're looking for someone to do X. Your product can deliver X outcomes while they ramp the hire.
"Replace the hire" — Best when: small company, "first hire" signals, building from scratch
They want the output of a [role] but may not need a full-time person if they use your product.
"Multiply the hire" — Best when: company is clearly scaling, multiple related roles
When their new hire starts, your product makes them 10x more effective from day one.
--posted-limit month--relevance-keywords to filter by title keywords--no-sheet --json --output results.json to save results without a sheetscripts/create_sheet_mcp.py--max-per-title (25 is usually enough)--posted-limit 24h for a quick daily scanRender a 'model comparison grid' video from a config — a fal-style "same prompt, N contenders" showcase — a dark real-DOM stage where per beat a monospace prompt fades in centered, docks to a small top strip, then a labeled 2-4 panel grid (static images OR muted video clips, mixable per cell) staggers in and holds for comparison, plus a minimal end card — frame-stepped via Playwright (video cells are frame-seeked deterministically) and encoded with FFmpeg. Deterministic assembly, FREE (cell media comes from create-image-fal / create-video-fal, music from create-music-elevenlabs), text stays pixel-crisp. Use for the model-comparison-grid format.
Render a punchy ~12s vertical (9:16) music-only direct-response OFFER ad as a 4-beat kinetic-typography film — HEADLINE slam → real PRODUCT drop → CLAIM/proof → CTA pill — from one config of copy slots, a real product photo, a brand palette, fonts, bpm, and beat split. DETERMINISTIC + FREE (a bundled Remotion project; springs + interpolate, no AI-gen for visuals). Backgrounds are engine gradient divs off the palette, props are inline SVG, the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched), and ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered (the format's credibility guard). A driver binds the config to Remotion input props, renders the 9:16 master, and derives a 1:1 center-crop with ffmpeg. Two gating checks run before render (claim verbs must match the product's physical format; the claim beat needs an edge-entry mechanism prop). Use for the motion-graphics-offer-ad format.
Assemble a myth-vs-fact kinetic-typography explainer video ad (≈29.5s, 9:16) from N myth/fact pairs + hook / turn / punch copy + palette + a brand end-card PNG + a VO track — a hook, 3 red-strike MYTH cards that flip to teal-check FACT cards (per-line strikethrough that crosses EVERY wrapped line), a "what actually works" turn, an optional proof reveal, a punch line, and a static end card. DETERMINISTIC assembly with ZERO AI-gen visuals — HTML hyperframes rendered frame-exact via Playwright (`window.renderAt(t)`, animation a pure function of beat-local time), Whisper beat-snap to VO word onsets, concat at a uniform fps, karaoke `.ass` captions burned last (suppressed on the proof + end-card beats), and a VO + optional music mix (music −20 dB, `amix normalize=0`, tail fade). FREE (Python + Playwright + ffmpeg); the recipe supplies the copy / palette / end-card / VO and gates the paid VO / music / Whisper calls to their own capabilities. Use for the myth-vs-fact format.