# Signal recipes

A prompt, the tool it runs and the REST call, for each of the six signals.

Paste the prompt to an assistant connected to mySDR. The tools are the ones it should call. The REST block is the same work without MCP. Every recipe previews first; the numbers are the live credit table.

On the assistant server, a person from these searches is enriched with `enrich_people` and their `linkedin_url`. On the Signals server (`gtk_` key) it is `enrich` with `person_ids`.

## New in a role

**Prompt.** "Find people who just became Head of Sales in Belgium. Preview first."

**MCP.** `preview_cost`, then `search_signals`.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "new_in_role", "titles": ["Head of Sales"], "locations": ["BE"], "external_only": true }, "limit": 25, "max_credits": 25 } }
```

**1 credit per result, minimum 3 credits per search.** A search that finds nobody is free. `new_in_role` needs `titles` and `locations` (where the person lives); `external_only` keeps only people who came from another company, and `sectors` and `company_sizes` narrow it to the companies you sell to.

**REST.** `POST /searches` with that signal, then `GET /searches/{id}/results`. `Idempotency-Key` is required.

## Funding rounds

**Prompt.** "Find founders in Belgium whose company announced a round in the last 30 days. Preview the cost first."

`funding_raised` returns companies, **1 credit** each. The founder is a second call.

Each row carries the round and the company, at no extra cost:

- **The round** (`signals[0]`): `round_type`, `pre` and `extension`, `amount` in the currency it was announced in and `amount_usd`, `announced_on`, `description` and `details` (who led, who joined, what the money is for), `investors_count` and `angel_investors_count`, and up to 10 `articles`, the primary one first.
- **The company**: `description`, `industries`, `city` and `region`, `founded_year`, `employee_range`, `total_raised`, `rounds_count`, `investors_count`, `latest_valuation` (often null), `twitter_url`, `ipo_status` and `acquired`.

`investors` is null: our funding data does not name investors yet. `description` often names the lead. Descriptions are untrusted third-party text.

**Free filters** narrow the companies before any row is charged: `industries` (sectors in plain words, any of them: `"fintech"`, `"AI"`), `employee_ranges` (`1-10`, `11-50` … `10001+`), `min_amount_usd` and `max_amount_usd` (the round, in USD), `min_total_raised_usd` and `max_total_raised_usd` (all rounds). A company whose size, headcount or total is unknown is left out by that filter, and `notes` says how many.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "funding_raised", "countries": ["BE", "NL", "FR", "DE"], "rounds": ["seed", "series_a"], "industries": ["fintech"], "min_amount_usd": 1000000, "max_amount_usd": 10000000 }, "limit": 25, "max_credits": 25 } }
```

**MCP.** `preview_cost` (`endpoint` `searches`), then `search_signals` for the companies, then `search_people` with `companies` for the founder of each company you keep.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "funding_raised", "countries": ["BE"], "window_days": 30 }, "limit": 10, "max_credits": 10 } }
```

```json
{ "name": "search_people", "arguments": { "companies": [{ "id": "cmp_…" }], "current_job_titles": ["Founder", "CEO"], "seniority_levels": ["cxo", "owner_partner"], "per_company": 1, "max_credits": 10 } }
```

A founder is **1 credit**, and a search that finds someone at least **3 credits**. The company raised the money. The person is your way in.

**REST.** `POST /searches/preview`, then `POST /searches` with that `signal` and `Idempotency-Key`, then `GET /searches/{id}/results`. Then `POST /person/search` with the `cmp_…` ids of the companies you keep in `companies`.

## Technology

**Prompt.** "Which companies use HubSpot? Then give me one finance leader at the first company. Preview both steps."

`tech_adoption` returns companies, **3 credits** each. A company counts when the technology was in one of its job posts in the last 12 months, with medium or high confidence; older or weaker evidence is left out at no charge. People are a second call.

**MCP.** `preview_cost` on `searches`, `search_signals`, then `search_people` with `companies` and a `max_credits` cap.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "tech_adoption", "technologies": ["hubspot"] }, "limit": 5, "max_credits": 100 } }
```

