Apify Buying Signal Detection
apify/awesome-skills
Set up a recurring buying-signal detection pipeline that finds companies showing buying intent across three signal types — job postings (hiring for the persona), fundraising events (recent raises)…
Research LinkedIn profiles and write personalized messages for any LinkedIn message type — connection requests, InMails, DMs, message requests, post comments, and comment replies.
$ npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install gooseworks-ai/goose-skills linkedin-message-writer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/outreach/capabilities/linkedin-message-writer .claude/skills/linkedin-message-writer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "linkedin-message-writer" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writer into .claude/skills/linkedin-message-writer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "linkedin-message-writer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install gooseworks-ai/goose-skills linkedin-message-writer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/outreach/capabilities/linkedin-message-writer .agents/skills/linkedin-message-writer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "linkedin-message-writer" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writer into .agents/skills/linkedin-message-writer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "linkedin-message-writer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install gooseworks-ai/goose-skills linkedin-message-writer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/outreach/capabilities/linkedin-message-writer .cursor/skills/linkedin-message-writer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "linkedin-message-writer" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writer into .cursor/skills/linkedin-message-writer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "linkedin-message-writer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/gooseworks-ai/goose-skills.git --path skills/outreach/capabilities/linkedin-message-writer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install gooseworks-ai/goose-skills linkedin-message-writer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/outreach/capabilities/linkedin-message-writer .gemini/skills/linkedin-message-writer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "linkedin-message-writer" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writer into .gemini/skills/linkedin-message-writer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "linkedin-message-writer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install gooseworks-ai/goose-skills linkedin-message-writerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/outreach/capabilities/linkedin-message-writer .github/skills/linkedin-message-writer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "linkedin-message-writer" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writer into .github/skills/linkedin-message-writer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "linkedin-message-writer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install gooseworks-ai/goose-skills linkedin-message-writer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/outreach/capabilities/linkedin-message-writer .opencode/skills/linkedin-message-writer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "linkedin-message-writer" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/capabilities/linkedin-message-writer into .opencode/skills/linkedin-message-writer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "linkedin-message-writer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
linkedin-message-writerResearch LinkedIn profiles and write personalized messages for any LinkedIn message type — connection requests, InMails, DMs, message requests, post comments, and comment replies.
Linkedin Message Writer is an agent skill from gooseworks-ai/goose-skills. Research LinkedIn profiles and write personalized messages for any LinkedIn message type — connection requests, InMails, DMs, message requests, post comments, and comment replies. Takes LinkedIn URLs as input, researches each person (profile data + recent posts via Apify), and generates messages tailored to each lead's background, interests, and recent activity. Exports tool-ready CSVs for Dripify, Expandi, Botdog, PhantomBuster, or generic format. No LinkedIn cookies or login required.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `skill.meta.json`).
It sits in Data & Analytics, covering Web scraping, Messaging and chat bots and Resume and CV writing. It works with LinkedIn and Apify. The repository describes itself as: Library of Growth & GTM skills + data APIs for Claude Code, Codex, Cursor to run ads, social, content, lead gen, seo and data scraping. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c650c6d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.apify.comlinkedin.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
APIFY_API_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Linkedin Message Writer loads about 3.4k tokens when it runs. Until then it costs about 129 tokens; SKILL.md has 1,530 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
ing LinkedIn profiles and posts. Set in `.env`:_TOKEN` not set | Ask user to add it to `.env` |Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from gooseworks-ai/goose-skills at commit c650c6d, republished under its MIT licence (© gooseworks-ai). 1,530 words, ~3,424 tokens.
.claude/skills/linkedin-message-writer/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Research LinkedIn leads and write personalized messages for any LinkedIn message type. Takes LinkedIn URLs, researches each person using Apify (profile + recent posts), and writes messages based on what it finds.
No LinkedIn cookies. No database setup. Just LinkedIn URLs in, personalized messages out.
Load this skill when:
Required for researching LinkedIn profiles and posts. Set in .env:
APIFY_API_TOKEN=your_token_hereNo LinkedIn cookies, login, or session tokens needed. Apify handles scraping without any LinkedIn credentials.
That's it. One env var. Nothing else.
This skill writes any text-based LinkedIn message type. Each type has different constraints.
| Message Type | Who Can Receive | Character Limit | When to Use |
|---|---|---|---|
| Connection request | 2nd/3rd degree connections | 200 (free) / 300 (premium) | First touch. Must earn the accept. No selling. |
| InMail | Anyone (requires premium credits) | Subject: 200, Body: 1,900 | Standalone pitch to people who won't accept cold connections. Senior execs, busy people. |
| DM | 1st-degree connections only | 8,000 | Follow-ups after connection accepted. Conversational, not broadcast. |
| Message request | Group members, event attendees, #OpenToWork | 8,000 | Warm context — you share a group or event. Reference the shared context. |
| Post comment | Anyone (public posts) | 1,250 | Warm-up before connecting. Show you engaged with their content. Not a pitch. |
| Comment reply | Anyone (in a thread) | 1,250 | Engage in a conversation they started. Add value, don't pitch. |
Connection request (200/300 chars):
InMail (subject 200 + body 1,900 chars):
DM (8,000 chars):
Message request (8,000 chars):
Post comment (1,250 chars):
Comment reply (1,250 chars):
Ask the user these questions. Skip any already answered.
Leads:
Message type: 3. What kind of LinkedIn message do you want to write? (connection request, InMail, DM, message request, post comment, comment reply, or a sequence of multiple types) 4. If connection request: do you have a free or premium LinkedIn account? (affects character limit: 200 vs 300)
Goal: 5. What's the objective? (book meetings, drive demo requests, get replies, build relationships, promote content, warm up before outreach) 6. What's the angle or hook? (pain-based, hiring signal, competitor displacement, event-based, content engagement, mutual connection, cold)
Tone: 7. Which tone? Present options:
Context: 9. What does your company/product do? (one-liner for the AI to work with) 10. Any proof points? (customer names, metrics, case studies to reference)
Output: 11. Which LinkedIn outreach tool do you use? (Dripify / Expandi / Botdog / PhantomBuster / Just give me a CSV)
Accept leads from whatever source the user provides:
linkedin_url, LinkedIn URL, LinkedIn, profile_url, url). If ambiguous, ask the user which column.Minimum required: At least one LinkedIn URL per lead.
Present the lead count to the user and confirm before proceeding to research.
Research each lead using two Apify actors. Both require only APIFY_API_TOKEN — no LinkedIn cookies.
Use harvestapi/linkedin-profile-scraper to get profile data for all leads.
API call:
curl -X POST "https://api.apify.com/v2/acts/harvestapi~linkedin-profile-scraper/runs?token=$APIFY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"urls": [
{"url": "https://www.linkedin.com/in/PROFILE_1/"},
{"url": "https://www.linkedin.com/in/PROFILE_2/"}
]
}'Cost: $0.003 per profile. 100 leads = $0.30.
Returns per lead:
Polling for results:
# Check run status
curl "https://api.apify.com/v2/acts/harvestapi~linkedin-profile-scraper/runs/{RUN_ID}?token=$APIFY_API_TOKEN"
# When status is SUCCEEDED, fetch results
curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?token=$APIFY_API_TOKEN"Use harvestapi/linkedin-profile-posts to get recent posts. Run this when:
Skip this when:
API call:
curl -X POST "https://api.apify.com/v2/acts/harvestapi~linkedin-profile-posts/runs?token=$APIFY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"profileUrls": [
"https://www.linkedin.com/in/PROFILE_1/",
"https://www.linkedin.com/in/PROFILE_2/"
]
}'Cost: $0.002 per post. ~20 posts per profile = ~$0.04 per lead. 50 leads = $2.00.
Returns per post:
Polling: Same pattern as Step 1.
After research completes, present a summary table:
Leads researched: {count}
Profile data: {count} profiles retrieved
Posts scraped: {count} posts from {count} leads (or "skipped")
Research cost: ~${total}
Sample leads:
| Name | Title | Company | Recent Post Topic | Personalization Angle |
|------|-------|---------|-------------------|----------------------|
| Jane Smith | VP Sales | Acme Corp | Posted about AI in sales | Reference her AI post |
| ... | ... | ... | ... | ... |If the user asked to filter/qualify leads, do that now based on profile data (title, company, industry, etc.) and present which leads made the cut.
Generate personalized messages for each lead based on the research.
Use the best available signal for each lead. In order of strength:
If the user provided reference messages that have worked, analyze those for tone, length, structure, and vocabulary. Use them as the template — don't override with defaults.
After generating any message, count the characters. If over the limit:
Generate a CSV with these columns:
linkedin_url, first_name, last_name, company, title, message_type, message_subject, message_bodyFor sequence-based campaigns (connection + follow-ups), use:
linkedin_url, first_name, last_name, company, title, connection_request, followup_1, followup_2, followup_3, inmail_subject, inmail_bodyDripify:
Profile URL, Note, Message 1, Message 2, Message 3Expandi:
LinkedIn URL, Connection message, Follow-up #1, Follow-up #2, Follow-up #3, InMail subject, InMail messageBotdog:
linkedin_profile_url, connection_note, message_1, message_2, message_3PhantomBuster:
profileUrl, messageGeneric CSV / Other:
Save to the current working directory:
{campaign-name}-{YYYY-MM-DD}.csvPresent final summary:
Campaign: {name}
Message type: {type}
Leads: {count}
Tool: {dripify/expandi/etc.}
Personalization: {profile-only / profile+posts}
Research cost: ~${amount}
Export file: {file_path}Show 3-5 sample messages from the export for final review.
Do NOT mark as done without explicit user confirmation. Ask: "Messages look good? Anything to adjust before you import?"
After confirmation:
| Leads | Profile Only | Profile + Posts |
|---|---|---|
| 10 | ~$0.03 | ~$0.43 |
| 50 | ~$0.15 | ~$2.15 |
| 100 | ~$0.30 | ~$4.30 |
| 500 | ~$1.50 | ~$21.50 |
Profile scraper: $0.003/profile. Post scraper: ~$0.04/lead (20 posts × $0.002).
| Error | Fix |
|---|---|
APIFY_API_TOKEN not set | Ask user to add it to .env |
| Apify run fails or times out | Retry once. If still fails, skip that lead and note it. |
| LinkedIn URL is invalid or profile not found | Skip the lead, report it to user |
| 0 profiles returned | Check URL format — must be full LinkedIn URL with https:// |
| Post scraper returns 0 posts | Person doesn't post publicly. Use profile data only for personalization. |
© gooseworks-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/outreach/capabilities/linkedin-message-writer of gooseworks-ai/goose-skills.
Open the folder on GitHubat commit c650c6d
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in gooseworks-ai/goose-skills, which our catalogue first saw on October 7, 2026.
Linkedin Message Writer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Linkedin Message Writer this skillgooseworks-ai/goose-skills | 1.2k | 1 repos | ~3.4k | Automated safety check: Notes | MIT | |
| Apify Buying Signal Detectionapify/awesome-skills | 266 | — | ~5.1k | Automated safety check: Notes | Apache-2.0 | |
| Fullenrich Event AttendeesOthmane-Khadri/YALC-the-GTM-operating-system | 318 | — | ~1.4k | Automated safety check: Warn | MIT | |
| Coffee ChatLeoYeAI/openclaw-master-skills | 2.2k | — | ~6.6k | Automated safety check: Pass | MIT | |
| Apify Lead Scoring Enrichmentapify/awesome-skills | 266 | — | ~4.4k | Automated safety check: Notes | Apache-2.0 | |
| Linkedin Thread Monitorsergebulaev/linkedin-skills | 4.4k | 1 repos | ~1.4k | Automated safety check: Pass | MIT |
apify/awesome-skills
Set up a recurring buying-signal detection pipeline that finds companies showing buying intent across three signal types — job postings (hiring for the persona), fundraising events (recent raises)…
Othmane-Khadri/YALC-the-GTM-operating-system
A skill your agent uses when the user says "enrich this LinkedIn event", "enrich attendees of this event", "enrich this attendees CSV", "scrape and enrich LinkedIn event {URL}", "FullEnrich event…
LeoYeAI/openclaw-master-skills
Generate a personalized coffee chat playbook for networking conversations.
apify/awesome-skills
Score and enrich a CSV of B2B leads using Apify Actors. An agent skill from apify/awesome-skills.
sergebulaev/linkedin-skills
Track which of your LinkedIn comments earned author replies.
apify/awesome-skills
Build a local-business lead database from Google Maps in one Apify pipeline: search by target audience + geography, enrich each place with company contacts from its website, leads enrichment (names…
gooseworks-ai/goose-skills
Scrape and search Reddit posts using Apify. An agent skill from gooseworks-ai/goose-skills.
gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent.
gooseworks-ai/goose-skills
Replace an existing video's opening with a supplied clip or free kinetic text hook while retaining and verifying every original body frame, audio, captions and ending.
gooseworks-ai/goose-skills
Scrape blog posts via RSS feeds (free, no API key) with Apify fallback for JS-heavy sites.
gooseworks-ai/goose-skills
Find leads by scraping engagers from a competitor's top LinkedIn posts.
gooseworks-ai/goose-skills
Assemble a ChatGPT chat-reveal video ad from a thread + timeline JSON — one continuous Playwright recording of a ChatGPT mobile chat (user types with the iOS keyboard up → taps send → keyboard…
Research LinkedIn profiles and write personalized messages for any LinkedIn message type — connection requests, InMails, DMs, message requests, post comments, and comment replies. Linkedin Message Writer is an agent skill from gooseworks-ai/goose-skills. Research LinkedIn profiles and write personalized messages for any LinkedIn message type — connection requests, InMails, DMs, message requests, post comments, and comment replies.
Linkedin Message Writer fits situations like: tasks that involve Web scraping; tasks that involve Messaging and chat bots; tasks that involve Resume and CV writing.
Run `npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a claude-code`. Or copy the skill folder (skills/outreach/capabilities/linkedin-message-writer in gooseworks-ai/goose-skills) into .claude/skills/linkedin-message-writer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a codex`. Or copy the skill folder (skills/outreach/capabilities/linkedin-message-writer in gooseworks-ai/goose-skills) into .agents/skills/linkedin-message-writer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add gooseworks-ai/goose-skills --skill linkedin-message-writer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/linkedin-message-writer, .gemini/skills/linkedin-message-writer, .github/skills/linkedin-message-writer and .opencode/skills/linkedin-message-writer in your project.
Going by SKILL.md and its folder, Linkedin Message Writer needs the command-line tools its instructions call (curl) and credentials named APIFY_API_TOKEN. Our summary lists: A credential in APIFY_API_TOKEN.
SKILL.md names 2 domains. In commands or code: api.apify.com and linkedin.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Linkedin Message Writer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Linkedin Message Writer: Apify Buying Signal Detection (apify/awesome-skills, 266 stars), Fullenrich Event Attendees (Othmane-Khadri/YALC-the-GTM-operating-system, 318 stars), Coffee Chat (LeoYeAI/openclaw-master-skills, 2.2k stars) and Apify Lead Scoring Enrichment (apify/awesome-skills, 266 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
gooseworks-ai (a GitHub organization) maintains it in gooseworks-ai/goose-skills, which has 1,240 GitHub stars. The repository holds 273 skills in this directory. The repository was last updated on October 8, 2026.
Source: gooseworks-ai/goose-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.