buying-signals
npx skills add https://github.com/alavida-ai/skills --skill buying-signals
Agent 安装分布
Skill 文档
Buying Signals
Automated B2B buying-signal detection via the Alavida platform. Analyzes companies across web/news, landing pages, and social media â then scores them by buying intent.
Freshness check: If more than 30 days have passed since the
last-updateddate above, check if the API or data models have changed.
Overview
Submit a list of companies to the Alavida platform. The service detects buying signals from multiple sources, classifies them with AI, validates findings, and scores each company by buying intent.
What it detects:
- Funding announcements (seed through Series C+)
- Y Combinator batch participation
- Product/stealth launches
- Job postings (creative and marketing roles)
- Founder pain posts on social media
- Partnership announcements
- Conference speaking engagements
Output:
- Per-company tier assignment (Hot / Warm / Cool / Cold)
- Scored and classified signals with source URLs
- Personalization recommendations for outreach
Setup
-
Get an Alavida API key from your account at https://app.alavida.ai
-
Configure the key:
<skill-path>/scripts/client.js setup --key <your-api-key>Or set the environment variable:
export ALAVIDA_API_KEY=<your-api-key> -
Requirements: Node.js 18+ (uses native fetch). No other dependencies.
Config priority (highest to lowest):
ALAVIDA_API_KEYenvironment variable~/.config/alavida/config.json
Handling “API key not found” errors
CRITICAL: When you receive an “API key not found” error:
-
Tell the user to run the setup command â The setup is interactive and requires user input:
<skill-path>/scripts/client.js setup -
Stop and wait â Do not continue without a valid API key. Wait for the user to complete setup and confirm before proceeding.
-
DO NOT attempt to:
- Search for API keys in config files or environment
- Grep through directories
- Construct complex shell commands to find credentials
- Prepare job files before setup is complete
Note for agents: All script paths in this document (e.g.,
./scripts/client.js) are relative to the skill directory where this SKILL.md file is located.
Signal Types
| Signal Type | Weight | Recency Window | Description |
|---|---|---|---|
founder_pain_post |
100 | 14 days | Founder expressing need for creative/marketing help |
job_post_creative |
90 | Active | Hiring designer, video editor, creative director |
funding_announcement |
80 | 90 days | Recent funding round (seed through Series C+) |
yc_batch |
80 | 60 days | Y Combinator company preparing for Demo Day |
stealth_launch |
75 | 30 days | Company coming out of stealth or launching |
job_post_marketing |
60 | Active | Hiring marketing roles (CMO, growth, demand gen) |
partnership_announced |
50 | 60 days | New partnership or integration |
conference_speaking |
40 | 30 days | Founder/exec speaking at conference |
Notes:
- Higher weights = stronger buying intent
- Signals outside recency window are discarded
- Multiple signals compound to higher scores
Tier System
| Tier | Score Range | Meaning | Action |
|---|---|---|---|
| Hot | 150+ | Multiple high-intent signals | Prioritize immediately |
| Warm | 80-149 | Clear buying signals | Good outreach candidates |
| Cool | 40-79 | Some interest indicators | Monitor for more signals |
| Cold | <40 | No strong signals | Lowest priority |
Common Actions
| User says… | Action |
|---|---|
| “Analyze this company for signals” | Create JSON file, run run <file.json> |
| “Check buying signals for Acme Corp” | Prepare company data, run analysis |
| “Score these prospects” | Batch analyze with run companies.json --poll |
| “Is the service healthy?” | health |
| “What’s my config?” | config:show |
| “Get results for job xyz” | status <job_id> |
Workflow
Follow this workflow when analyzing companies:
-
Check configuration first:
./scripts/client.js config:showIf no API key configured, run setup.
-
Verify service is available:
./scripts/client.js health -
Prepare input file (JSON format â see Input File Format)
-
Submit and wait for results:
./scripts/client.js run companies.json --pollFlags:
--poll: Wait for job completion (recommended)--timeout <seconds>: Polling timeout (default: 600s)--json: Output raw JSON
-
Or submit and check later:
./scripts/client.js run companies.json # returns job_id ./scripts/client.js status <job_id> -
Review results â The CLI displays:
- Job status and progress
- Per-company tier assignments and scores
- Signal details by type with source URLs
- Outreach recommendations
Commands Reference
| Command | Description |
|---|---|
setup |
Configure Alavida API key (interactive or --key <key>) |
config:show |
Show current config (key source, platform URL) |
health |
Check buying-signals service availability |
run <file.json> |
Submit companies for analysis |
run <file.json> --poll |
Submit and wait for results |
status <job_id> |
Get job status and results |
Input File Format
JSON file with an array of companies, each optionally containing people:
Minimal example:
{
"companies": [
{
"company_id": "comp_123",
"company_name": "Acme Corp",
"domain": "acme.com",
"website_url": "https://acme.com"
}
]
}
Full example:
{
"companies": [
{
"company_id": "comp_123",
"company_name": "Acme Corp",
"domain": "acme.com",
"website_url": "https://acme.com",
"funding_stage": "Series A",
"funding_total": 10000000,
"employee_count": 50,
"detected_verticals": ["B2B SaaS", "Developer Tools"],
"icp_score": 0.85,
"company_linkedin_url": "https://linkedin.com/company/acme",
"company_twitter_handle": "@acmecorp",
"people": [
{
"full_name": "Jane Doe",
"job_title": "CEO & Founder",
"role_type": "decision_maker",
"linkedin_url": "https://linkedin.com/in/janedoe",
"twitter_handle": "@janedoe"
}
]
}
]
}
Company fields:
company_id(required): Unique identifiercompany_name(required): Company namedomain(required): Domain (e.g., “acme.com”)website_url(required): Full website URLfunding_stage: e.g., “Seed”, “Series A”funding_total: Total funding raised in USDemployee_count: Number of employeesdetected_verticals: Industry verticals (array)icp_score: ICP match score 0.0-1.0company_linkedin_url: Company LinkedIn URLcompany_twitter_handle: Twitter handle with @
Person fields:
full_name(required): Person’s full namejob_title(required): Job titlerole_type(required): “decision_maker” or “champion”linkedin_url: LinkedIn profile URLtwitter_handle: Twitter handle with @
Data Models
Job Submission Response
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued"
}
Job Status Response
{
"job_id": "550e8400-...",
"status": "completed",
"progress": 100,
"credits_used": 500,
"created_at": "2026-02-10T12:00:00Z",
"updated_at": "2026-02-10T12:01:30Z",
"result": {
"companies": [
{
"company_name": "Acme Corp",
"company_id": "comp_123",
"tier": "HOT",
"total_score": 270,
"signal_count": 8,
"recommendation": "Strong buying intent. Prioritize for outreach.",
"reasoning": "Multiple signals across funding, hiring, and social.",
"signals": [
{
"type": "funding_announcement",
"source_url": "https://techcrunch.com/...",
"snippet": "Acme raised $10M Series A...",
"confidence": 0.95,
"pipeline": "web_news"
}
]
}
],
"summary": {
"total_companies": 3,
"hot": 1,
"warm": 1,
"cool": 1,
"cold": 0
}
}
}
Pricing
Buying signals uses a credit-based pricing model:
- Base cost: 500 credits per run
- Typical range: 400-800 credits depending on signal density
- Credits are deducted after job completion
If your account has insufficient credits, the platform returns a 402 error before any work begins. Top up at https://app.alavida.ai/credits.
Error Handling
Common Errors
“API key not found”
- Run
./scripts/client.js setupto configure your API key
“Authentication failed” (401)
- Your API key is invalid or expired
- Get a new key from https://app.alavida.ai
“Insufficient credits” (402)
- Your account doesn’t have enough credits
- Top up at https://app.alavida.ai/credits
“Service unavailable” (503)
- The buying-signals service is temporarily down
- Try again in a few minutes
“Job failed”
- Check the error message in
./scripts/client.js status <job_id> - Some pipelines may fail while others succeed â partial results are still returned
Partial Failures
The service uses partial failure tolerance:
- If one analysis source fails, others continue
- Results include both successful signals and notes about failures
- Credits are charged proportionally for partial results
Examples
Setup
./scripts/client.js setup --key ak_xxxxx
Show configuration
./scripts/client.js config:show
Check service health
./scripts/client.js health
Analyze companies and wait for results
./scripts/client.js run companies.json --poll
Submit and check later
./scripts/client.js run companies.json
# => Job ID: 550e8400-e29b-41d4-a716-446655440000
./scripts/client.js status 550e8400-e29b-41d4-a716-446655440000
Get raw JSON output
./scripts/client.js run companies.json --poll --json > results.json
Tips
- Start with health check: Always run
healthbefore submitting jobs - Test with one company first: Validate your setup before batch processing
- Use –poll: Most useful for interactive analysis â submit and get results in one command
- Personalization: Use the
recommendationfield in results for outreach messaging - Top signals: Review per-company signals for the best conversation hooks
Integration with Claude Code
When asked to analyze prospects:
- User provides company list or asks to analyze specific companies
- Create input JSON file with company data
- Run analysis:
./scripts/client.js run <file> --poll - Review results and provide recommendations based on tiers and signals
- Suggest outreach strategies based on top signals