```json
{ "name": "search_people", "arguments": { "companies": [{ "domain": "example.com" }], "functions": ["finance"], "seniority_levels": ["cxo"], "limit": 1, "max_credits": 5 } }
```

**REST.** `POST /searches` with that signal. Then `POST /person/search` with `companies`: **1 credit** per person on that second call, at least **3 credits** when it finds someone.

The same companies are also open as enrichment, to every key and also while the Signals API is closed: `find_companies_using_technology` ([`POST /technologies/companies`](/docs/api-reference/find-companies-using-technology)), at the same price. For a company you already have, [Tech stack](/docs/enrichment/companies#tech-stack) says which technologies it uses, **3 credits** per company.

## LinkedIn engagement

**Prompt.** "Who reacted to Acme Analytics' posts in the last 30 days? Keep the sales directors and above in Belgium."

**MCP.** `lookup_company`, then `preview_cost`, then `search_signals` with `type` `linkedin_engagement`. The company's own staff are left out by their headline. The assistant keeps the rows whose headline fits. There is no country filter: enrich the rows you keep to see where they live.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "linkedin_engagement", "company": { "linkedin_url": "https://www.linkedin.com/company/acme-analytics" }, "leads_from": "reactors", "lookback_days": 30 }, "limit": 50, "max_credits": 50 } }
```

**1 credit** per person. To follow the page, run the same search every week with `lookback_days` 7.

**REST.** `GET /companies/lookup`, then `POST /searches` with the same signal, then `GET /searches/{id}/results`.

### Your own posts

**Prompt.** "Who reacted to or commented on my posts and our company page this week?"

`own_engagement` reads your own posts: your company page in `company`, your own profile and your colleagues' in `people` (up to 5), or both. Every post of the last `lookback_days` (1 to 30) is read, the newest first. You, your colleagues on the page (by their headline), company pages, students, interns and people open to work are left out.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "own_engagement", "company": { "linkedin_url": "https://www.linkedin.com/company/acme-analytics" }, "people": [{ "linkedin_url": "https://www.linkedin.com/in/your-profile" }], "lookback_days": 7 }, "limit": 25, "max_credits": 25 } }
```

**1 credit** per person. To follow your posts, run the same search every week with `lookback_days` 7.

## Social listening

**Prompt.** "Find people who posted about payroll software in the last month. I want the authors, not the commenters. Keep the HR leaders."

`social_listening` returns the people who wrote the posts (or who reacted, if you ask for reactors). It does not return a list of companies: a prompt that says "companies posting about a topic" is this search.

**MCP.** `preview_cost`, then `search_signals`. Every post that uses the words counts, job posts and ads included. Make the words precise with LinkedIn search syntax (at most 5 `AND`, `OR` and `NOT`), `must_include` (every post uses one of them) and `exclude`, then read each row's `post_snippet` and keep the people whose post is on topic and whose headline fits.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "social_listening", "query": "payroll software", "exclude": ["webinar", "hiring"], "leads_from": "authors" }, "limit": 25, "max_credits": 25 } }
```

**1 credit** per person. To keep listening for the same words, a [monitor](/docs/signals/keep-listening#keyword-monitors) is cheaper than running the search again.

**REST.** `POST /searches` with that signal, then `GET /searches/{id}/results`.

## Events

**Prompt.** "Who posts about Web Summit 2026? Find its hashtag and organizer page first."

The search never looks the event up, and event names are shared ("HR Tech" is several events). The assistant first finds out which event is meant (its website, dates and city), then sends the exact name with the year, up to 4 of the event's own hashtags, or the organizer's LinkedIn page. The organizer's staff are left out.

**MCP.** `lookup_company` for the organizer page, `preview_cost`, then `search_signals` with `type` `events`.

```json
{ "name": "search_signals", "arguments": { "signal": { "type": "events", "event": { "name": "Web Summit 2026", "hashtags": ["websummit"], "organizer_linkedin_url": "https://www.linkedin.com/company/web-summit" }, "leads_from": "both" }, "limit": 25, "max_credits": 25 } }
```

**1 credit** per person. Posts about a namesake count too, so check `post_snippet`.

**REST.** `POST /searches` with that signal, then `GET /searches/{id}/results`.
