Skip to main content
Each recipe is a complete request body. Cost estimates assume the 10M tier ($1.25 / 1K credits) — see Credits & billing for the full graduated curve. Remember: every Signal’s first check is the baseline — billed, never triggers.

1. Job-change alert on one person

Fire when title, position or company changes. Daily checks.
POST /v1/signals
Cost: 1 credit per check — 1 credit a day per person.

2. The fleet: job-change alerts on 1,000 champions

The flagship setup. Set the account default webhook once, then one bulk call:
POST /v1/signals/bulk
Cost: 1,000 credits per check across the fleet — 1,000 credits a day (≈ $1.25 at the 10M tier). Pause the quarter’s campaign in one call: POST /v1/signals/pause with { "tag": "q3-pipeline" }.
Want one webhook stream and one line item instead of 1,000 Signals? Use a single Signal with target.type: "profile_list" and urls: [...] — same pricing, collective management.

3. Watch anything change on a profile

Any non-volatile field (see Filtering — counters and media URLs are excluded from * by design).
POST /v1/signals
Cost: 1 credit per check — 1 credit a week. (No notify → account default webhook.)

4. Headcount moves on an account — with a noise floor

numeric_change with a threshold: ±5% fires, weekly drift doesn’t.
POST /v1/signals
Cost: 1 credit per check — 1 credit a week per account.

5. New senior openings on a company’s job board

new_entity diffs the posting set — only new matching jobs produce Triggers.
POST /v1/signals
Cost: 1 credit per check (board scan) — 1 credit a day.

6. Net-new leads — Sales Nav saved-search style

Watch a people search (filters or a Sales Nav URL). Fire only when new people enter the result set — same idea as Sales Navigator’s “save search to get notified of new results.”
POST /v1/signals
Or paste the Sales Nav URL you already run:
Trigger payload (additions only by default):
Pipe diff.added[].url into a batch enrich job if you need full profiles. Set "include_removals": true only if you also care about people dropping out of the ICP window. Cost: 2 credits per check (50 results ≈ 2 pages × 1) — 2 credits a day. Same pattern for companies: target.type: "company_search" + criteria.mode: "new_entity".

7. Posts mentioning your trigger phrase

text_match on a keyword post search — intent signals pushed to your webhook.
POST /v1/signals
Cost: 1 credit per check — 4 credits a day at 6h.

8. A post crosses an engagement threshold

Engagement counts are volatile-excluded from * — name them explicitly with a floor.
POST /v1/signals
Cost: 1 credit per check — 24 credits a day at 1h; drop to 6h for 4 a day.

9. Net-new reactors (or commenters / sharers) on a post

Watch who engaged — not just the count. Pair post_reactions / post_comments / post_reposts with new_entity. Identity is the person (profile URN/URL); leave include_removals off so incomplete pages don’t false-fire removals.
POST /v1/signals
diff.added[] stubs include urn, url, full_name, headline (and reaction_type for reactions). Swap type to post_comments or post_reposts for the other engagement lists. Cost: 1 credit per returned engager per check (same as /v1/posts/engagement/*); empty pages free. At max_results: 100 and 1h, budget for up to 2,400 credits/day if every check returns a full set — prefer 6h/1d on viral posts.

10. Complex logic with expressions

CEL over snapshot and diff — e.g. headcount dropped ≥10% at a company you track:
POST /v1/signals

11. Estimate before you enable — and cap the blast radius

Spend is credits per check × how often the Signal runs. The API projects it for you: estimated_monthly_credits on every Signal, combined totals on bulk create, and a standing burn figure on GET /v1/account. Then set a hard ceiling: PATCH /v1/account with monitoring.monthly_check_budget. If fleet growth ever outruns the plan, Signals pause with budget_exceeded instead of draining your enrichment balance.

Operational tips

  • Dedupe on trigger_id, order by check_number — retries reuse the ID, and delivery order isn’t guaranteed.
  • Watch for signal.paused events — insufficient credits, budget exceeded, or a dead webhook. Signals never silently skip.
  • Start weekly, tighten later. PATCH /v1/signals/{id} changes the interval in place — no need to recreate.
  • Test the plumbing: POST /v1/signals/{id}/test-webhook sends a free signed signal.test fixture (no scrape). POST /v1/signals/{id}/check-now runs a real check (billed like a scheduled check) — poll delivery status via GET /v1/webhook-deliveries/{id}.