
Security News
Feross on TBPN: How North Korea Hijacked Axios
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.
signals-sortlist-cli
Advanced tools
Signals CLI - Command line interface for the Signals lead intelligence API. Discover leads, manage subscriptions, and automate workflows from the terminal or AI agents.
Lead intelligence CLI for developers and AI agents -- Discover leads, manage subscriptions, and automate workflows from the terminal.
The Signals CLI provides a command-line interface to the Signals API, enabling developers and AI agents to monitor sources (LinkedIn, funding databases, etc.) and discover new leads programmatically.
npm install -g signals-sortlist-cli
Install the Signals skill for your AI agent (Cursor, Claude Code, OpenClaw, etc.):
npx skills add sortlist/signals-cli
This installs the SKILL.md which gives your agent full knowledge of the CLI commands, patterns, and workflows.
The recommended way to authenticate is the interactive login command:
signals login
This prompts for your API key (get it from Settings > API Keys in your dashboard), validates it, and saves it to ~/.signals/config.json.
Alternatively, set the SIGNALS_API_KEY environment variable (takes priority over saved config):
export SIGNALS_API_KEY=your_api_key
To remove saved credentials:
signals logout
API keys are scoped to your team. Use --business (-b) to specify which business to operate on for leads, subscriptions, and webhooks.
The signal catalog lists all available monitoring types. This is read-only and public.
# List all signal types
signals signals:list
# Get details for a specific signal
signals signals:get linkedin-company-engagers
Each team can have multiple businesses. All leads, subscriptions, and webhooks are scoped to a business.
# List all businesses in your team
signals businesses:list
# Get a business with its Ideal Customer Profile
signals businesses:get 1
# Create a business from a website (auto-analyzes name, description, and ICP)
signals businesses:create --website https://acme.com
# Create a business manually
signals businesses:create --name "Acme Corp" --website https://acme.com
# Create with ICP attributes
signals businesses:create --name "Acme Corp" \
--icp '{"target_job_titles":["CTO","VP of Engineering"],"target_locations":["North America"]}'
businesses:create options:
| Option | Required | Description |
|---|---|---|
--website | Conditional | Website URL. If passed alone, auto-analyzes name/description/ICP |
--name | Conditional | Business name (required when not using website-only mode) |
--description | No | Short description |
--icp | No | Ideal Customer Profile attributes as JSON string |
# Update a business name
signals businesses:update 1 --name "New Name"
# Update the ICP (include the ICP id from businesses:get response)
signals businesses:update 1 --icp '{"id":1,"target_job_titles":["CTO","VP Engineering"],"lead_matching_mode":70}'
businesses:update options:
| Option | Description |
|---|---|
--name | Business name |
--website | Website URL |
--description | Short description |
--icp | ICP attributes as JSON string (include id to update existing ICP) |
A subscription is a signal you've activated with a specific configuration (e.g. "Track engagers on Apple's LinkedIn page"). All subscription commands require --business (-b).
# List all subscriptions
signals subscriptions:list --business 1
# Get a subscription with stats
signals subscriptions:get 42 --business 1
# Create a subscription
signals subscriptions:create --business 1 \
--signal linkedin-company-engagers \
--name "Apple Engagers" \
--config '{"linkedin_url":"https://www.linkedin.com/company/apple/"}'
# Update a subscription
signals subscriptions:update 42 --business 1 --name "Renamed Subscription"
# Pause (stops scanning for new leads)
signals subscriptions:pause 42 --business 1
# Resume
signals subscriptions:resume 42 --business 1
# Delete
signals subscriptions:delete 42 --business 1
subscriptions:create options:
| Option | Required | Description |
|---|---|---|
--business | Yes | Business ID |
--signal | Yes | Signal slug from the catalog |
--name | Yes | Name for this subscription |
--config | No | Signal-specific config as JSON string |
subscriptions:update options:
| Option | Description |
|---|---|
--name | Updated name |
--active | Set active state (true/false) |
--config | Updated config as JSON string |
Leads are enriched profiles discovered by your active subscriptions. Each lead includes name, company, LinkedIn URL, email, phone, and more. All lead commands require --business (-b).
# List leads (paginated)
signals leads:list --business 1
signals leads:list --business 1 --page 2 --per-page 50
# Get a single lead with full details and delivery history
signals leads:get 1234 --business 1
# Delete a lead (soft-delete)
signals leads:delete 1234 --business 1
leads:list options:
| Option | Default | Description |
|---|---|---|
--business | — | Business ID (required) |
--page | 1 | Page number |
--per-page | 25 | Results per page (max 100) |
Register URLs to receive an HTTP POST in real-time whenever a new lead is discovered. All webhook commands require --business (-b).
# List webhooks
signals webhooks:list --business 1
# Create a webhook with HMAC signature verification
signals webhooks:create --business 1 --url https://example.com/webhook --secret whsec_abc123
# Delete a webhook
signals webhooks:delete 10 --business 1
webhooks:create options:
| Option | Required | Description |
|---|---|---|
--business | Yes | Business ID |
--url | Yes | URL to receive POST requests |
--secret | No | Secret for HMAC-SHA256 signature verification |
Every command outputs JSON for easy parsing with jq or consumption by AI agents:
# Get all lead emails
signals leads:list --business 1 --per-page 100 | jq '.leads[] | .payload.email'
# Get subscription IDs that are active
signals subscriptions:list --business 1 | jq '.subscriptions[] | select(.active) | .id'
# Count total leads
signals leads:list --business 1 | jq '.meta.total_count'
# List business names
signals businesses:list | jq '.businesses[] | .name'
# 1. Create a business from a website (auto-generates ICP)
signals businesses:create --website https://acme.com
# 2. Note the business ID from the response, then browse signals
signals signals:list
# 3. Create a subscription
signals subscriptions:create --business 1 \
--signal linkedin-company-engagers \
--name "Acme Engagers" \
--config '{"linkedin_url":"https://www.linkedin.com/company/acme/"}'
# 4. Check for leads
signals leads:list --business 1
signals subscriptions:pause 42 --business 1 # Stop scanning
signals subscriptions:resume 42 --business 1 # Start scanning again
# Register a webhook
signals webhooks:create --business 1 --url https://my-app.com/signals --secret my_secret
# Verify
signals webhooks:list --business 1
| Variable | Required | Description |
|---|---|---|
SIGNALS_API_KEY | No | Your Signals API key (overrides saved config from signals login) |
| Exit Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error (message on stderr) |
| HTTP Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 404 | Resource not found |
| 422 | Validation error |
| 429 | Rate limited (60 req/min) |
git clone https://github.com/sortlist/signals-cli.git
cd signals-cli
npm install
npm run dev # Watch mode
npm run build # Production build
src/
index.ts # CLI entry point (yargs)
api.ts # SignalsAPI client class
config.ts # Config management (~/.signals/config.json)
commands/
login.ts # login, logout
signals.ts # signals:list, signals:get
businesses.ts # businesses:list, businesses:get, businesses:create, businesses:update
subscriptions.ts # Subscription management
leads.ts # Lead management
webhooks.ts # Webhook management
Full API docs: https://api.meetsignals.ai/docs/api
MIT
FAQs
Signals CLI - Command line interface for the Signals lead intelligence API. Discover leads, manage subscriptions, and automate workflows from the terminal or AI agents.
We found that signals-sortlist-cli demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.

Security News
OpenSSF has issued a high-severity advisory warning open source developers of an active Slack-based campaign using impersonation to deliver malware.

Research
/Security News
Malicious packages published to npm, PyPI, Go Modules, crates.io, and Packagist impersonate developer tooling to fetch staged malware, steal credentials and wallets, and enable remote access.