# Plan, billing & credits > Your plan, invoices, credits and changing or pausing your subscription. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/account/billing Billing shows your plan, invoices and payment method; Credit history shows every credit used and refunded. Only account owners can change billing. 1. **Billing:** plan, invoices, invoice emails (with a CC). 2. **Credit history:** every charge and refund, by source. 3. **Change, pause or cancel** the plan from Billing (owners only). A cancelled plan stays usable until the end of the period you paid for, and you can restart it before then. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/account/billing/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). Plans, invoices and payment methods change only in the dashboard or through the [MCP tools](/docs/account/billing/mcp). ### Use case: Alert before credits run out [#use-case-alert-before-credits-run-out] Read the latest snapshot every morning: when `creditsRemaining` falls below a tenth of `creditsLimit`, post to your team chat. --- ## MCP — AI agents Source: /docs/account/billing/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > How many credits do I have left this month? ```json {} ``` > How many credits did we use last month, and on what? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "cycle": 1 } ``` The answer splits the cycle by source (website visitors, Prospector, enrichment…) and by day. `cycle` goes back up to 5 billing cycles. > Where did my Prospector credits go this month? ```json { "source": "PROSPECTOR", "operation": "CHARGE", "from": "2026-10-01" } ``` > When is my next bill, and how much will it be? ```json {} ``` It answers the plan, leads per month, price, billing interval (monthly or yearly), next billing date and whether the plan is set to cancel, paused or downgrading. Without a paid subscription the price fields are empty. > Is auto top-up on, and what's my monthly limit? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` > Turn on auto top-up: 500 leads at a time, no more than $300 a month. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "enabled": true, "packLeads": 500, "capUsd": 300 } ``` > Which of our sending domains renew in the next two months, and for how much? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` Each domain comes with its yearly price, renewal date and whether it renews automatically. Domains you brought yourself (`source: "imported"`) renew at your own registrar and are never billed here. > Show my unpaid invoices and what my next bill will be. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` > We don't need 5,000 leads a month any more. Move us to 3,000 from the next bill. ```json { "leads": 3000 } ``` Nothing is charged or refunded now: the smaller plan starts at the next billing date, and your current credits stay until then. Plans go up to 1,000,000 leads a month; for more, contact us. > Cancel my subscription. It's too expensive for us right now, the budget was cut. ```json { "reason": "expensive", "feedback": "Budget was cut this quarter." } ``` Your assistant asks you to confirm before it cancels. The plan stays usable until the end of the billing period, and `reactivate_subscription` undoes the cancellation before then. If you would rather keep your data and pay less, ask it to pause (`pause_subscription`) or downgrade (`downgrade_plan`) instead. # Team & account (/docs/account) Invite your team with exactly the access they need, manage your API keys, and keep an eye on your plan and credits. # Partner programs (/docs/account/partners) **Community** links to the Happierleads community and its learning content. The **Affiliate Program** pays you for every customer you refer: join it, then follow your clicks, sign-ups and payouts in the partner dashboard. The **Creator Program** and **Agency Creator Program** are for people who make content about Happierleads or run it for their clients. ## Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. # Account settings & sign-in > Your profile, password, notifications, compliance (GDPR & DPA), and signing in. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/account/settings **Account Settings** holds your notification emails, agency and white-label options and account-wide preferences. **Edit profile** changes your name, email and password. **Compliance** shows the GDPR information and lets you download the DPA. Signing in works with your email and password, a magic link sent to your email, or Google. ### Compliance (GDPR & DPA) [#compliance-gdpr--dpa] Who we are, how data is handled, the services that process it, and the Data Processing Agreement you can sign and download. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. # Team members > Invite people and choose what they can do and which websites they see. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/account/team Owners can do everything, billing included. Members get the permissions you tick (or a preset) on the websites you choose. 1. **Team → Invite people.** 2. **Pick a preset or permissions**, and the websites. 3. **Send invite** — they get an email to join. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/account/team/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Onboard a new hire [#use-case-onboard-a-new-hire] `POST /admin/invite` with `{ "invites": [{ "email": …, "preset": "sales", "websites": [ … ] }] }`. --- ## MCP — AI agents Source: /docs/account/team/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Invite sam@yourcompany.example as a sales member on all websites. ```json { "invites": [ { "email": "sam@yourcompany.example", "role": "Member", "preset": "sales", "allWebsites": true } ] } ``` # Use these docs with AI (/docs/ai) ## For AI assistants and crawlers [#for-ai-assistants-and-crawlers] | URL | What it is | | --- | --- | | [`/llms.txt`](/llms.txt) | Index of every page with a one-line description ([llmstxt.org](https://llmstxt.org) format) | | [`/llms-full.txt`](/llms-full.txt) | The full text of all docs in one file | | `/docs/.md` | Any page as Markdown — e.g. [`/docs/leads/prospector/search-prospects/manual-search.md`](/docs/leads/prospector/search-prospects/manual-search.md) returns every tab of that feature | | `Accept: text/markdown` | Requesting any docs URL with this header returns Markdown instead of HTML | | [`/openapi.json`](/openapi.json) | OpenAPI description of the public REST API, mirrored from the API on every docs build | | [`/docs/mcp/tools`](/docs/mcp/tools) | Every MCP tool, generated from the live server definitions | | [`/sitemap.xml`](/sitemap.xml) | Every page, for search engines | Each page also carries `TechArticle` structured data and a `` pointing at its Markdown. ## On every page [#on-every-page] - **Copy for LLM** copies the page as Markdown. On a feature page it copies **every tab** — Guide, API, MCP and Examples — so an assistant gets the complete picture in one paste. - **View as Markdown** opens the same text in a new tab. - **Open in…** sends the page straight to ChatGPT, Claude and others. - **Ask about this page** answers questions from the page’s own text. ## Let your assistant act, not just read [#let-your-assistant-act-not-just-read] Reading docs tells an assistant *how*. Connecting the [MCP server](/docs/leads/prospector/search-prospects/manual-search/mcp) lets it actually do the work in your account — search prospects, reveal contacts, and more. # Authentication > The keys that let your code and your AI assistant act on your account, what each one can reach, and how to replace one. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/authentication ### Your keys [#your-keys] They are also in the [dashboard](https://admin.happierleads.com) under **Integrations → API**. | Key | Who has it | What it can reach | | --- | --- | --- | | **Master Account API Key** | The account owner | Every website on the account, plus account and billing | | **Website API Key** | Each website | That one website only | With a website key, every request runs for that key's own website: a different `websiteId` in the request is replaced by the key's website, not refused. To read or change another website, use that website's key or the master key. The same keys work for both ways of connecting: - **REST API**: add `privateKey=YOUR_KEY` to the request. Every feature page has an **API** tab with its endpoints, ready to try. - **MCP server**: your connection URL in **Integrations → MCP Server** already contains the key (`?token=…`). Assistants that support OAuth can sign in with `https://rest-dash.happierleads.com/mcp` instead; they then act as the person who signed in, with that person’s permissions. Whatever the key, the server checks every request against the account’s plan and the person’s permissions. A key never unlocks more than the dashboard would. Anyone with a key, or a connection URL that contains one, can use your account. Keep keys on your server or in your assistant’s settings, never in browser code, shared documents or a public repository. ### If a key leaks, rotate it [#if-a-key-leaks-rotate-it] Open **Integrations → API**, pick the key and click **Rotate Key**. The account owner can also rotate the master key under **Account settings → Advanced**. Rotating takes effect immediately: the old key stops working for the REST API, and any assistant connected with the old connection URL loses access. Copy the new connection URL from **Integrations → MCP Server** into your assistant, and update any integrations that used the old key. To disconnect only an assistant that signed in with OAuth, remove the Happierleads connector in that assistant’s settings. ### Website IDs [#website-ids] Most requests take a `websiteId`: the website the request runs for. Ask your assistant to call `list_websites`, or copy it from your website’s settings in the dashboard. Website IDs are 24-character strings such as `64b7f0a1c2d3e4f5a6b7c8d9` (a made-up example used throughout these docs). ### Find your keys in the dashboard [#find-your-keys-in-the-dashboard] ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. # Build an automation > Act on new leads the moment they arrive: post to Slack, push to your CRM, start a campaign, call a webhook or email an alert. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/automations Each automation watches a source (a new lead, an intent signal, a web-scraping signal), checks your filter rules and then acts. Automations run on every plan, trial included. 1. **Automations → Add new automation.** 2. **Pick the source**, add **filter rules**, then the **action**. 3. **Switch it on**; its runs show on the card. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/automations/automations/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pause an automation [#use-case-pause-an-automation] `PATCH /admin/automations/{id}` with `{ "isActive": false }`. --- ## MCP — AI agents Source: /docs/automations/automations/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Which of my automations failed this week? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Clay > Send new leads to a Clay table to enrich and route them. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/clay Each lead that matches the automation is added as a row of a Clay table, through the table's webhook. Clay can then enrich it further and send it on. 1. **In Clay**, add a webhook source to your table and copy its URL. 2. **Automations → New automation**, then **Send to Clay**, and paste the URL. 3. **Choose** every lead or only leads with a suggested contact, then **Save**. --- ## API — From your code Source: /docs/automations/clay/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Only leads Clay can work with [#use-case-only-leads-clay-can-work-with] Set `whenToPush` to `only-with-suggested-contacts` so only leads with a person to enrich are sent. --- ## MCP — AI agents Source: /docs/automations/clay/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Send every new lead with a contact to my Clay table. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "Leads to Clay", "trigger": { "then": "send-to-clay", "actions": { "sendToClay": { "url": "https://api.clay.com/v3/sources/webhook/your-table-id", "whenToPush": "only-with-suggested-contacts" } } }, "actions": [] } ``` # GoHighLevel > Push leads to GoHighLevel: create a contact in GoHighLevel, optionally an opportunity in a pipeline stage, with tags. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/crm/gohighlevel Create a contact in GoHighLevel, optionally an opportunity in a pipeline stage, with tags. Fields are filled from your [field mapping](/docs/automations/crm/overview); an automation decides which leads go. 1. **Integrations → CRMs → GoHighLevel → Connect** and sign in to GoHighLevel. 2. **Map the fields** you want filled. 3. **Automations → New automation**, then **Send to GoHighLevel**, pick the owner, **Save**. --- ## API — From your code Source: /docs/automations/crm/gohighlevel/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick the owner [#use-case-pick-the-owner] `GET /v3/crm/owners?crm=gohighlevel` lists the users of your GoHighLevel; use one's id as `assignContactsTo`. ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with `crm: "gohighlevel"` and a `leadId` sends that lead right away, without an automation. --- ## MCP — AI agents Source: /docs/automations/crm/gohighlevel/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Push every new lead to GoHighLevel, owned by Sarah. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to GoHighLevel", "trigger": { "then": "send-to-gohighlevel", "actions": { "sentToGoHighLevel": { "createOpportunity": true, "opportunityStatus": "open", "tags": [ "website-visitor" ], "assignContactsTo": "OWNER_ID" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Send this lead to GoHighLevel now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "gohighlevel", "leadId": "6a3f00000000000000000003" } ``` # HubSpot > Push leads to HubSpot: create a contact, a company, a deal or a lead in HubSpot, assigned to an owner you pick. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/crm/hubspot Create a contact, a company, a deal or a lead in HubSpot, assigned to an owner you pick. Fields are filled from your [field mapping](/docs/automations/crm/overview); an automation decides which leads go. 1. **Integrations → CRMs → HubSpot → Connect** and sign in to HubSpot. 2. **Map the fields** you want filled. 3. **Automations → New automation**, then **Send to HubSpot**, pick the owner, **Save**. --- ## API — From your code Source: /docs/automations/crm/hubspot/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick the owner [#use-case-pick-the-owner] `GET /v3/crm/owners?crm=hubspot` lists the users of your HubSpot; use one's id as `assignContactsTo`. ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with `crm: "hubspot"` and a `leadId` sends that lead right away, without an automation. --- ## MCP — AI agents Source: /docs/automations/crm/hubspot/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Push every new lead to HubSpot, owned by Sarah. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to HubSpot", "trigger": { "then": "send-to-hubspot", "actions": { "sentToHubspot": { "action": "create-a-contact", "assignContactsTo": "OWNER_ID" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Send this lead to HubSpot now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "hubspot", "leadId": "6a3f00000000000000000003" } ``` # Connect & map fields > Connect HubSpot, Pipedrive, Zoho or Salesforce and send matching leads with the fields you map. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/crm/overview Connect your CRM once under Integrations → CRMs, map the fields, then let an automation push the leads that match. 1. **Integrations → CRMs → Connect.** 2. **Map the fields** you want filled. 3. **Create an automation** that pushes matching leads. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/automations/crm/overview/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with the CRM, the website and the contact data; pick an owner from `GET /v3/crm/owners`. --- ## MCP — AI agents Source: /docs/automations/crm/overview/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Push this lead to HubSpot and assign it to Jane. ```json { "crm": "hubspot", "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Pipedrive > Push leads to Pipedrive: create a person and organisation in Pipedrive, assigned to an owner you pick. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/crm/pipedrive Create a person and organisation in Pipedrive, assigned to an owner you pick. Fields are filled from your [field mapping](/docs/automations/crm/overview); an automation decides which leads go. 1. **Integrations → CRMs → Pipedrive → Connect** and sign in to Pipedrive. 2. **Map the fields** you want filled. 3. **Automations → New automation**, then **Send to Pipedrive**, pick the owner, **Save**. --- ## API — From your code Source: /docs/automations/crm/pipedrive/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick the owner [#use-case-pick-the-owner] `GET /v3/crm/owners?crm=pipedrive` lists the users of your Pipedrive; use one's id as `assignContactsTo`. ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with `crm: "pipedrive"` and a `leadId` sends that lead right away, without an automation. --- ## MCP — AI agents Source: /docs/automations/crm/pipedrive/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Push every new lead to Pipedrive, owned by Sarah. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to Pipedrive", "trigger": { "then": "send-to-pipedrive", "actions": { "sentToPipedrive": { "assignContactsTo": "OWNER_ID" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Send this lead to Pipedrive now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "pipedrive", "leadId": "6a3f00000000000000000003" } ``` # Salesforce > Push leads to Salesforce: create a lead in Salesforce for each matching visitor, assigned to an owner you pick. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/crm/salesforce Create a lead in Salesforce for each matching visitor, assigned to an owner you pick. Fields are filled from your [field mapping](/docs/automations/crm/overview); an automation decides which leads go. 1. **Integrations → CRMs → Salesforce → Connect** and sign in to Salesforce. 2. **Map the fields** you want filled. 3. **Automations → New automation**, then **Send to Salesforce**, pick the owner, **Save**. --- ## API — From your code Source: /docs/automations/crm/salesforce/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick the owner [#use-case-pick-the-owner] `GET /v3/crm/owners?crm=salesforce` lists the users of your Salesforce; use one's id as `assignContactsTo`. ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with `crm: "salesforce"` and a `leadId` sends that lead right away, without an automation. --- ## MCP — AI agents Source: /docs/automations/crm/salesforce/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Push every new lead to Salesforce, owned by Sarah. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to Salesforce", "trigger": { "then": "send-to-salesforce", "actions": { "sentToSalesforce": { "assignContactsTo": "OWNER_ID" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Send this lead to Salesforce now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "salesforce", "leadId": "6a3f00000000000000000003" } ``` # Zoho CRM > Push leads to Zoho CRM: create a lead in Zoho CRM, assigned to an owner you pick. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/crm/zoho Create a lead in Zoho CRM, assigned to an owner you pick. Fields are filled from your [field mapping](/docs/automations/crm/overview); an automation decides which leads go. 1. **Integrations → CRMs → Zoho CRM → Connect** and sign in to Zoho CRM. 2. **Map the fields** you want filled. 3. **Automations → New automation**, then **Send to Zoho CRM**, pick the owner, **Save**. --- ## API — From your code Source: /docs/automations/crm/zoho/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick the owner [#use-case-pick-the-owner] `GET /v3/crm/owners?crm=zoho` lists the users of your Zoho CRM; use one's id as `assignContactsTo`. ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with `crm: "zoho"` and a `leadId` sends that lead right away, without an automation. --- ## MCP — AI agents Source: /docs/automations/crm/zoho/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Push every new lead to Zoho CRM, owned by Sarah. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to Zoho CRM", "trigger": { "then": "send-to-zoho", "actions": { "sentToZoho": { "assignContactsTo": "OWNER_ID" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Send this lead to Zoho CRM now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "zoho", "leadId": "6a3f00000000000000000003" } ``` # Email campaigns > Add every matching lead to an email campaign automatically. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/email-campaigns Each lead that matches the automation is added to an email campaign as a contact and starts its sequence from the first step, from the mailboxes you choose. 1. **Automations → New automation**, then **Add to email campaign**. 2. **Pick the campaign** and, if you like, the mailboxes that send. 3. **Save.** The campaign must be active for the emails to go out. --- ## API — From your code Source: /docs/automations/email-campaigns/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Find the campaign [#use-case-find-the-campaign] `GET /admin/email-campaigns` lists your campaigns; use one's `_id` as `emailCampaign`. --- ## MCP — AI agents Source: /docs/automations/email-campaigns/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Add every hot lead to my 'Website visitors' campaign. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "Hot leads to campaign", "trigger": { "then": "send-to-emailCampaign" }, "actions": [ { "emailCampaign": "6a3f00000000000000000004" } ] } ``` # Overview (/docs/automations) An automation watches your new leads and acts when one matches its rules: post it to Slack, push it to your CRM, call a webhook or email you an alert. Automations keep running on every plan, trial included. Step-by-step guides for Automations are coming next. Until then, ask the support chat on this page anything about them. # Run history & re-run > See what each automation did with each lead, and run it again once a failure is fixed. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/run-history Every run is kept: delivered, filtered out (with the rule that stopped it) or failed (with the reason). Fix the cause, then retry. 1. **View runs** on an automation. 2. **Failed** shows what went wrong. 3. **Retry this lead**, or retry several at once. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/automations/run-history/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Retry after a fix [#use-case-retry-after-a-fix] `POST /admin/automations/re-trigger` with the `leadIds` and `automationIds` to run again. --- ## MCP — AI agents Source: /docs/automations/run-history/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Why wasn’t this lead sent to HubSpot? ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2" } ``` # Slack > Post every new lead to a Slack channel, with the message you choose. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/slack Each lead that matches the automation is posted to a Slack channel the moment it arrives: who they are, their company, the pages they saw and a link to the lead. You choose the channel and the message. 1. **Integrations → Notifications → Connect Slack.** 2. **Automations → New automation**, then **Send to Slack**. 3. **Pick the channel** and, if you like, edit the message. 4. **Save.** Send yourself a test message first to see how it looks. --- ## API — From your code Source: /docs/automations/slack/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick the channel first [#use-case-pick-the-channel-first] `GET /v3/slack/channels` lists the channels of the connected workspace; use one as `sendMessagesTo`. ### Use case: Try the message [#use-case-try-the-message] `POST /v3/slack/test-message` posts a sample lead with the saved template, or the `template` you pass. --- ## MCP — AI agents Source: /docs/automations/slack/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Post every new lead from the US to #sales in Slack. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New US leads to #sales", "trigger": { "then": "send-to-slack", "actions": { "sentToSlack": { "sendMessagesTo": "#sales" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Send me a test Slack message so I can see how leads look. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "channelName": "#sales" } ``` # Webhooks > Send every new lead as JSON to a URL of your own: your app, Make, n8n or any tool that takes a webhook. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/automations/webhook Each lead that matches the automation is sent as a JSON POST to your URL: the person, their company, the pages they saw and the lead link. Every request carries a signature header you can check with your website's webhook secret. 1. **Automations → New automation**, then **Trigger webhook**. 2. **Paste your URL** and choose: every lead, or only leads with a suggested contact. 3. **Send a test lead** to check your endpoint, then **Save**. --- ## API — From your code Source: /docs/automations/webhook/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Check your endpoint first [#use-case-check-your-endpoint-first] `POST /v3/webhooks/test` with `webhook` set to your URL sends a sample lead and returns the status your endpoint answered. --- ## MCP — AI agents Source: /docs/automations/webhook/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Send every new lead to my n8n webhook. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to n8n", "trigger": { "then": "trigger-webhook", "actions": { "sentToWebhook": { "url": "https://n8n.example/webhook/leads", "whenToPush": "every-time" } } }, "actions": [] } ``` ### Use case [#use-case-1] > Test my webhook with a sample lead. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "webhook": "https://n8n.example/webhook/leads" } ``` # Build it with your AI coding assistant (/docs/embed/build-with-ai) Paste this into Claude (or any AI coding assistant) inside your app's code base. It builds every step of this section, the [one-off migration](/docs/embed/existing-clients) included, and keeps a checklist file so nothing gets forgotten. The dashboard steps it asks you to confirm. ```text title="Prompt" You are integrating Happierleads "Embedded screens" into this app. Our clients will see their website visitors (Leads) and the tracking-pixel install screen inside our app, in an iframe, under our brand. Every item below is a hard requirement: missing one breaks the integration for real clients or leaks a key. BEFORE ANYTHING ELSE: create INTEGRATION_CHECKLIST.md at the repo root containing every checkbox below, word for word. Tick a box only when its code is written AND tested, or, for the manual items, when I have confirmed it. Re-read the checklist at the start of every reply, end every reply with the list of boxes still open, and never say "done" while one is unticked. The dashboard items (section A) are mine: ask me to confirm each one, never assume it. ## Facts - API base: read it from HL_API_BASE (https://rest-admin.happierleads.com, or https://rest-dash. once white-label DNS is verified). - Two keys, server only: HL_MASTER_KEY (master-priv-…, sent as ?privateKey=) and HL_EMBED_KEY (hle_…, sent as Authorization: Bearer). Never in browser code, never in logs, never in git. Add HL_API_BASE, HL_MASTER_KEY and HL_EMBED_KEY to .env.example with empty values. - One Happierleads website per client company, its id stored as company.happierleadsWebsiteId (add the field and its migration). ## A. Dashboard setup (manual: I do these, you ask me to confirm) - [ ] A-1. Account settings → White label → Start setup: our two addresses chosen (e.g. reveal. and rest-dash.), the DNS records the wizard shows added at our DNS provider, Verify passed. - [ ] A-2. Account settings → White label → Embed in your app: "Allow my app to embed these screens" ticked, the origin of EVERY environment that shows the iframe saved (production, staging, local), tabs / Leads-screen parts / extra screens chosen, Session length set (1 week by default, 1 minute to 1 year). - [ ] A-3. Server keys → Create key: saved as HL_EMBED_KEY in every environment's secrets. - [ ] A-4. Account settings → API Keys: master key created and saved as HL_MASTER_KEY. ## B. Server: one Happierleads client module - [ ] B-1. createWebsite({ name, domain }) → POST /admin/websites { name, domain } → { websiteId } (domain may be ""); setLimits(id, { credits, emailAccounts }) → PUT /admin/websites/set-limits/{id}; startTrial(id, endsAt) → PUT /admin/websites/toggle-limits/{id} { trialEnabled: true, trialExpireDate, enableWebsiteLimits: true }; setPaid(id, renewsAt) → same URL with { trialEnabled: false, activeWebsite: true, enableWebsiteLimits: true, refreshOnDate }; cancel(id) → setLimits(id, { credits: 0, emailAccounts: 0 }) then toggle-limits { activeWebsite: false }; createEmbedSession(body) → POST /v3/embed/sessions. - [ ] B-2. Every call: 10 s timeout; a non-2xx throws with method, path and status (never the key or the full URL); one retry on 5xx or network errors only. ## C. Scenario 1: a client signs up - [ ] C-1. Where a client company is created: createWebsite, save websiteId on the company immediately, then setLimits and startTrial (credits and trial length from our plan config). - [ ] C-2. If Happierleads fails, sign-up still succeeds: flag the company happierleadsPending and retry from a background job. Never create a second website for a company that already has an id. ## D. One-off migration of existing clients (before launch) - [ ] D-1. scripts/happierleads-migrate with a --dry-run flag that only prints: every company without happierleadsWebsiteId → createWebsite, save the id, setLimits, then setPaid (paying: refreshOnDate = next renewal) or startTrial (trial end date). - [ ] D-2. Idempotent (skips companies that have an id, saves the id before the next call), throttled (about 3 calls per second), logs ok / failed per company plus a summary; running it again retries the failures. - [ ] D-3. Run on staging, then production; show me the summary and I confirm the counts. ## E. Billing: leads follow what they pay - [ ] E-1. In our billing webhook: payment succeeded (first payment, or trial → paid) → setPaid(next billing date) FIRST, then setLimits({ credits: the plan's leads, emailAccounts, resetCredits: true }). Plan change → setLimits with the new numbers (an upgrade adds the difference to what is left). Cancelled or unpaid → setLimits({ credits: 0, emailAccounts: 0 }) then toggle-limits { activeWebsite: false } (tracking stops, their data is kept). - [ ] E-1b. Know what Happierleads does on its own, and do NOT duplicate it: a normal monthly renewal needs no call (leads refill to the limit on refreshOnDate, then the date moves on a month); a trial that ends sets the leads to 0 by itself. set-limits always needs BOTH credits and emailAccounts (a 405 otherwise). - [ ] E-2. The webhook is idempotent (the same event twice gives the same result) and logs the status of each Happierleads call. ## F. Scenario 2: a client logs in and opens the page (the embed endpoint) - [ ] F-1. GET /api/leads-embed behind our normal auth. Not signed in → 401 without calling Happierleads. - [ ] F-2. Normal users: createEmbedSession({ websiteId, view }). Send NO user email or name: Happierleads does not need our users' personal data (only add user: { email } if we switch on CSV export, which emails the file link there). websiteId comes from the signed-in user's company, NEVER from the request. view is validated against auto, leads, install and the extra screens we ticked in A-2. - [ ] F-3. Only our own staff (our rule) get { scope: "account" }, the admin view of every website. - [ ] F-4. Respond { url } with Cache-Control: no-store. Never store or log the url: it works once, within 60 seconds. - [ ] F-5. A company with no websiteId yet gets one on the spot (C-1) and the request continues. ## G. The page (browser) - [ ] G-1. A "Website visitors" page (our navigation, a full-height borderless iframe) and an "Install tracking" item opening view=install; one iframe per screen. - [ ] G-2. Fetch a fresh url every time a screen is shown; never reuse one. - [ ] G-3. (Optional: sessions last as long as we set in Embed settings, 1 week by default) on postMessage "session-ended" (check e.origin === new URL(url).origin) load a fresh url, at most every 30 seconds. - [ ] G-4. No key, master or embed, in any front-end file or bundle: grep the build output to prove it. - [ ] G-5. White label: nothing our users can see says Happierleads. No brand name in our routes or URLs (use /api/leads-embed), page or iframe titles, menu items, error messages, front-end code or logs shown to users. Use our own product words (e.g. "Website visitors"). ## H. Security and tests - [ ] H-1. Every destructive Happierleads call (e.g. DELETE /admin/websites/{id}) runs only on our server after our own permission check; none from the browser. - [ ] H-2. Tests: the client module (mocked fetch), sign-up creating and saving the website, the migration run twice creates no duplicates, billing paid and cancelled, the embed endpoint (401 signed out, only the user's own websiteId even when another is sent, staff scope, no-store header). - [ ] H-3. End to end on staging, with me: sign up a test client → the install screen opens in the iframe; log in again → the leads screen. Match this project's code style. Work through the checklist in order and keep INTEGRATION_CHECKLIST.md current after every change. ``` # Cancel or unpaid (/docs/embed/cancel) A client cancels, or stops paying. Two calls: no more leads, then stop the monthly refill. **Tracking stops; their leads and settings are kept**, so a returning client picks up where they left off. ## 1. Leads to 0 [#1-leads-to-0] ## 2. Stop the monthly refill [#2-stop-the-monthly-refill] ## They come back [#they-come-back] Run the two [switch to paid](./switch-to-paid) calls again: everything works at once. ## Leaving for good [#leaving-for-good] Only when a client asks for their data to be removed: `DELETE /admin/websites/{id}` removes the website **and all its leads**. It cannot be undone, and never call it from a browser. **Next:** [go live: bring your existing clients across](/docs/embed/existing-clients). # Change plan or billing date (/docs/embed/change-plan) **A normal monthly renewal needs no call**: on `refreshOnDate` the leads refill to the plan's number and the date moves on a month. Call us only when something changes. ## Upgrade or downgrade [#upgrade-or-downgrade] `PUT /admin/websites/set-limits/{websiteId}` with the new numbers. - **Upgrade:** the extra leads are added to what is left now (limit 1,000 with 377 left → 5,000 gives 4,377 left). - **Downgrade:** what is left is capped at the new number. Try it with Mock data: the sample website has 1,000 leads a month with 377 left. ## Billing date moved, or refill now [#billing-date-moved-or-refill-now] Run both [switch to paid](./switch-to-paid) calls again with the new date: paid mode with the new `refreshOnDate`, then the plan's leads with `resetCredits: true`. **Next:** [cancel or unpaid](/docs/embed/cancel). # Scenario 2: a client logs in (/docs/embed/client-logs-in) A client who already has a website (from sign-up or the one-off migration) signs in and opens the page. Nothing is created: your server only asks for a link. ### 1–2. Your sign-in, exactly as today [#12-your-sign-in-exactly-as-today] `POST /login` and your own session cookie. There is no Happierleads login to add, and we never see your session. ### 3–7. Your page asks your server for a one-time link [#37-your-page-asks-your-server-for-a-one-time-link] Your page calls **your** endpoint. Your server checks the user is signed in, reads `company.happierleadsWebsiteId` from **your** database (never from the request), and asks us for a link with your embed key: ```js title="server.js" app.get('/api/leads-embed', requireLogin, async (req, res) => { const r = await fetch(`${process.env.HL_API_BASE}/v3/embed/sessions`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.HL_EMBED_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ websiteId: req.user.company.happierleadsWebsiteId, view: req.query.view || 'auto' }), }); if (!r.ok) return res.status(502).json({ error: 'Could not open this screen' }); res.set('Cache-Control', 'no-store').json({ url: (await r.json()).url }); // works once, 60 seconds }); ``` The call to us, from your server only, with your embed key. Try it on sample data (change `view`, or send another `websiteId` to see the refusal); the **JavaScript** and **Python** tabs have the server code: Every field and `view`: [Open a screen](/docs/embed/open-a-screen). ### 8. Their leads appear [#8-their-leads-appear] ```html ``` The screen stays open as long as your Session length (1 week by default), then sends `session-ended`: load a fresh link. More: [Show it in an iframe](/docs/embed/iframe). # Scenario 1: a client signs up (/docs/embed/client-signs-up) A new client fills in **your** sign-up form. In the same request your server creates their Happierleads website, then their first page opens the install screen. ### 1. Your sign-up, exactly as today [#1-your-sign-up-exactly-as-today] `POST /signup` on your own app: create the user and their company. Your users never get a Happierleads password. ### 2–3. Create their website [#23-create-their-website] With your master key. The domain may be empty: the install screen asks for it. The answer is `201 { websiteId }`. ### 4. Save the websiteId on YOUR customer [#4-save-the-websiteid-on-your-customer] Before any other call. It is the only link between your client and their website. ```js const { websiteId } = await res.json(); await db.companies.update(company.id, { happierleadsWebsiteId: websiteId }); ``` ### 5–6. Their leads and email accounts [#56-their-leads-and-email-accounts] ### 7–8. Trial until the end date [#78-trial-until-the-end-date] When they pay, your billing webhook [switches them to paid](/docs/embed/switch-to-paid). ### 9. Send them to your Leads page [#9-send-them-to-your-leads-page] An ordinary redirect inside your own app; nothing goes to Happierleads. ```js res.redirect('/visitors'); // your page with the iframe ``` ### 10–14. Your page asks your server for a one-time link [#1014-your-page-asks-your-server-for-a-one-time-link] Your page calls **your** endpoint. Your server checks the user is signed in, reads `company.happierleadsWebsiteId` from **your** database (never from the request), and asks us for a link with your embed key: ```js title="server.js" app.get('/api/leads-embed', requireLogin, async (req, res) => { const r = await fetch(`${process.env.HL_API_BASE}/v3/embed/sessions`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.HL_EMBED_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ websiteId: req.user.company.happierleadsWebsiteId, view: req.query.view || 'auto' }), }); if (!r.ok) return res.status(502).json({ error: 'Could not open this screen' }); res.set('Cache-Control', 'no-store').json({ url: (await r.json()).url }); // works once, 60 seconds }); ``` The call to us, from your server only, with your embed key. Try it on sample data (change `view`, or send another `websiteId` to see the refusal); the **JavaScript** and **Python** tabs have the server code: Every field and `view`: [Open a screen](/docs/embed/open-a-screen). ### 15. The screen loads [#15-the-screen-loads] ```html ``` A new client has no pixel yet, so `view: "auto"` opens the install screen: their snippet and a Verify button. More: [Show it in an iframe](/docs/embed/iframe). **Next:** [Scenario 2: a client logs in](/docs/embed/client-logs-in). # Create a website when a client signs up (/docs/embed/create-website) Every client gets **one website**. Create it in your sign-up code, right after you create the client's company in your own database, with your master key (`HL_MASTER_KEY`, sent as `?privateKey=`). ## 1. Create the website [#1-create-the-website] `POST /admin/websites` with the client's name and domain. The domain may be empty: the install screen asks the client for it. The answer is the new website's id. ## 2. Save the websiteId on your client [#2-save-the-websiteid-on-your-client] Store the `websiteId` on your own customer record (for example `company.happierleadsWebsiteId`). It is the only link between your client and their website: credits, trial, paid, cancel and every screen you open later need it. Lose it and that client cannot open their screens. ```js // after POST /admin/websites, before anything else await db.companies.update(company.id, { happierleadsWebsiteId: websiteId }); ``` ## 3. Then give it credits [#3-then-give-it-credits] In the same sign-up request, right after saving the id: [start a trial](./start-trial), or [switch it to paid](./switch-to-paid) if the client paid at sign-up. ## If our API is down at sign-up [#if-our-api-is-down-at-sign-up] Let the sign-up succeed anyway: flag the company (for example `happierleadsPending`) and retry from a background job. Never create a second website for a company that already has a `websiteId`. **Next:** [open a screen: the one-time link](/docs/embed/open-a-screen). # Bring your existing clients across (/docs/embed/existing-clients) Clients who signed up before today have no website yet. Run this once before you launch: for each of them it does what [sign-up](/docs/embed/create-website) does, then sets them to paid or trial like your billing webhook ([trial](/docs/embed/start-trial) or [paid](/docs/embed/switch-to-paid)). It is **safe to run again**: clients that already have a `websiteId` are skipped, and the id is saved before the next call, so a re-run only retries the failures. ```js title="scripts/happierleads-migrate.js" const API = process.env.HL_API_BASE ?? 'https://rest-admin.happierleads.com'; const DRY_RUN = process.argv.includes('--dry-run'); async function hl(method, path, body) { const r = await fetch(`${API}${path}?privateKey=${process.env.HL_MASTER_KEY}`, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); if (!r.ok) throw new Error(`${method} ${path} → ${r.status} ${await r.text()}`); return r.json(); } const companies = await db.companies.find({ happierleadsWebsiteId: null }); // your own query let ok = 0, failed = 0; for (const c of companies) { if (DRY_RUN) { console.log('would create', c.id, c.name); continue; } try { const { websiteId } = await hl('POST', '/admin/websites', { name: c.name, domain: c.domain || '' }); await db.companies.update(c.id, { happierleadsWebsiteId: websiteId }); // save first, then limits await hl('PUT', `/admin/websites/set-limits/${websiteId}`, { credits: c.plan.leads, emailAccounts: 2 }); await hl('PUT', `/admin/websites/toggle-limits/${websiteId}`, c.isPaying ? { trialEnabled: false, activeWebsite: true, enableWebsiteLimits: true, refreshOnDate: c.renewsAt } : { trialEnabled: true, trialExpireDate: c.trialEndsAt, enableWebsiteLimits: true }); ok += 1; console.log('ok', c.id, websiteId); } catch (e) { failed += 1; console.error('FAILED', c.id, e.message); // run again to retry } await new Promise((r) => setTimeout(r, 300)); // about 3 calls a second } console.log({ total: companies.length, ok, failed }); ``` 1. Run it with `--dry-run` and check the list. 2. Run it on staging, open a few clients' screens. 3. Run it on production and compare the summary with your client count. **Next:** [security checklist](/docs/embed/security). # How it works (/docs/embed/how-it-works) Four parties take part: your user's browser, your server (it holds both keys), Happierleads (the API, and the screens served on your domain) and the embedded screen. Your users only ever talk to your app; your server is the only one that talks to our API. Three flows, each on its own page with the diagram and the API calls in order: ## What happens without you [#what-happens-without-you] You don't need to call us for these: - **Monthly renewal:** on `refreshOnDate` the leads refill to the plan's number and the date moves on a month. - **Trial end:** the leads go to 0 and tracking stops, unless your webhook switched them to paid. - **`view: "auto"`:** opens the install screen until the pixel works, then their leads. - **Session length:** a screen stays open as long as your Embed settings say (1 week by default), then sends `session-ended` to your page. # Show it in an iframe (/docs/embed/iframe) Ask your endpoint for a fresh link every time the page opens, put it in the iframe, done. ```html ``` ```tsx export function WebsiteVisitors({ view = 'auto' }: { view?: string }) { const [url, setUrl] = useState(); useEffect(() => { fetch(`/api/leads-embed?view=${view}`) .then((r) => r.json()) .then((d) => setUrl(d.url)); }, [view]); return url ? ``` Your website's leads (or its install screen, if the pixel isn't live yet) appear inside your page. Reload after 60 seconds and you get *This link was already used or has expired*: that is the one-time link doing its job. ## What you just did [#what-you-just-did] | You did by hand | In the real integration | | --- | --- | | Copied a website id | Your server creates one website per client at sign-up and saves its id ([create a website](/docs/embed/create-website)) | | Ran `curl` with the embed key | One endpoint on your server asks for the link on every page load ([open a screen](/docs/embed/open-a-screen)) | | Pasted the url into `index.html` | Your page fetches the url from your endpoint and sets the iframe ([show it in an iframe](/docs/embed/iframe)) | | Used `localhost` | Your app's real address, with the screens on your own domain ([your domain and keys](/docs/embed/setup)) | **Next:** [how it works: the three flows](/docs/embed/how-it-works). # Security: server vs browser (/docs/embed/security) A key in a web page can be read by anyone who opens it. So keys only ever live on your server, and the browser only ever gets a link that works once. ## Your server only [#your-server-only] - **Master key** (`master-priv-…`): acts as the account owner. - **Embed key** (`hle_…`): can only open embedded sessions. - Creating, changing and deleting websites, setting credits and trials. - Asking for the one-time link, **after your own sign-in check**. ## Safe in the browser [#safe-in-the-browser] - The tracking pixel snippet: it only carries the website's public id. - The one-time link: it works once, within 60 seconds. - The messages the frame sends your page (`ready`, `session-ended`…). ## Never [#never] - A key in front-end code, a mobile app or a public repository. - `DELETE /admin/websites/{id}`, or any write, from the browser: proxy it through your server after your own permission check. - A `websiteId` taken from the request: always from the signed-in user's company in your database. - One login shared between clients: one website and one client view each. - `scope: "account"` for anyone but your own staff. ## If a key leaks [#if-a-key-leaks] - **Embed key:** revoke it under **Embed in your app → Server keys**. Its open sessions end on their next request. Create a new one first to avoid downtime (up to 5 can be active). - **Master key:** rotate it, see [Authentication](/docs/authentication#if-a-key-leaks-rotate-it). ## Before you go live [#before-you-go-live] - [ ] `grep` your front-end build output for `master-priv-` and `hle_`: no hits. - [ ] Signed out, your endpoint answers `401` without calling us. - [ ] Sending another company's `websiteId` still opens only the user's own. - [ ] The link response has `Cache-Control: no-store` and is never logged. **Next:** [build it with your AI coding assistant](/docs/embed/build-with-ai). # Your domain and keys (/docs/embed/setup) Two things in your Happierleads dashboard, once, before your first client. Then add the keys to your server's environment. ## 1. Put the screens on your domain [#1-put-the-screens-on-your-domain] Your clients must never see happierleads.com. The **White label** wizard puts everything on two addresses of yours: one for the screens and one for the API. ### Choose your two addresses [#choose-your-two-addresses] Open **Account settings → White label** and click **Start setup**. Type a subdomain (for example `reveal`) and your domain. The wizard sets up: - `reveal.youragency.example`: the screens (the dashboard, or the embedded screens) - `rest-dash.youragency.example`: the API Fill in the sender details for system emails and click **Save & continue**. ![Choose your domains](/images/embed/wizard-domains.png) ### Add the DNS records [#add-the-dns-records] The wizard shows two **CNAME** records. Add them at your DNS provider exactly as shown. Set **Proxy status** to **DNS only** (grey cloud). Proxied records stop the SSL certificate from being issued. ![Verify your DNS](/images/embed/wizard-dns.png) ### Verify [#verify] Click **Verify DNS & continue**, usually 5 to 30 minutes after adding the records. Records turn green once they are found. If one says *Not yet*, fix it, wait a few minutes and click Verify again. Once verified you can call the API on `https://rest-dash.youragency.example` instead of `https://rest-admin.happierleads.com`: same endpoints, same keys. ## 2. Switch embedding on and create your keys [#2-switch-embedding-on-and-create-your-keys] ### Allow your app to embed the screens [#allow-your-app-to-embed-the-screens] Open **Account settings → White label → Embed in your app** and tick **Allow my app to embed these screens**. ### Add your app's addresses [#add-your-apps-addresses] Add the address of every environment that shows the iframe (production, staging, local), one per line, for example `https://app.youragency.example`, and click **Save addresses**. Any other site gets a blank frame. ### Choose what your users see [#choose-what-your-users-see] - **Leads tabs:** Website Visitors, 3rd-Party Intent, Web Scraping, Prospector, AI Scout, Lists. - **Parts of the Leads screen:** ICP score, Email campaigns, Automations, Ad audiences. - **Extra screens** you can embed as their own iframe: Automations, Integrations, Website settings, Qualify, Email campaigns. Leads and pixel install are always available. - **CSV export** (optional): only for sessions where your server sends the user's email; the file link is emailed there. ### Set the session length [#set-the-session-length] How long a screen stays open before it needs a fresh link: 1 week by default, from 1 minute to 1 year. Revoking a key or switching embedding off still ends every session at once. ### Create the embed key [#create-the-embed-key] Under **Server keys** click **Create key**. It is shown **once**: store it on your server as `HL_EMBED_KEY`. You can have up to 5 active keys, so you can rotate without downtime. ### Create the master key [#create-the-master-key] Open **Account settings → API Keys**, create a master key and store it as `HL_MASTER_KEY`. See [Authentication](/docs/authentication) for rotating keys. ![Account settings → White label → Embed in your app](/images/embed/embed-settings.png) ## 3. Add the keys to your server [#3-add-the-keys-to-your-server] ```bash title=".env (server only, never committed)" HL_API_BASE=https://rest-admin.happierleads.com # or https://rest-dash.youragency.example once DNS is verified HL_MASTER_KEY=master-priv-… HL_EMBED_KEY=hle_… ``` Add the three names with empty values to `.env.example`, and to every environment's secrets. **Next:** [choose what your users see](/docs/embed/what-users-see). # Start a trial (/docs/embed/start-trial) A trial gives a new client a number of leads until an end date. Two calls, from your sign-up code right after [creating the website](./create-website). ## 1. How many leads and email accounts [#1-how-many-leads-and-email-accounts] `PUT /admin/websites/set-limits/{websiteId}`. Both `credits` and `emailAccounts` are required (a `405` otherwise). ## 2. Trial until the end date [#2-trial-until-the-end-date] `PUT /admin/websites/toggle-limits/{websiteId}` with `trialEnabled: true` and the end date. ## What happens without you [#what-happens-without-you] When the trial ends, its leads go to 0 and tracking stops. Nothing to call, unless they pay: then [switch them to paid](./switch-to-paid). ## The same in your dashboard [#the-same-in-your-dashboard] **Website settings → Credits for this website**, handy to check what your code did: | In the dashboard | In the API | | --- | --- | | Give it its own limit | `enableWebsiteLimits: true` | | Trial (one-off) | `trialEnabled: true` | | Leads for the trial | `credits` | | Trial ends on | `trialExpireDate` | ![Trial in Website settings](/images/embed/ui-trial.png) **Next:** [switch to paid](/docs/embed/switch-to-paid). # Switch to paid (/docs/embed/switch-to-paid) A client pays: at sign-up for a paid plan, or in your *payment succeeded* webhook when a trial converts. Two calls, **in this order**. ## 1. Paid mode, with the monthly refill date [#1-paid-mode-with-the-monthly-refill-date] `PUT /admin/websites/toggle-limits/{websiteId}` with `activeWebsite: true` and `refreshOnDate` = their next billing date. This ends a trial. ## 2. The plan's leads, refilled to full now [#2-the-plans-leads-refilled-to-full-now] `PUT /admin/websites/set-limits/{websiteId}` with the plan's numbers and `resetCredits: true`. Call both from your billing webhook and make it idempotent: the same event twice must give the same result. The **JavaScript** tab of each playground has the code. ## What happens without you [#what-happens-without-you] Every month on `refreshOnDate` their leads refill to the plan's number and the date moves on a month. A normal renewal needs no call. ## The same in your dashboard [#the-same-in-your-dashboard] | In the dashboard | In the API | | --- | --- | | Give it its own limit | `enableWebsiteLimits: true` | | Every month | `activeWebsite: true, trialEnabled: false` | | Leads per month | `credits` | | Refills on | `refreshOnDate` | | Refill now | `resetCredits: true` | ![Paid in Website settings](/images/embed/ui-paid.png) **Next:** [change plan or billing date](/docs/embed/change-plan). # Choose what your users see (/docs/embed/what-users-see) You decide what your users see, once for your whole account, in **Account settings → White label → Embed in your app**. Every new session follows these settings; change one and the next link your server asks for uses it. ## Try the switches [#try-the-switches] The same switches as in your dashboard. Change one and the preview opens a new session with it, exactly as your users would see it. ## The settings [#the-settings] | Setting | What it changes | Default | | --- | --- | --- | | **Leads tabs** (products): Website Visitors, 3rd-Party Intent, Web Scraping, Prospector, AI Scout, Lists | The tabs at the top of the Leads screen. At least one. | Website Visitors | | **ICP score** | The ICP Fit column and the Qualify screen | On | | **Email campaigns** | The Campaign column and the Email campaigns screen | On | | **Automations** | The Automations column, re-running them, and the Automations screen | On | | **Ad audiences** | The Google, LinkedIn and Meta Ads columns | On | | **CSV export** | The Export button, only in sessions where your server sends `user.email` (the file link is emailed there) | On | | **Screens you can embed**: Automations, Integrations, Website settings, Qualify, Email campaigns | Extra screens, each opened with its own `view` | Off (Leads and Install are always on) | | **Session length** | How long a screen stays open before it needs a fresh link: 1 minute to 1 year | 1 week | A screen whose part is switched off cannot be opened either: switch off **Email campaigns** and a session with `view: "engage"` is refused. ## Change them in your dashboard [#change-them-in-your-dashboard] Open **Account settings → White label → Embed in your app**. Under **What your users see**, tick the Leads tabs and the parts of the Leads screen they get. Under **Screens you can embed**, tick the extra screens you will put behind your own menu items. Set the **Session length** and click **Save length**. Revoking a key or switching embedding off still ends every session at once. ![What your users see, in Embed in your app](/images/embed/embed-settings.png) ## One menu item per screen [#one-menu-item-per-screen] Each screen is its own iframe behind your own menu item, opened with its `view` (see [Open a screen](/docs/embed/open-a-screen)): | Your menu item | `view` | | --- | --- | | Website visitors | `auto` (install until the pixel works, then leads) or `leads` | | Install tracking | `install` | | Automations | `automations` | | Integrations | `integrations` | | Qualify | `qualify` | | Email campaigns | `engage` | | Website settings | `settings` | **Next:** [create a website when a client signs up](/docs/embed/create-website). # Ads audiences > Show ads to the people who visited your website: send them to Google, LinkedIn and Meta Ads as audiences. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/ads-audiences Connect Google, LinkedIn or Meta Ads under **Integrations → Paid Ads**, link a campaign under **Engage**, and your identified leads are added to its audience (for Google Ads, by an automation with the **Push to Google Ads** action). 1. **Integrations → Paid Ads:** connect the ad account. 2. **Engage → Google Ads / LinkedIn Ads / Meta Ads:** link a campaign. 3. **Automations:** for Google Ads, add the **Push to Google Ads** action so matching leads join the audience. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/ads-audiences/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Weekly ads report [#use-case-weekly-ads-report] Read every audience with `GET /v3/google-ads/audiences`, refresh each one's numbers with `POST /v3/google-ads/audiences/{audienceId}/sync-stats`, then post the clicks and conversions to your team. --- ## MCP — AI agents Source: /docs/engage/ads-audiences/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > How are my Google Ads retargeting audiences doing this month? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Campaign contacts > Add people to a campaign, see where each one is, and stop it for anyone who replied elsewhere. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/campaign-contacts Contacts enter a campaign from your leads (or automations) and move through its emails; the Contacts tab shows where each one is. 1. **Add leads** from the Leads table or a lead → **Add to campaign**. 2. **Open the campaign → Contacts** to see scheduled, contacted, bounced and warm. 3. **Overview** shows opens, clicks, replies and warm leads. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/campaign-contacts/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Add someone from your app [#use-case-add-someone-from-your-app] `POST /admin/email-campaign/schedule-contact` with `{ "email": …, "emailCampaignId": … }` and any merge fields (first name, company…). --- ## MCP — AI agents Source: /docs/engage/campaign-contacts/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Add ava@northwind-analytics.example to “Pricing page visitors”. ```json { "campaignId": "6530c1d2e3f4a5b6c7d8e9f5", "email": "ava@northwind-analytics.example", "firstName": "Ava" } ``` # Campaign health > See how many emails a campaign can send a day and what holds it back. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/campaign-health Every campaign has a health check: its mailboxes, their daily limits and warmup, and a recommended fix when something holds it back. It shows on the campaign overview. 1. **Open a campaign:** the banner shows its health. 2. **Follow the recommended action**, e.g. add a mailbox or raise a daily limit. 3. **Dismiss** a recommendation you have handled. --- ## API — From your code Source: /docs/engage/campaign-health/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Watch capacity daily [#use-case-watch-capacity-daily] `GET /admin/email-campaigns/{id}/capacity` returns the daily capacity and what limits it. --- ## MCP — AI agents Source: /docs/engage/campaign-health/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Why is “Pricing page visitors” sending so slowly? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "campaignId": "6530c1d2e3f4a5b6c7d8e9f5" } ``` # Email campaigns > Send email sequences to your leads from your own mailboxes, on the days and hours you choose. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/email-campaigns A campaign sends a sequence of emails to its contacts, from your connected mailboxes, inside the sending window you set. 1. **Engage → + New Campaign → Email Campaign.** 2. **Name it and set the window:** hours, days, timezone. 3. **Write the emails** under Sequences, add contacts, then switch it on. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/email-campaigns/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pause a campaign [#use-case-pause-a-campaign] `PUT /admin/email-campaigns/{id}` with `{ "status": "paused" }`; `"active"` starts it again. --- ## MCP — AI agents Source: /docs/engage/email-campaigns/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Create a 3-email campaign for website visitors who saw our pricing page. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "Pricing page visitors", "emailAccountId": "6530c1d2e3f4a5b6c7d8e9f6", "steps": [ { "subject": "Saw you checking our pricing", "body": "Hi {{ first_name | there }},\nQuick question about pricing\u2026\n{{sender_signature}}\n{{unsubscribe_text}}", "delayDays": 0 } ] } ``` # Engage (/docs/engage) Engage turns leads into conversations: email sequences sent from your own mailboxes, LinkedIn campaigns, and one Master Inbox for every reply. Campaigns send on paid plans; on a trial you can build them and see how they would work. # LinkedIn campaigns > Send connection requests, with an optional personalised note, from your LinkedIn account. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/linkedin-campaigns Pair your LinkedIn account, then let a campaign send connection requests (with an optional personalised note, up to 300 characters) to your leads. 1. **Engage → LinkedIn.** 2. **Pair your account:** install the [LinkedIn Chrome extension](/docs/engage/linkedin-extension) and click **Connect this Chrome**; it appears under Integrations → LinkedIn Accounts. 3. **Watch** requests sent, accepted and failed. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/linkedin-campaigns/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Report on LinkedIn [#use-case-report-on-linkedin] `GET /v3/linkedin/campaigns` returns each campaign with its counts. --- ## MCP — AI agents Source: /docs/engage/linkedin-campaigns/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > How are my LinkedIn campaigns doing? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # LinkedIn Chrome extension > Install the Happierleads LinkedIn extension so your LinkedIn campaigns send connection requests from your own browser. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/linkedin-extension [LinkedIn campaigns](/docs/engage/linkedin-campaigns) send their connection requests through a Chrome extension, from your own LinkedIn session in your own browser. Nothing logs in to LinkedIn on your behalf. LinkedIn is in BETA. It is available on every plan except lifetime deals. ### Install it [#install-it] 1. Open Chrome on the computer where you are signed in to LinkedIn. 2. Install **[Happierleads LinkedIn from the Chrome Web Store](https://chromewebstore.google.com/detail/happierleads-linkedin/jkimcciakllhjkgkpimcjlfkoiaejkao)** and click **Add to Chrome**. You can also click **Add to Chrome** under **Integrations → LinkedIn Accounts** in the dashboard. 3. Pin it: click the puzzle icon in Chrome’s toolbar, then the pin next to **Happierleads LinkedIn**. 4. Open the extension and click **Connect this Chrome**. If no dashboard tab is open, sign in with your dashboard email and password, then pick the workspace. 5. Within a minute the account appears in **Integrations → LinkedIn Accounts** with its status. Updates install automatically. Install it on each Chrome profile whose LinkedIn account you want to send from; each one appears as its own row. ### What it sends, and when [#what-it-sends-and-when] The extension only sends **connection requests**, with an optional personalised note, to the prospects your LinkedIn campaigns queue. It never scrapes profiles or your feed and never reads your messages. To keep your account safe it: - sends a few requests a day per account, spread hours apart, and raises the number slowly during the first weeks (**Ramp-up** on the account row; you can change the start, the maximum and the number of days); - sends only inside the campaign’s schedule (by default weekdays, 08:00–20:00 in the timezone of the computer running Chrome); - waits until you are away from the keyboard, so it never takes over while you browse; - tries each prospect at most twice, and stops for at least a day if LinkedIn shows a limit or asks you to verify. Chrome has to be open and signed in to LinkedIn for anything to send. A laptop that is only open in the evening still sends, inside its local hours. ### Pause or remove it [#pause-or-remove-it] - **Pause one account:** the pause button on its row in **Integrations → LinkedIn Accounts**, or switch off **Autopilot** in the extension. - **Remove an account:** the delete button on its row. Requests queued for it are cancelled. To stop for good, also remove the extension from Chrome. ### Troubleshooting [#troubleshooting] | You see | Do this | | --- | --- | | The account is not in **LinkedIn Accounts** | Open the extension and click **Connect this Chrome**. Make sure you are signed in to LinkedIn in the same Chrome profile. | | **LinkedIn disconnected** in the extension | Sign in to linkedin.com again in that Chrome, then reopen the extension. | | Requests are queued but nothing is sent | Check that Chrome is open, the time is inside the campaign’s schedule, today’s limit is not used up, and the account is not paused or cooling down after a LinkedIn warning. | | **Could not load your workspaces** | Sign in to the dashboard in a tab of the same Chrome, then click **Connect this Chrome** again. | Next: [create a LinkedIn campaign](/docs/engage/linkedin-campaigns). # Deliverability check > Check a mailbox’s SPF, DKIM, DMARC and tracking domain so its emails are trusted. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/mailboxes/deliverability Each mailbox shows its DNS checks (SPF, DKIM, DMARC) and tracking. Run a check after changing DNS, and use your own domain for open and click tracking. 1. **Integrations → Email Accounts:** the Deliverability column shows the checks. 2. **⋮ → Check DNS Records** after a DNS change. 3. **⋮ → Custom Tracking Domain** to track with your own domain. --- ## API — From your code Source: /docs/engage/mailboxes/deliverability/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: After a DNS change [#use-case-after-a-dns-change] `POST /admin/email-accounts/{id}/check-deliverability` runs the checks again and returns what is still missing. --- ## MCP — AI agents Source: /docs/engage/mailboxes/deliverability/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Is my new mailbox set up correctly? ```json { "emailAccountId": "6530c1d2e3f4a5b6c7d8e9f6" } ``` # Outreach domains > Separate domains for your sending mailboxes, so outreach never risks your main domain. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/mailboxes/domains Cold email is best sent from domains that look like yours but are not your main one. Buy ready-to-send domains with mailboxes, or connect one you own. 1. **Integrations → Domains.** 2. **Buy a new domain** (mailboxes and DNS set up for you) or **bring your own**. 3. **Keep auto-renew on** so mailboxes never stop. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/mailboxes/domains/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Pick domains for a new campaign [#use-case-pick-domains-for-a-new-campaign] `GET /v3/outreach-domains/suggestions` proposes names close to yours; check one with `GET /v3/outreach-domains/availability?domain=…`. --- ## MCP — AI agents Source: /docs/engage/mailboxes/domains/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Suggest three outreach domains for us. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` > What do extra mailboxes and domains cost us? ```json {} ``` It answers your price per mailbox (monthly and yearly) and whether your account has its own pricing. Plan prices are not in it: ask "what would 5,000 leads a month cost?" and the assistant uses `preview_plan_change`. # Email accounts > Connect the mailboxes your campaigns send from: Gmail, Outlook or any SMTP/IMAP mailbox. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/mailboxes/email-accounts Campaigns send from your own mailboxes. Connect Gmail or Outlook, or any mailbox with SMTP and IMAP; each one shows its status and DNS checks. 1. **Integrations → Email Accounts → Add Mailbox.** 2. **Pick the provider** and follow the steps (Gmail needs an app password). 3. **Check the status** and deliverability of each mailbox. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/mailboxes/email-accounts/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Connect a mailbox from your app [#use-case-connect-a-mailbox-from-your-app] Get the settings with `GET /admin/email-providers?email=…`, test them with `POST /admin/email-accounts-test`, then `POST /admin/email-accounts`. --- ## MCP — AI agents Source: /docs/engage/mailboxes/email-accounts/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Which of my mailboxes are disconnected? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Warmup > Warm up new mailboxes so their emails land in the inbox, not in spam. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/mailboxes/warmup Warmup sends and answers a few emails a day from a mailbox and slowly raises the number, so inbox providers learn to trust it before your campaigns use it. 1. **⋮ on a mailbox → Email Warmup Settings.** 2. **Pick how hard** (conservative, normal, aggressive) and the daily target. 3. **Watch the Warmup column** grow toward the target. --- ## API — From your code Source: /docs/engage/mailboxes/warmup/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Turn warmup on for a new mailbox [#use-case-turn-warmup-on-for-a-new-mailbox] `POST /admin/email-accounts/{id}/warmup/toggle` with `{ "enabled": true }`, then `PUT …/warmup/settings` with `{ "intensity": "normal" }`. --- ## MCP — AI agents Source: /docs/engage/mailboxes/warmup/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > How is warmup going on my mailboxes? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Master Inbox > Every reply to every campaign, from all your mailboxes, in one inbox. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/master-inbox Replies from all your mailboxes land in one place. Answer them right there; the reply goes out from the same mailbox. 1. **Master Inbox**: Inbox, Sent, Scheduled, Archived. 2. **Open a conversation** and answer it. 3. **Archive** what is done. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/master-inbox/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Send replies to your helpdesk [#use-case-send-replies-to-your-helpdesk] Poll `GET /v3/inbox`, read each thread with `GET /v3/inbox/{emailId}`, and answer with `POST /v3/inbox/{emailId}/reply`. --- ## MCP — AI agents Source: /docs/engage/master-inbox/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Summarise today’s replies and draft answers to the interested ones. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "status": "inbox" } ``` # Sequences > The emails of a campaign: what each one says, when it is sent and in what order. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/engage/sequences Each step of a sequence is one email, sent a number of days after the previous one, with merge fields like `{{ first_name | there }}`. 1. **Open a campaign → Sequences.** 2. **Edit a step** (pencil) or **Add Step** for a follow-up. 3. **Set the delay** in days; reorder steps with the arrows. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/engage/sequences/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Add a follow-up [#use-case-add-a-follow-up] `POST /admin/email-templates` with the campaign, subject, body and `sendingPeriod` (days after the previous step). --- ## MCP — AI agents Source: /docs/engage/sequences/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Add a third email to “Pricing page visitors”, 4 days after the second. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "campaignId": "6530c1d2e3f4a5b6c7d8e9f5", "subject": "One last idea", "body": "Hi {{ first_name | there }},\n\u2026\n{{sender_signature}}\n{{unsubscribe_text}}", "delayDays": 4 } ``` # Getting around the dashboard > The sidebar, search, the account menu, setup progress, help, feedback and the banners at the top of the dashboard. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/getting-around Everything you can reach from any page: the **sidebar** (Leads, Qualify, Engage, Automations, Integrations, Website Settings), the **website switcher**, **search** (⌘K / Ctrl+K) to jump to any page or lead, the **account menu** under your name, **Account Progress** (your setup checklist), **What's New**, the **Help Center** and the **Feedback** tab on the right. Banners at the top tell you about your trial, your limits and upcoming webinars. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. # Introduction (/docs) Happierleads identifies the exact people visiting your website — name, email, phone, LinkedIn — plus their company, and helps you find and reach new prospects. These docs are organised **by feature, not by tool**. Each feature has one page with four tabs that do the same job four ways: | Tab | Use it when you… | | --- | --- | | **Guide** | work in the Happierleads dashboard | | **API** | build an integration with the REST API | | **MCP** | ask an AI assistant (Claude, ChatGPT, Cursor) to do it for you | | **Examples** | want a ready-made search to copy and adapt | ## Features [#features] Find new people who match your ideal customer profile and add them to your leads. ## Built to be read by AI [#built-to-be-read-by-ai] Every page is also available as plain Markdown, and the whole site is indexed in [`/llms.txt`](/llms.txt). Point your AI assistant at these docs and it can answer “how do I…?” questions with the exact steps. See [Use these docs with AI](/docs/ai). # AI Scout > Describe who to find; a scout reads Google, YouTube and review sites every day and adds the people who fit as leads. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/ai-scout A scout finds people where they show up online — podcast guests, YouTube creators, conference speakers, award winners, companies on G2 — scores how well each one fits your description and adds the ones who do as leads, every day. 1. **Leads → AI Scout → Create a scout.** 2. **Describe who you're looking for**, or start from a template. 3. **Set people per day and the minimum fit**, check the sources, optionally pick a campaign. 4. **Create.** The first run starts right away; each lead uses 1 credit. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/ai-scout/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Plan first, then create [#use-case-plan-first-then-create] `POST /v3/ai-scouts/plan` with a `description` returns the name and sources it would use, free. Send the same description (and the sources you kept) to `POST /v3/ai-scouts`. ### Use case: Keep spend in check [#use-case-keep-spend-in-check] `PUT /v3/ai-scouts/daily-limit` caps the leads per day across all scouts of the website; `perDay` caps each scout. ### Use case: Pause on Friday, resume on Monday [#use-case-pause-on-friday-resume-on-monday] `POST /v3/ai-scouts/{scoutId}/pause` and `/resume` from your scheduler. --- ## MCP — AI agents Source: /docs/leads/ai-scout/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Find founders who were guests on B2B podcasts, 25 a day. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "description": "Founders of B2B SaaS companies who were guests on sales or marketing podcasts in the last year", "perDay": 25 } ``` ### Use case [#use-case-1] > What did my scouts find this week, and why do they fit? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "scoutId": "6a1f00000000000000000001" } ``` # Notes on leads > Write notes on a lead that your whole team can see. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/comments Notes keep your team on the same page: what was said, what happens next. 1. **Open a lead.** 2. **Notes → write → Save note.** 3. Everyone on your team sees it on that lead. --- ## API — From your code Source: /docs/leads/comments/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Log a call from your phone system [#use-case-log-a-call-from-your-phone-system] `POST /v3/leads/{leadId}/comments` with `{ "content": "Called, interested, follow up Friday" }`. --- ## MCP — AI agents Source: /docs/leads/comments/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Add a note to this lead: called them, follow up on Friday. ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "content": "Called them, follow up on Friday." } ``` # Company enrichment > Get the firmographics of any company from its domain: industry, size, revenue, location and technologies. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/company-enrichment Send a domain, get the company back: name, industry, employees, revenue, location, social profiles and the technologies it uses. 1. **Call** `GET /v3/enrich?domain=…` with your key. 2. **Or ask your AI assistant** to enrich a company. 3. There is no dashboard screen: it is for your own tools and automations. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/company-enrichment/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Enrich sign-ups as they arrive [#use-case-enrich-sign-ups-as-they-arrive] Call `GET /v3/enrich?domain=…` with the domain of each new sign-up’s email and store the company details next to them. --- ## MCP — AI agents Source: /docs/leads/company-enrichment/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > What do we know about northwind-analytics.example? ```json { "domain": "northwind-analytics.example" } ``` # CSV Exports > Download your leads as a CSV: choose the sources and exactly which fields go in the file. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/csv-export Export any of your leads to a CSV, with the fields you choose. Works for every Leads tab, not only Website Visitors. 1. **Export to CSV** at the top of Leads. 2. **Which leads:** tick the sources — Website Visitors, 3rd-Party Intent, Web Scraping, Prospector, AI Scout. 3. **Which fields:** search, tick a whole group (Contact, Company, Activity…) or single fields. Your choice is remembered for next time. 4. **Export CSV.** The file is built in the background, emailed to you and kept under **CSV Exports** for 30 days. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/csv-export/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: A monthly export [#use-case-a-monthly-export] `POST /v3/leads/export` with the month as `dateFrom`/`dateTo`. The download link is emailed to you. --- ## MCP — AI agents Source: /docs/leads/csv-export/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Export this month’s leads to CSV. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-01", "dateTo": "2026-10-30" } ``` # Remove or block leads > Remove leads you do not want, or keep a company or person out of your automations. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/hide-delete Clean up your leads: remove one, delete several at once, or block a company or person from every automation. 1. **⋮ on a lead → Remove Lead** (you confirm). 2. **Block company / person** keeps them out of automations. 3. **Tick several → trash** deletes them together. --- ## API — From your code Source: /docs/leads/hide-delete/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Hide test leads [#use-case-hide-test-leads] `POST /v3/leads/{leadId}/hide` with `{ "hide": true }` hides one lead; `POST /v3/leads/delete` with `{ "leadIds": [...] }` deletes several for good. --- ## MCP — AI agents Source: /docs/leads/hide-delete/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Hide the leads from our own office. ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "hide": true } ``` # 3rd-Party Intent > See companies researching the topics you sell into, even before they visit your website. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/intent-topics Pick topics like “CRM Software” or “Cybersecurity” and get the companies actively researching them across the web, each day, with a daily limit you set. 1. **Leads → 3rd-Party Intent → + Add topic.** 2. **Search a topic → + Track**, with a daily limit. 3. **Click a topic chip** to see only its companies; pause or stop it from its ⋯ menu. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/intent-topics/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Start tracking a topic [#use-case-start-tracking-a-topic] Find its `topicSlug` with `GET /admin/intent-topics/catalog`, then `POST /admin/intent-topics` with `{ "websiteId": …, "topicSlug": …, "userDailyLimit": 20 }`. --- ## MCP — AI agents Source: /docs/leads/intent-topics/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Which intent topics fit a company selling HR software? Track the best one. ```json {} ``` # Lead details > Open one lead to see the person, their company, how well they fit and an AI summary of their visits. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/lead-details Click any lead to open it: contact details, company, ICP score, every visit and where they came from. 1. **Click a lead** in the table. 2. **Read the card:** contact, company, ICP score, visits and source. 3. **Add to campaign** to reach out, or move to the next lead with the arrows. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/lead-details/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Get the summary of one lead [#use-case-get-the-summary-of-one-lead] `GET /v3/leads/{leadId}/summary` returns a short AI summary of who they are and what they looked at. The `leadId` comes from `GET /v3/leads`. --- ## MCP — AI agents Source: /docs/leads/lead-details/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Tell me about the most recent lead from acme.example and what they looked at. ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2" } ``` # Lists > Keep people and companies in lists for campaigns and exports, or upload your own from a CSV. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/lists Lists hold the people or companies you want to work with together: send them a campaign, export them, or upload your own contacts from a CSV. 1. **Leads → Lists → + New list**, or **Upload CSV**. 2. **Add leads** from the table: tick them → **Add to list**. 3. **Open a list** to see who is in it, or download it as a CSV. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/lists/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Create a list and export it [#use-case-create-a-list-and-export-it] `POST /admin/lists?listType=contact` with `{ "websiteId": …, "name": "Q4 founders" }`, then `POST /admin/lists/export-csv/{listId}?listType=contact` — the file is emailed to you. --- ## MCP — AI agents Source: /docs/leads/lists/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Make a list called “Q4 founders”. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "listType": "contact", "name": "Q4 founders" } ``` # Find an email > Look for the email of a person we do not hold one for, by testing and verifying likely addresses. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/prospector/find-email When a search result has no email, we can look for one: likely address patterns are tried and verified. **50 credits** (popular) or **100** (deep), charged even when nothing is found. 1. **Search people** first to get their `profileId`. 2. **Try a reveal first:** it costs 1 credit when we already hold an email. 3. **Then find an email**, popular or deep. --- ## API — From your code Source: /docs/leads/prospector/find-email/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: After a reveal comes back empty [#use-case-after-a-reveal-comes-back-empty] When `POST /admin/prospector/people/reveal` returns `no-contact-details`, call `POST /v3/prospector/people/find-email` with the same `profileId`. --- ## MCP — AI agents Source: /docs/leads/prospector/find-email/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > We have no email for Ava Thompson. Can you find one? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "profileId": "3cbd7f0d47879822dd5f722ab6dfac85", "depth": "popular" } ``` # Search companies > Find companies in the Happierleads database by industry, size, location or technology, or look one up by name. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/prospector/search-companies Look up one company or person by name, or search companies by industry, size, location and technology. 1. **Leads → Prospector → Search database.** 2. **People or Companies**, then type a name. 3. **Import** adds a person to your leads (1 credit when their email verifies). --- ## API — From your code Source: /docs/leads/prospector/search-companies/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Companies using a technology [#use-case-companies-using-a-technology] `POST /v3/prospector/companies/search` with `"technologies": ["HubSpot"]` in the query. --- ## MCP — AI agents Source: /docs/leads/prospector/search-companies/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Find US software companies with 50 to 200 employees. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "query": { "industries": [ "Computer Software" ], "locations": [ "United States" ], "employeesMin": 50, "employeesMax": 200 } } ``` # Auto Search > Describe your ideal customer once; new matching people are added to your leads every day. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/prospector/search-prospects/auto-search Auto Search keeps prospecting for you. Describe who you sell to, check the profile it builds, pick how many leads you want a day. Each lead delivered costs **1 credit**. Pause it any time. 1. **Leads → Prospector → + New Auto Search.** 2. **Describe your ideal customer** in plain words, or start from one of your Qualify ICPs. 3. **Review the profile:** each preference is **Must**, **High**, **Prefer** or **Bonus**; the pool shows how many people match. 4. **Pick leads per day**, then **Start Auto Search**. Already have filters in [Manual search](/docs/leads/prospector/search-prospects/manual-search)? **Save as Auto Search** turns them into one. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/prospector/search-prospects/auto-search/api REST endpoints on `https://rest-admin.happierleads.com`, authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). A website key only reaches its own website’s Auto Searches. | Endpoint | Does | Cost | | --- | --- | --- | | `POST /admin/prospector/auto-searches/profile` | Turns a description into preferences (nothing saved) | Free | | `POST /admin/prospector/auto-searches` | Creates and starts an Auto Search | 1 credit per lead delivered | | `GET /admin/prospector/auto-searches?websiteId=` | Lists a website’s Auto Searches | Free | | `POST /admin/prospector/auto-searches/{id}/pause` · `/resume` | Stops or restarts deliveries | Free | ### Use case: describe who you sell to [#use-case-describe-who-you-sell-to] `POST /admin/prospector/auto-searches/profile` with a sentence or two. You get preferences back: `field`, `values` and `weight` (`Must` is required, `High`, `Prefer` and `Bonus` raise the score). ```json title="Response" { "httpStatus": 200, "name": "My ideal customers", "prefs": [ { "field": "job", "values": ["Founder", "CEO"], "weight": "Must" }, { "field": "industry", "values": ["Computer Software"], "weight": "High" }, { "field": "hq", "values": ["United States"], "weight": "Must" }, { "field": "emp", "values": ["11-50", "51-200"], "weight": "Prefer" } ] } ``` ### Use case: start it [#use-case-start-it] `POST /admin/prospector/auto-searches` with a `name`, the `prefs` and `perDay` (25, 50, 100, 200 or 500). It starts straight away; each lead delivered costs **1 credit**. ```bash curl -X POST "https://rest-admin.happierleads.com/admin/prospector/auto-searches?privateKey=YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "US SaaS founders", "perDay": 50, "prefs": [{ "field": "job", "values": ["Founder", "CEO"], "weight": "Must" }] }' ``` ### Use case: check and pause it [#use-case-check-and-pause-it] `GET /admin/prospector/auto-searches?websiteId=…` lists them with `status`, `deliveredToday`, `deliveredTotal` and `pool` (how many people match). `POST /admin/prospector/auto-searches/{id}/pause` with `{ "websiteId": … }` stops deliveries; `/resume` starts them again. ### When it fails [#when-it-fails] `401` missing or wrong key, `403` plan without Prospector, `404` not an Auto Search of this website, `422` the description could not be turned into preferences. --- ## MCP — AI agents Source: /docs/leads/prospector/search-prospects/auto-search/mcp Connect the [MCP server](/docs/mcp#quickstart), then describe who you sell to. Your assistant builds the profile, shows it to you, and starts it when you say so. Each lead delivered costs 1 credit. ### Use case: set one up [#use-case-set-one-up] > Find me 50 new US SaaS founders every day. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "description": "Founders and CEOs of US SaaS companies" } ``` It shows you the preferences (Must, High, Prefer, Bonus), then, once you agree: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "US SaaS founders", "perDay": 50, "prefs": [ { "field": "job", "values": ["Founder", "CEO"], "weight": "Must" }, { "field": "hq", "values": ["United States"], "weight": "Must" }, { "field": "industry", "values": ["Computer Software"], "weight": "High" } ] } ``` ### Use case: how is it doing? [#use-case-how-is-it-doing] > How many leads did my Auto Searches bring in today? It calls `list_auto_searches` and reads `deliveredToday`, `deliveredTotal` and `pool` for each one. ### Use case: pause it [#use-case-pause-it] > Pause the US SaaS founders search. It finds the id with `list_auto_searches`, then calls `pause_auto_search`. `resume_auto_search` starts it again. Turn on tool approval in your assistant to confirm `create_auto_search` and `resume_auto_search`, the calls that start spending credits. # Manual search > Filter the Happierleads contact database by job title, seniority, industry, location and company size, then add the people you want to your leads. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/prospector/search-prospects/manual-search Manual search finds people who aren’t on your website yet. Set filters, see who matches, add the ones you want. Each person you add costs **1 credit**, charged only when their email verifies. Looking is free. 1. **Leads → Prospector → Manual search.** 2. **Filter** by job title, seniority, industry, location (the company’s headquarters) and company size. 3. **Tick** the people you want, then **Add N to Leads**. 4. **Export:** Export to CSV → Export from: Prospector. Want new matches every day instead? Use [Auto Search](/docs/leads/prospector/search-prospects/auto-search). ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/prospector/search-prospects/manual-search/api Two REST endpoints on `https://rest-admin.happierleads.com`, authenticated with `?privateKey=YOUR_KEY`, like every other endpoint. Your keys are in **Integrations → API** (see [Authentication](/docs/authentication)). | Endpoint | Does | Cost | | --- | --- | --- | | `POST /admin/prospector/people/search` | Finds people by title, seniority, industry, location and company size | Free | | `POST /admin/prospector/people/reveal` | Shows the email and phone of one person | 1 credit | ### Use case: find people [#use-case-find-people] `POST /admin/prospector/people/search` with `websiteId` (from `GET /admin/websites`) and a `query`; every filter is optional ([all filters](/docs/mcp/tools/search-people)). Searching never returns emails. ```json title="Response" { "httpStatus": 200, "people": [ { "profileId": "3cbd7f0d47879822dd5f722ab6dfac85", "companyProfileId": "4a837e150440103296e07fd46e3f1ff1", "name": "Ava Thompson", "firstName": "Ava", "lastName": "Thompson", "position": "Founder", "jobTitle": "Founder", "jobTitles": ["Founder"], "seniority": "Owner", "department": "Executive", "company": "Northwind Analytics", "companyName": "Northwind Analytics", "companyDomain": "northwind-analytics.example", "companyLocation": { "city": "Austin", "country": "United States", "countryCode": "US" }, "companyInfo": { "logo": null, "industry": "Computer Software", "sector": "Technology", "employees": "42", "revenue": "$1M - $10M", "description": null, "foundedYear": 2018, "tags": [] }, "linkedin": "https://www.linkedin.com/in/sample-ava-thompson-00", "emailStatus": null, "hasEmail": false, "hasPhone": true } ], "total": 6, "note": "locations filters on the company headquarters. jobTitle is the position that matched your titles filter; jobTitles lists every position the person holds. companyLocation / companyDomain are null when we do not hold that employer yet." } ``` Next page: pass `query.page`. ### Use case: get their email [#use-case-get-their-email] `POST /admin/prospector/people/reveal` with `websiteId` and a `profileId` from the search. **1 credit** when we hold an email or phone, nothing when we don’t. ```bash curl -X POST "https://rest-admin.happierleads.com/admin/prospector/people/reveal?privateKey=YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "profileId": "71e392938b6bfb2a8f112058d0afc3f1" }' ``` ```json title="Response" { "httpStatus": 200, "profileId": "71e392938b6bfb2a8f112058d0afc3f1", "businessEmail": "noah.ramirez@northwind-analytics.example", "emailStatus": "valid", "phone": null, "creditsCharged": 1, "status": "revealed", "remainingCredits": 498 } ``` ### When it fails [#when-it-fails] The HTTP status says why: `401` missing or wrong key, `402` no credits, `403` plan without Prospector, `429` more than one search per second or the plan’s search limit is used up. --- ## MCP — AI agents Source: /docs/leads/prospector/search-prospects/manual-search/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Searching is free; revealing an email costs 1 credit. ### Use case: find people [#use-case-find-people] > Find 25 SaaS founders in the United States at companies with 10–200 employees. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "query": { "titles": ["CEO", "Founder"], "industries": ["Computer Software"], "locations": ["United States"], "employeesMin": 10, "employeesMax": 200, "count": 25 } } ``` ### Use case: narrow it down [#use-case-narrow-it-down] > Only heads of marketing at software companies in Germany with more than 50 employees. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "query": { "titles": ["Head of Marketing"], "industries": ["Computer Software"], "locations": ["Germany"], "employeesMin": 50 } } ``` ### Use case: get emails and start outreach [#use-case-get-emails-and-start-outreach] > Reveal the emails for the first five and add them to my campaign “Q4 SaaS founders”. It calls `reveal_contact` once per person (1 credit each), then `list_campaigns` and `add_prospect_to_campaign`. Turn on tool approval in your assistant to confirm each paid call. # Saved views > Save a set of filters as a view and open it again in one click. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/saved-filters Filter the table the way you like it once, save it as a view, and come back to it any time. 1. **Filter the table.** 2. **Save as view** and give it a name. 3. **Set default** to open it every time. --- ## API — From your code Source: /docs/leads/saved-filters/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: List your saved views [#use-case-list-your-saved-views] `GET /admin/filters?websiteId=…` returns each view with its name and filters. --- ## MCP — AI agents Source: /docs/leads/saved-filters/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Show me my saved views. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Session recordings > Replay what a lead did on your website, page by page. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/session-recordings Every page a lead saw has a ▶: replay the visit to see what caught their attention. 1. **Open a lead** from Website Visitors. 2. **▶ on a page** replays that visit. 3. **Pick a session** when they came back several times. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/session-recordings/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Link a replay in your CRM [#use-case-link-a-replay-in-your-crm] `GET /v3/recordings?email=…` lists the sessions of a lead; `GET /v3/recordings/{sessionId}/url?clientId=…` returns a link to watch one. --- ## MCP — AI agents Source: /docs/leads/session-recordings/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > What did ava.thompson@northwind-analytics.example look at on our site? ```json { "email": "ava.thompson@northwind-analytics.example" } ``` # Tag leads > Group leads with your own tags, then filter by them or use them in automations. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/tags Tags are your own labels on leads: “Hot”, “Partner”, “Follow up”… Filter the table by them, or let automations act on them. 1. **+ Add tag** on a lead. 2. **Pick a tag**, or type a new name to create it. 3. **Manage tags** to rename, recolour or delete them. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/tags/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Tag a lead from your CRM sync [#use-case-tag-a-lead-from-your-crm-sync] Create the tag once with `POST /v3/tags`, then `POST /v3/leads/{leadId}/tags/{tagId}` for each lead. --- ## MCP — AI agents Source: /docs/leads/tags/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Tag every lead from acme.example as “Hot”. ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "tagId": "6530c1d2e3f4a5b6c7d8e9f3" } ``` # Web Scraping > Keywords we look for on websites — what your buyers write, or a competitor's script — and every match becomes a lead. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/web-scraping Web Scraping looks for your keywords on websites across the open web, in the page text and in the scripts a site loads. Use a phrase your buyers write about themselves ("ships worldwide") or a domain such as a competitor's tracker. Every company that matches becomes a lead, with its people. 1. **Leads → Web Scraping → + Add keyword.** 2. **Type the keyword**, pick Exact or Fuzzy, or click a suggestion. 3. **Set the daily limit** (1 credit per lead) and click Done. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/web-scraping/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Watch a competitor [#use-case-watch-a-competitor] `PUT /v3/web-scraping` with `enabled: true` and a keyword like `{ "value": "competitor-tool.com", "matchMode": "exact" }`. Send the whole list: it replaces the keywords. ### Use case: Which keywords work [#use-case-which-keywords-work] `GET /v3/web-scraping` returns leads per keyword over the last 7 days; pause the silent ones. --- ## MCP — AI agents Source: /docs/leads/web-scraping/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Find companies that have a competitor's tracker on their site. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "enabled": true, "keywords": [ { "value": "competitor-tool.com", "matchMode": "exact" } ] } ``` ### Use case [#use-case-1] > Which of my keywords brought leads this week? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Choose your columns > Pick which columns the leads table shows, in what order, for each tab. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/website-visitors/columns The gear above the table chooses its columns. Every tab (Website Visitors, 3rd-Party Intent, Web Scraping…) keeps its own set, saved for your website on every device. 1. **The gear** above the table. 2. **Search, tick or untick** columns; drag a row to reorder. 3. **Save.** Columns are a dashboard layout. From the [API](/docs/leads/website-visitors/see-your-leads/api) or [MCP](/docs/leads/website-visitors/see-your-leads/mcp) every lead comes back with all its fields. # Filter your leads > Narrow the leads table by period, search, ICP score, traffic source and any field. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/website-visitors/filters Start with the period, search for a name or domain, then add filters: ICP score, the ad that brought them, or any field of the person, the company, their behaviour, campaign or CRM. 1. **Pick the period** and **search**. 2. **+ Filter:** ICP score and traffic chips, then a category, a field and its value. 3. **Close the panel** — filters stay as chips. Keep a set with [Save as view](/docs/leads/saved-filters). --- ## API — From your code Source: /docs/leads/website-visitors/filters/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Decision makers from Germany [#use-case-decision-makers-from-germany] `visitorLocation=Germany`, `employeesMin=50` and `exactVisitor=true` over the month: people at mid-size German companies, not just their company. ### Use case: Who came from your Google Ads [#use-case-who-came-from-your-google-ads] `utmSource=google` (and `utmMedium=cpc`) with the period you want. ### Use case: Who looked at pricing [#use-case-who-looked-at-pricing] `pageVisited=/pricing`. Combine with `visits_lower_bound=2` for people who came back. --- ## MCP — AI agents Source: /docs/leads/website-visitors/filters/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Who from SaaS companies with 50+ people visited our pricing page this week? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-24", "dateTo": "2026-10-30", "industries": [ "Software Development" ], "employeesMin": 50, "pageVisited": "/pricing" } ``` ### Use case [#use-case-1] > Which leads came from our Google Ads this month? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-01", "dateTo": "2026-10-30", "utmSource": "google" } ``` # See your leads > Everyone we identified on your website: the person, their company, what they did and how well they fit. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/leads/website-visitors/see-your-leads Website Visitors lists everyone we identified on your website, newest first: one row per person. 1. **Leads → Website Visitors.** 2. **Read a row:** the person and how to reach them, their company, what they did, their ICP score, their campaign and the automations that ran. 3. **Click a name** for the full lead ([Lead details](/docs/leads/lead-details)). Next: [choose your columns](/docs/leads/website-visitors/columns) and [filter your leads](/docs/leads/website-visitors/filters). ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/leads/website-visitors/see-your-leads/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Who came from Germany this month? [#use-case-who-came-from-germany-this-month] `GET /v3/leads` with `visitorLocation=Germany` and the month as `dateFrom`/`dateTo`. Results come 50 a page; pass `page` for more. --- ## MCP — AI agents Source: /docs/leads/website-visitors/see-your-leads/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Who from Germany visited our pricing page this month? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-01", "dateTo": "2026-10-30", "visitorLocation": "Germany", "pageVisited": "/pricing" } ``` # Errors and troubleshooting (/docs/mcp/errors) There are two kinds of problem: - **Connection problems:** the assistant can’t reach Happierleads at all. You fix these in your assistant’s settings. - **Tool errors:** the connection works, but one call was refused. The error message goes back to the assistant, which reads it and usually corrects itself, for example by fetching a missing ID and trying again. ## Connection problems [#connection-problems] | What you see | Why | Fix | | --- | --- | --- | | The assistant says it has no Happierleads tools | The connector isn’t added, or it’s switched off for this chat | Add it ([Quickstart](/docs/mcp#quickstart)) and enable it in the chat’s connector menu | | “Unauthorized” or a request to sign in again | The key in the URL is wrong, or the OAuth session ended | Copy the connection URL again from **Integrations → MCP Server**, or reconnect to sign in | | “Session not found or expired. Reconnect via /mcp/sse” | An older SSE connection dropped | Reconnect the connector; newer clients use Streamable HTTP and don’t hit this | | It connects but tools time out | Your network blocks outside MCP servers | Ask your IT team to allow `rest-dash.happierleads.com` | ## Tool errors [#tool-errors] Tool errors come back as a message the assistant can read, marked as an error: ```json { "error": "Tool not available for website-scoped key. Ask your account owner for a master key." } ``` | Message | Why | What the assistant should do | | --- | --- | --- | | “Tool not available for website-scoped key…” | A team member’s URL was used for an account-level tool | Tell you the account owner needs to do it, or connect with the owner’s URL | | “websiteId is required…” / “…needs a prospectId (24 hex characters)” | It skipped a lookup step | Call `list_websites` (or the matching `list_` tool) for the ID, then retry | | “Your plan does not allow the prospector” | The plan doesn’t include that feature | Stop and tell you; the fix is a plan change, not a retry | | “You exceed the limits” | Too many calls in a short time, or a plan limit is used up | Wait before retrying; don’t loop | | Payment required, with an upgrade link | The tool needs an add-on, e.g. `verify_contact` needs Email Waterfall | Show you the link; don’t retry | | Empty results | Nothing matched | Suggest widening the filters, e.g. a bigger company size or more job titles | ## For assistant builders [#for-assistant-builders] - Tool failures come back as tool results with `isError: true` and a JSON `error` message, not as protocol errors, so the model can read the reason and adjust. - Treat plan, add-on and permission errors as final: retrying won’t change the answer. - The server validates every input. The tool descriptions say which lookup tool provides each ID (`list_websites` → `websiteId`, `search_people` → `profileId`). # free_companies_using_tech (/docs/mcp/free-tools/free-companies-using-tech) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_companies_using_tech.mdx. */} **Free companies-using-technology search** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Finds up to 10 companies whose detected tech stack contains a technology name (partial, case-insensitive match), optionally filtered by industry, HQ country and headcount. Each result has the company profile (domain, name, industry, employees, revenue, headquarters, LinkedIn, technologies). An unknown country returns 400. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `tech` | `string` | Yes | Technology name, e.g. HubSpot, Salesforce, Shopify, Stripe. Partial match, case-insensitive. | | `industry` | `string` | No | Optional industry filter (partial, case-insensitive), e.g. SaaS, Financial Services. | | `country` | `string` | No | Optional headquarters country: ISO code (US, GB, DE) or country name. | | `employeesMin` | `number` | No | Optional minimum employee count (compared with the lower end of the company's headcount range). | | `employeesMax` | `number` | No | Optional maximum employee count (compared with the upper end of the company's headcount range). | | `limit` | `number` | No | Max results, 1-10 (default 10). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_companies_using_tech", "title": "Free companies-using-technology search", "annotations": { "title": "Free companies-using-technology search", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "tech": { "type": "string", "description": "Technology name, e.g. HubSpot, Salesforce, Shopify, Stripe. Partial match, case-insensitive." }, "industry": { "type": "string", "description": "Optional industry filter (partial, case-insensitive), e.g. SaaS, Financial Services." }, "country": { "type": "string", "description": "Optional headquarters country: ISO code (US, GB, DE) or country name." }, "employeesMin": { "type": "number", "description": "Optional minimum employee count (compared with the lower end of the company's headcount range)." }, "employeesMax": { "type": "number", "description": "Optional maximum employee count (compared with the upper end of the company's headcount range)." }, "limit": { "type": "number", "description": "Max results, 1-10 (default 10)." } }, "required": [ "tech" ] } } ``` # free_email_pattern (/docs/mcp/free-tools/free-email-pattern) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_email_pattern.mdx. */} **Free email format lookup** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Works out the email format a company uses from up to 50 known contacts at that domain. Returns pattern (e.g. \{first\}.\{last\}, \{f\}\{last\}, \{first\}), an example with a placeholder name (jane.doe@domain), confidence (share of sampled contacts that match, as a percent string), sampledFrom and allPatterns with counts. pattern is null when there are no contacts or no recognisable format. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `domain` | `string` | Yes | Company domain without protocol, e.g. stripe.com. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_email_pattern", "title": "Free email format lookup", "annotations": { "title": "Free email format lookup", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "domain": { "type": "string", "description": "Company domain without protocol, e.g. stripe.com." } }, "required": [ "domain" ] } } ``` # free_enrich_company (/docs/mcp/free-tools/free-enrich-company) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_enrich_company.mdx. */} **Free company lookup** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Looks up a company by domain and returns its profile: name, description, industry, sector, employees, estimated revenue, founded year, headquarters, LinkedIn, logo, technologies (up to 20) and tech categories. Returns 404 when the company is not in the database. For people at the company use free_find_decision_makers or free_people_search. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `domain` | `string` | Yes | Company domain without protocol, e.g. salesforce.com. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_enrich_company", "title": "Free company lookup", "annotations": { "title": "Free company lookup", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "domain": { "type": "string", "description": "Company domain without protocol, e.g. salesforce.com." } }, "required": [ "domain" ] } } ``` # free_find_decision_makers (/docs/mcp/free-tools/free-find-decision-makers) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_find_decision_makers.mdx. */} **Free decision-maker lookup** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Returns up to 5 senior people at a company (C-level, VP, director, manager or titles like Head of/Chief), most senior first: name, title, seniority, department, LinkedIn, picture, email and emailStatus. Verified business emails are revealed, up to 10 per account per UTC day across all free tools; personal emails are never returned. emailStatus is 'verified' (address shown), 'unverified — not revealed' or 'daily free limit reached — resets 00:00 UTC' (address masked, e.g. j***@acme.example), or 'not found'. For a specific role use free_people_search. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `domain` | `string` | Yes | Company domain without protocol, e.g. hubspot.com. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_find_decision_makers", "title": "Free decision-maker lookup", "annotations": { "title": "Free decision-maker lookup", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "domain": { "type": "string", "description": "Company domain without protocol, e.g. hubspot.com." } }, "required": [ "domain" ] } } ``` # free_find_lookalikes (/docs/mcp/free-tools/free-find-lookalikes) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_find_lookalikes.mdx. */} **Free lookalike companies** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Given a company domain, returns up to 10 similar companies: same industry (or sector), headcount between about a quarter and four times the seed's, ranked by shared technologies. Returns seedCompany and the company profiles. 404 when the seed company is not in the database; an empty result with a message when the seed lacks industry data. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `domain` | `string` | Yes | Domain of the company to find lookalikes for, e.g. acme.example. | | `limit` | `number` | No | Max results, 1-10 (default 10). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_find_lookalikes", "title": "Free lookalike companies", "annotations": { "title": "Free lookalike companies", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "domain": { "type": "string", "description": "Domain of the company to find lookalikes for, e.g. acme.example." }, "limit": { "type": "number", "description": "Max results, 1-10 (default 10)." } }, "required": [ "domain" ] } } ``` # free_intent_signals (/docs/mcp/free-tools/free-intent-signals) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_intent_signals.mdx. */} **Free intent signals by topic** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Returns up to 10 companies that have verified decision-makers in the job roles that typically buy a topic's products (e.g. sales operations and account executives for crm), each with company, domain, industry, country and up to 3 contacts (name, title, email, emailStatus). It is a role-based prospect list for the topic, not a measure of current research activity. Verified business emails are revealed, up to 10 per account per UTC day across all free tools; personal emails are never returned. emailStatus is 'verified' (address shown), 'unverified — not revealed' or 'daily free limit reached — resets 00:00 UTC' (address masked, e.g. j***@acme.example), or 'not found'. An unknown topic returns availableTopics (closest matches first); an unknown country returns 400. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `topic` | `string` | Yes | Intent topic slug or name, e.g. crm, marketing-automation, cybersecurity, cloud-computing, seo. An unknown topic returns availableTopics (closest matches first). | | `country` | `string` | No | Optional contact country: ISO code (US, GB, DE) or country name. | | `industry` | `string` | No | Optional industry of the contact's company (partial, case-insensitive), e.g. software, financial services, SaaS / Software. | | `limit` | `number` | No | Max companies, 1-10 (default 10). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_intent_signals", "title": "Free intent signals by topic", "annotations": { "title": "Free intent signals by topic", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "topic": { "type": "string", "description": "Intent topic slug or name, e.g. crm, marketing-automation, cybersecurity, cloud-computing, seo. An unknown topic returns availableTopics (closest matches first)." }, "country": { "type": "string", "description": "Optional contact country: ISO code (US, GB, DE) or country name." }, "industry": { "type": "string", "description": "Optional industry of the contact's company (partial, case-insensitive), e.g. software, financial services, SaaS / Software." }, "limit": { "type": "number", "description": "Max companies, 1-10 (default 10)." } }, "required": [ "topic" ] } } ``` # free_people_search (/docs/mcp/free-tools/free-people-search) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/free_people_search.mdx. */} **Free people search by role** · Read-only Free on every plan of a signed-in account, also after the trial ends, no credits used. Finds up to 5 people whose job title contains a role, either at one company (domain) or across companies matching an industry and/or country. Returns name, title, company, domain, seniority, LinkedIn, picture, email and emailStatus. Verified business emails are revealed, up to 10 per account per UTC day across all free tools; personal emails are never returned. emailStatus is 'verified' (address shown), 'unverified — not revealed' or 'daily free limit reached — resets 00:00 UTC' (address masked, e.g. j***@acme.example), or 'not found'. Use free_find_decision_makers for a company's top people without a specific role. Free tools share a limit of 10 calls per account per UTC day (resets 00:00 UTC; past it the call returns 429). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `role` | `string` | Yes | Job title or part of it (case-insensitive), e.g. "VP of Sales", "Head of Marketing", "CTO". | | `domain` | `string` | No | Optional company domain to search within, e.g. acme.example. When set, industry and country are ignored. | | `industry` | `string` | No | Optional industry of the person's company (partial match), e.g. SaaS, FinTech. Used only without domain. | | `country` | `string` | No | Optional company headquarters country: ISO code (US, GB) or name. Used only without domain; an unrecognised value is ignored. | | `limit` | `number` | No | Max results, 1-5 (default 5). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "free_people_search", "title": "Free people search by role", "annotations": { "title": "Free people search by role", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "role": { "type": "string", "description": "Job title or part of it (case-insensitive), e.g. \"VP of Sales\", \"Head of Marketing\", \"CTO\"." }, "domain": { "type": "string", "description": "Optional company domain to search within, e.g. acme.example. When set, industry and country are ignored." }, "industry": { "type": "string", "description": "Optional industry of the person's company (partial match), e.g. SaaS, FinTech. Used only without domain." }, "country": { "type": "string", "description": "Optional company headquarters country: ISO code (US, GB) or name. Used only without domain; an unrecognised value is ignored." }, "limit": { "type": "number", "description": "Max results, 1-5 (default 5)." } }, "required": [ "role" ] } } ``` # Free tools (/docs/mcp/free-tools) With a free Happierleads account your assistant gets a set of tools at no cost, free forever with a small daily limit. Connect the [MCP server](/docs/mcp#quickstart) with your free account to use them. # Connect your AI assistant (/docs/mcp) ## Quickstart [#quickstart] You need a Happierleads account and an AI assistant that supports MCP connectors. ### 1. Copy your connection URL [#1-copy-your-connection-url] ### 2. Add it to your assistant [#2-add-it-to-your-assistant] ### 3. Check it works [#3-check-it-works] Start a new chat and ask: > List my websites. **Expected:** the assistant shows that it used `list_websites` and replies with your websites and whether each one’s tracking script is verified. If it says it has no Happierleads tools, see [Errors and troubleshooting](/docs/mcp/errors#connection-problems). ## What you can ask [#what-you-can-ask] You don’t write requests or learn tool names. Describe what you want, and the assistant picks the tools: | Product | Ask | Your assistant uses | | --- | --- | --- | | [Leads](/docs/leads/website-visitors/see-your-leads/mcp) | “Who visited my site this week? Hottest first.” | `get_leads` | | [Lead details](/docs/leads/lead-details/mcp) | “Give me a sales brief on the last visitor from acme.com.” | `get_lead_ai_summary` | | [3rd-party intent](/docs/leads/intent-topics/mcp) | “Subscribe me to companies researching CRM software.” | `subscribe_to_intent_topic` | | [Web Scraping](/docs/leads/web-scraping/mcp) | “Find companies that have a competitor's tracker on their site.” | `update_web_scraping` | | [AI Scout](/docs/leads/ai-scout/mcp) | “Find founders who were guests on B2B podcasts, 25 a day.” | `create_ai_scout` | | [Prospector](/docs/leads/prospector/search-prospects/manual-search/mcp) | “Find 25 SaaS founders in the US at companies with 10–200 employees.” | `search_people` | | [Auto Search](/docs/leads/prospector/search-prospects/auto-search/mcp) | “Add 50 new heads of marketing at fintechs to my leads every day.” | `create_auto_search` | | [Lists & export](/docs/leads/csv-export/mcp) | “Export this week's hot leads to CSV.” | `export_leads_csv` | | [Qualify](/docs/qualify/ai-assist/mcp) | “Build a scoring model for B2B SaaS companies with 50+ staff.” | `ai_generate_scoring_model` | | [Engage](/docs/engage/email-campaigns/mcp) | “How are my email campaigns doing? Which replied?” | `get_campaign_stats`, `get_inbox_emails` | | [Mailboxes](/docs/engage/mailboxes/warmup/mcp) | “Is my mailbox warmup healthy?” | `get_warmup_health` | | [Automations & CRM](/docs/automations/automations/mcp) | “Push every hot lead to HubSpot.” | `create_automation` | | [Websites](/docs/websites/tracking-pixel/mcp) | “Is my tracking script installed correctly?” | `get_website_diagnostics` | | [Account](/docs/account/billing/mcp) | “How many credits do I have left?” | `get_account` | Each feature page has an **MCP** tab with the questions to ask for that feature. The full list is under [All tools](/docs/mcp/tools). ## Free tools [#free-tools] The `free_` tools (company enrichment, decision-makers, people search, companies using a technology, lookalikes, email patterns and intent topics) are free on every Happierleads account, including after your trial ends, so all you need is a [free account](https://admin.happierleads.com/signup?utm_source=docs&utm_medium=mcp). Each account gets **10 calls and 10 verified business emails a day**, reset at 00:00 UTC. For more, use the paid tools such as [`search_people`](/docs/mcp/tools/search-people). ## How it works [#how-it-works] The **Model Context Protocol (MCP)** is an open standard that lets AI assistants use tools inside other products. When you ask something: 1. Your assistant reads the list of Happierleads tools and their descriptions. 2. It picks the tool that fits and fills in its parameters from your words. 3. Happierleads runs the tool in your account, with your plan, credits and websites, and the assistant summarises the result. The assistant can also chain tools: find people, reveal their emails, then add them to a campaign. Before you let it act, read [Security and permissions](/docs/mcp/security). ## Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. # Security and permissions (/docs/mcp/security) When you connect an AI assistant, it acts **as you**. Everything it does uses your plan, your limits and your credits, exactly as if you’d clicked it in the dashboard. The server checks permissions on every call. An assistant can’t reach anything your connection doesn’t allow, whatever it is asked to do. ## What each connection can reach [#what-each-connection-can-reach] | You connect with | The assistant can | | --- | --- | | Connection URL of the **account owner** | Use every website on the account, plus account and billing tools | | Connection URL of a **team member** | Use only the website that was open when the URL was copied. Account and billing tools are refused | | **OAuth sign-in** | Act as the person who signed in, with the same access they have in the dashboard | Each [tool page](/docs/mcp/tools) says which connections can use it. ## What tools can do [#what-tools-can-do] Every [tool page](/docs/mcp/tools) is labelled from the tool’s own MCP annotations, which assistants also read: | Label | Meaning | Examples | | --- | --- | --- | | **Read-only** | Looks things up, changes nothing | `search_people`, `get_leads`, `list_campaigns` | | **Changes data** | Creates or edits something in your account | `create_campaign`, `tag_lead`, `update_website` | | **Deletes or overwrites data** | Removes or replaces something; deleted data can’t be restored | `delete_lead`, `delete_campaign`, `update_lead_scoring_model` | | **Acts outside your account** | Sends email, pushes to a CRM, buys a domain or charges your card | `add_prospect_to_campaign`, `push_lead_to_crm`, `reply_to_prospect` | | **Spends credits or money** | Uses credits or charges your card | `reveal_contact` (1 credit), `find_contact_email` (50 or 100 credits), `upgrade_plan`, `purchase_outreach_domains` | Some tools tell the assistant to confirm with you before they run. For example, `upgrade_plan` asks it to show you the new price and get an explicit yes first. ## Stay in control [#stay-in-control] - **Turn on tool approval** in your assistant, so you see each tool call and approve it before it runs. This matters most for tools that spend credits or delete data. - **Start read-only.** Ask questions first; let the assistant act once you trust what it’s doing. - **Use a team member’s URL for narrow jobs.** It limits the assistant to one website and keeps billing out of reach. - **Watch other connectors.** If other MCP servers or web browsing are on in the same chat, text from a web page or email can try to steer the assistant (prompt injection). Review any action you didn’t ask for. ## Disconnect or replace a key [#disconnect-or-replace-a-key] - **Disconnect one assistant:** remove the Happierleads connector in its settings (for example **Settings → Connectors** in Claude). - **A connection URL leaked:** rotate the key in **Integrations → API → Rotate Key**. The old URL stops working at once; copy the new one from **Integrations → MCP Server**. See [Authentication](/docs/authentication#if-a-key-leaks-rotate-it). # activate_linkedin_campaign (/docs/mcp/tools/activate-linkedin-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/activate_linkedin_campaign.mdx. */} **Start a LinkedIn campaign** · Changes data · Acts outside your account Starts a LinkedIn campaign: it begins sending invitations and messages from the connected LinkedIn account, within the account's daily LinkedIn limits. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "activate_linkedin_campaign", "title": "Start a LinkedIn campaign", "annotations": { "title": "Start a LinkedIn campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinCampaignId": { "type": "string", "description": "LinkedIn campaign ID from list_linkedin_campaigns." } }, "required": [ "websiteId", "linkedinCampaignId" ] } } ``` # add_campaign_step (/docs/mcp/tools/add-campaign-step) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_campaign_step.mdx. */} **Add a campaign step** · Changes data Adds one email at the end of a campaign's sequence, sent delayDays after the previous one (the first step of an empty campaign becomes the opening email). Returns the new step. Follow the same writing rules as create_campaign. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | | `subject` | `string` | Yes | Subject line; merge fields like \{\{ first_name \| there \}\} allowed. | | `body` | `string` | Yes | Email body as plain text, one paragraph per line, ending with \{\{sender_signature\}\} and \{\{unsubscribe_text\}\}. | | `delayDays` | `number` | No | Days after the previous step. Default 0. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_campaign_step", "title": "Add a campaign step", "annotations": { "title": "Add a campaign step", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." }, "subject": { "type": "string", "description": "Subject line; merge fields like {{ first_name | there }} allowed." }, "body": { "type": "string", "description": "Email body as plain text, one paragraph per line, ending with {{sender_signature}} and {{unsubscribe_text}}." }, "delayDays": { "type": "number", "minimum": 0, "description": "Days after the previous step. Default 0." } }, "required": [ "websiteId", "campaignId", "subject", "body" ] } } ``` # add_email_account (/docs/mcp/tools/add-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_email_account.mdx. */} **Connect mailbox** · Changes data Connect an existing mailbox to a website for sending outreach, using its SMTP (sending) and IMAP (reading replies) settings. Use purchase_outreach_domains instead to buy new domains with ready-made mailboxes. websiteId comes from list_websites. Each new mailbox uses one of the account's mailbox slots (error "You can't create more email accounts" when none are left); connecting an address the website already has updates that mailbox instead. The credentials are not tested by this call. A new mailbox starts at 2 campaign emails a day and ramps to 20 a day over 4 weeks; warmup stays off until you call toggle_warmup. Returns the saved mailbox (its _id is the emailAccountId) without its passwords. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `email` | `string` | Yes | The mailbox's from-address, e.g. jane@acme.example. | | `fullName` | `string` | Yes | Sender name shown on outgoing mail, e.g. Jane Doe. The first word becomes the first name, the rest the last name. | | `smtpEmail` | `string` | Yes | SMTP login username, usually the same as email. | | `smtpHost` | `string` | Yes | SMTP server host name, e.g. smtp.example.com. | | `smtpPort` | `number` | Yes | SMTP port, e.g. 465 (TLS) or 587. | | `smtpTLS` | `boolean` | No | Use TLS for SMTP. Default true. | | `imapEmail` | `string` | Yes | IMAP login username, usually the same as email. | | `imapHost` | `string` | Yes | IMAP server host name, e.g. imap.example.com. | | `imapPort` | `number` | Yes | IMAP port, usually 993. | | `imapTLS` | `boolean` | No | Use TLS for IMAP. Default true. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_email_account", "title": "Connect mailbox", "annotations": { "title": "Connect mailbox", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "email": { "type": "string", "description": "The mailbox's from-address, e.g. jane@acme.example." }, "fullName": { "type": "string", "description": "Sender name shown on outgoing mail, e.g. Jane Doe. The first word becomes the first name, the rest the last name." }, "smtpEmail": { "type": "string", "description": "SMTP login username, usually the same as email." }, "smtpHost": { "type": "string", "description": "SMTP server host name, e.g. smtp.example.com." }, "smtpPort": { "type": "number", "description": "SMTP port, e.g. 465 (TLS) or 587." }, "smtpTLS": { "type": "boolean", "description": "Use TLS for SMTP. Default true." }, "imapEmail": { "type": "string", "description": "IMAP login username, usually the same as email." }, "imapHost": { "type": "string", "description": "IMAP server host name, e.g. imap.example.com." }, "imapPort": { "type": "number", "description": "IMAP port, usually 993." }, "imapTLS": { "type": "boolean", "description": "Use TLS for IMAP. Default true." } }, "required": [ "websiteId", "email", "fullName", "smtpHost", "smtpPort", "smtpEmail", "smtpPassword", "imapHost", "imapPort", "imapEmail", "imapPassword" ] } } ``` # add_lead_comment (/docs/mcp/tools/add-lead-comment) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_lead_comment.mdx. */} **Add a comment to a lead** · Changes data Add a note to a lead, visible to everyone on the account's team, signed with the connected user's name. leadId comes from get_leads. Read existing notes with get_lead_comments; edit with update_lead_comment. Each call adds a new comment. Returns status 'Successful' and commentId. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | | `content` | `string` | Yes | The comment text (plain text). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_lead_comment", "title": "Add a comment to a lead", "annotations": { "title": "Add a comment to a lead", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." }, "content": { "type": "string", "description": "The comment text (plain text)." } }, "required": [ "leadId", "content" ] } } ``` # add_linkedin_keyword (/docs/mcp/tools/add-linkedin-keyword) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_linkedin_keyword.mdx. */} **Add a LinkedIn keyword** · Changes data · Acts outside your account Starts watching a keyword on LinkedIn: people who post or comment about it become leads. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `keyword` | `string` | Yes | The keyword or phrase. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_linkedin_keyword", "title": "Add a LinkedIn keyword", "annotations": { "title": "Add a LinkedIn keyword", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "keyword": { "type": "string", "description": "The keyword or phrase." } }, "required": [ "websiteId", "keyword" ] } } ``` # add_linkedin_tracked_post (/docs/mcp/tools/add-linkedin-tracked-post) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_linkedin_tracked_post.mdx. */} **Track a LinkedIn post** · Changes data · Acts outside your account Starts tracking a LinkedIn post (yours or someone else’s): people who react to or comment on it become leads. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `url` | `string` | Yes | The LinkedIn post URL. | | `isOwn` | `boolean` | No | true when it is your own post. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_linkedin_tracked_post", "title": "Track a LinkedIn post", "annotations": { "title": "Track a LinkedIn post", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "url": { "type": "string", "description": "The LinkedIn post URL." }, "isOwn": { "type": "boolean", "description": "true when it is your own post." } }, "required": [ "websiteId", "url" ] } } ``` # add_outreach_domain (/docs/mcp/tools/add-outreach-domain) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_outreach_domain.mdx. */} **Pick outreach domain** · Changes data Add an available domain to a website's picked list (the purchase cart). Nothing is bought or charged: purchase_outreach_domains later buys every picked domain at once. Call search_domain_availability first; the server uses its own quote from that search (re-checked if older than 6 hours), not the price you send, and refuses a domain that is not available. Remove a pick with remove_outreach_domain; see the cart with list_outreach_domains. websiteId comes from list_websites. Returns success and outreachDomains[] (the current unpaid picks), with alreadyAdded: true when the domain was already picked. Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites to attach the domain to. | | `domain` | `string` | Yes | Domain name to pick, e.g. getacme.example. | | `price` | `number` | Yes | Registration price in USD from search_domain_availability. Required by the schema, but the server uses its own quote. | | `renewalPrice` | `number` | No | Renewal price in USD from search_domain_availability. Ignored; the server uses its own quote. | | `replacePicked` | `boolean` | No | true to drop the other unpaid picks and keep only this domain. Default false, which adds to the list. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_outreach_domain", "title": "Pick outreach domain", "annotations": { "title": "Pick outreach domain", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites to attach the domain to." }, "domain": { "type": "string", "description": "Domain name to pick, e.g. getacme.example." }, "price": { "type": "number", "description": "Registration price in USD from search_domain_availability. Required by the schema, but the server uses its own quote." }, "renewalPrice": { "type": "number", "description": "Renewal price in USD from search_domain_availability. Ignored; the server uses its own quote." }, "replacePicked": { "type": "boolean", "description": "true to drop the other unpaid picks and keep only this domain. Default false, which adds to the list." } }, "required": [ "websiteId", "domain", "price" ] } } ``` # add_prospect_to_campaign (/docs/mcp/tools/add-prospect-to-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_prospect_to_campaign.mdx. */} **Add contact to campaign** · Changes data · Acts outside your account Add one contact to an existing email campaign so it receives the sequence, like Manual Entry in the app. The first step is scheduled inside the campaign's sending window and then sent to the contact by real email. Confirm with the user before calling. campaignId comes from list_campaigns or create_campaign; the campaign must be active and have at least one step. Each added contact uses 1 from the account's prospecting allowance (remaining.prospectorHardLimit in get_account), not lead credits; it is used even when the contact lands in error-sending, and neither stop_prospect nor remove_prospect_from_campaign gives it back. The address is not verified at this point. Returns scheduled: true and the prospectId, or scheduled: false with a reason: already-in-campaign (HTTP 409, nothing used), campaign-inactive, company-excluded, contact-not-found, error-sending (a prospect row was kept, prospectId returned so you can remove it) or error. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `campaignId` | `string` | Yes | Email campaign id from list_campaigns or create_campaign. | | `email` | `string` | Yes | The contact's email address. Must be a valid address. | | `domain` | `string` | No | Optional company domain of the contact, e.g. acme.example. Used for company merge fields and exclusion checks. | | `firstName` | `string` | No | Optional first name, used by \{\{ first_name \}\}. | | `lastName` | `string` | No | Optional last name. | | `position` | `string` | No | Optional job title, used by \{\{ position \}\}. | | `phone` | `string` | No | Optional phone number. | | `scheduledFor` | `string` | No | Optional ISO 8601 date/time for the first step, e.g. 2026-11-03T09:30:00Z. Omit to send at the next free slot. | | `emailAccountIds` | `string[]` | No | Optional mailbox ids from list_email_accounts to send from. Leave empty and the connected mailboxes with the most remaining daily capacity are used. | | `validation` | `string[]` | No | Optional, accepted for compatibility. Contacts are not verified when added to a campaign, so this does not filter anything today. Values: valid, catch-all, risky. | | `custom` | `object` | No | Optional object of extra merge fields for this contact, e.g. \{ "industry": "SaaS" \}. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_prospect_to_campaign", "title": "Add contact to campaign", "annotations": { "title": "Add contact to campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "campaignId": { "type": "string", "description": "Email campaign id from list_campaigns or create_campaign." }, "email": { "type": "string", "description": "The contact's email address. Must be a valid address." }, "domain": { "type": "string", "description": "Optional company domain of the contact, e.g. acme.example. Used for company merge fields and exclusion checks." }, "firstName": { "type": "string", "description": "Optional first name, used by {{ first_name }}." }, "lastName": { "type": "string", "description": "Optional last name." }, "position": { "type": "string", "description": "Optional job title, used by {{ position }}." }, "phone": { "type": "string", "description": "Optional phone number." }, "scheduledFor": { "type": "string", "description": "Optional ISO 8601 date/time for the first step, e.g. 2026-11-03T09:30:00Z. Omit to send at the next free slot." }, "emailAccountIds": { "type": "array", "items": { "type": "string" }, "description": "Optional mailbox ids from list_email_accounts to send from. Leave empty and the connected mailboxes with the most remaining daily capacity are used." }, "validation": { "type": "array", "items": { "type": "string", "enum": [ "valid", "catch-all", "risky" ] }, "description": "Optional, accepted for compatibility. Contacts are not verified when added to a campaign, so this does not filter anything today. Values: valid, catch-all, risky." }, "custom": { "type": "object", "description": "Optional object of extra merge fields for this contact, e.g. { \"industry\": \"SaaS\" }." } }, "required": [ "campaignId", "email" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/manual-search/mcp](/docs/leads/prospector/search-prospects/manual-search/mcp) # add_to_domain_blacklist (/docs/mcp/tools/add-to-domain-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_to_domain_blacklist.mdx. */} **Block domains** · Changes data Blocks company domains from becoming new leads on a website (e.g. your own company, competitors, existing customers). Domains are saved as one new named group; a group name that already exists on the website is refused (405), so pick a new name, or remove the group and add it again with the full list. Full URLs are reduced to their hostname. websiteId comes from list_websites; existing groups from get_domain_blacklist. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `csv` | `string` | Yes | Name of the new group, e.g. "internal" or "customers". Must not already exist on this website. | | `domains` | `string[]` | Yes | Domains to block, e.g. ["acme.example", "competitor.example"]. URLs are accepted and reduced to the hostname (a www. prefix is kept). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_to_domain_blacklist", "title": "Block domains", "annotations": { "title": "Block domains", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "csv": { "type": "string", "description": "Name of the new group, e.g. \"internal\" or \"customers\". Must not already exist on this website." }, "domains": { "type": "array", "items": { "type": "string" }, "description": "Domains to block, e.g. [\"acme.example\", \"competitor.example\"]. URLs are accepted and reduced to the hostname (a www. prefix is kept)." } }, "required": [ "websiteId", "csv", "domains" ] } } ``` # add_to_email_blacklist (/docs/mcp/tools/add-to-email-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_to_email_blacklist.mdx. */} **Add to the email blocklist** · Changes data Adds email addresses that campaigns on this website must never send to, e.g. customers, competitors or people who asked not to be contacted. They are added under a group name so they can be removed together. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emails` | `string[]` | Yes | The email addresses to block. | | `group` | `string` | No | Group name to add them under. Default 'blacklist'. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_to_email_blacklist", "title": "Add to the email blocklist", "annotations": { "title": "Add to the email blocklist", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emails": { "type": "array", "items": { "type": "string" }, "description": "The email addresses to block." }, "group": { "type": "string", "description": "Group name to add them under. Default 'blacklist'." } }, "required": [ "websiteId", "emails" ] } } ``` # add_website (/docs/mcp/tools/add-website) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/add_website.mdx. */} **Add website** · Changes data Creates a new website on the account and returns only its websiteId. It uses one of the plan's website slots; when none are left the call fails with 401 'You cannot add more websites, please upgrade'. Next steps: set its address with update_website (url), get the install snippet with get_tracking_pixel, then check installation with verify_website. Confirm with the user before calling. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `name` | `string` | No | Display name for the website, e.g. "Acme marketing site". Defaults to "New Website". | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "add_website", "title": "Add website", "annotations": { "title": "Add website", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "name": { "type": "string", "description": "Display name for the website, e.g. \"Acme marketing site\". Defaults to \"New Website\"." } } } } ``` # ai_generate_scoring_model (/docs/mcp/tools/ai-generate-scoring-model) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/ai_generate_scoring_model.mdx. */} **AI-generate a scoring model** · Changes data Have AI build a lead scoring model from the website's own pages (it reads the site to infer the ideal customer) and save it as 'ICP Score - AI Generated'. Only one such model can exist per website; a second call is refused with 'AI Lead scoring model has already been generated!'. Pass description to steer it: the ideal customer as the user describes it takes priority over what the site suggests. For exact rules use create_lead_scoring_model instead. websiteId comes from list_websites. Returns result (the new model with _id and its rules). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `description` | `string` | Yes | Plain-English description of the ideal customer, e.g. "US software companies with 50-500 staff selling to finance teams". Steers the generated rules. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "ai_generate_scoring_model", "title": "AI-generate a scoring model", "annotations": { "title": "AI-generate a scoring model", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "description": { "type": "string", "description": "Plain-English description of the ideal customer, e.g. \"US software companies with 50-500 staff selling to finance teams\". Steers the generated rules." } }, "required": [ "websiteId", "description" ] } } ``` # archive_email (/docs/mcp/tools/archive-email) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/archive_email.mdx. */} **Archive inbox email** · Changes data Archive one email conversation in the outreach master inbox so it leaves the inbox view; it stays visible with get_inbox_emails status archived. It changes nothing for the prospect and sends nothing. emailId comes from get_inbox_emails (prospects[].emails[].emailId). Returns a success status. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `emailId` | `string` | Yes | Email id from get_inbox_emails, prospects[].emails[].emailId. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "archive_email", "title": "Archive inbox email", "annotations": { "title": "Archive inbox email", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "emailId": { "type": "string", "description": "Email id from get_inbox_emails, prospects[].emails[].emailId." } }, "required": [ "emailId" ] } } ``` # block_domain (/docs/mcp/tools/block-domain) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/block_domain.mdx. */} **Block a company domain** · Changes data Adds a company domain to the website exclusions: its visitors are not identified and use no credits. Undo with remove_from_domain_blacklist. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `domain` | `string` | Yes | The company domain, e.g. acme.com. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "block_domain", "title": "Block a company domain", "annotations": { "title": "Block a company domain", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "domain": { "type": "string", "description": "The company domain, e.g. acme.com." } }, "required": [ "websiteId", "domain" ] } } ``` # block_person (/docs/mcp/tools/block-person) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/block_person.mdx. */} **Block a person** · Changes data Excludes one person (by email, LinkedIn URL or name) from the leads of a website, e.g. an employee or a customer. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `email` | `string` | No | Their email. | | `linkedinUrl` | `string` | No | Their LinkedIn profile URL. | | `name` | `string` | No | Their name. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "block_person", "title": "Block a person", "annotations": { "title": "Block a person", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "email": { "type": "string", "description": "Their email." }, "linkedinUrl": { "type": "string", "description": "Their LinkedIn profile URL." }, "name": { "type": "string", "description": "Their name." } }, "required": [ "websiteId" ] } } ``` # build_auto_search_profile (/docs/mcp/tools/build-auto-search-profile) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/build_auto_search_profile.mdx. */} **Build an Auto Search profile** · Read-only Turns a plain-English description of the ideal customer ("founders of US SaaS companies with 10-200 staff") into Auto Search preferences: field, values and weight (Must, High, Prefer or Bonus). Nothing is saved and nothing is charged. Show the preferences to the user, adjust them if asked, then pass them to create_auto_search. Returns 400 when the description is too short and 422 when it cannot be turned into preferences. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `description` | `string` | Yes | Who the user sells to, in a sentence or two: job titles, industries, company size, countries. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "build_auto_search_profile", "title": "Build an Auto Search profile", "annotations": { "title": "Build an Auto Search profile", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "description": { "type": "string", "description": "Who the user sells to, in a sentence or two: job titles, industries, company size, countries." } }, "required": [ "websiteId", "description" ] } } ``` # cancel_subscription (/docs/mcp/tools/cancel-subscription) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/cancel_subscription.mdx. */} **Cancel subscription** · Deletes or overwrites data · Acts outside your account Cancels the subscription at the end of the current billing period (it stays usable until then) and records why. Both a reason and the customer's own words are required: feedback must be at least 3 characters, or at least 10 when reason is 'other'. Before cancelling, consider pause_subscription or downgrade_plan if the user is open to them. Undo with reactivate_subscription before the period ends. Confirm with the user before calling. Returns cancelAt (the date it ends). | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `reason` | `string` | Yes | One of: bugs, expensive, no_value (not enough leads/value), bad_icp (wrong leads), switching (to a competitor), no_need (don't need it now), other. | | `feedback` | `string` | No | Why they are cancelling, in the customer's own words. Required in practice: at least 3 characters, 10 when reason is 'other'. Max 2000 characters. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "cancel_subscription", "title": "Cancel subscription", "annotations": { "title": "Cancel subscription", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "reason": { "type": "string", "description": "One of: bugs, expensive, no_value (not enough leads/value), bad_icp (wrong leads), switching (to a competitor), no_need (don't need it now), other." }, "feedback": { "type": "string", "description": "Why they are cancelling, in the customer's own words. Required in practice: at least 3 characters, 10 when reason is 'other'. Max 2000 characters." } }, "required": [ "reason" ] } } ``` # change_prospects_mailbox (/docs/mcp/tools/change-prospects-mailbox) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/change_prospects_mailbox.mdx. */} **Move prospects to another mailbox** · Changes data Moves prospects to another mailbox: their next emails are sent from it. Use it when a mailbox is disconnected or over its limit. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `prospectIds` | `string[]` | Yes | Prospect IDs from get_prospects. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "change_prospects_mailbox", "title": "Move prospects to another mailbox", "annotations": { "title": "Move prospects to another mailbox", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "prospectIds": { "type": "array", "items": { "type": "string" }, "description": "Prospect IDs from get_prospects." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." } }, "required": [ "websiteId", "prospectIds", "emailAccountId" ] } } ``` # clear_blog_cache (/docs/mcp/tools/clear-blog-cache) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/clear_blog_cache.mdx. */} **Refresh blog cache** · Changes data Clears every cached copy of the website's hosted blog (Optimize add-on), so visitors get the latest version on their next page load. Use it when a published change does not show yet. It changes no content and costs nothing. Returns \{ status, site \}. Errors: 403 without the Optimize add-on or the SEO permission, 404 when the blog is not set up. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "clear_blog_cache", "title": "Refresh blog cache", "annotations": { "title": "Refresh blog cache", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # clone_campaign (/docs/mcp/tools/clone-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/clone_campaign.mdx. */} **Copy a campaign** · Changes data Copies a campaign with its steps and settings, named '\ (copy)'. The copy starts paused and has no contacts, so nothing is sent until it is started. Returns the new campaign. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "clone_campaign", "title": "Copy a campaign", "annotations": { "title": "Copy a campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." } }, "required": [ "websiteId", "campaignId" ] } } ``` # create_ai_scout (/docs/mcp/tools/create-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_ai_scout.mdx. */} **Create an AI Scout** · Changes data · Acts outside your account · Spends credits or money Creates an AI Scout and runs it right away. Every day it reads its sources (Google, YouTube, review sites), finds the people behind them, scores how well they fit and adds those above the minimum fit as leads under Leads › AI Scout, 1 credit per lead, up to the people per day and the website's daily limit. Not on LTD plans. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `name` | `string` | No | Optional. A short name; made from the description when left out. | | `description` | `string` | Yes | Who to find, in a sentence or two: roles, industries, company size, where they talk (podcasts, YouTube, review sites). | | `perDay` | `"10" \| "25" \| "50" \| "100"` | No | People per day to deliver: 10, 25, 50 or 100. | | `minFit` | `number` | No | Minimum fit score (10-95, default 70): people below it are skipped. | | `sources` | `object[]` | No | Optional. Where the scout reads: Google searches, YouTube searches, playlists or creators, G2 categories. Made from the description when left out; get them first with plan_ai_scout. | | `sources[].kind` | `"google" \| "youtube_search" \| "youtube_playlist" \| "youtube_creators" \| "g2_category"` | Yes | google, youtube_search, youtube_playlist, youtube_creators or g2_category. | | `sources[].ref` | `string` | Yes | The search words, the playlist or channel link, or the G2 category link. | | `sources[].label` | `string` | No | Optional. How the source is shown in the dashboard. | | `sources[].active` | `boolean` | No | false to keep the source but stop reading it. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_ai_scout", "title": "Create an AI Scout", "annotations": { "title": "Create an AI Scout", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "name": { "type": "string", "description": "Optional. A short name; made from the description when left out." }, "description": { "type": "string", "description": "Who to find, in a sentence or two: roles, industries, company size, where they talk (podcasts, YouTube, review sites)." }, "perDay": { "type": "number", "enum": [ 10, 25, 50, 100 ], "description": "People per day to deliver: 10, 25, 50 or 100." }, "minFit": { "type": "number", "minimum": 10, "maximum": 95, "description": "Minimum fit score (10-95, default 70): people below it are skipped." }, "sources": { "type": "array", "items": { "type": "object", "properties": { "kind": { "type": "string", "enum": [ "google", "youtube_search", "youtube_playlist", "youtube_creators", "g2_category" ], "description": "google, youtube_search, youtube_playlist, youtube_creators or g2_category." }, "ref": { "type": "string", "description": "The search words, the playlist or channel link, or the G2 category link." }, "label": { "type": "string", "description": "Optional. How the source is shown in the dashboard." }, "active": { "type": "boolean", "description": "false to keep the source but stop reading it." } }, "required": [ "kind", "ref" ] }, "description": "Optional. Where the scout reads: Google searches, YouTube searches, playlists or creators, G2 categories. Made from the description when left out; get them first with plan_ai_scout." } }, "required": [ "websiteId", "description" ] } } ``` # create_auto_search (/docs/mcp/tools/create-auto-search) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_auto_search.mdx. */} **Create an Auto Search** · Changes data · Spends credits or money Creates an Auto Search and starts it: every day new people matching the preferences are verified and added to the website's leads, 1 credit per lead delivered, up to perDay a day, until it is paused. Must preferences are required, the others raise the score. Confirm the preferences and the daily amount with the user before calling. Returns the saved Auto Search. Returns 403 when the plan does not include Prospector. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `name` | `string` | Yes | A short name, e.g. 'US SaaS founders'. | | `description` | `string` | No | Optional. The plain-English description it was built from. | | `prefs` | `object[]` | Yes | Preferences from build_auto_search_profile: field (job, seniority, department, industry, emp, revenue, funding, round, tech, hq), values, weight (Must, High, Prefer, Bonus). | | `prefs[].field` | `"job" \| "seniority" \| "department" \| "industry" \| "emp" \| "revenue" \| "funding" \| "round" \| "tech" \| "hq"` | Yes | What the preference is about: job (job title), seniority, department, industry, emp (employees), revenue, funding, round (funding round), tech (technology used) or hq (company headquarters country). | | `prefs[].values` | `string[]` | Yes | The values that match, e.g. ["CEO", "Founder"] for job or ["United States"] for hq. | | `prefs[].weight` | `"Must" \| "High" \| "Prefer" \| "Bonus"` | No | Must (required), High, Prefer or Bonus (raise the score). Default Prefer. | | `excludes` | `object[]` | No | Optional. Companies or people to leave out: field cname (company name), domain or pname (person name), values. | | `excludes[].field` | `"cname" \| "domain" \| "pname"` | Yes | cname (company name), domain (company domain) or pname (person name). | | `excludes[].values` | `string[]` | Yes | The names or domains to leave out. | | `perDay` | `"25" \| "50" \| "100" \| "200" \| "500"` | No | Leads per day: 25, 50, 100, 200 or 500. Default 100. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_auto_search", "title": "Create an Auto Search", "annotations": { "title": "Create an Auto Search", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "name": { "type": "string", "description": "A short name, e.g. 'US SaaS founders'." }, "description": { "type": "string", "description": "Optional. The plain-English description it was built from." }, "prefs": { "type": "array", "items": { "type": "object", "properties": { "field": { "type": "string", "enum": [ "job", "seniority", "department", "industry", "emp", "revenue", "funding", "round", "tech", "hq" ], "description": "What the preference is about: job (job title), seniority, department, industry, emp (employees), revenue, funding, round (funding round), tech (technology used) or hq (company headquarters country)." }, "values": { "type": "array", "items": { "type": "string" }, "description": "The values that match, e.g. [\"CEO\", \"Founder\"] for job or [\"United States\"] for hq." }, "weight": { "type": "string", "enum": [ "Must", "High", "Prefer", "Bonus" ], "description": "Must (required), High, Prefer or Bonus (raise the score). Default Prefer." } }, "required": [ "field", "values" ] }, "description": "Preferences from build_auto_search_profile: field (job, seniority, department, industry, emp, revenue, funding, round, tech, hq), values, weight (Must, High, Prefer, Bonus)." }, "excludes": { "type": "array", "items": { "type": "object", "properties": { "field": { "type": "string", "enum": [ "cname", "domain", "pname" ], "description": "cname (company name), domain (company domain) or pname (person name)." }, "values": { "type": "array", "items": { "type": "string" }, "description": "The names or domains to leave out." } }, "required": [ "field", "values" ] }, "description": "Optional. Companies or people to leave out: field cname (company name), domain or pname (person name), values." }, "perDay": { "type": "number", "enum": [ 25, 50, 100, 200, 500 ], "description": "Leads per day: 25, 50, 100, 200 or 500. Default 100." } }, "required": [ "websiteId", "name", "prefs" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/auto-search/mcp](/docs/leads/prospector/search-prospects/auto-search/mcp) # create_automation (/docs/mcp/tools/create-automation) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_automation.mdx. */} **Create automation** · Changes data · Acts outside your account Creates an automation that is active straight away and runs whenever a lead matches it. By default it triggers when a new lead is identified, on the first visit only, immediately. The action is set by trigger.then, and its settings go in trigger.actions. For example, Slack uses \{ sentToSlack: \{ sendMessagesTo \} \} and a webhook uses \{ sentToWebhook: \{ url \} \}. To send leads to an email campaign, pass actions: [\{ emailCampaign: "\" \}]. Without trigger.then, the action is send-to-slack, or send-to-emailCampaign when actions has a campaign. It acts outside the account for every future matching lead (messages, CRM records, campaign emails). Confirm with the user before calling. Returns the created automation with its _id. Errors (405) include a missing campaign or an invalid campaign ID. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `name` | `string` | Yes | Name shown in the automation list. | | `trigger` | `object` | Yes | Object with the rule and action settings. Keys: when (default 'new-lead-is-identified'); then (the action: send-to-slack, send-to-hubspot, send-to-pipedrive, send-to-salesforce, send-to-zoho, send-to-gohighlevel, trigger-webhook, send-to-zapier, send-to-clay, send-to-emailCampaign, send-to-linkedinCampaign, send-email-alert, send-csv-on-email, …); trigger ('only-on-first-visit' default, 'on-every-visit', 'none'); interval ('immediately' default, 'after-session', 'daily', 'weekly', 'monthly'); repeatWindowHours (12, 24, 72, 168, 720, 2160 or 4320; null = off); dedupeScope ('contact' default, or 'company'); contactSelectionStrategy ('flexible-job-titles' default, 'exact-job-titles', 'flexible-find-at-least-one-job-titles'); maxContactsToSend (default 1); emailVerification; filter (a saved filter id from list_filters); actions (the action settings object, e.g. \{ sentToSlack: \{...\} \}). | | `actions` | `any[]` | Yes | Shortcut for email campaigns only: a list whose item has emailCampaign set to a campaign id from list_campaigns, e.g. [\{ "emailCampaign": "64f..." \}]. Other items are ignored; put other action settings in trigger.actions. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_automation", "title": "Create automation", "annotations": { "title": "Create automation", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "name": { "type": "string", "description": "Name shown in the automation list." }, "trigger": { "type": "object", "description": "Object with the rule and action settings. Keys: when (default 'new-lead-is-identified'); then (the action: send-to-slack, send-to-hubspot, send-to-pipedrive, send-to-salesforce, send-to-zoho, send-to-gohighlevel, trigger-webhook, send-to-zapier, send-to-clay, send-to-emailCampaign, send-to-linkedinCampaign, send-email-alert, send-csv-on-email, …); trigger ('only-on-first-visit' default, 'on-every-visit', 'none'); interval ('immediately' default, 'after-session', 'daily', 'weekly', 'monthly'); repeatWindowHours (12, 24, 72, 168, 720, 2160 or 4320; null = off); dedupeScope ('contact' default, or 'company'); contactSelectionStrategy ('flexible-job-titles' default, 'exact-job-titles', 'flexible-find-at-least-one-job-titles'); maxContactsToSend (default 1); emailVerification; filter (a saved filter id from list_filters); actions (the action settings object, e.g. { sentToSlack: {...} })." }, "actions": { "type": "array", "description": "Shortcut for email campaigns only: a list whose item has emailCampaign set to a campaign id from list_campaigns, e.g. [{ \"emailCampaign\": \"64f...\" }]. Other items are ignored; put other action settings in trigger.actions." } }, "required": [ "websiteId", "name", "trigger", "actions" ] } } ``` # create_blog_article (/docs/mcp/tools/create-blog-article) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_blog_article.mdx. */} **Create blog article** · Changes data · Acts outside your account Publishes a hand-written article on the website's hosted blog at \/\, or saves it as a draft (Optimize add-on). It goes live publicly at once unless status is 'draft'. It uses one article from the monthly allowance, whether live or draft. With none left it returns 400 'No articles left this month. Add more articles on the Billing page.' Confirm with the user before publishing. To change an existing article use update_blog_article. Returns 201 with \{ article, url \}; url is the public address. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `title` | `string` | Yes | Article title (H1). Required. | | `html` | `string` | Yes | Article body as HTML. Supported: p, h2, h3, ul/ol, blockquote, img, table. Required. | | `metaDescription` | `string` | No | Search-result description, about 150–160 characters. | | `excerpt` | `string` | No | Short summary for the blog index. Defaults to the meta description. | | `category` | `string` | No | Category name. Default 'Guides'. | | `coverImage` | `string` | No | Absolute cover image URL starting with http(s)://; other values are dropped. | | `slug` | `string` | No | URL path segment, e.g. "lead-scoring-guide". Defaults to the title. A number is added if the slug is already taken. | | `status` | `"live" \| "draft"` | No | 'live' (default) publishes now; 'draft' saves without publishing. | | `faq` | `object[]` | No | FAQ entries shown under the article. Entries missing q or a are dropped. | | `faq[].q` | `string` | No | Question text. | | `faq[].a` | `string` | No | Answer text. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_blog_article", "title": "Create blog article", "annotations": { "title": "Create blog article", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "title": { "type": "string", "description": "Article title (H1). Required." }, "html": { "type": "string", "description": "Article body as HTML. Supported: p, h2, h3, ul/ol, blockquote, img, table. Required." }, "metaDescription": { "type": "string", "description": "Search-result description, about 150–160 characters." }, "excerpt": { "type": "string", "description": "Short summary for the blog index. Defaults to the meta description." }, "category": { "type": "string", "description": "Category name. Default 'Guides'." }, "coverImage": { "type": "string", "description": "Absolute cover image URL starting with http(s)://; other values are dropped." }, "slug": { "type": "string", "description": "URL path segment, e.g. \"lead-scoring-guide\". Defaults to the title. A number is added if the slug is already taken." }, "status": { "type": "string", "enum": [ "live", "draft" ], "description": "'live' (default) publishes now; 'draft' saves without publishing." }, "faq": { "type": "array", "items": { "type": "object", "properties": { "q": { "type": "string", "description": "Question text." }, "a": { "type": "string", "description": "Answer text." } } }, "description": "FAQ entries shown under the article. Entries missing q or a are dropped." } }, "required": [ "websiteId", "title", "html" ] } } ``` # create_campaign (/docs/mcp/tools/create-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_campaign.mdx. */} **Create email campaign** · Changes data Create a new email sequence: the campaign plus one email per entry in steps (the first is the initial email, the rest follow-ups). The campaign is created active but sends nothing until contacts are added with add_prospect_to_campaign. To change one email later use update_campaign_step; to see the result use get_campaign. websiteId comes from list_websites. Returns emailCampaign (its _id is the campaignId) and templates[], one server response per step: a step rejected for bad merge fields comes back with an error there while the campaign and the other steps still exist, so check every entry and fix failures with update_campaign_step (templateId from get_campaign). Writing rules: Write the body as plain text, one paragraph per line, no blank lines between paragraphs (each line becomes one \; never add empty paragraphs or \\ for spacing). Merge fields need a fallback with this syntax: \{\{ first_name | there \}\}, \{\{ company_name | your company \}\}, \{\{ position | your role \}\}, \{\{ industry | your industry \}\}, \{\{ website | your website \}\} (not default("...")); a bare \{\{company_name\}\} renders empty when the company is unknown. End every body with \{\{sender_signature\}\} on its own line, then \{\{unsubscribe_text\}\} on its own line, and nothing after them; never type your own sign-off (Best regards, name) or unsubscribe sentence, those two variables render them. They and sender_* fields take no fallback. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | Campaign name shown in the app. | | `emailAccountId` | `string` | Yes | Required by the schema but not used: a campaign is not tied to one mailbox. Sending mailboxes are picked per contact in add_prospect_to_campaign. Pass any mailbox id from list_email_accounts. | | `steps` | `object[]` | Yes | The emails of the sequence, in order, one object per email. At least one step is needed before contacts can be added. | | `steps[].subject` | `string` | Yes | Subject line. Merge fields need a fallback, e.g. Quick idea for \{\{ company_name \| your team \}\}. | | `steps[].body` | `string` | Yes | Plain text, one paragraph per line, no blank lines, ending with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\} on their own lines. | | `steps[].delayDays` | `number` | No | Whole days to wait after the previous step. 0 for the first step. Default 0. | | `settings` | `object` | No | Optional sending schedule object; omitted keys use the defaults. daysRange: days of the week it may send, numbers 0-6 where 0 is Sunday, default [1,2,3,4,5] (Monday to Friday). timeSlot: sending window \{ start, end \} in whole hours (0-23) of the campaign timezone, default \{ start: 9, end: 17 \}. timezone: IANA timezone of the window, default America/New_York; supported: America/Los_Angeles, America/Denver, America/Chicago, America/New_York, UTC, Europe/London, Europe/Paris, Europe/Athens, Australia/Perth, Australia/Adelaide, Australia/Sydney, Asia/Dubai, Asia/Riyadh, Asia/Karachi, Asia/Kolkata, Asia/Dhaka, Asia/Ho_Chi_Minh, Asia/Tokyo, Pacific/Guadalcanal, Pacific/Auckland, Pacific/Midway, Pacific/Honolulu, America/Anchorage, America/Puerto_Rico, America/St_Johns, America/Sao_Paulo. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_campaign", "title": "Create email campaign", "annotations": { "title": "Create email campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "name": { "type": "string", "description": "Campaign name shown in the app." }, "emailAccountId": { "type": "string", "description": "Required by the schema but not used: a campaign is not tied to one mailbox. Sending mailboxes are picked per contact in add_prospect_to_campaign. Pass any mailbox id from list_email_accounts." }, "steps": { "type": "array", "description": "The emails of the sequence, in order, one object per email. At least one step is needed before contacts can be added.", "items": { "type": "object", "properties": { "subject": { "type": "string", "description": "Subject line. Merge fields need a fallback, e.g. Quick idea for {{ company_name | your team }}." }, "body": { "type": "string", "description": "Plain text, one paragraph per line, no blank lines, ending with {{sender_signature}} then {{unsubscribe_text}} on their own lines." }, "delayDays": { "type": "number", "description": "Whole days to wait after the previous step. 0 for the first step. Default 0." } }, "required": [ "subject", "body" ] } }, "settings": { "type": "object", "description": "Optional sending schedule object; omitted keys use the defaults. daysRange: days of the week it may send, numbers 0-6 where 0 is Sunday, default [1,2,3,4,5] (Monday to Friday). timeSlot: sending window { start, end } in whole hours (0-23) of the campaign timezone, default { start: 9, end: 17 }. timezone: IANA timezone of the window, default America/New_York; supported: America/Los_Angeles, America/Denver, America/Chicago, America/New_York, UTC, Europe/London, Europe/Paris, Europe/Athens, Australia/Perth, Australia/Adelaide, Australia/Sydney, Asia/Dubai, Asia/Riyadh, Asia/Karachi, Asia/Kolkata, Asia/Dhaka, Asia/Ho_Chi_Minh, Asia/Tokyo, Pacific/Guadalcanal, Pacific/Auckland, Pacific/Midway, Pacific/Honolulu, America/Anchorage, America/Puerto_Rico, America/St_Johns, America/Sao_Paulo." } }, "required": [ "websiteId", "name", "emailAccountId", "steps" ] } } ``` # create_contact (/docs/mcp/tools/create-contact) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_contact.mdx. */} **Create contact** · Changes data Saves a new person record (name, job title, company domain) and returns it with its _id. Its main use is to get a contactId for verify_contact. To find new people use search_people. To push someone into a CRM use push_lead_to_crm. The name, position, company domain and email (businessEmail, or personalEmail when there is no work email) are stored; phone and LinkedIn are not. Costs nothing. Errors: 405 when firstName, lastName or position is missing. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. Required by the tool schema; the saved record is not linked to it. | | `firstName` | `string` | Yes | Person's first name. Required. | | `lastName` | `string` | Yes | Person's last name. Required. | | `position` | `string` | Yes | Job title, e.g. "Head of Marketing". Required. | | `domain` | `string` | No | Company domain without protocol, e.g. "acme.example". Without it verify_contact cannot guess an address. | | `businessEmail` | `string` | No | Work email. Saved on the contact; verify_contact checks it. | | `personalEmail` | `string` | No | Personal email, used only when businessEmail is not given. | | `linkedinUrl` | `string` | No | LinkedIn profile URL. Accepted but not stored. | | `phone` | `string` | No | Phone number. Accepted but not stored. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_contact", "title": "Create contact", "annotations": { "title": "Create contact", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites. Required by the tool schema; the saved record is not linked to it." }, "firstName": { "type": "string", "description": "Person's first name. Required." }, "lastName": { "type": "string", "description": "Person's last name. Required." }, "position": { "type": "string", "description": "Job title, e.g. \"Head of Marketing\". Required." }, "domain": { "type": "string", "description": "Company domain without protocol, e.g. \"acme.example\". Without it verify_contact cannot guess an address." }, "businessEmail": { "type": "string", "description": "Work email. Saved on the contact; verify_contact checks it." }, "personalEmail": { "type": "string", "description": "Personal email, used only when businessEmail is not given." }, "linkedinUrl": { "type": "string", "description": "LinkedIn profile URL. Accepted but not stored." }, "phone": { "type": "string", "description": "Phone number. Accepted but not stored." } }, "required": [ "websiteId", "firstName", "lastName", "position" ] } } ``` # create_filter (/docs/mcp/tools/create-filter) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_filter.mdx. */} **Save a lead filter** · Changes data Save a lead filter under a name so it shows as a saved view on the leads page and can be used as an automation segment. url is a query string of lead filter parameters (the same names get_leads uses); date and pagination parameters are removed before saving, so a saved filter always applies to whatever date range is chosen. websiteId comes from list_websites. Saving the same name twice creates two filters. Returns the saved filter (_id, name, url, tab). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | Name shown for the saved view, e.g. "US SaaS visitors". | | `url` | `string` | Yes | Query string of filter parameters, e.g. "?visitorLocation=US&industries=Software&tag=HOT". dateFrom, dateTo, page and similar date/pagination parameters are stripped. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_filter", "title": "Save a lead filter", "annotations": { "title": "Save a lead filter", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "name": { "type": "string", "description": "Name shown for the saved view, e.g. \"US SaaS visitors\"." }, "url": { "type": "string", "description": "Query string of filter parameters, e.g. \"?visitorLocation=US&industries=Software&tag=HOT\". dateFrom, dateTo, page and similar date/pagination parameters are stripped." } }, "required": [ "websiteId", "name", "url" ] } } ``` # create_lead_scoring_model (/docs/mcp/tools/create-lead-scoring-model) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_lead_scoring_model.mdx. */} **Create a lead scoring model** · Changes data Create a lead scoring model on a website, with its rules: criteria (same shape as get_lead_scoring_model / update_lead_scoring_model), active and aiMatching are saved with it. Leave criteria out to start with an empty model and add rules later with update_lead_scoring_model. Names must be unique per website (case-insensitive). To have AI build a model from your website instead, use ai_generate_scoring_model. websiteId comes from list_websites. Returns the saved model with its _id. If the model was created but its rules could not be saved, the result is an error with modelId and a note to retry with update_lead_scoring_model. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | Model name, unique on the website, e.g. "Enterprise SaaS". | | `active` | `boolean` | No | true (default) to score leads with it straight away, false to save it switched off. | | `criteria` | `object` | No | Rules keyed by criterion, in the shape get_lead_scoring_model returns (industry, employees, revenue, jobTitle, pageVisited, …), e.g. \{"industry":[\{"values":["Software"],"score":8,"filter":"any"\}]\}. | | `aiMatching` | `object` | No | AI matching settings, in the shape get_lead_scoring_model returns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_lead_scoring_model", "title": "Create a lead scoring model", "annotations": { "title": "Create a lead scoring model", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "name": { "type": "string", "description": "Model name, unique on the website, e.g. \"Enterprise SaaS\"." }, "active": { "type": "boolean", "description": "true (default) to score leads with it straight away, false to save it switched off." }, "criteria": { "type": "object", "description": "Rules keyed by criterion, in the shape get_lead_scoring_model returns (industry, employees, revenue, jobTitle, pageVisited, …), e.g. {\"industry\":[{\"values\":[\"Software\"],\"score\":8,\"filter\":\"any\"}]}." }, "aiMatching": { "type": "object", "description": "AI matching settings, in the shape get_lead_scoring_model returns." } }, "required": [ "websiteId", "name" ] } } ``` # create_list (/docs/mcp/tools/create-list) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_list.mdx. */} **Create a list** · Changes data Creates an empty contact or company list on a website and returns it. Add people to it from the dashboard or a campaign. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. | | `name` | `string` | Yes | The list's name. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_list", "title": "Create a list", "annotations": { "title": "Create a list", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact for lists of people, company for lists of companies." }, "name": { "type": "string", "description": "The list's name." } }, "required": [ "websiteId", "listType", "name" ] } } ``` # create_tag (/docs/mcp/tools/create-tag) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_tag.mdx. */} **Create a tag** · Changes data Create a new tag on a website so you can label leads with tag_lead. The name is stored in upper case and must be unique on the website (a duplicate returns 'Tag text already exist'). websiteId comes from list_websites. Check list_tags first to reuse an existing tag. Returns status 'Successful' and tagId. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | Tag name, e.g. "Hot account" (saved as "HOT ACCOUNT"). | | `color` | `string` | No | Hex colour as #RRGGBB, e.g. "#059669". Default "#1E4EFF". Any other format is refused. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "create_tag", "title": "Create a tag", "annotations": { "title": "Create a tag", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "name": { "type": "string", "description": "Tag name, e.g. \"Hot account\" (saved as \"HOT ACCOUNT\")." }, "color": { "type": "string", "description": "Hex colour as #RRGGBB, e.g. \"#059669\". Default \"#1E4EFF\". Any other format is refused." } }, "required": [ "websiteId", "name" ] } } ``` # delete_ai_scout (/docs/mcp/tools/delete-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_ai_scout.mdx. */} **Delete an AI Scout** · Deletes or overwrites data Deletes an AI Scout: it stops for good and is removed from the list. The leads it already delivered stay in Leads. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_ai_scout", "title": "Delete an AI Scout", "annotations": { "title": "Delete an AI Scout", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "scoutId": { "type": "string", "description": "AI Scout ID from list_ai_scouts." } }, "required": [ "websiteId", "scoutId" ] } } ``` # delete_automation (/docs/mcp/tools/delete-automation) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_automation.mdx. */} **Delete automation** · Deletes or overwrites data Deletes an automation permanently, so it no longer acts on any lead. Records already pushed to CRMs or campaigns stay where they are. To stop it while keeping the setup, use toggle_automation with isActive false. Get automationId from list_automations. Confirm with the user before calling. Returns status 'Successful', or 404 'No automation found'. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `automationId` | `string` | Yes | Automation _id from list_automations. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_automation", "title": "Delete automation", "annotations": { "title": "Delete automation", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "automationId": { "type": "string", "description": "Automation _id from list_automations." } }, "required": [ "automationId" ] } } ``` # delete_campaign_step (/docs/mcp/tools/delete-campaign-step) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_campaign_step.mdx. */} **Delete a campaign step** · Deletes or overwrites data Removes one email from a campaign's sequence for good. Contacts who already got it keep it. Confirm with the user before calling. Returns 404 when templateId is not a step of the campaign. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | | `templateId` | `string` | Yes | _id of the step, from get_campaign (emailCampaignTemplates). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_campaign_step", "title": "Delete a campaign step", "annotations": { "title": "Delete a campaign step", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." }, "templateId": { "type": "string", "description": "_id of the step, from get_campaign (emailCampaignTemplates)." } }, "required": [ "websiteId", "campaignId", "templateId" ] } } ``` # delete_campaign (/docs/mcp/tools/delete-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_campaign.mdx. */} **Delete email campaign** · Deletes or overwrites data Permanently delete an email campaign together with all its steps and every prospect in it; scheduled emails are never sent and the history is lost. This cannot be undone and nothing is refunded. To stop only some contacts use stop_prospect or remove_prospect_from_campaign. Confirm with the user before calling. campaignId comes from list_campaigns. Returns a status message and deletedProspects (how many prospects were removed). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `campaignId` | `string` | Yes | Email campaign id from list_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_campaign", "title": "Delete email campaign", "annotations": { "title": "Delete email campaign", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "campaignId": { "type": "string", "description": "Email campaign id from list_campaigns." } }, "required": [ "campaignId" ] } } ``` # delete_email_account (/docs/mcp/tools/delete-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_email_account.mdx. */} **Remove mailbox** · Deletes or overwrites data Remove a connected mailbox from the account. Prospects that were scheduled or in progress on it are moved to error-sending and paused, so their next steps will not send until they are given another mailbox. The mailbox slot is freed. This does not delete the mailbox at its email provider. Confirm with the user before calling. emailAccountId comes from list_email_accounts. Returns a status message. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `emailAccountId` | `string` | Yes | Mailbox id from list_email_accounts (_id). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_email_account", "title": "Remove mailbox", "annotations": { "title": "Remove mailbox", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "emailAccountId": { "type": "string", "description": "Mailbox id from list_email_accounts (_id)." } }, "required": [ "emailAccountId" ] } } ``` # delete_filter (/docs/mcp/tools/delete-filter) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_filter.mdx. */} **Delete a saved filter** · Deletes or overwrites data Delete a saved lead filter. Any automation that used it as its segment is switched to 'All leads', so it will then run for every new lead; check list_automations before deleting a filter an automation depends on. filterId is the _id from list_filters. Confirm with the user before calling. Returns status 'successful', or an error when the filter does not exist. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `filterId` | `string` | Yes | Saved filter id (the _id from list_filters). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_filter", "title": "Delete a saved filter", "annotations": { "title": "Delete a saved filter", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "filterId": { "type": "string", "description": "Saved filter id (the _id from list_filters)." } }, "required": [ "filterId" ] } } ``` # delete_intent_topic (/docs/mcp/tools/delete-intent-topic) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_intent_topic.mdx. */} **Unsubscribe intent topic** · Deletes or overwrites data Unsubscribes a website from an intent topic and deletes the subscription, including its delivery counters. Leads already delivered stay. To stop it only for a while, use update_intent_topic with paused true. Confirm with the user before calling. Returns \{ result: \{ deleted: true, topicSlug \} \}, or 404 when the website is not subscribed. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `topicSlug` | `string` | Yes | Slug of a subscribed topic, from list_intent_topics. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_intent_topic", "title": "Unsubscribe intent topic", "annotations": { "title": "Unsubscribe intent topic", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "topicSlug": { "type": "string", "description": "Slug of a subscribed topic, from list_intent_topics." } }, "required": [ "websiteId", "topicSlug" ] } } ``` # delete_lead_comment (/docs/mcp/tools/delete-lead-comment) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_lead_comment.mdx. */} **Delete a lead comment** · Deletes or overwrites data Permanently delete a comment from a lead. Only the user who wrote the comment can delete it; others get 'You do not have permission'. commentId is the _id from get_lead_comments. Confirm with the user before calling. Returns status 'Successful'. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `commentId` | `string` | Yes | Comment id (the _id from get_lead_comments). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_lead_comment", "title": "Delete a lead comment", "annotations": { "title": "Delete a lead comment", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "commentId": { "type": "string", "description": "Comment id (the _id from get_lead_comments)." } }, "required": [ "commentId" ] } } ``` # delete_lead_scoring_model (/docs/mcp/tools/delete-lead-scoring-model) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_lead_scoring_model.mdx. */} **Delete a lead scoring model** · Deletes or overwrites data Permanently delete a lead scoring model and remove its score from every lead of the website. This cannot be undone. To stop a model scoring without losing it, use update_lead_scoring_model with active=false instead. modelId from list_lead_scoring_models. Confirm with the user before calling. Returns status 'Successful'. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `modelId` | `string` | Yes | Scoring model id from list_lead_scoring_models. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_lead_scoring_model", "title": "Delete a lead scoring model", "annotations": { "title": "Delete a lead scoring model", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "modelId": { "type": "string", "description": "Scoring model id from list_lead_scoring_models." } }, "required": [ "modelId" ] } } ``` # delete_lead (/docs/mcp/tools/delete-lead) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_lead.mdx. */} **Delete leads permanently** · Deletes or overwrites data Permanently delete one or more leads. This cannot be undone, the credits they used are not given back, and the companies of the deleted leads are added to the website's blocked company domains (the Exclude list in Qualify), so new leads from those companies stop appearing. To only take a lead off the list, use hide_lead instead. leadIds come from get_leads. Confirm with the user before calling. Returns deletedCount, the number of leads actually deleted (leads outside your account are skipped). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadIds` | `string[]` | Yes | Array of lead ids (the _id values from get_leads), e.g. ["66f1...", "66f2..."]. Use leads from one website per call. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_lead", "title": "Delete leads permanently", "annotations": { "title": "Delete leads permanently", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadIds": { "type": "array", "items": { "type": "string" }, "description": "Array of lead ids (the _id values from get_leads), e.g. [\"66f1...\", \"66f2...\"]. Use leads from one website per call." } }, "required": [ "leadIds" ] } } ``` # delete_linkedin_campaign (/docs/mcp/tools/delete-linkedin-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_linkedin_campaign.mdx. */} **Delete a LinkedIn campaign** · Deletes or overwrites data Deletes a LinkedIn campaign and stops everything it would still send. Connections already made on LinkedIn stay. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_linkedin_campaign", "title": "Delete a LinkedIn campaign", "annotations": { "title": "Delete a LinkedIn campaign", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinCampaignId": { "type": "string", "description": "LinkedIn campaign ID from list_linkedin_campaigns." } }, "required": [ "websiteId", "linkedinCampaignId" ] } } ``` # delete_linkedin_keyword (/docs/mcp/tools/delete-linkedin-keyword) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_linkedin_keyword.mdx. */} **Delete a LinkedIn keyword** · Deletes or overwrites data Stops watching a LinkedIn keyword for good and removes it from the list. The leads it already found stay. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `keywordId` | `string` | Yes | Keyword ID from list_linkedin_keywords. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_linkedin_keyword", "title": "Delete a LinkedIn keyword", "annotations": { "title": "Delete a LinkedIn keyword", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "keywordId": { "type": "string", "description": "Keyword ID from list_linkedin_keywords." } }, "required": [ "websiteId", "keywordId" ] } } ``` # delete_list (/docs/mcp/tools/delete-list) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_list.mdx. */} **Delete a list** · Deletes or overwrites data Deletes a list for good. The contacts or companies in it stay in the account. Confirm with the user before calling. Returns 404 when the list is not one of this website's. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | _id from list_lists. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_list", "title": "Delete a list", "annotations": { "title": "Delete a list", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact for lists of people, company for lists of companies." }, "listId": { "type": "string", "description": "_id from list_lists." } }, "required": [ "websiteId", "listType", "listId" ] } } ``` # delete_tag (/docs/mcp/tools/delete-tag) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_tag.mdx. */} **Delete a tag** · Deletes or overwrites data Deletes a tag from this website; it is removed from every lead that had it. The leads themselves stay. tagId comes from list_tags. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `tagId` | `string` | Yes | Tag ID from list_tags. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_tag", "title": "Delete a tag", "annotations": { "title": "Delete a tag", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "tagId": { "type": "string", "description": "Tag ID from list_tags." } }, "required": [ "websiteId", "tagId" ] } } ``` # delete_website (/docs/mcp/tools/delete-website) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_website.mdx. */} **Delete website** · Deletes or overwrites data Deletes a website: tracking stops, it disappears from list_websites and its leads are no longer shown, and its website slot is freed. It cannot be restored with these tools. websiteId comes from list_websites. Confirm with the user before calling, naming the website. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. Double-check it is the website the user means. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "delete_website", "title": "Delete website", "annotations": { "title": "Delete website", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites. Double-check it is the website the user means." } }, "required": [ "websiteId" ] } } ``` # dismiss_campaign_capacity_warning (/docs/mcp/tools/dismiss-campaign-capacity-warning) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/dismiss_campaign_capacity_warning.mdx. */} **Dismiss a capacity warning** · Changes data Hides a campaign's capacity warning (more contacts than its mailboxes can send to in time) for some days. Nothing about sending changes; add mailboxes or lower the contacts to fix the cause. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `campaignId` | `string` | Yes | Campaign ID from list_campaigns. | | `dismissDays` | `number` | No | How many days to hide it (1-90, default 7). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "dismiss_campaign_capacity_warning", "title": "Dismiss a capacity warning", "annotations": { "title": "Dismiss a capacity warning", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "campaignId": { "type": "string", "description": "Campaign ID from list_campaigns." }, "dismissDays": { "type": "number", "minimum": 1, "maximum": 90, "description": "How many days to hide it (1-90, default 7)." } }, "required": [ "websiteId", "campaignId" ] } } ``` # downgrade_plan (/docs/mcp/tools/downgrade-plan) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/downgrade_plan.mdx. */} **Downgrade plan** · Changes data · Acts outside your account Schedules the subscription to change to a new number of leads per month from the next billing date; nothing is charged or refunded now and current credits stay until then. Current add-ons are kept. Returns tierName, leads, the new monthly price and effectiveAt (when it takes effect); get_subscription then shows it under pendingDowngrade. Use upgrade_plan for more leads now; to stop paying use cancel_subscription or pause_subscription. Confirm with the user before calling. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leads` | `number` | Yes | Leads per month of the plan to switch to at the next billing date. | | `annual` | `boolean` | No | true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "downgrade_plan", "title": "Downgrade plan", "annotations": { "title": "Downgrade plan", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "leads": { "type": "number", "description": "Leads per month of the plan to switch to at the next billing date." }, "annual": { "type": "boolean", "description": "true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch." } }, "required": [ "leads" ] } } ``` # enrich_domain (/docs/mcp/tools/enrich-domain) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/enrich_domain.mdx. */} **Find contacts at a company** · Changes data · Spends credits or money Look up the people known at a company domain and return them as contacts[] (name, position, email, LinkedIn, isDecisionMaker, plus scores against your scoring models when they have job-title rules). Use it to find who to reach at a company that visited; for firmographics without credits use free_enrich_company, to search people by title use search_people. websiteId (from list_websites) is required even though the schema marks it optional. Cost: 1 credit the first time your account gets contacts for a domain; repeating the same domain is not charged again, and nothing is charged when no contacts are found. Refused when the account has no credits left. Confirm with the user before calling. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `domain` | `string` | Yes | Company domain, e.g. "acme.example" (a full URL is reduced to its domain). | | `websiteId` | `string` | No | Website id from list_websites whose credits pay for the lookup. Required: the call returns an error without it. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "enrich_domain", "title": "Find contacts at a company", "annotations": { "title": "Find contacts at a company", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "domain": { "type": "string", "description": "Company domain, e.g. \"acme.example\" (a full URL is reduced to its domain)." }, "websiteId": { "type": "string", "description": "Website id from list_websites whose credits pay for the lookup. Required: the call returns an error without it." } }, "required": [ "domain" ] } } ``` # export_leads_csv (/docs/mcp/tools/export-leads-csv) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/export_leads_csv.mdx. */} **Export leads to CSV** · Changes data · Acts outside your account Queue a CSV export of a website's leads whose last visit falls in the date range. The file is built in the background: the user gets an email with the download link and it is listed under Downloads in the dashboard for 30 days; this tool does not return the file itself. Each finished export uses one of the plan's CSV downloads; it fails when the plan has no CSV downloads or none are left. websiteId from list_websites. For leads you want to read in the conversation, use get_leads. Returns status 'queued' and job (id, status, stage, progress, rowCount, fileName, expiresAt). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `dateFrom` | `string` | Yes | Start of the range (last visit date). Accepts YYYY-MM-DD, MM/DD/YYYY, ISO 8601 or epoch milliseconds. | | `dateTo` | `string` | Yes | End of the range, inclusive. Same formats as dateFrom. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "export_leads_csv", "title": "Export leads to CSV", "annotations": { "title": "Export leads to CSV", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "dateFrom": { "type": "string", "description": "Start of the range (last visit date). Accepts YYYY-MM-DD, MM/DD/YYYY, ISO 8601 or epoch milliseconds." }, "dateTo": { "type": "string", "description": "End of the range, inclusive. Same formats as dateFrom." } }, "required": [ "websiteId", "dateFrom", "dateTo" ] } } ``` # export_list_csv (/docs/mcp/tools/export-list-csv) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/export_list_csv.mdx. */} **Export a list to CSV** · Changes data · Acts outside your account Builds a CSV of a list and emails the download link to the user. Returns as soon as the export has started. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | _id from list_lists. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "export_list_csv", "title": "Export a list to CSV", "annotations": { "title": "Export a list to CSV", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact for lists of people, company for lists of companies." }, "listId": { "type": "string", "description": "_id from list_lists." } }, "required": [ "websiteId", "listType", "listId" ] } } ``` # find_contact_email (/docs/mcp/tools/find-contact-email) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/find_contact_email.mdx. */} **Find contact email** · Changes data · Acts outside your account · Spends credits or money Looks for a business email for one search_people contact by trying likely address patterns at their company and verifying each one. Use it only when reveal_contact found no email for that person. depth 'popular' tries the common patterns and costs 50 credits. 'deep' tries more patterns and costs 100 credits. Credits are charged whether or not an address is found. Confirm the cost with the user before calling. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the same one used for search_people). | | `profileId` | `string` | Yes | profileId from a search_people row. | | `depth` | `"popular" \| "deep"` | No | 'popular' (default, 50 credits) or 'deep' (100 credits). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "find_contact_email", "title": "Find contact email", "annotations": { "title": "Find contact email", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the same one used for search_people)." }, "profileId": { "type": "string", "description": "profileId from a search_people row." }, "depth": { "type": "string", "enum": [ "popular", "deep" ], "description": "'popular' (default, 50 credits) or 'deep' (100 credits)." } }, "required": [ "websiteId", "profileId" ] } } ``` # generate_campaign_emails_ai (/docs/mcp/tools/generate-campaign-emails-ai) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/generate_campaign_emails_ai.mdx. */} **Write campaign emails with AI** · Changes data Writes a sequence of emails for a campaign with AI, from your website, offer and ideal customer, and saves them as the campaign steps. Review them with get_campaign before starting the campaign. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `campaignId` | `string` | Yes | Campaign ID from list_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "generate_campaign_emails_ai", "title": "Write campaign emails with AI", "annotations": { "title": "Write campaign emails with AI", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "campaignId": { "type": "string", "description": "Campaign ID from list_campaigns." } }, "required": [ "websiteId", "campaignId" ] } } ``` # get_account (/docs/mcp/tools/get-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_account.mdx. */} **Get account** · Read-only Shows the signed-in account: plan, credit limits and remaining credits, refresh and trial dates, add-ons, features, settings, pause status, failed-payment flag and the account's websites (the first 11 only). Use it to get an overview or to check credits before a credit-spending action. For subscription price and renewal date use get_subscription; for credit usage line by line use get_credit_history; for the complete website list use list_websites. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_account", "title": "Get account", "annotations": { "title": "Get account", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": {} } } ``` # get_ai_scout (/docs/mcp/tools/get-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_ai_scout.mdx. */} **Get an AI Scout** · Read-only One AI Scout with its sources, how many people it found, qualified and delivered, and the latest people it picked with why they fit. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_ai_scout", "title": "Get an AI Scout", "annotations": { "title": "Get an AI Scout", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "scoutId": { "type": "string", "description": "AI Scout ID from list_ai_scouts." } }, "required": [ "websiteId", "scoutId" ] } } ``` # get_auto_topup (/docs/mcp/tools/get-auto-topup) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_auto_topup.mdx. */} **Get auto top-up** · Read-only Whether auto top-up is on: when credits run out, a pack of leads is bought automatically, up to a monthly cap in USD. Returns on/off, the pack size, the cap and what was spent this month. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_auto_topup", "title": "Get auto top-up", "annotations": { "title": "Get auto top-up", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_automation_runs (/docs/mcp/tools/get-automation-runs) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_automation_runs.mdx. */} **Get an automation's runs** · Read-only The runs of one automation, newest first: which lead each run handled, when, and whether it succeeded (and why not). Use it to check that an automation really sent leads to Slack, your CRM or a webhook. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `automationId` | `string` | Yes | Automation ID from list_automations. | | `limit` | `number` | No | Runs to return (1-200). | | `skip` | `number` | No | Runs to skip, for paging. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_automation_runs", "title": "Get an automation's runs", "annotations": { "title": "Get an automation's runs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "automationId": { "type": "string", "description": "Automation ID from list_automations." }, "limit": { "type": "number", "minimum": 1, "maximum": 200, "description": "Runs to return (1-200)." }, "skip": { "type": "number", "minimum": 0, "description": "Runs to skip, for paging." } }, "required": [ "websiteId", "automationId" ] } } ``` # get_automation_stats (/docs/mcp/tools/get-automation-stats) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_automation_stats.mdx. */} **Get automation statistics** · Read-only For every automation of a website: how many leads it handled, how many failed and when it last ran. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_automation_stats", "title": "Get automation statistics", "annotations": { "title": "Get automation statistics", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_automation (/docs/mcp/tools/get-automation) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_automation.mdx. */} **Get automation** · Read-only Returns the full setup of one automation: name, isActive, when (trigger event), then (action), trigger, interval, frequency settings (repeatWindowHours, dedupeScope), contact selection, email verification rules, filter and the action settings. Read it before update_automation. For what an automation did for a specific lead, use get_lead_automation_history. Get automationId from list_automations. Errors: 400 for an invalid id, 404 'automation not found.' | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `automationId` | `string` | Yes | Automation _id from list_automations (24 hex characters). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_automation", "title": "Get automation", "annotations": { "title": "Get automation", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "automationId": { "type": "string", "description": "Automation _id from list_automations (24 hex characters)." } }, "required": [ "automationId" ] } } ``` # get_billing (/docs/mcp/tools/get-billing) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_billing.mdx. */} **Get billing (subscription)** · Read-only Returns the same subscription summary as get_subscription: plan, leads per month, credits used and remaining, top-up credits, price, billing interval, next billing date, whether it is set to cancel or is paused, pending downgrade and any running retention discount. The websiteId is accepted but does not change the result (billing is per account). Prefer get_subscription. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. Required by the schema but ignored; the result covers the whole account. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_billing", "title": "Get billing (subscription)", "annotations": { "title": "Get billing (subscription)", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites. Required by the schema but ignored; the result covers the whole account." } }, "required": [ "websiteId" ] } } ``` # get_blog_article (/docs/mcp/tools/get-blog-article) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_blog_article.mdx. */} **Get blog article** · Read-only Returns one blog article in full (Optimize add-on): its content blocks, FAQ, every version with its status, the public url and the visits it received. Use it before update_blog_article to see the current text. Get articleId from list_blog_articles. Returns \{ article, visits, url \}, or 404 'Article not found'. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `articleId` | `string` | Yes | Article _id from list_blog_articles. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_blog_article", "title": "Get blog article", "annotations": { "title": "Get blog article", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "articleId": { "type": "string", "description": "Article _id from list_blog_articles." } }, "required": [ "websiteId", "articleId" ] } } ``` # get_campaign_capacity (/docs/mcp/tools/get-campaign-capacity) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_campaign_capacity.mdx. */} **Get campaign health** · Read-only Returns the campaign's health: connected mailboxes and their daily limits, how many emails it can send a day, and what is holding it back (e.g. no mailbox, warmup, limits). Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_campaign_capacity", "title": "Get campaign health", "annotations": { "title": "Get campaign health", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." } }, "required": [ "websiteId", "campaignId" ] } } ``` # get_campaign_stats (/docs/mcp/tools/get-campaign-stats) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_campaign_stats.mdx. */} **Get campaign statistics** · Read-only Returns how a campaign is doing: emails sent, opened, clicked, replied, bounced and unsubscribed, with rates. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_campaign_stats", "title": "Get campaign statistics", "annotations": { "title": "Get campaign statistics", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." } }, "required": [ "websiteId", "campaignId" ] } } ``` # get_campaign (/docs/mcp/tools/get-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_campaign.mdx. */} **Get campaign details** · Read-only Get one email campaign with live analytics: settings (isActive, schedule, timezone), its steps in emailCampaignTemplates[] (each with _id = templateId for update_campaign_step, subject, body and per-step stats), stats (prospect total, scheduledCount, uniqueContacted, totalEmailsSent, opens, clicks, replies, warm replies, bounced, unsubscribed and their rates), steps[] (per-step sent/opened/clicked/replied), statusBuckets (prospect counts per status) and statistics (sent vs scheduled over time). campaignId comes from list_campaigns. Use get_prospects for the contacts themselves. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `campaignId` | `string` | Yes | Email campaign id from list_campaigns or create_campaign. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_campaign", "title": "Get campaign details", "annotations": { "title": "Get campaign details", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "campaignId": { "type": "string", "description": "Email campaign id from list_campaigns or create_campaign." } }, "required": [ "campaignId" ] } } ``` # get_company_people (/docs/mcp/tools/get-company-people) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_company_people.mdx. */} **Get people at the lead's company** · Read-only Other people who work at the company of a lead (name, job title, department, seniority, LinkedIn), optionally only one department, to find the right contact when the visitor was not the buyer. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `leadId` | `string` | Yes | Lead ID from get_leads. | | `department` | `string` | No | Only this department, e.g. Sales Department. | | `page` | `number` | No | Page of results, from 1. | | `limit` | `number` | No | People per page (1-100). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_company_people", "title": "Get people at the lead's company", "annotations": { "title": "Get people at the lead's company", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "leadId": { "type": "string", "description": "Lead ID from get_leads." }, "department": { "type": "string", "description": "Only this department, e.g. Sales Department." }, "page": { "type": "number", "minimum": 1, "description": "Page of results, from 1." }, "limit": { "type": "number", "minimum": 1, "maximum": 100, "description": "People per page (1-100)." } }, "required": [ "websiteId", "leadId" ] } } ``` # get_country_blacklist (/docs/mcp/tools/get-country-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_country_blacklist.mdx. */} **Get blocked countries** · Read-only Returns the countries whose visitors are never identified on this website (two-letter codes such as DE or FR). Visits from them are not turned into leads and use no credits. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_country_blacklist", "title": "Get blocked countries", "annotations": { "title": "Get blocked countries", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_credit_history (/docs/mcp/tools/get-credit-history) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_credit_history.mdx. */} **Get credit history** · Read-only Lists the account's credit transactions from the last 90 days, newest first: each row has operation (CHARGE, REFUND or DUPLICATE_PREVENTED), amount, credits before/after, the website, the lead's domain/email, a source category (WEBSITE_VISITOR, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, INTENT_SIGNALS, ADJUSTMENT, OTHER), a reason and createdAt. Returns \{ count, hasMore, logs \}. Use it to explain where credits went. For one website's per-cycle allowance snapshots use get_website_credit_history. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | `number` | No | Page number, starting at 1 (default 1). Use hasMore in the result to know if there is a next page. | | `limit` | `number` | No | Rows per page (default 100, max 500). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_credit_history", "title": "Get credit history", "annotations": { "title": "Get credit history", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "page": { "type": "number", "description": "Page number, starting at 1 (default 1). Use hasMore in the result to know if there is a next page." }, "limit": { "type": "number", "description": "Rows per page (default 100, max 500)." } } } } ``` # get_credit_summary (/docs/mcp/tools/get-credit-summary) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_credit_summary.mdx. */} **Get the credit summary** · Read-only Credits used in a billing cycle, by source (website visitors, Prospector, AI Scout, Web Scraping…) and by day, with what is left. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `cycle` | `number` | No | 0 for the current cycle, 1 for the one before, … | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_credit_summary", "title": "Get the credit summary", "annotations": { "title": "Get the credit summary", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "cycle": { "type": "number", "minimum": 0, "description": "0 for the current cycle, 1 for the one before, …" } }, "required": [ "websiteId" ] } } ``` # get_crm_mappings (/docs/mcp/tools/get-crm-mappings) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_crm_mappings.mdx. */} **Get CRM field mappings** · Read-only The field mappings used when leads are pushed to a CRM: which lead field fills which CRM field, for contacts and companies. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `crm` | `"hubspot" \| "salesforce" \| "pipedrive" \| "zoho" \| "gohighlevel"` | Yes | The CRM. | | `objectType` | `"contact" \| "company"` | No | contact or company. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_crm_mappings", "title": "Get CRM field mappings", "annotations": { "title": "Get CRM field mappings", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "crm": { "type": "string", "enum": [ "hubspot", "salesforce", "pipedrive", "zoho", "gohighlevel" ], "description": "The CRM." }, "objectType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact or company." } }, "required": [ "websiteId", "crm" ] } } ``` # get_domain_blacklist (/docs/mcp/tools/get-domain-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_domain_blacklist.mdx. */} **List blocked domains** · Read-only Lists the company domains blocked from becoming leads on a website. Returns \{ result: [ \{ domain, csv, ... \} ] \}, where csv is the name of the group each domain was added under. Use the group name with remove_from_domain_blacklist. To block more domains use add_to_domain_blacklist. websiteId comes from list_websites. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_domain_blacklist", "title": "List blocked domains", "annotations": { "title": "List blocked domains", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_domain_setup_status (/docs/mcp/tools/get-domain-setup-status) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_domain_setup_status.mdx. */} **Domain setup progress** · Read-only Check the setup progress of the outreach domains bought for a website (unpaid picks are not shown). Call it after purchase_outreach_domains until every domain is ready. websiteId comes from list_websites. Per domain read status, completedSteps of totalSteps (5: purchased, DNS configured, mail setup, mailboxes created, ready), progressPercent, terminal (true when ready), mailboxCount, awaitingSenderInfo, hasError with retryCount / retriesExhausted / nextRetryAt (failed steps are retried automatically) and paymentError. Also returns hasEmailSenderInfo and a summary (total, ready, inFlight, errored, paymentErrored, awaitingSenderInfo). Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_domain_setup_status", "title": "Domain setup progress", "annotations": { "title": "Domain setup progress", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_domain_suggestions (/docs/mcp/tools/get-domain-suggestions) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_domain_suggestions.mdx. */} **Suggest outreach domains** · Read-only Suggest look-alike domain names for cold outreach, built from the website's own domain and keeping its ending (e.g. acme.example gives getacme.example, tryacme.example, useacme.example, goacme.example, acmeapp.example, acmehq.example). Availability is not checked: run search_domain_availability on a name before add_outreach_domain. websiteId comes from list_websites. Returns baseDomain and suggestions[]. Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. Suggestions are derived from this website's domain. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_domain_suggestions", "title": "Suggest outreach domains", "annotations": { "title": "Suggest outreach domains", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites. Suggestions are derived from this website's domain." } }, "required": [ "websiteId" ] } } ``` # get_email_account_stats (/docs/mcp/tools/get-email-account-stats) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_account_stats.mdx. */} **Mailbox sending load** · Read-only Get the sending load of every mailbox on a website: how many campaign emails are scheduled on it and how full its next 30 days are. It does not return opens, replies or bounces; use get_campaign for campaign results and get_warmup_stats for warmup numbers. websiteId comes from list_websites. Returns one entry per mailbox with emailAccount (the mailbox id, match it to list_email_accounts), totalScheduledEmails and capacity (a percentage string; anything above 100% is shown as 200%), or a note when the website has no mailboxes. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_email_account_stats", "title": "Mailbox sending load", "annotations": { "title": "Mailbox sending load", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_email_account (/docs/mcp/tools/get-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_account.mdx. */} **Get a mailbox** · Read-only One mailbox in full: address, sender name and signature, daily sending limit, warmup state and health, and whether it is connected. Passwords are never returned. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_email_account", "title": "Get a mailbox", "annotations": { "title": "Get a mailbox", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # get_email_template (/docs/mcp/tools/get-email-template) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_template.mdx. */} **Get a campaign email** · Read-only Returns one email (step) of a campaign in full: subject and body templates with their merge fields, the sender, the delay before it is sent and its position in the sequence. templateId comes from get_campaign (emailCampaignTemplates). Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `campaignId` | `string` | Yes | Campaign ID from list_campaigns. | | `templateId` | `string` | Yes | Step ID from get_campaign, emailCampaignTemplates. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_email_template", "title": "Get a campaign email", "annotations": { "title": "Get a campaign email", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "campaignId": { "type": "string", "description": "Campaign ID from list_campaigns." }, "templateId": { "type": "string", "description": "Step ID from get_campaign, emailCampaignTemplates." } }, "required": [ "websiteId", "campaignId", "templateId" ] } } ``` # get_email_thread (/docs/mcp/tools/get-email-thread) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_thread.mdx. */} **Read email thread** · Read-only Read one outreach email conversation: the email that was sent (subject, send time, opens) and every reply under it, incoming and outgoing. emailId comes from get_inbox_emails (prospects[].emails[].emailId). Returns prospectEmail with the prospect's _id, name and recipientEmail, email (the sent email with its replies[]) and emailAccount (the mailbox that sent it). Use reply_to_prospect to answer. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `emailId` | `string` | Yes | Email id from get_inbox_emails, prospects[].emails[].emailId (not the prospect _id). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_email_thread", "title": "Read email thread", "annotations": { "title": "Read email thread", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "emailId": { "type": "string", "description": "Email id from get_inbox_emails, prospects[].emails[].emailId (not the prospect _id)." } }, "required": [ "emailId" ] } } ``` # get_google_ads_audience (/docs/mcp/tools/get-google-ads-audience) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_google_ads_audience.mdx. */} **Get a Google Ads audience** · Read-only One retargeting audience: settings, contacts uploaded, match rate and the stats of its Google campaign. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `audienceId` | `string` | Yes | Audience ID from list_google_ads_audiences. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_google_ads_audience", "title": "Get a Google Ads audience", "annotations": { "title": "Get a Google Ads audience", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "audienceId": { "type": "string", "description": "Audience ID from list_google_ads_audiences." } }, "required": [ "websiteId", "audienceId" ] } } ``` # get_icp (/docs/mcp/tools/get-icp) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_icp.mdx. */} **Get ideal customer profile** · Read-only Returns the ideal customer profile (ICP) saved for a website: the companies the user wants to reach. Read it before update_icp, or when explaining why a lead is or is not a good fit. Lead scoring rules are separate: use list_lead_scoring_models. Returns employeeLowerBound / employeeUpperBound, revenueLowerBound / revenueUpperBound, location[], role[], industries[], sector[], the priority values for each criterion and any AI qualification questions. Returns null when no ICP is saved. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_icp", "title": "Get ideal customer profile", "annotations": { "title": "Get ideal customer profile", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_inbox_emails (/docs/mcp/tools/get-inbox-emails) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_inbox_emails.mdx. */} **List outreach inbox** · Read-only List prospects from the outreach master inbox of a website across all campaigns, most recent activity first. Default status inbox shows prospects who replied (including out-of-office) and are not archived. Use get_email_thread to read one conversation, reply_to_prospect to answer and archive_email to clear it. websiteId comes from list_websites. Returns prospects[] (each with _id, recipientEmail, firstName, lastName, status, the sending emailAccount, emailCampaign and emails[]; each emails[].emailId is the emailId the other inbox tools take), totalProspects, currentPage and totalPages. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | | `status` | `string` | No | Which view to list: inbox (replied, not archived; default), contacted (an email was sent), scheduled (an email is due and not sent yet) or archived. | | `page` | `number` | No | Page number, starting at 1. Default 1. | | `limit` | `number` | No | Prospects per page. Default 20. | | `searchQuery` | `string` | No | Optional case-insensitive text matched against first name, last name and email address. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_inbox_emails", "title": "List outreach inbox", "annotations": { "title": "List outreach inbox", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." }, "status": { "type": "string", "description": "Which view to list: inbox (replied, not archived; default), contacted (an email was sent), scheduled (an email is due and not sent yet) or archived." }, "page": { "type": "number", "description": "Page number, starting at 1. Default 1." }, "limit": { "type": "number", "description": "Prospects per page. Default 20." }, "searchQuery": { "type": "string", "description": "Optional case-insensitive text matched against first name, last name and email address." } }, "required": [ "websiteId" ] } } ``` # get_intent_topics_catalog (/docs/mcp/tools/get-intent-topics-catalog) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_intent_topics_catalog.mdx. */} **Browse intent topics** · Read-only Lists every third-party intent topic you can subscribe to, e.g. 'CRM Software' or 'Cybersecurity'. Each topic tracks companies that are actively researching that category across the web. Use it to find a topicSlug for subscribe_to_intent_topic. To see the topics a website already follows, use list_intent_topics. Costs nothing. Returns \{ result[] \} sorted by name; each row has topicSlug, displayName, profile.roleKeywords, profile.industryConstraint, surgeThreshold and availabilityPerDay. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_intent_topics_catalog", "title": "Browse intent topics", "annotations": { "title": "Browse intent topics", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": {} } } ``` # get_lead_ai_summary (/docs/mcp/tools/get-lead-ai-summary) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_ai_summary.mdx. */} **AI visit summary for a lead** · Read-only Get a short AI-written summary (about 50 words) of what this visitor did on your website, based on their company, country and the pages they viewed, ending with one verdict: 'Ready to Buy', 'Research' or 'Just Browsing'. Returned as aISummary (text, may contain \ tags). leadId comes from get_leads. Use get_lead for the raw page-visit data. Generated fresh on each call, so wording can differ between calls. Changes nothing in the account. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead_ai_summary", "title": "AI visit summary for a lead", "annotations": { "title": "AI visit summary for a lead", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." } }, "required": [ "leadId" ] } } ``` # get_lead_automation_history (/docs/mcp/tools/get-lead-automation-history) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_automation_history.mdx. */} **Lead automation history** · Read-only List every automation run recorded for one lead, newest first, as automationLogs[] with status, message (the result or error text), automation (the automation id, see list_automations) and executedAt. Use it to check whether a lead reached Slack, a CRM, a webhook or an email campaign and why a run failed. leadId comes from get_leads. To run automations again use retrigger_automations or rerun_automation_for_lead. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead_automation_history", "title": "Lead automation history", "annotations": { "title": "Lead automation history", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." } }, "required": [ "leadId" ] } } ``` # get_lead_comments (/docs/mcp/tools/get-lead-comments) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_comments.mdx. */} **Get lead comments** · Read-only Get the comments (team notes) on a lead. Each comment has _id (commentId for update_lead_comment / delete_lead_comment), content, the author's firstName, lastName, userEmail, role and picture, and createdAt. leadId comes from get_leads. Add one with add_lead_comment. Returns \{ comments: [...] \}. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead_comments", "title": "Get lead comments", "annotations": { "title": "Get lead comments", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." } }, "required": [ "leadId" ] } } ``` # get_lead_quality (/docs/mcp/tools/get-lead-quality) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_quality.mdx. */} **Get the lead quality bar** · Read-only Returns the lead quality settings of a website: the minimum ideal-customer score a lead needs to be kept, the bar per source (website visitors, intent, Web Scraping, Prospector, AI Scout), contacts-only options and the audience focus (B2B, B2C or both). Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead_quality", "title": "Get the lead quality bar", "annotations": { "title": "Get the lead quality bar", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_lead_recordings (/docs/mcp/tools/get-lead-recordings) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_recordings.mdx. */} **List session recordings** · Read-only List session recordings (replays of what a visitor did on your website), newest first, up to 100. Pass clientId to list a website's recordings, or email to list one identified visitor's recordings. Each recording has session_id, client_id, lead_email, started_at, ended_at, duration_ms, page_count, first_page and finalized. Recordings exist only when session recording is enabled for the website. clientId comes from get_website or get_tracking_pixel; the email is the lead's exactPerson email from get_leads. To watch one, pass its session_id and client_id to get_recording_url. At least one of clientId or email is required. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `clientId` | `string` | No | The website's clientId (16-32 characters) from get_website or get_tracking_pixel. | | `email` | `string` | No | Email address of an identified visitor (from get_leads). When given, the list is the recordings for this email. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead_recordings", "title": "List session recordings", "annotations": { "title": "List session recordings", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "clientId": { "type": "string", "description": "The website's clientId (16-32 characters) from get_website or get_tracking_pixel." }, "email": { "type": "string", "description": "Email address of an identified visitor (from get_leads). When given, the list is the recordings for this email." } } } } ``` # get_lead_scoring_model (/docs/mcp/tools/get-lead-scoring-model) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_scoring_model.mdx. */} **Get a lead scoring model** · Read-only Get one lead scoring model with all its rules. Each criterion (industry, employees, revenue, hqLocation, sector, technologies, companyType, tag, keywords, jobTitle, department, seniority, visitorLocation, visitorCity, visitorState, pageVisited, numberVisits, duration, recency, referrerDomain, campaignSource/Medium/Name/Term, companyDomain, contactEmail) holds a list of rules with values, score (-10 to +10 points) and filter ('any' = add points, 'only' = keep only matching leads, 'excl' = exclude matching leads). Also returns name, active, status, bands (warm/hot thresholds) and revision. modelId is an _id from list_lead_scoring_models. Read it before update_lead_scoring_model. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `modelId` | `string` | Yes | Scoring model id (24 hex characters), the _id from list_lead_scoring_models. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead_scoring_model", "title": "Get a lead scoring model", "annotations": { "title": "Get a lead scoring model", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "modelId": { "type": "string", "description": "Scoring model id (24 hex characters), the _id from list_lead_scoring_models." } }, "required": [ "modelId" ] } } ``` # get_lead (/docs/mcp/tools/get-lead) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead.mdx. */} **Get lead details** · Read-only Get one lead's company profile and visit history: company (name, domain, industry, sector, type, founded year, location, employee range, estimated revenue, LinkedIn/Facebook pages), tags, UTM values, pageVisits[] (url, path, timeSpentMs/timeSpentSeconds, visitCount, sorted by time spent) and summary (totalVisits, lastVisit, totalTimeOnSiteMs, referrer), plus CRM record ids when the lead was pushed. leadId is the _id of a row from get_leads. exactPerson is the identified person (firstName, lastName, fullName, businessEmail, personalEmail, email, phone, position, linkedinUrl), or null when only the company is known; exactPersonType says Exact Visitor or Suggested Contact. Use get_lead_ai_summary for a short written read of the visit, get_lead_automation_history for automation runs. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_lead", "title": "Get lead details", "annotations": { "title": "Get lead details", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." } }, "required": [ "leadId" ] } } ``` # get_leads (/docs/mcp/tools/get-leads) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_leads.mdx. */} **List website leads** · Read-only List the identified visitors (leads) of one website whose last visit falls in a date range, newest first: the exact person (exactPerson: name, email, phone, LinkedIn, position), their company, visitor location, pages viewed, visits, UTM data, tags and lead scores. Use get_lead for one lead's full page history, get_lead_comments for notes, export_leads_csv for a full file. websiteId comes from list_websites. Read-only. 50 leads per page; totalLeads, totalPages and currentPage tell you where you are, and paginationCapped=true means narrow the dates or filters to reach every lead. Hidden leads are never listed. When nothing matches, emptyStateReason says why (not_verified, too_restrictive_filters, no_leads_in_date_range, no_leads_ever). Results may be up to 60 seconds old. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `dateFrom` | `string` | Yes | Start of the range, matched on the lead's last visit date (whole day). Accepts YYYY-MM-DD, MM/DD/YYYY, a full ISO 8601 timestamp or epoch milliseconds. | | `dateTo` | `string` | Yes | End of the range (inclusive, whole day). Same formats as dateFrom. | | `page` | `number` | No | Page number, 1-based, 50 leads per page. Default 1; pages beyond 100 return page 100. | | `domain` | `string` | No | Free-text search across company name and domain, person names and emails, e.g. "acme.example" or "Jane Smith". | | `industries` | `string` | No | One industry to match (case-insensitive, partial match), e.g. "Software". A single value, not a list. | | `sectors` | `string` | No | One company sector to match (case-insensitive, partial match). | | `visitorLocation` | `string` | No | Visitor country as a two-letter ISO code, e.g. "US", "GB" (case-insensitive). | | `visitorLocationState` | `string` | No | Visitor state/region, e.g. "California". When set without visitorLocation, results are limited to US visitors. | | `tag` | `string` | No | Tag name (not id) to filter by, e.g. "HOT"; tag names are stored in upper case and matched case-insensitively. Names come from list_tags. | | `visits_lower_bound` | `number` | No | Minimum number of visits (sessions). Default 0. | | `visits_upper_bound` | `number` | No | Maximum number of visits (sessions). Leave it out to include every lead, however many visits. | | `employeesMin` | `number` | No | Smallest company headcount to include, e.g. 10. | | `employeesMax` | `number` | No | Largest company headcount to include, e.g. 200. | | `tech` | `string` | No | Technology the company uses, case-insensitive partial match, e.g. "HubSpot", or a JSON array string of several: '["HubSpot","Shopify"]'. | | `exactVisitor` | `boolean` | No | true to list only leads where the exact person was identified (name and contact details), false for all leads. Leave it out for all leads. | | `utmSource` | `string` | No | JSON array string of [operator, value] pairs, e.g. '[["contains","google"]]'. Operators: contains, not-contains, starts-with, ends-with. A plain string (not JSON) makes the call fail. | | `utmMedium` | `string` | No | JSON array string of [operator, value] pairs, e.g. '[["contains","cpc"]]'. Same operators as utmSource. | | `pageVisited` | `string` | No | JSON array string of [operator, value] pairs matched against visited page paths, e.g. '[["contains","pricing"]]' or '[["not-contains","careers"]]'. Operators: contains, not-contains, starts-with (value without the leading slash), ends-with. A plain string makes the call fail. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_leads", "title": "List website leads", "annotations": { "title": "List website leads", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "dateFrom": { "type": "string", "description": "Start of the range, matched on the lead's last visit date (whole day). Accepts YYYY-MM-DD, MM/DD/YYYY, a full ISO 8601 timestamp or epoch milliseconds." }, "dateTo": { "type": "string", "description": "End of the range (inclusive, whole day). Same formats as dateFrom." }, "page": { "type": "number", "description": "Page number, 1-based, 50 leads per page. Default 1; pages beyond 100 return page 100." }, "domain": { "type": "string", "description": "Free-text search across company name and domain, person names and emails, e.g. \"acme.example\" or \"Jane Smith\"." }, "industries": { "type": "string", "description": "One industry to match (case-insensitive, partial match), e.g. \"Software\". A single value, not a list." }, "sectors": { "type": "string", "description": "One company sector to match (case-insensitive, partial match)." }, "visitorLocation": { "type": "string", "description": "Visitor country as a two-letter ISO code, e.g. \"US\", \"GB\" (case-insensitive)." }, "visitorLocationState": { "type": "string", "description": "Visitor state/region, e.g. \"California\". When set without visitorLocation, results are limited to US visitors." }, "tag": { "type": "string", "description": "Tag name (not id) to filter by, e.g. \"HOT\"; tag names are stored in upper case and matched case-insensitively. Names come from list_tags." }, "visits_lower_bound": { "type": "number", "description": "Minimum number of visits (sessions). Default 0." }, "visits_upper_bound": { "type": "number", "description": "Maximum number of visits (sessions). Leave it out to include every lead, however many visits." }, "employeesMin": { "type": "number", "description": "Smallest company headcount to include, e.g. 10." }, "employeesMax": { "type": "number", "description": "Largest company headcount to include, e.g. 200." }, "tech": { "type": "string", "description": "Technology the company uses, case-insensitive partial match, e.g. \"HubSpot\", or a JSON array string of several: '[\"HubSpot\",\"Shopify\"]'." }, "exactVisitor": { "type": "boolean", "description": "true to list only leads where the exact person was identified (name and contact details), false for all leads. Leave it out for all leads." }, "utmSource": { "type": "string", "description": "JSON array string of [operator, value] pairs, e.g. '[[\"contains\",\"google\"]]'. Operators: contains, not-contains, starts-with, ends-with. A plain string (not JSON) makes the call fail." }, "utmMedium": { "type": "string", "description": "JSON array string of [operator, value] pairs, e.g. '[[\"contains\",\"cpc\"]]'. Same operators as utmSource." }, "pageVisited": { "type": "string", "description": "JSON array string of [operator, value] pairs matched against visited page paths, e.g. '[[\"contains\",\"pricing\"]]' or '[[\"not-contains\",\"careers\"]]'. Operators: contains, not-contains, starts-with (value without the leading slash), ends-with. A plain string makes the call fail." } }, "required": [ "websiteId", "dateFrom", "dateTo" ] } } ``` # get_linkedin_campaign_timeline (/docs/mcp/tools/get-linkedin-campaign-timeline) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_linkedin_campaign_timeline.mdx. */} **Get a LinkedIn campaign timeline** · Read-only What a LinkedIn campaign did day by day over the last days: invitations sent, accepted, messages sent and replies. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. | | `days` | `number` | No | How many days back (1-90). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_linkedin_campaign_timeline", "title": "Get a LinkedIn campaign timeline", "annotations": { "title": "Get a LinkedIn campaign timeline", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinCampaignId": { "type": "string", "description": "LinkedIn campaign ID from list_linkedin_campaigns." }, "days": { "type": "number", "minimum": 1, "maximum": 90, "description": "How many days back (1-90)." } }, "required": [ "websiteId", "linkedinCampaignId" ] } } ``` # get_linkedin_campaign (/docs/mcp/tools/get-linkedin-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_linkedin_campaign.mdx. */} **Get a LinkedIn campaign** · Read-only One LinkedIn campaign of this website: its settings and the people in it with their status (invited, connected, messaged, replied), optionally one status, page by page. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. | | `status` | `string` | No | Only people with this status. | | `page` | `number` | No | Page of people, from 1. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_linkedin_campaign", "title": "Get a LinkedIn campaign", "annotations": { "title": "Get a LinkedIn campaign", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinCampaignId": { "type": "string", "description": "LinkedIn campaign ID from list_linkedin_campaigns." }, "status": { "type": "string", "description": "Only people with this status." }, "page": { "type": "number", "minimum": 1, "description": "Page of people, from 1." } }, "required": [ "websiteId", "linkedinCampaignId" ] } } ``` # get_list (/docs/mcp/tools/get-list) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_list.mdx. */} **Get a list** · Read-only Returns one list with its contacts or companies, page by page. Returns 404 when the list is not one of this website's. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | _id from list_lists. | | `page` | `number` | No | Page of items, starting at 1. | | `limit` | `number` | No | Items per page. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_list", "title": "Get a list", "annotations": { "title": "Get a list", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact for lists of people, company for lists of companies." }, "listId": { "type": "string", "description": "_id from list_lists." }, "page": { "type": "number", "minimum": 1, "description": "Page of items, starting at 1." }, "limit": { "type": "number", "minimum": 1, "description": "Items per page." } }, "required": [ "websiteId", "listType", "listId" ] } } ``` # get_permissions_catalog (/docs/mcp/tools/get-permissions-catalog) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_permissions_catalog.mdx. */} **Get the permissions catalog** · Read-only Returns every permission a member can be given and the presets (full, sales, developer, viewer, team, client) with the permissions each one ticks. Use it before invite_members or update_member. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_permissions_catalog", "title": "Get the permissions catalog", "annotations": { "title": "Get the permissions catalog", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": {} } } ``` # get_pricing (/docs/mcp/tools/get-pricing) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_pricing.mdx. */} **Get outreach mailbox and domain pricing** · Read-only Returns the account's prices for outreach mailboxes and sending domains: mailboxPricePerMonthUSD (and the yearly equivalent), whether custom or default pricing applies, the defaults, and the outreach starter-kit state (available now, or earned on upgrade). It does NOT return subscription plan prices; to see what a plan change would cost use preview_plan_change, and for the current plan use get_subscription. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_pricing", "title": "Get outreach mailbox and domain pricing", "annotations": { "title": "Get outreach mailbox and domain pricing", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": {} } } ``` # get_prospects (/docs/mcp/tools/get-prospects) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_prospects.mdx. */} **List campaign prospects** · Read-only List the contacts (prospects) already added to email campaigns on a website, newest first. Pass campaignId (from list_campaigns) to see one campaign's prospects; each prospect carries its emails[] with the per-step schedule, send time, opens and replies. Use get_inbox_emails for replies only, and search_people/get_leads to find new contacts. websiteId comes from list_websites. Returns prospects[], totalCount and totalPages. Page size is 50 for the whole website, 200 for one campaign. The prospect _id is the prospectId used by stop_prospect and remove_prospect_from_campaign. When the campaign is paused, every prospect is shown with paused: true. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `campaignId` | `string` | No | Optional email campaign id from list_campaigns. Limits the list to that campaign. | | `page` | `number` | No | Page number, starting at 1. Default 1. | | `status` | `string` | No | Optional prospect status filter, e.g. scheduled, contacted, warm-reply, cold-reply, bounced, unsubscribed, out-of-office, error-sending, manually-paused, delayed, skipped. An unknown value is ignored and all prospects are returned. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_prospects", "title": "List campaign prospects", "annotations": { "title": "List campaign prospects", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "campaignId": { "type": "string", "description": "Optional email campaign id from list_campaigns. Limits the list to that campaign." }, "page": { "type": "number", "description": "Page number, starting at 1. Default 1." }, "status": { "type": "string", "description": "Optional prospect status filter, e.g. scheduled, contacted, warm-reply, cold-reply, bounced, unsubscribed, out-of-office, error-sending, manually-paused, delayed, skipped. An unknown value is ignored and all prospects are returned." } }, "required": [ "websiteId" ] } } ``` # get_recording_url (/docs/mcp/tools/get-recording-url) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_recording_url.mdx. */} **Get recording playback link** · Read-only Get a signed playback link for one session recording. The link expires after 5 minutes, so open or share it right away and request a new one later. sessionId is session_id and clientId is client_id from get_lead_recordings (clientId also from get_website). The session must be among the website's 100 most recent recordings, otherwise access is refused. Returns url. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `sessionId` | `string` | Yes | Recording id (session_id from get_lead_recordings), 16-64 characters. | | `clientId` | `string` | Yes | The website's clientId that owns the recording (client_id from get_lead_recordings, or from get_website). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_recording_url", "title": "Get recording playback link", "annotations": { "title": "Get recording playback link", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "sessionId": { "type": "string", "description": "Recording id (session_id from get_lead_recordings), 16-64 characters." }, "clientId": { "type": "string", "description": "The website's clientId that owns the recording (client_id from get_lead_recordings, or from get_website)." } }, "required": [ "sessionId", "clientId" ] } } ``` # get_slack_message_template (/docs/mcp/tools/get-slack-message-template) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_slack_message_template.mdx. */} **Get the Slack message template** · Read-only The template of the message posted to Slack for each lead, with its merge fields. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_slack_message_template", "title": "Get the Slack message template", "annotations": { "title": "Get the Slack message template", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_subscription (/docs/mcp/tools/get-subscription) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_subscription.mdx. */} **Get subscription** · Read-only Shows the current subscription: plan, tierName, leads per month, usedCredits, remaining, topUpCredits, refreshOn, price (monthly equivalent, USD), annualTotal, interval ('month' or 'year'), nextBillingDate, cancelAtPeriodEnd, subscriptionStatus, isPausedByUser/pausedUntil, pendingDowngrade, retentionDiscount and add-ons. Read-only. Call it before any plan change: the interval tells you which value of `annual` to pass to preview_plan_change, upgrade_plan and downgrade_plan. Price fields are empty when there is no paid subscription. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_subscription", "title": "Get subscription", "annotations": { "title": "Get subscription", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": {} } } ``` # get_tracking_pixel (/docs/mcp/tools/get-tracking-pixel) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_tracking_pixel.mdx. */} **Get tracking snippet** · Read-only Returns the JavaScript snippet to install on a website so visitors can be identified, plus websiteId, clientId, status and url. Give trackingScript to the user to add to every page of their site (or their tag manager / site builder). After it is installed, run verify_website. websiteId comes from list_websites or add_website. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites or add_website. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_tracking_pixel", "title": "Get tracking snippet", "annotations": { "title": "Get tracking snippet", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites or add_website." } }, "required": [ "websiteId" ] } } ``` # get_warmup_health (/docs/mcp/tools/get-warmup-health) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_warmup_health.mdx. */} **Get warmup health** · Read-only Returns one mailbox's warmup health: reputation, inbox vs spam placement and what to fix. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | _id of the mailbox from list_email_accounts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_warmup_health", "title": "Get warmup health", "annotations": { "title": "Get warmup health", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "_id of the mailbox from list_email_accounts." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # get_warmup_stats (/docs/mcp/tools/get-warmup-stats) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_warmup_stats.mdx. */} **Get warmup stats** · Read-only Get warmup statistics for all mailboxes on a website: totals (mailboxes, warmup on, connected, warmup emails sent and received) and per mailbox the daily volume, inbox placement and reputation. websiteId comes from list_websites. reputation is only reported when a health check from the last 7 days backs it, otherwise it is insufficient_data with healthScore null. sentToday is the real number of warmup emails sent today and effectiveDailyLimit the limit actually enforced; currentDailyVolume resets daily. rampWeek (= warmupSettings.currentWeek) is the warmup ramp week and is null while warmup is off; rampingCurrentWeek on list_email_accounts is a different thing, the campaign sending ramp. warmupPlacement counts warmup emails that landed in inbox vs spam. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_warmup_stats", "title": "Get warmup stats", "annotations": { "title": "Get warmup stats", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_web_scraping (/docs/mcp/tools/get-web-scraping) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_web_scraping.mdx. */} **Get Web Scraping keywords** · Read-only Web Scraping looks for your keywords on websites across the open web — in the page text or in the scripts a site loads — and adds the companies that match, with their people, as leads under Leads › Web Scraping. A keyword can be a phrase your buyers write about themselves ("ships worldwide") or a domain such as a competitor's tracker (competitor-tool.com). Returns whether it is on, the keywords and their match mode, the daily limit, contacts-only, leads today and in total, and leads per keyword over the last 7 days. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_web_scraping", "title": "Get Web Scraping keywords", "annotations": { "title": "Get Web Scraping keywords", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_website_analytics (/docs/mcp/tools/get-website-analytics) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_analytics.mdx. */} **Get website audience breakdown** · Read-only Summarises who the identified leads on a website are, over a date range (default the last 30 days): top 10 industries, all company-size ranges, top 10 job titles and top 5 countries, each with a count. Empty lists mean no data in the range. For leads per day use get_website_daily_stats; for the leads themselves use get_leads. websiteId comes from list_websites. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `dateFrom` | `string` | No | Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days. | | `dateTo` | `string` | No | End date (inclusive), same formats as dateFrom. Only used together with dateFrom. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_website_analytics", "title": "Get website audience breakdown", "annotations": { "title": "Get website audience breakdown", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "dateFrom": { "type": "string", "description": "Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days." }, "dateTo": { "type": "string", "description": "End date (inclusive), same formats as dateFrom. Only used together with dateFrom." } }, "required": [ "websiteId" ] } } ``` # get_website_credit_history (/docs/mcp/tools/get-website-credit-history) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_credit_history.mdx. */} **Get website credit history** · Read-only Returns the credit snapshots stored for one website: each entry has creditsLimit, creditsRemaining, creditsUsed, refreshOn and timestamps. Returns \{ history: [...] \}, the full list (no paging). Use it for a website that has its own credit allowance. For individual credit charges and refunds use get_credit_history. websiteId comes from list_websites. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (24-character ID). | | `page` | `number` | No | Accepted but currently ignored; the whole history is returned. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_website_credit_history", "title": "Get website credit history", "annotations": { "title": "Get website credit history", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (24-character ID)." }, "page": { "type": "number", "description": "Accepted but currently ignored; the whole history is returned." } }, "required": [ "websiteId" ] } } ``` # get_website_daily_stats (/docs/mcp/tools/get-website-daily-stats) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_daily_stats.mdx. */} **Get daily lead counts** · Read-only Returns one row per day for a website (default the last 30 days, every day included even with 0): date (YYYY-MM-DD, UTC), leadsIdentified, avgIcpScore and leadsWithIcpScore. Each lead is counted on the day of its most recent visit, so a returning lead moves to its latest day. leadsProspected, emailsSent and emailsScheduled are always 0 here. For the audience breakdown use get_website_analytics. websiteId comes from list_websites. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `dateFrom` | `string` | No | Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days. | | `dateTo` | `string` | No | End date (inclusive), same formats as dateFrom. Only used together with dateFrom. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_website_daily_stats", "title": "Get daily lead counts", "annotations": { "title": "Get daily lead counts", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "dateFrom": { "type": "string", "description": "Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days." }, "dateTo": { "type": "string", "description": "End date (inclusive), same formats as dateFrom. Only used together with dateFrom." } }, "required": [ "websiteId" ] } } ``` # get_website_diagnostics (/docs/mcp/tools/get-website-diagnostics) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_diagnostics.mdx. */} **Diagnose website** · Read-only Checks why a website may not be producing leads. Returns processing.isBlocked and shouldExpectLeads, credits (account, website and effective credits, and whether the website has its own allowance), recentActivity (leadsLast48Hours, lastLeadCreatedAt, hasNeverGeneratedLeads) and messages.primary, a one-line status that names the block reason (e.g. trial expired, credits exhausted, account paused). Use it for 'no leads' questions; to check the snippet is installed use verify_website. websiteId comes from list_websites. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_website_diagnostics", "title": "Diagnose website", "annotations": { "title": "Diagnose website", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # get_website (/docs/mcp/tools/get-website) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website.mdx. */} **Get website** · Read-only Returns one website's details: name, url, domain, clientId, trackingScript (the install snippet), status (unverified, verified, removed or failed), lastVerifiedAt, tracking settings (identifySettings, trackExactVisitors, trackCompanyWithSuggestedContacts, trackPersonalEmails, session recording, email digest), credit limits and remaining, trial dates, tags, intent-topic state, integrations and members. websiteId comes from list_websites. If the ID is unknown the result says 'No website found'. For just the snippet use get_tracking_pixel. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (24-character ID). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "get_website", "title": "Get website", "annotations": { "title": "Get website", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (24-character ID)." } }, "required": [ "websiteId" ] } } ``` # hide_lead (/docs/mcp/tools/hide-lead) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/hide_lead.mdx. */} **Hide or unhide a lead** · Changes data Hide a lead from the leads list (hide=true, the default) or bring a hidden lead back (hide=false). Hidden leads no longer appear in get_leads. Hiding is reversible and keeps the lead's data; it does not give back the credit the lead used. To remove a lead for good use delete_lead. leadId comes from get_leads. Returns status 'Successful'; hiding an already hidden lead returns an error 'Lead is already hidden.' | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | | `hide` | `boolean` | No | true (default) hides the lead; false makes a hidden lead visible again. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "hide_lead", "title": "Hide or unhide a lead", "annotations": { "title": "Hide or unhide a lead", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." }, "hide": { "type": "boolean", "description": "true (default) hides the lead; false makes a hidden lead visible again." } }, "required": [ "leadId" ] } } ``` # All tools (/docs/mcp/tools) {/* Generated by scripts/sync-mcp-tools.mjs. Do not edit. */} Your assistant sees these automatically and picks the right one for your request; you never call them by name. **230 tools**: 99 read-only, 100 that change data, 31 that delete or overwrite data, 43 that act outside your account (send email, push to a CRM, charge a card) and 13 that can spend credits or money. ## Account & billing [#account--billing] | Tool | What it does | | | --- | --- | --- | | [`get_account`](/docs/mcp/tools/get-account) | Shows the signed-in account: plan, credit limits and remaining credits, refresh and trial dates, add-ons, features, settings, pause status, failed-payment flag and the account's websites (the first 11 only). | Read-only | | [`update_account_tracking_settings`](/docs/mcp/tools/update-account-tracking-settings) | Turns tracking options on or off for every website of the account at once: identify people, suggested contacts, personal emails, session recordings. | Changes data | | [`get_credit_summary`](/docs/mcp/tools/get-credit-summary) | Credits used in a billing cycle, by source (website visitors, Prospector, AI Scout, Web Scraping…) and by day, with what is left. | Read-only | | [`list_billing_domains`](/docs/mcp/tools/list-billing-domains) | The sending domains billed to the account, with their yearly price, renewal date and auto-renew. | Read-only | | [`list_open_invoices`](/docs/mcp/tools/list-open-invoices) | The account invoices that are still open or past due, with amount and due date. | Read-only | | [`list_invoices`](/docs/mcp/tools/list-invoices) | The account's invoices, newest first: date, amount, currency, status (paid, open) and a link to the PDF. | Read-only | | [`get_auto_topup`](/docs/mcp/tools/get-auto-topup) | Whether auto top-up is on: when credits run out, a pack of leads is bought automatically, up to a monthly cap in USD. | Read-only | | [`set_auto_topup`](/docs/mcp/tools/set-auto-topup) | Turns auto top-up on or off and sets the pack of leads bought each time credits run out and the monthly cap in USD. | Changes data | | [`get_billing`](/docs/mcp/tools/get-billing) | Returns the same subscription summary as get_subscription: plan, leads per month, credits used and remaining, top-up credits, price, billing interval, next billing date, whether it is set to cancel or is paused, pending downgrade and any running retention discount. | Read-only | | [`get_pricing`](/docs/mcp/tools/get-pricing) | Returns the account's prices for outreach mailboxes and sending domains: mailboxPricePerMonthUSD (and the yearly equivalent), whether custom or default pricing applies, the defaults, and the outreach starter-kit state (available now, or earned on upgrade). | Read-only | | [`get_credit_history`](/docs/mcp/tools/get-credit-history) | Lists the account's credit transactions from the last 90 days, newest first: each row has operation (CHARGE, REFUND or DUPLICATE_PREVENTED), amount, credits before/after, the website, the lead's domain/email, a source category (WEBSITE_VISITOR, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, INTENT_SIGNALS, ADJUSTMENT, OTHER), a reason and createdAt. | Read-only | | [`get_website_credit_history`](/docs/mcp/tools/get-website-credit-history) | Returns the credit snapshots stored for one website: each entry has creditsLimit, creditsRemaining, creditsUsed, refreshOn and timestamps. | Read-only | | [`get_subscription`](/docs/mcp/tools/get-subscription) | Shows the current subscription: plan, tierName, leads per month, usedCredits, remaining, topUpCredits, refreshOn, price (monthly equivalent, USD), annualTotal, interval ('month' or 'year'), nextBillingDate, cancelAtPeriodEnd, subscriptionStatus, isPausedByUser/pausedUntil, pendingDowngrade, retentionDiscount and add-ons. | Read-only | | [`preview_plan_change`](/docs/mcp/tools/preview-plan-change) | Shows what a plan change would cost without changing anything. | Read-only | | [`upgrade_plan`](/docs/mcp/tools/upgrade-plan) | Moves the subscription to more leads per month right away and charges the card on file today. | Changes data · Credits | | [`downgrade_plan`](/docs/mcp/tools/downgrade-plan) | Schedules the subscription to change to a new number of leads per month from the next billing date; nothing is charged or refunded now and current credits stay until then. | Changes data | | [`pause_subscription`](/docs/mcp/tools/pause-subscription) | Pauses the subscription for 1 to 6 months: invoices during the pause are not collected, no new leads come in while paused, and it resumes automatically on pausedUntil. | Deletes or overwrites data | | [`cancel_subscription`](/docs/mcp/tools/cancel-subscription) | Cancels the subscription at the end of the current billing period (it stays usable until then) and records why. | Deletes or overwrites data | | [`reactivate_subscription`](/docs/mcp/tools/reactivate-subscription) | Undoes a cancellation that has not taken effect yet, or ends a pause early. | Changes data | ## Free tools [#free-tools] | Tool | What it does | | | --- | --- | --- | | [`free_enrich_company`](/docs/mcp/free-tools/free-enrich-company) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | | [`free_intent_signals`](/docs/mcp/free-tools/free-intent-signals) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | | [`free_find_decision_makers`](/docs/mcp/free-tools/free-find-decision-makers) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | | [`free_companies_using_tech`](/docs/mcp/free-tools/free-companies-using-tech) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | | [`free_find_lookalikes`](/docs/mcp/free-tools/free-find-lookalikes) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | | [`free_people_search`](/docs/mcp/free-tools/free-people-search) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | | [`free_email_pattern`](/docs/mcp/free-tools/free-email-pattern) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only | ## Team [#team] | Tool | What it does | | | --- | --- | --- | | [`list_members`](/docs/mcp/tools/list-members) | Lists the people on the account as team: userId, name, email, role (Owner or Member), permissions, preset, websites and whether their invite is still pending. | Read-only | | [`get_permissions_catalog`](/docs/mcp/tools/get-permissions-catalog) | Returns every permission a member can be given and the presets (full, sales, developer, viewer, team, client) with the permissions each one ticks. | Read-only | | [`invite_members`](/docs/mcp/tools/invite-members) | Invites people to the account; each one receives an invitation email to set a password. | Changes data | | [`update_member`](/docs/mcp/tools/update-member) | Changes a member's role, permissions or websites. | Changes data | | [`remove_member`](/docs/mcp/tools/remove-member) | Removes a person from the account: they lose access straight away. | Deletes or overwrites data | ## Prospector [#prospector] | Tool | What it does | | | --- | --- | --- | | [`create_contact`](/docs/mcp/tools/create-contact) | Saves a new person record (name, job title, company domain) and returns it with its _id. | Changes data | | [`verify_contact`](/docs/mcp/tools/verify-contact) | Checks whether the email of a saved contact is valid and deliverable. | Changes data · Credits | | [`search_companies`](/docs/mcp/tools/search-companies) | Searches the company database by name or domain keyword, industry, HQ country, headcount, revenue and technologies. | Read-only | | [`search_people`](/docs/mcp/tools/search-people) | Searches the 209M-contact people database by job title, company, company HQ country, seniority, department, industry, technology and company size. | Read-only | | [`reveal_contact`](/docs/mcp/tools/reveal-contact) | Returns the email address and phone number held for one person from search_people. | Changes data · Credits | | [`find_contact_email`](/docs/mcp/tools/find-contact-email) | Looks for a business email for one search_people contact by trying likely address patterns at their company and verifying each one. | Changes data · Credits | | [`list_auto_searches`](/docs/mcp/tools/list-auto-searches) | Lists the Auto Searches of one website: name, status (running or paused), preferences, people per day, leads delivered today and in total, the matching pool and the last run. | Read-only | | [`build_auto_search_profile`](/docs/mcp/tools/build-auto-search-profile) | Turns a plain-English description of the ideal customer ("founders of US SaaS companies with 10-200 staff") into Auto Search preferences: field, values and weight (Must, High, Prefer or Bonus). | Read-only | | [`create_auto_search`](/docs/mcp/tools/create-auto-search) | Creates an Auto Search and starts it: every day new people matching the preferences are verified and added to the website's leads, 1 credit per lead delivered, up to perDay a day, until it is paused. | Changes data · Credits | | [`pause_auto_search`](/docs/mcp/tools/pause-auto-search) | Pauses one Auto Search: no more leads are delivered and no more credits are used until it is resumed. | Changes data | | [`resume_auto_search`](/docs/mcp/tools/resume-auto-search) | Resumes a paused Auto Search: deliveries start again today, 1 credit per lead delivered. | Changes data · Credits | | [`get_icp`](/docs/mcp/tools/get-icp) | Returns the ideal customer profile (ICP) saved for a website: the companies the user wants to reach. | Read-only | | [`update_icp`](/docs/mcp/tools/update-icp) | Changes a website's ideal customer profile: target industries, sectors, HQ locations, headcount and revenue ranges. | Changes data | ## Qualify (lead scoring) [#qualify-lead-scoring] | Tool | What it does | | | --- | --- | --- | | [`recalculate_lead_scores`](/docs/mcp/tools/recalculate-lead-scores) | Re-run lead scoring for specific leads against the website's current scoring models, and answer any AI qualification questions those leads do not have an answer for yet. | Changes data | | [`list_lead_scoring_models`](/docs/mcp/tools/list-lead-scoring-models) | List a website's lead scoring models (Qualify): the rules that score each lead on company, people and behaviour criteria and mark it warm or hot. | Read-only | | [`create_lead_scoring_model`](/docs/mcp/tools/create-lead-scoring-model) | Create a lead scoring model on a website, with its rules: criteria (same shape as get_lead_scoring_model / update_lead_scoring_model), active and aiMatching are saved with it. | Changes data | | [`ai_generate_scoring_model`](/docs/mcp/tools/ai-generate-scoring-model) | Have AI build a lead scoring model from the website's own pages (it reads the site to infer the ideal customer) and save it as 'ICP Score - AI Generated'. | Changes data | | [`get_lead_scoring_model`](/docs/mcp/tools/get-lead-scoring-model) | Get one lead scoring model with all its rules. | Read-only | | [`update_lead_scoring_model`](/docs/mcp/tools/update-lead-scoring-model) | Change a lead scoring model's name, on/off state and/or rules. | Deletes or overwrites data | | [`delete_lead_scoring_model`](/docs/mcp/tools/delete-lead-scoring-model) | Permanently delete a lead scoring model and remove its score from every lead of the website. | Deletes or overwrites data | ## Automations & CRM [#automations--crm] | Tool | What it does | | | --- | --- | --- | | [`get_lead_automation_history`](/docs/mcp/tools/get-lead-automation-history) | List every automation run recorded for one lead, newest first, as automationLogs[] with status, message (the result or error text), automation (the automation id, see list_automations) and executedAt. | Read-only | | [`retrigger_automations`](/docs/mcp/tools/retrigger-automations) | Runs a website's automations again for a list of leads, for example after a CRM or Slack connection was fixed. | Changes data | | [`list_crm_variables`](/docs/mcp/tools/list-crm-variables) | The lead and company fields (name, email, job title, company size, pages visited, score…) that can be mapped to fields in your CRM. | Read-only | | [`get_crm_mappings`](/docs/mcp/tools/get-crm-mappings) | The field mappings used when leads are pushed to a CRM: which lead field fills which CRM field, for contacts and companies. | Read-only | | [`set_crm_mappings`](/docs/mcp/tools/set-crm-mappings) | Sets the field mappings for contacts or companies pushed to a CRM. | Deletes or overwrites data | | [`get_slack_message_template`](/docs/mcp/tools/get-slack-message-template) | The template of the message posted to Slack for each lead, with its merge fields. | Read-only | | [`set_slack_message_template`](/docs/mcp/tools/set-slack-message-template) | Changes the template of the message posted to Slack for each lead. | Changes data | | [`send_slack_test_message`](/docs/mcp/tools/send-slack-test-message) | Posts a sample lead message to a Slack channel so you can see how it looks. | Changes data | | [`test_webhook`](/docs/mcp/tools/test-webhook) | Sends a sample lead, as automations send them, to a URL so you can check your endpoint receives and parses it. | Changes data | | [`preview_automation_filter`](/docs/mcp/tools/preview-automation-filter) | Counts the leads of the last days that match a saved filter, and shows a few of them, before you use the filter in an automation. | Read-only | | [`get_automation_stats`](/docs/mcp/tools/get-automation-stats) | For every automation of a website: how many leads it handled, how many failed and when it last ran. | Read-only | | [`get_automation_runs`](/docs/mcp/tools/get-automation-runs) | The runs of one automation, newest first: which lead each run handled, when, and whether it succeeded (and why not). | Read-only | | [`list_slack_channels`](/docs/mcp/tools/list-slack-channels) | The channels of the Slack workspace connected to this website, to pick one for a Slack automation. | Read-only | | [`list_automations`](/docs/mcp/tools/list-automations) | Lists a website's automations: rules that act when a lead matches, for example sending to Slack, a CRM, a webhook, Zapier, an email or LinkedIn campaign, or an email alert. | Read-only | | [`create_automation`](/docs/mcp/tools/create-automation) | Creates an automation that is active straight away and runs whenever a lead matches it. | Changes data | | [`get_automation`](/docs/mcp/tools/get-automation) | Returns the full setup of one automation: name, isActive, when (trigger event), then (action), trigger, interval, frequency settings (repeatWindowHours, dedupeScope), contact selection, email verification rules, filter and the action settings. | Read-only | | [`update_automation`](/docs/mcp/tools/update-automation) | Changes an existing automation: its name, rule, action settings or on/off state. | Changes data | | [`delete_automation`](/docs/mcp/tools/delete-automation) | Deletes an automation permanently, so it no longer acts on any lead. | Deletes or overwrites data | | [`toggle_automation`](/docs/mcp/tools/toggle-automation) | Switches an automation on or off without changing its setup. | Changes data | | [`rerun_automation_for_lead`](/docs/mcp/tools/rerun-automation-for-lead) | Runs one type of automation again for a single lead right now and reports the outcome. | Changes data | | [`push_lead_to_crm`](/docs/mcp/tools/push-lead-to-crm) | Creates a contact in the website's connected CRM: HubSpot, Pipedrive, Salesforce, Zoho or GoHighLevel. | Changes data | | [`list_crm_owners`](/docs/mcp/tools/list-crm-owners) | Lists the users in a connected CRM that a contact can be assigned to. | Read-only | ## Intent data [#intent-data] | Tool | What it does | | | --- | --- | --- | | [`get_intent_topics_catalog`](/docs/mcp/tools/get-intent-topics-catalog) | Lists every third-party intent topic you can subscribe to, e.g. | Read-only | | [`list_intent_topics`](/docs/mcp/tools/list-intent-topics) | Lists the intent topics a website is subscribed to, with delivery numbers. | Read-only | | [`subscribe_to_intent_topic`](/docs/mcp/tools/subscribe-to-intent-topic) | Subscribes a website to an intent topic, so companies researching that topic start arriving as leads each day, up to the daily limit. | Changes data · Credits | | [`update_intent_topic`](/docs/mcp/tools/update-intent-topic) | Pauses or resumes an intent topic subscription, or changes its daily lead limit. | Changes data | | [`delete_intent_topic`](/docs/mcp/tools/delete-intent-topic) | Unsubscribes a website from an intent topic and deletes the subscription, including its delivery counters. | Deletes or overwrites data | ## Campaigns & inbox [#campaigns--inbox] | Tool | What it does | | | --- | --- | --- | | [`list_email_blacklist`](/docs/mcp/tools/list-email-blacklist) | Lists the email addresses campaigns on this website never send to, grouped by the name they were added under. | Read-only | | [`add_to_email_blacklist`](/docs/mcp/tools/add-to-email-blacklist) | Adds email addresses that campaigns on this website must never send to, e.g. | Changes data | | [`remove_from_email_blacklist`](/docs/mcp/tools/remove-from-email-blacklist) | Removes every address added under one group name; campaigns can email them again. | Deletes or overwrites data | | [`update_campaign`](/docs/mcp/tools/update-campaign) | Renames a campaign, starts it (status active: emails start going out to its contacts) or pauses it, or changes its sending days (0 Sunday to 6 Saturday), hours (timeSlot start and end, 0-24), timezone or open/click tracking. | Changes data | | [`clone_campaign`](/docs/mcp/tools/clone-campaign) | Copies a campaign with its steps and settings, named '\ (copy)'. | Changes data | | [`get_campaign_stats`](/docs/mcp/tools/get-campaign-stats) | Returns how a campaign is doing: emails sent, opened, clicked, replied, bounced and unsubscribed, with rates. | Read-only | | [`get_campaign_capacity`](/docs/mcp/tools/get-campaign-capacity) | Returns the campaign's health: connected mailboxes and their daily limits, how many emails it can send a day, and what is holding it back (e.g. | Read-only | | [`add_campaign_step`](/docs/mcp/tools/add-campaign-step) | Adds one email at the end of a campaign's sequence, sent delayDays after the previous one (the first step of an empty campaign becomes the opening email). | Changes data | | [`delete_campaign_step`](/docs/mcp/tools/delete-campaign-step) | Removes one email from a campaign's sequence for good. | Deletes or overwrites data | | [`reorder_campaign_steps`](/docs/mcp/tools/reorder-campaign-steps) | Puts a campaign's emails in a new order. | Changes data | | [`resume_prospects`](/docs/mcp/tools/resume-prospects) | Resumes paused prospects so their emails are sent again from their next scheduled step. | Changes data | | [`send_prospects_now`](/docs/mcp/tools/send-prospects-now) | Sends the next email of their sequence to the given prospects right away instead of at their scheduled time, within the mailbox limits. | Changes data | | [`change_prospects_mailbox`](/docs/mcp/tools/change-prospects-mailbox) | Moves prospects to another mailbox: their next emails are sent from it. | Changes data | | [`reschedule_prospects`](/docs/mcp/tools/reschedule-prospects) | Recalculates when the next email of each prospect goes out, spread over the coming days within the mailbox limits, e.g. | Changes data | | [`generate_campaign_emails_ai`](/docs/mcp/tools/generate-campaign-emails-ai) | Writes a sequence of emails for a campaign with AI, from your website, offer and ideal customer, and saves them as the campaign steps. | Changes data | | [`list_linkedin_keywords`](/docs/mcp/tools/list-linkedin-keywords) | The keywords watched on LinkedIn (LinkedIn Fans): people who post or comment about them become leads. | Read-only | | [`add_linkedin_keyword`](/docs/mcp/tools/add-linkedin-keyword) | Starts watching a keyword on LinkedIn: people who post or comment about it become leads. | Changes data | | [`set_linkedin_keyword_status`](/docs/mcp/tools/set-linkedin-keyword-status) | Pauses or resumes watching one LinkedIn keyword. | Changes data | | [`delete_linkedin_keyword`](/docs/mcp/tools/delete-linkedin-keyword) | Stops watching a LinkedIn keyword for good and removes it from the list. | Deletes or overwrites data | | [`list_linkedin_tracked_posts`](/docs/mcp/tools/list-linkedin-tracked-posts) | The LinkedIn posts being tracked: people who react to or comment on them become leads. | Read-only | | [`add_linkedin_tracked_post`](/docs/mcp/tools/add-linkedin-tracked-post) | Starts tracking a LinkedIn post (yours or someone else’s): people who react to or comment on it become leads. | Changes data | | [`update_linkedin_account`](/docs/mcp/tools/update-linkedin-account) | Changes the label of a connected LinkedIn account, or pauses and resumes it (paused: its campaigns send nothing). | Changes data | | [`list_google_ads_audiences`](/docs/mcp/tools/list-google-ads-audiences) | The Google Ads retargeting audiences of a website: name, linked Google campaign, contacts uploaded and match stats. | Read-only | | [`get_google_ads_audience`](/docs/mcp/tools/get-google-ads-audience) | One retargeting audience: settings, contacts uploaded, match rate and the stats of its Google campaign. | Read-only | | [`sync_google_ads_audience_stats`](/docs/mcp/tools/sync-google-ads-audience-stats) | Fetches the latest impressions, clicks and conversions of an audience’s campaign from Google Ads. | Changes data | | [`dismiss_campaign_capacity_warning`](/docs/mcp/tools/dismiss-campaign-capacity-warning) | Hides a campaign's capacity warning (more contacts than its mailboxes can send to in time) for some days. | Changes data | | [`spam_check_email`](/docs/mcp/tools/spam-check-email) | Checks an email subject and body for words and patterns that send mail to spam, and returns a score with each issue and how to fix it. | Read-only | | [`get_linkedin_campaign`](/docs/mcp/tools/get-linkedin-campaign) | One LinkedIn campaign of this website: its settings and the people in it with their status (invited, connected, messaged, replied), optionally one status, page by page. | Read-only | | [`get_linkedin_campaign_timeline`](/docs/mcp/tools/get-linkedin-campaign-timeline) | What a LinkedIn campaign did day by day over the last days: invitations sent, accepted, messages sent and replies. | Read-only | | [`activate_linkedin_campaign`](/docs/mcp/tools/activate-linkedin-campaign) | Starts a LinkedIn campaign: it begins sending invitations and messages from the connected LinkedIn account, within the account's daily LinkedIn limits. | Changes data | | [`pause_linkedin_campaign`](/docs/mcp/tools/pause-linkedin-campaign) | Pauses a running LinkedIn campaign: nothing more is sent until it is resumed. | Changes data | | [`resume_linkedin_campaign`](/docs/mcp/tools/resume-linkedin-campaign) | Resumes a paused LinkedIn campaign: it continues sending invitations and messages where it stopped. | Changes data | | [`delete_linkedin_campaign`](/docs/mcp/tools/delete-linkedin-campaign) | Deletes a LinkedIn campaign and stops everything it would still send. | Deletes or overwrites data | | [`get_email_template`](/docs/mcp/tools/get-email-template) | Returns one email (step) of a campaign in full: subject and body templates with their merge fields, the sender, the delay before it is sent and its position in the sequence. | Read-only | | [`get_prospects`](/docs/mcp/tools/get-prospects) | List the contacts (prospects) already added to email campaigns on a website, newest first. | Read-only | | [`list_campaigns`](/docs/mcp/tools/list-campaigns) | List the email campaigns of one website, newest first, with their status (isActive), schedule, steps (emailCampaignTemplates), health and a cached stats snapshot (statsRollup: contacted, sent, opens, clicks, replies, bounces and rates, refreshed about every 5 minutes; see computedAt). | Read-only | | [`create_campaign`](/docs/mcp/tools/create-campaign) | Create a new email sequence: the campaign plus one email per entry in steps (the first is the initial email, the rest follow-ups). | Changes data | | [`update_campaign_step`](/docs/mcp/tools/update-campaign-step) | Rewrite one email (step) of an existing campaign: its subject, body and/or delay. | Changes data | | [`get_campaign`](/docs/mcp/tools/get-campaign) | Get one email campaign with live analytics: settings (isActive, schedule, timezone), its steps in emailCampaignTemplates[] (each with _id = templateId for update_campaign_step, subject, body and per-step stats), stats (prospect total, scheduledCount, uniqueContacted, totalEmailsSent, opens, clicks, replies, warm replies, bounced, unsubscribed and their rates), steps[] (per-step sent/opened/clicked/replied), statusBuckets (prospect counts per status) and statistics (sent vs scheduled over time). | Read-only | | [`add_prospect_to_campaign`](/docs/mcp/tools/add-prospect-to-campaign) | Add one contact to an existing email campaign so it receives the sequence, like Manual Entry in the app. | Changes data | | [`remove_prospect_from_campaign`](/docs/mcp/tools/remove-prospect-from-campaign) | Delete a prospect from its campaign, like "Remove from campaign" in the app: the prospect and its scheduled emails are deleted, emails already sent stay sent, and its history is gone. | Deletes or overwrites data | | [`stop_prospect`](/docs/mcp/tools/stop-prospect) | Stop one prospect's email sequence: no further steps are sent and the prospect is marked manually-paused, keeping it and its history in the campaign. | Deletes or overwrites data | | [`list_linkedin_accounts`](/docs/mcp/tools/list-linkedin-accounts) | List the LinkedIn accounts connected to a website through the browser extension, newest first. | Read-only | | [`list_linkedin_campaigns`](/docs/mcp/tools/list-linkedin-campaigns) | List the LinkedIn connection-request campaigns of a website, newest first, with each campaign's status (draft, active, paused, completed), stats and progress (\{ pct, terminalCount, total \}). | Read-only | | [`get_inbox_emails`](/docs/mcp/tools/get-inbox-emails) | List prospects from the outreach master inbox of a website across all campaigns, most recent activity first. | Read-only | | [`get_email_thread`](/docs/mcp/tools/get-email-thread) | Read one outreach email conversation: the email that was sent (subject, send time, opens) and every reply under it, incoming and outgoing. | Read-only | | [`reply_to_prospect`](/docs/mcp/tools/reply-to-prospect) | Send a reply email to a prospect in an existing outreach conversation. | Changes data | | [`archive_email`](/docs/mcp/tools/archive-email) | Archive one email conversation in the outreach master inbox so it leaves the inbox view; it stays visible with get_inbox_emails status archived. | Changes data | | [`delete_campaign`](/docs/mcp/tools/delete-campaign) | Permanently delete an email campaign together with all its steps and every prospect in it; scheduled emails are never sent and the history is lost. | Deletes or overwrites data | ## Mailboxes & domains [#mailboxes--domains] | Tool | What it does | | | --- | --- | --- | | [`list_email_providers`](/docs/mcp/tools/list-email-providers) | Returns the SMTP and IMAP host, port and TLS settings of common providers (Gmail, Outlook, Zoho…). | Read-only | | [`test_email_account`](/docs/mcp/tools/test-email-account) | Connects to the SMTP and IMAP servers with these settings and says whether sending and reading work, without saving anything. | Read-only | | [`update_warmup_settings`](/docs/mcp/tools/update-warmup-settings) | Changes how hard a mailbox warms up: intensity conservative, normal or aggressive, and the most warmup emails a day (5-100). | Changes data | | [`get_warmup_health`](/docs/mcp/tools/get-warmup-health) | Returns one mailbox's warmup health: reputation, inbox vs spam placement and what to fix. | Read-only | | [`verify_tracking_domain`](/docs/mcp/tools/verify-tracking-domain) | Checks that a mailbox's custom tracking domain has its CNAME record set, so open and click tracking links use your own domain. | Changes data | | [`list_domains`](/docs/mcp/tools/list-domains) | The domains bought or imported for sending, with their mailboxes, DNS state, expiry date and auto-renew. | Read-only | | [`set_domain_auto_renew`](/docs/mcp/tools/set-domain-auto-renew) | Turns automatic yearly renewal of a sending domain on or off. | Changes data | | [`rename_email_account`](/docs/mcp/tools/rename-email-account) | Changes the sender name a mailbox shows, and for mailboxes on our servers the part of the address before the @. | Changes data | | [`reconnect_email_account`](/docs/mcp/tools/reconnect-email-account) | Tries the saved SMTP and IMAP settings of a disconnected mailbox again; when they work, the mailbox is connected and its paused prospects continue. | Changes data | | [`unmark_email_account_spam`](/docs/mcp/tools/unmark-email-account-spam) | Clears the flag set when a mailbox looked like it was going to spam, so it sends again. | Changes data | | [`remove_tracking_domain`](/docs/mcp/tools/remove-tracking-domain) | Stops using the custom open and click tracking domain of a mailbox; tracking falls back to the shared domain. | Deletes or overwrites data | | [`get_email_account`](/docs/mcp/tools/get-email-account) | One mailbox in full: address, sender name and signature, daily sending limit, warmup state and health, and whether it is connected. | Read-only | | [`update_email_account`](/docs/mcp/tools/update-email-account) | Changes a mailbox: the daily sending limit (queued emails are rescheduled to match), the sender name, company, position, phone and the HTML signature. | Changes data | | [`list_email_accounts`](/docs/mcp/tools/list-email-accounts) | List the mailboxes connected to a website for sending outreach, with their health and warmup state. | Read-only | | [`add_email_account`](/docs/mcp/tools/add-email-account) | Connect an existing mailbox to a website for sending outreach, using its SMTP (sending) and IMAP (reading replies) settings. | Changes data | | [`get_email_account_stats`](/docs/mcp/tools/get-email-account-stats) | Get the sending load of every mailbox on a website: how many campaign emails are scheduled on it and how full its next 30 days are. | Read-only | | [`delete_email_account`](/docs/mcp/tools/delete-email-account) | Remove a connected mailbox from the account. | Deletes or overwrites data | | [`toggle_warmup`](/docs/mcp/tools/toggle-warmup) | Turn email warmup on or off for one mailbox. | Changes data | | [`get_warmup_stats`](/docs/mcp/tools/get-warmup-stats) | Get warmup statistics for all mailboxes on a website: totals (mailboxes, warmup on, connected, warmup emails sent and received) and per mailbox the daily volume, inbox placement and reputation. | Read-only | | [`run_deliverability_check`](/docs/mcp/tools/run-deliverability-check) | Run the deliverability check for one mailbox: SPF, DKIM and DMARC of its domain, its custom tracking domain and an IP blacklist score. | Changes data | | [`get_domain_suggestions`](/docs/mcp/tools/get-domain-suggestions) | Suggest look-alike domain names for cold outreach, built from the website's own domain and keeping its ending (e.g. | Read-only | | [`search_domain_availability`](/docs/mcp/tools/search-domain-availability) | Check whether a domain can be registered for outreach and what it costs. | Read-only | | [`add_outreach_domain`](/docs/mcp/tools/add-outreach-domain) | Add an available domain to a website's picked list (the purchase cart). | Changes data | | [`remove_outreach_domain`](/docs/mcp/tools/remove-outreach-domain) | Remove a domain from a website's picked list (purchase cart) before it is bought. | Changes data | | [`purchase_outreach_domains`](/docs/mcp/tools/purchase-outreach-domains) | Buy every domain in the website's picked list (added with add_outreach_domain) and set each one up for outreach: registration, DNS, SPF/DKIM/DMARC, a mailbox and warmup. | Deletes or overwrites data · Credits | | [`get_domain_setup_status`](/docs/mcp/tools/get-domain-setup-status) | Check the setup progress of the outreach domains bought for a website (unpaid picks are not shown). | Read-only | | [`list_outreach_domains`](/docs/mcp/tools/list-outreach-domains) | List every outreach domain of a website, picked or bought, with its status, setup progress, mailboxes and expiry. | Read-only | ## AI Scout [#ai-scout] | Tool | What it does | | | --- | --- | --- | | [`list_ai_scouts`](/docs/mcp/tools/list-ai-scouts) | Lists the AI Scouts of one website: name, description, status (running or paused), people per day, minimum fit, the sources it reads (readsFrom) and how many people each delivered, plus the website's daily AI Scout limit. | Read-only | | [`get_ai_scout`](/docs/mcp/tools/get-ai-scout) | One AI Scout with its sources, how many people it found, qualified and delivered, and the latest people it picked with why they fit. | Read-only | | [`plan_ai_scout`](/docs/mcp/tools/plan-ai-scout) | Turns a description of who to find ("founders of B2B SaaS companies who talk about outbound on podcasts") into a scout name and the sources it would read. | Read-only | | [`create_ai_scout`](/docs/mcp/tools/create-ai-scout) | Creates an AI Scout and runs it right away. | Changes data · Credits | | [`update_ai_scout`](/docs/mcp/tools/update-ai-scout) | Changes an AI Scout's name, description, people per day, minimum fit or sources. | Changes data | | [`pause_ai_scout`](/docs/mcp/tools/pause-ai-scout) | Pauses an AI Scout: no more people are delivered until it is resumed. | Changes data | | [`resume_ai_scout`](/docs/mcp/tools/resume-ai-scout) | Resumes a paused AI Scout. | Changes data · Credits | | [`run_ai_scout`](/docs/mcp/tools/run-ai-scout) | Starts a run of an AI Scout now instead of waiting for its daily run. | Changes data · Credits | | [`delete_ai_scout`](/docs/mcp/tools/delete-ai-scout) | Deletes an AI Scout: it stops for good and is removed from the list. | Deletes or overwrites data | | [`set_ai_scout_daily_limit`](/docs/mcp/tools/set-ai-scout-daily-limit) | Sets how many AI Scout leads (= credits) the website may receive per day across all its scouts, 1 to 500. | Changes data | ## Web Scraping keywords [#web-scraping-keywords] | Tool | What it does | | | --- | --- | --- | | [`get_web_scraping`](/docs/mcp/tools/get-web-scraping) | Web Scraping looks for your keywords on websites across the open web — in the page text or in the scripts a site loads — and adds the companies that match, with their people, as leads under Leads › Web Scraping. | Read-only | | [`update_web_scraping`](/docs/mcp/tools/update-web-scraping) | Turns Web Scraping on or off and sets its keywords (exact or fuzzy match, each can be paused), the daily limit (1-500 leads, 1 credit each) and contacts-only (only companies where we found a person). | Changes data · Credits | | [`suggest_web_scraping_keywords`](/docs/mcp/tools/suggest-web-scraping-keywords) | Keyword ideas for Web Scraping: phrases the website's buyers would write about themselves on their own sites (never the seller's own category words). | Read-only | ## Optimize blog [#optimize-blog] | Tool | What it does | | | --- | --- | --- | | [`list_blog_articles`](/docs/mcp/tools/list-blog-articles) | Lists the articles on a website's hosted blog (Optimize add-on), newest first. | Read-only | | [`get_blog_article`](/docs/mcp/tools/get-blog-article) | Returns one blog article in full (Optimize add-on): its content blocks, FAQ, every version with its status, the public url and the visits it received. | Read-only | | [`create_blog_article`](/docs/mcp/tools/create-blog-article) | Publishes a hand-written article on the website's hosted blog at \/\, or saves it as a draft (Optimize add-on). | Changes data | | [`update_blog_article`](/docs/mcp/tools/update-blog-article) | Edits a blog article by saving a new version at the same URL (Optimize add-on). | Changes data | | [`clear_blog_cache`](/docs/mcp/tools/clear-blog-cache) | Clears every cached copy of the website's hosted blog (Optimize add-on), so visitors get the latest version on their next page load. | Changes data | ## Websites & tracking [#websites--tracking] | Tool | What it does | | | --- | --- | --- | | [`list_websites`](/docs/mcp/tools/list-websites) | Lists the account's tracked websites, newest first, with _id (the websiteId other tools need), name, url, domain, clientId, status (unverified, verified, removed or failed), trial and credit fields, tags and tracking settings. | Read-only | | [`add_website`](/docs/mcp/tools/add-website) | Creates a new website on the account and returns only its websiteId. | Changes data | | [`get_website`](/docs/mcp/tools/get-website) | Returns one website's details: name, url, domain, clientId, trackingScript (the install snippet), status (unverified, verified, removed or failed), lastVerifiedAt, tracking settings (identifySettings, trackExactVisitors, trackCompanyWithSuggestedContacts, trackPersonalEmails, session recording, email digest), credit limits and remaining, trial dates, tags, intent-topic state, integrations and members. | Read-only | | [`get_tracking_pixel`](/docs/mcp/tools/get-tracking-pixel) | Returns the JavaScript snippet to install on a website so visitors can be identified, plus websiteId, clientId, status and url. | Read-only | | [`verify_website`](/docs/mcp/tools/verify-website) | Loads the website's home page (from its saved url) and checks whether this website's tracking snippet is in the HTML. | Changes data | | [`update_website`](/docs/mcp/tools/update-website) | Changes a website's name, url and tracking settings. | Changes data | | [`delete_website`](/docs/mcp/tools/delete-website) | Deletes a website: tracking stops, it disappears from list_websites and its leads are no longer shown, and its website slot is freed. | Deletes or overwrites data | | [`get_website_analytics`](/docs/mcp/tools/get-website-analytics) | Summarises who the identified leads on a website are, over a date range (default the last 30 days): top 10 industries, all company-size ranges, top 10 job titles and top 5 countries, each with a count. | Read-only | | [`get_website_daily_stats`](/docs/mcp/tools/get-website-daily-stats) | Returns one row per day for a website (default the last 30 days, every day included even with 0): date (YYYY-MM-DD, UTC), leadsIdentified, avgIcpScore and leadsWithIcpScore. | Read-only | | [`get_website_diagnostics`](/docs/mcp/tools/get-website-diagnostics) | Checks why a website may not be producing leads. | Read-only | | [`set_website_tags`](/docs/mcp/tools/set-website-tags) | Sets the labels of a website, used to group websites (for example by client or market) in the websites list. | Changes data | | [`set_page_tracking_rules`](/docs/mcp/tools/set-page-tracking-rules) | Sets the page rules of a website. | Deletes or overwrites data | | [`set_website_limits`](/docs/mcp/tools/set-website-limits) | Sets how many of the account's credits and mailboxes one website may use, for accounts that share them between websites (for example one website per client). | Changes data | | [`get_country_blacklist`](/docs/mcp/tools/get-country-blacklist) | Returns the countries whose visitors are never identified on this website (two-letter codes such as DE or FR). | Read-only | | [`set_country_blacklist`](/docs/mcp/tools/set-country-blacklist) | Sets the countries whose visitors are never identified on this website. | Deletes or overwrites data | | [`search_locations`](/docs/mcp/tools/search-locations) | Looks up location names as the location filters expect them: every country with city data, US states (optionally matching q) or cities matching q (optionally within one country). | Read-only | | [`get_domain_blacklist`](/docs/mcp/tools/get-domain-blacklist) | Lists the company domains blocked from becoming leads on a website. | Read-only | | [`add_to_domain_blacklist`](/docs/mcp/tools/add-to-domain-blacklist) | Blocks company domains from becoming new leads on a website (e.g. | Changes data | | [`remove_from_domain_blacklist`](/docs/mcp/tools/remove-from-domain-blacklist) | Deletes a whole named group of blocked domains from a website, so those companies can become leads again. | Deletes or overwrites data | ## Visitors (leads) [#visitors-leads] | Tool | What it does | | | --- | --- | --- | | [`get_leads`](/docs/mcp/tools/get-leads) | List the identified visitors (leads) of one website whose last visit falls in a date range, newest first: the exact person (exactPerson: name, email, phone, LinkedIn, position), their company, visitor location, pages viewed, visits, UTM data, tags and lead scores. | Read-only | | [`get_lead`](/docs/mcp/tools/get-lead) | Get one lead's company profile and visit history: company (name, domain, industry, sector, type, founded year, location, employee range, estimated revenue, LinkedIn/Facebook pages), tags, UTM values, pageVisits[] (url, path, timeSpentMs/timeSpentSeconds, visitCount, sorted by time spent) and summary (totalVisits, lastVisit, totalTimeOnSiteMs, referrer), plus CRM record ids when the lead was pushed. | Read-only | | [`get_lead_ai_summary`](/docs/mcp/tools/get-lead-ai-summary) | Get a short AI-written summary (about 50 words) of what this visitor did on your website, based on their company, country and the pages they viewed, ending with one verdict: 'Ready to Buy', 'Research' or 'Just Browsing'. | Read-only | | [`tag_lead`](/docs/mcp/tools/tag-lead) | Attach an existing tag to a lead. | Changes data | | [`remove_tags_from_lead`](/docs/mcp/tools/remove-tags-from-lead) | Remove one tag from a lead. | Changes data | | [`hide_lead`](/docs/mcp/tools/hide-lead) | Hide a lead from the leads list (hide=true, the default) or bring a hidden lead back (hide=false). | Changes data | | [`delete_lead`](/docs/mcp/tools/delete-lead) | Permanently delete one or more leads. | Deletes or overwrites data | | [`export_leads_csv`](/docs/mcp/tools/export-leads-csv) | Queue a CSV export of a website's leads whose last visit falls in the date range. | Changes data | | [`enrich_domain`](/docs/mcp/tools/enrich-domain) | Look up the people known at a company domain and return them as contacts[] (name, position, email, LinkedIn, isDecisionMaker, plus scores against your scoring models when they have job-title rules). | Changes data · Credits | | [`list_lists`](/docs/mcp/tools/list-lists) | Lists the contact or company lists of one website with their names and ids. | Read-only | | [`create_list`](/docs/mcp/tools/create-list) | Creates an empty contact or company list on a website and returns it. | Changes data | | [`get_list`](/docs/mcp/tools/get-list) | Returns one list with its contacts or companies, page by page. | Read-only | | [`delete_list`](/docs/mcp/tools/delete-list) | Deletes a list for good. | Deletes or overwrites data | | [`remove_list_items`](/docs/mcp/tools/remove-list-items) | Removes contacts or companies from a list; they stay in the account. | Deletes or overwrites data | | [`export_list_csv`](/docs/mcp/tools/export-list-csv) | Builds a CSV of a list and emails the download link to the user. | Changes data | | [`update_filter`](/docs/mcp/tools/update-filter) | Marks a saved leads filter as a favourite (shown first) or not. | Changes data | | [`block_domain`](/docs/mcp/tools/block-domain) | Adds a company domain to the website exclusions: its visitors are not identified and use no credits. | Changes data | | [`block_person`](/docs/mcp/tools/block-person) | Excludes one person (by email, LinkedIn URL or name) from the leads of a website, e.g. | Changes data | | [`purge_leads_below_bar`](/docs/mcp/tools/purge-leads-below-bar) | Removes the leads already in the table that score below the lead quality bar (get_lead_quality). | Deletes or overwrites data | | [`undo_lead_purge`](/docs/mcp/tools/undo-lead-purge) | Brings back the leads removed by the last purge_leads_below_bar, with their tags, comments and history as they were. | Changes data | | [`update_tag`](/docs/mcp/tools/update-tag) | Renames a tag or changes its colour on this website. | Changes data | | [`delete_tag`](/docs/mcp/tools/delete-tag) | Deletes a tag from this website; it is removed from every lead that had it. | Deletes or overwrites data | | [`update_lead_notes`](/docs/mcp/tools/update-lead-notes) | Sets the free-form notes on a lead, replacing what was there; an empty string clears them. | Changes data | | [`get_company_people`](/docs/mcp/tools/get-company-people) | Other people who work at the company of a lead (name, job title, department, seniority, LinkedIn), optionally only one department, to find the right contact when the visitor was not the buyer. | Read-only | | [`rename_list`](/docs/mcp/tools/rename-list) | Renames a contact or company list of this website. | Changes data | | [`set_session_recording`](/docs/mcp/tools/set-session-recording) | Turns session recordings on or off for one website. | Changes data | | [`get_lead_quality`](/docs/mcp/tools/get-lead-quality) | Returns the lead quality settings of a website: the minimum ideal-customer score a lead needs to be kept, the bar per source (website visitors, intent, Web Scraping, Prospector, AI Scout), contacts-only options and the audience focus (B2B, B2C or both). | Read-only | | [`update_lead_quality`](/docs/mcp/tools/update-lead-quality) | Changes the lead quality settings of a website. | Changes data | | [`list_tags`](/docs/mcp/tools/list-tags) | List the tags available on a website: the website's own tags plus the built-in default tags. | Read-only | | [`create_tag`](/docs/mcp/tools/create-tag) | Create a new tag on a website so you can label leads with tag_lead. | Changes data | | [`list_filters`](/docs/mcp/tools/list-filters) | List the saved lead filters (saved views) of a website. | Read-only | | [`create_filter`](/docs/mcp/tools/create-filter) | Save a lead filter under a name so it shows as a saved view on the leads page and can be used as an automation segment. | Changes data | | [`delete_filter`](/docs/mcp/tools/delete-filter) | Delete a saved lead filter. | Deletes or overwrites data | | [`get_lead_comments`](/docs/mcp/tools/get-lead-comments) | Get the comments (team notes) on a lead. | Read-only | | [`add_lead_comment`](/docs/mcp/tools/add-lead-comment) | Add a note to a lead, visible to everyone on the account's team, signed with the connected user's name. | Changes data | | [`update_lead_comment`](/docs/mcp/tools/update-lead-comment) | Replace the text of an existing lead comment. | Deletes or overwrites data | | [`delete_lead_comment`](/docs/mcp/tools/delete-lead-comment) | Permanently delete a comment from a lead. | Deletes or overwrites data | | [`get_lead_recordings`](/docs/mcp/tools/get-lead-recordings) | List session recordings (replays of what a visitor did on your website), newest first, up to 100. | Read-only | | [`get_recording_url`](/docs/mcp/tools/get-recording-url) | Get a signed playback link for one session recording. | Read-only | # invite_members (/docs/mcp/tools/invite-members) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/invite_members.mdx. */} **Invite team members** · Changes data · Acts outside your account Invites people to the account; each one receives an invitation email to set a password. Members get what their role, preset or permissions allow on the websites given. Returns 405 when everyone listed is already on the account. Confirm the emails and access with the user before calling. Needs the master key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `invites` | `object[]` | Yes | One entry per person to invite. | | `invites[].email` | `string` | Yes | Their email address. An invitation email is sent to it. | | `invites[].role` | `"Owner" \| "Member"` | No | Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner. | | `invites[].preset` | `"full" \| "sales" \| "developer" \| "viewer" \| "team" \| "client"` | No | Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog). | | `invites[].permissions` | `string[]` | No | Exact permission ids, from get_permissions_catalog. Overrides the preset. | | `invites[].allWebsites` | `boolean` | No | true: access to every current and future website. | | `invites[].websites` | `string[]` | No | Website ids the member can see, when allWebsites is false. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "invite_members", "title": "Invite team members", "annotations": { "title": "Invite team members", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "invites": { "type": "array", "items": { "type": "object", "properties": { "email": { "type": "string", "description": "Their email address. An invitation email is sent to it." }, "role": { "type": "string", "enum": [ "Owner", "Member" ], "description": "Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner." }, "preset": { "type": "string", "enum": [ "full", "sales", "developer", "viewer", "team", "client" ], "description": "Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog)." }, "permissions": { "type": "array", "items": { "type": "string" }, "description": "Exact permission ids, from get_permissions_catalog. Overrides the preset." }, "allWebsites": { "type": "boolean", "description": "true: access to every current and future website." }, "websites": { "type": "array", "items": { "type": "string" }, "description": "Website ids the member can see, when allWebsites is false." } }, "required": [ "email" ] }, "description": "One entry per person to invite." } }, "required": [ "invites" ] } } ``` # list_ai_scouts (/docs/mcp/tools/list-ai-scouts) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_ai_scouts.mdx. */} **List AI Scouts** · Read-only Lists the AI Scouts of one website: name, description, status (running or paused), people per day, minimum fit, the sources it reads (readsFrom) and how many people each delivered, plus the website's daily AI Scout limit. Free. Use it to find a scoutId. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_ai_scouts", "title": "List AI Scouts", "annotations": { "title": "List AI Scouts", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_auto_searches (/docs/mcp/tools/list-auto-searches) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_auto_searches.mdx. */} **List Auto Searches** · Read-only Lists the Auto Searches of one website: name, status (running or paused), preferences, people per day, leads delivered today and in total, the matching pool and the last run. Free. Use it before pause_auto_search or resume_auto_search to find the autoSearchId. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_auto_searches", "title": "List Auto Searches", "annotations": { "title": "List Auto Searches", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/auto-search/mcp](/docs/leads/prospector/search-prospects/auto-search/mcp) # list_automations (/docs/mcp/tools/list-automations) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_automations.mdx. */} **List automations** · Read-only Lists a website's automations: rules that act when a lead matches, for example sending to Slack, a CRM, a webhook, Zapier, an email or LinkedIn campaign, or an email alert. Use it to find an automationId for get_automation, update_automation, toggle_automation or delete_automation. Each automation shows its name, isActive, when (the trigger event), then (the action), trigger, interval and its action settings. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_automations", "title": "List automations", "annotations": { "title": "List automations", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_billing_domains (/docs/mcp/tools/list-billing-domains) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_billing_domains.mdx. */} **List billed domains** · Read-only The sending domains billed to the account, with their yearly price, renewal date and auto-renew. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_billing_domains", "title": "List billed domains", "annotations": { "title": "List billed domains", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_blog_articles (/docs/mcp/tools/list-blog-articles) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_blog_articles.mdx. */} **List blog articles** · Read-only Lists the articles on a website's hosted blog (Optimize add-on), newest first. Use it to find an articleId for get_blog_article or update_blog_article. Each row has _id, title, slug, url, status (live, draft…), source, category, version, visits, firstAvg / currentAvg (the average ICP match of visitors to the first and current version), versionAvgs, pendingRefinement, publishedAt, issues and locked (locked articles cannot be edited). Errors: 403 without the Optimize add-on or the SEO permission, 404 when the blog is not set up. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_blog_articles", "title": "List blog articles", "annotations": { "title": "List blog articles", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_campaigns (/docs/mcp/tools/list-campaigns) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_campaigns.mdx. */} **List email campaigns** · Read-only List the email campaigns of one website, newest first, with their status (isActive), schedule, steps (emailCampaignTemplates), health and a cached stats snapshot (statsRollup: contacted, sent, opens, clicks, replies, bounces and rates, refreshed about every 5 minutes; see computedAt). For exact live numbers and per-step stats of one campaign use get_campaign. websiteId comes from list_websites and is required even though the schema marks it optional. Returns emailCampaigns[], totalDocs and remaining (campaigns not yet shown). 50 campaigns per page. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | No | Website id (24 hex characters) from list_websites. Required by the server. | | `page` | `number` | No | Page number, starting at 1. Default 1. 50 campaigns per page. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_campaigns", "title": "List email campaigns", "annotations": { "title": "List email campaigns", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites. Required by the server." }, "page": { "type": "number", "description": "Page number, starting at 1. Default 1. 50 campaigns per page." } } } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/manual-search/mcp](/docs/leads/prospector/search-prospects/manual-search/mcp) # list_crm_owners (/docs/mcp/tools/list-crm-owners) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_crm_owners.mdx. */} **List CRM owners** · Read-only · Acts outside your account Lists the users in a connected CRM that a contact can be assigned to. Use it to get the ownerId that push_lead_to_crm needs for HubSpot, Zoho and Pipedrive. Reads from the CRM and changes nothing. Returns \{ data \} with the CRM's own user list. Errors: the CRM is not connected for this website, 401 when the CRM login has expired and needs reconnecting. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `crm` | `string` | Yes | One of: hubspot, pipedrive, salesforce, zoho, gohighlevel. | | `websiteId` | `string` | Yes | Website ID from list_websites; the CRM must be connected on this website. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_crm_owners", "title": "List CRM owners", "annotations": { "title": "List CRM owners", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "crm": { "type": "string", "description": "One of: hubspot, pipedrive, salesforce, zoho, gohighlevel." }, "websiteId": { "type": "string", "description": "Website ID from list_websites; the CRM must be connected on this website." } }, "required": [ "crm", "websiteId" ] } } ``` # list_crm_variables (/docs/mcp/tools/list-crm-variables) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_crm_variables.mdx. */} **List CRM variables** · Read-only The lead and company fields (name, email, job title, company size, pages visited, score…) that can be mapped to fields in your CRM. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_crm_variables", "title": "List CRM variables", "annotations": { "title": "List CRM variables", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_domains (/docs/mcp/tools/list-domains) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_domains.mdx. */} **List sending domains** · Read-only The domains bought or imported for sending, with their mailboxes, DNS state, expiry date and auto-renew. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_domains", "title": "List sending domains", "annotations": { "title": "List sending domains", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_email_accounts (/docs/mcp/tools/list-email-accounts) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_email_accounts.mdx. */} **List sending mailboxes** · Read-only List the mailboxes connected to a website for sending outreach, with their health and warmup state. Passwords and login tokens are never returned. websiteId comes from list_websites and is required even though the schema marks it optional. Per mailbox read _id (the emailAccountId other tools take), email, connected, disabled, the sending limit and its ramp (messagesPerDayLimit, rampingCurrentWeek = the campaign sending ramp), dailyLimitCeiling, warmupEnabled, warmupDailyLimit and warmupSentToday, warmupStats, warmupPlacement (warmup emails landing in inbox vs spam), and warmupNeedsFilter / warmupFilterVerified (whether the mailbox has the inbox filter warmup needs). Use get_warmup_stats for warmup totals and run_deliverability_check for DNS health. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | No | Website id (24 hex characters) from list_websites. Required by the server. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_email_accounts", "title": "List sending mailboxes", "annotations": { "title": "List sending mailboxes", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites. Required by the server." } } } } ``` # list_email_blacklist (/docs/mcp/tools/list-email-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_email_blacklist.mdx. */} **List the email blocklist** · Read-only Lists the email addresses campaigns on this website never send to, grouped by the name they were added under. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_email_blacklist", "title": "List the email blocklist", "annotations": { "title": "List the email blocklist", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_email_providers (/docs/mcp/tools/list-email-providers) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_email_providers.mdx. */} **List email provider settings** · Read-only Returns the SMTP and IMAP host, port and TLS settings of common providers (Gmail, Outlook, Zoho…). Pass an email to get the settings for its provider. Use the result for test_email_account and add_email_account. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `email` | `string` | No | Optional. A mailbox address, to get its provider's settings. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_email_providers", "title": "List email provider settings", "annotations": { "title": "List email provider settings", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "email": { "type": "string", "description": "Optional. A mailbox address, to get its provider's settings." } } } } ``` # list_filters (/docs/mcp/tools/list-filters) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_filters.mdx. */} **List saved lead filters** · Read-only List the saved lead filters (saved views) of a website. Each has _id (use it with delete_filter), name, url (the filter as a query string of get_leads-style parameters), tab and isDefault. Saved filters can also be chosen as the segment of an automation. websiteId comes from list_websites. Filters that exist only for automations are not listed. Returns \{ filters: [...] \}. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_filters", "title": "List saved lead filters", "annotations": { "title": "List saved lead filters", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_google_ads_audiences (/docs/mcp/tools/list-google-ads-audiences) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_google_ads_audiences.mdx. */} **List Google Ads audiences** · Read-only The Google Ads retargeting audiences of a website: name, linked Google campaign, contacts uploaded and match stats. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_google_ads_audiences", "title": "List Google Ads audiences", "annotations": { "title": "List Google Ads audiences", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_intent_topics (/docs/mcp/tools/list-intent-topics) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_intent_topics.mdx. */} **List subscribed intent topics** · Read-only Lists the intent topics a website is subscribed to, with delivery numbers. Use get_intent_topics_catalog to browse topics it is not subscribed to yet. Returns \{ result[], totalActive \}. Each row has topicSlug, displayName, paused, enabledAt, pausedAt, userDailyLimit, dailyDeliveredToday, totalDeliveredCount and recentSurgeCount7d (leads with this topic seen in the last 7 days). If intent signals are not enabled for the website, it returns an empty result with featureEnabled false. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_intent_topics", "title": "List subscribed intent topics", "annotations": { "title": "List subscribed intent topics", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_invoices (/docs/mcp/tools/list-invoices) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_invoices.mdx. */} **List invoices** · Read-only The account's invoices, newest first: date, amount, currency, status (paid, open) and a link to the PDF. Account owners and billing admins only. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `limit` | `number` | No | Invoices to return (1-100). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_invoices", "title": "List invoices", "annotations": { "title": "List invoices", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "limit": { "type": "number", "minimum": 1, "maximum": 100, "description": "Invoices to return (1-100)." } }, "required": [ "websiteId" ] } } ``` # list_lead_scoring_models (/docs/mcp/tools/list-lead-scoring-models) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_lead_scoring_models.mdx. */} **List lead scoring models** · Read-only List a website's lead scoring models (Qualify): the rules that score each lead on company, people and behaviour criteria and mark it warm or hot. Returns results.scores[] with each model's _id (modelId for the other scoring tools), name, active, status (live, draft, archived), bands (warm/hot thresholds, default 40/70) and its rules per criterion, plus pagination fields. 50 models per page. websiteId comes from list_websites. Use get_lead_scoring_model for one model. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `page` | `number` | No | Page number, 1-based, 50 models per page. Default 1. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_lead_scoring_models", "title": "List lead scoring models", "annotations": { "title": "List lead scoring models", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "page": { "type": "number", "description": "Page number, 1-based, 50 models per page. Default 1." } }, "required": [ "websiteId" ] } } ``` # list_linkedin_accounts (/docs/mcp/tools/list-linkedin-accounts) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_linkedin_accounts.mdx. */} **List LinkedIn accounts** · Read-only List the LinkedIn accounts connected to a website through the browser extension, newest first. Use list_linkedin_campaigns for the LinkedIn connection-request campaigns themselves. websiteId comes from list_websites. Returns accounts[]; per account read status (unpaired or paired) and connectionState: connected (extension seen in the last 6 hours), stale (seen before that), never_seen, cooldown (paused for a while by LinkedIn limits), unpaired. Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_linkedin_accounts", "title": "List LinkedIn accounts", "annotations": { "title": "List LinkedIn accounts", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_linkedin_campaigns (/docs/mcp/tools/list-linkedin-campaigns) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_linkedin_campaigns.mdx. */} **List LinkedIn campaigns** · Read-only List the LinkedIn connection-request campaigns of a website, newest first, with each campaign's status (draft, active, paused, completed), stats and progress (\{ pct, terminalCount, total \}). The prospect list itself is not included. Use list_linkedin_accounts for the LinkedIn accounts that send them and list_campaigns for email campaigns. websiteId comes from list_websites and is required even though the schema marks it optional. Returns campaigns[]. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | No | Website id from list_websites. Required by the server. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_linkedin_campaigns", "title": "List LinkedIn campaigns", "annotations": { "title": "List LinkedIn campaigns", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites. Required by the server." } } } } ``` # list_linkedin_keywords (/docs/mcp/tools/list-linkedin-keywords) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_linkedin_keywords.mdx. */} **List LinkedIn keywords** · Read-only The keywords watched on LinkedIn (LinkedIn Fans): people who post or comment about them become leads. With their status and leads found. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_linkedin_keywords", "title": "List LinkedIn keywords", "annotations": { "title": "List LinkedIn keywords", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_linkedin_tracked_posts (/docs/mcp/tools/list-linkedin-tracked-posts) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_linkedin_tracked_posts.mdx. */} **List tracked LinkedIn posts** · Read-only The LinkedIn posts being tracked: people who react to or comment on them become leads. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_linkedin_tracked_posts", "title": "List tracked LinkedIn posts", "annotations": { "title": "List tracked LinkedIn posts", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_lists (/docs/mcp/tools/list-lists) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_lists.mdx. */} **List lists** · Read-only Lists the contact or company lists of one website with their names and ids. Free. Use it to find the listId for get_list, delete_list, remove_list_items or export_list_csv. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. | | `page` | `number` | No | Page number, starting at 1. | | `limit` | `number` | No | Lists per page. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_lists", "title": "List lists", "annotations": { "title": "List lists", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact for lists of people, company for lists of companies." }, "page": { "type": "number", "minimum": 1, "description": "Page number, starting at 1." }, "limit": { "type": "number", "minimum": 1, "description": "Lists per page." } }, "required": [ "websiteId", "listType" ] } } ``` # list_members (/docs/mcp/tools/list-members) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_members.mdx. */} **List team members** · Read-only Lists the people on the account as team: userId, name, email, role (Owner or Member), permissions, preset, websites and whether their invite is still pending. Needs the master key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_members", "title": "List team members", "annotations": { "title": "List team members", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": {} } } ``` # list_open_invoices (/docs/mcp/tools/list-open-invoices) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_open_invoices.mdx. */} **List open invoices** · Read-only The account invoices that are still open or past due, with amount and due date. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_open_invoices", "title": "List open invoices", "annotations": { "title": "List open invoices", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_outreach_domains (/docs/mcp/tools/list-outreach-domains) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_outreach_domains.mdx. */} **List outreach domains** · Read-only List every outreach domain of a website, picked or bought, with its status, setup progress, mailboxes and expiry. Use get_domain_setup_status for a compact progress view after a purchase. websiteId comes from list_websites. Per domain read domain, status (picked = in the cart, not bought), progress, timestamps, error, paymentError, price / renewalPrice, the registration (expiresAt, autoRenew) and mailboxes[] (email, status). Also returns emailSenderInfo and a summary (total, ready, inFlight, errored, paymentErrored). Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_outreach_domains", "title": "List outreach domains", "annotations": { "title": "List outreach domains", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_slack_channels (/docs/mcp/tools/list-slack-channels) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_slack_channels.mdx. */} **List Slack channels** · Read-only The channels of the Slack workspace connected to this website, to pick one for a Slack automation. Returns an error when Slack is not connected. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_slack_channels", "title": "List Slack channels", "annotations": { "title": "List Slack channels", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_tags (/docs/mcp/tools/list-tags) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_tags.mdx. */} **List tags** · Read-only List the tags available on a website: the website's own tags plus the built-in default tags. Each tag has _id (use it as tagId in tag_lead / remove_tags_from_lead), text (the name, in upper case; use it for the tag filter in get_leads) and colour. websiteId comes from list_websites. Create a new tag with create_tag. Returns \{ tags: [...] \}. Read-only. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_tags", "title": "List tags", "annotations": { "title": "List tags", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." } }, "required": [ "websiteId" ] } } ``` # list_websites (/docs/mcp/tools/list-websites) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_websites.mdx. */} **List websites** · Read-only Lists the account's tracked websites, newest first, with _id (the websiteId other tools need), name, url, domain, clientId, status (unverified, verified, removed or failed), trial and credit fields, tags and tracking settings. Returns \{ websites, pagination: \{ total, page, limit, totalPages, hasNext, hasPrev \} \}. Default 50 per page, max 100. Start here to find a websiteId. For the install snippet use get_tracking_pixel; for full settings use get_website. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `page` | `number` | No | Page number, starting at 1 (default 1). | | `limit` | `number` | No | Websites per page (default 50, max 100). | | `search` | `string` | No | Optional text matched (case-insensitive) against domain, url and name. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "list_websites", "title": "List websites", "annotations": { "title": "List websites", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "page": { "type": "number", "description": "Page number, starting at 1 (default 1)." }, "limit": { "type": "number", "description": "Websites per page (default 50, max 100)." }, "search": { "type": "string", "description": "Optional text matched (case-insensitive) against domain, url and name." } } } } ``` # pause_ai_scout (/docs/mcp/tools/pause-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/pause_ai_scout.mdx. */} **Pause an AI Scout** · Changes data Pauses an AI Scout: no more people are delivered until it is resumed. The leads it already delivered stay. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "pause_ai_scout", "title": "Pause an AI Scout", "annotations": { "title": "Pause an AI Scout", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "scoutId": { "type": "string", "description": "AI Scout ID from list_ai_scouts." } }, "required": [ "websiteId", "scoutId" ] } } ``` # pause_auto_search (/docs/mcp/tools/pause-auto-search) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/pause_auto_search.mdx. */} **Pause an Auto Search** · Changes data Pauses one Auto Search: no more leads are delivered and no more credits are used until it is resumed. Leads already delivered stay. Returns the Auto Search with status paused, or 404 when it does not belong to the website. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `autoSearchId` | `string` | Yes | _id from list_auto_searches. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "pause_auto_search", "title": "Pause an Auto Search", "annotations": { "title": "Pause an Auto Search", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "autoSearchId": { "type": "string", "description": "_id from list_auto_searches." } }, "required": [ "websiteId", "autoSearchId" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/auto-search/mcp](/docs/leads/prospector/search-prospects/auto-search/mcp) # pause_linkedin_campaign (/docs/mcp/tools/pause-linkedin-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/pause_linkedin_campaign.mdx. */} **Pause a LinkedIn campaign** · Changes data Pauses a running LinkedIn campaign: nothing more is sent until it is resumed. People already in it keep their place. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "pause_linkedin_campaign", "title": "Pause a LinkedIn campaign", "annotations": { "title": "Pause a LinkedIn campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinCampaignId": { "type": "string", "description": "LinkedIn campaign ID from list_linkedin_campaigns." } }, "required": [ "websiteId", "linkedinCampaignId" ] } } ``` # pause_subscription (/docs/mcp/tools/pause-subscription) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/pause_subscription.mdx. */} **Pause subscription** · Deletes or overwrites data · Acts outside your account Pauses the subscription for 1 to 6 months: invoices during the pause are not collected, no new leads come in while paused, and it resumes automatically on pausedUntil. Only the account owner or a teammate with billing permission can do it (others get 403 with the owner's email). Use reactivate_subscription to end a pause early. Confirm with the user before calling. Returns pausedUntil and months. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `months` | `number` | Yes | Number of months to pause, 1 to 6. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "pause_subscription", "title": "Pause subscription", "annotations": { "title": "Pause subscription", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "months": { "type": "number", "description": "Number of months to pause, 1 to 6." } }, "required": [ "months" ] } } ``` # plan_ai_scout (/docs/mcp/tools/plan-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/plan_ai_scout.mdx. */} **Plan an AI Scout** · Read-only Turns a description of who to find ("founders of B2B SaaS companies who talk about outbound on podcasts") into a scout name and the sources it would read. Nothing is saved or charged. Show it to the user, then pass it to create_ai_scout. Returns 400 when the description is too short. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `description` | `string` | Yes | Who to find, in a sentence or two. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "plan_ai_scout", "title": "Plan an AI Scout", "annotations": { "title": "Plan an AI Scout", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "description": { "type": "string", "description": "Who to find, in a sentence or two." } }, "required": [ "websiteId", "description" ] } } ``` # preview_automation_filter (/docs/mcp/tools/preview-automation-filter) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/preview_automation_filter.mdx. */} **Preview an automation filter** · Read-only Counts the leads of the last days that match a saved filter, and shows a few of them, before you use the filter in an automation. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `filterId` | `string` | Yes | Saved filter ID from list_filters. | | `days` | `number` | No | How many days back (1-90). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "preview_automation_filter", "title": "Preview an automation filter", "annotations": { "title": "Preview an automation filter", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "filterId": { "type": "string", "description": "Saved filter ID from list_filters." }, "days": { "type": "number", "minimum": 1, "maximum": 90, "description": "How many days back (1-90)." } }, "required": [ "websiteId", "filterId" ] } } ``` # preview_plan_change (/docs/mcp/tools/preview-plan-change) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/preview_plan_change.mdx. */} **Preview plan change** · Read-only Shows what a plan change would cost without changing anything. Returns direction (upgrade, downgrade or flat), intervalChanged, current and new leads, newMonthlyCents, chargedNowCents (amount charged today, in cents), nextInvoiceCents and nextInvoiceDate. For a same-interval upgrade, today's charge is the extra leads at the new plan's per-lead price (newPerLeadCents), not a time-based proration. chargedNowCents is 0 for downgrades and for monthly/yearly switches. Always run this before upgrade_plan and show the user the price. Fails if the account has no active paid subscription. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leads` | `number` | Yes | Leads per month of the new plan, e.g. 1000, 3000, 5000. | | `annual` | `boolean` | No | true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "preview_plan_change", "title": "Preview plan change", "annotations": { "title": "Preview plan change", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leads": { "type": "number", "description": "Leads per month of the new plan, e.g. 1000, 3000, 5000." }, "annual": { "type": "boolean", "description": "true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch." } }, "required": [ "leads" ] } } ``` # purchase_outreach_domains (/docs/mcp/tools/purchase-outreach-domains) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/purchase_outreach_domains.mdx. */} **Buy outreach domains** · Deletes or overwrites data · Acts outside your account · Spends credits or money Buy every domain in the website's picked list (added with add_outreach_domain) and set each one up for outreach: registration, DNS, SPF/DKIM/DMARC, a mailbox and warmup. This charges the card immediately for the first year of each domain, and each mailbox is then billed as a monthly subscription. Confirm the domains and the total with the user before calling. Setup runs in the background and the user is emailed when it is done; follow it with get_domain_setup_status. By default each domain gets one mailbox named firstname.lastname from emailSenderInfo. Errors: no domains picked, missing sender info, payment_method_required, or HTTP 402 when the payment fails. Returns success, a message and outreachDomains[]. Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites whose picked domains are bought. | | `domains` | `any[]` | Yes | Not used to choose domains: the purchase always covers every domain currently picked for the website. Use add_outreach_domain / remove_outreach_domain to change the selection. | | `paymentMethodId` | `string` | No | Id of the saved payment card to charge. Required unless a coupon makes the order free. | | `emailSenderInfo` | `object` | No | Sender details for the new mailboxes: \{ firstName, lastName, jobTitle \}, all three required. | | `couponCode` | `string` | No | Optional coupon code for the order. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "purchase_outreach_domains", "title": "Buy outreach domains", "annotations": { "title": "Buy outreach domains", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites whose picked domains are bought." }, "domains": { "type": "array", "description": "Not used to choose domains: the purchase always covers every domain currently picked for the website. Use add_outreach_domain / remove_outreach_domain to change the selection." }, "paymentMethodId": { "type": "string", "description": "Id of the saved payment card to charge. Required unless a coupon makes the order free." }, "emailSenderInfo": { "type": "object", "description": "Sender details for the new mailboxes: { firstName, lastName, jobTitle }, all three required." }, "couponCode": { "type": "string", "description": "Optional coupon code for the order." } }, "required": [ "websiteId", "domains" ] } } ``` # purge_leads_below_bar (/docs/mcp/tools/purge-leads-below-bar) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/purge_leads_below_bar.mdx. */} **Purge leads below the bar** · Deletes or overwrites data Removes the leads already in the table that score below the lead quality bar (get_lead_quality). It can be undone with undo_lead_purge. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "purge_leads_below_bar", "title": "Purge leads below the bar", "annotations": { "title": "Purge leads below the bar", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # push_lead_to_crm (/docs/mcp/tools/push-lead-to-crm) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/push_lead_to_crm.mdx. */} **Push contact to CRM** · Changes data · Acts outside your account Creates a contact in the website's connected CRM: HubSpot, Pipedrive, Salesforce, Zoho or GoHighLevel. The contact details come from a saved contact with that email if one exists, otherwise from the lead's identified person when you pass leadId. With leadId, the lead is marked as added to the CRM. contactData.email is always required. HubSpot, Zoho and Pipedrive also need ownerId, which you get from list_crm_owners. To set up automatic pushes for every lead, use create_automation instead. It writes to a third-party system, so confirm with the user before calling. Errors: the CRM is not connected for this website, 'No Contact Found', 401 when the CRM login has expired. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | No | Lead _id from get_leads (optional). Supplies the person's details and links the CRM record to the lead. | | `crm` | `string` | Yes | One of: hubspot, pipedrive, salesforce, zoho, gohighlevel. | | `websiteId` | `string` | Yes | Website ID from list_websites; the CRM must be connected on this website. | | `ownerId` | `string` | No | CRM user id to assign the contact to, from list_crm_owners. Required for hubspot, zoho and pipedrive. | | `contactData` | `object` | Yes | Contact fields: email (required), firstName, lastName, position. ownerId may also be given here. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "push_lead_to_crm", "title": "Push contact to CRM", "annotations": { "title": "Push contact to CRM", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead _id from get_leads (optional). Supplies the person's details and links the CRM record to the lead." }, "crm": { "type": "string", "description": "One of: hubspot, pipedrive, salesforce, zoho, gohighlevel." }, "websiteId": { "type": "string", "description": "Website ID from list_websites; the CRM must be connected on this website." }, "ownerId": { "type": "string", "description": "CRM user id to assign the contact to, from list_crm_owners. Required for hubspot, zoho and pipedrive." }, "contactData": { "type": "object", "description": "Contact fields: email (required), firstName, lastName, position. ownerId may also be given here." } }, "required": [ "crm", "websiteId", "contactData" ] } } ``` # reactivate_subscription (/docs/mcp/tools/reactivate-subscription) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/reactivate_subscription.mdx. */} **Reactivate subscription** · Changes data · Acts outside your account Undoes a cancellation that has not taken effect yet, or ends a pause early. Ending a pause restarts billing, so only the account owner or a teammate with billing permission can do it; undoing a scheduled cancellation is open to the team. Some custom plans cannot be unpaused here (409 needs_support) and need the support team. Confirm with the user before ending a pause. Returns ok and the plan. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] This tool takes no parameters. ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "reactivate_subscription", "title": "Reactivate subscription", "annotations": { "title": "Reactivate subscription", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": {} } } ``` # recalculate_lead_scores (/docs/mcp/tools/recalculate-lead-scores) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/recalculate_lead_scores.mdx. */} **Re-score leads** · Changes data Re-run lead scoring for specific leads against the website's current scoring models, and answer any AI qualification questions those leads do not have an answer for yet. Use it after changing a model with update_lead_scoring_model when you want selected leads updated now. AI questions count against the plan's monthly AI qualification allowance; leads that already have every answer are re-scored without any AI use (counted in aiSkipped). websiteId from list_websites, leadIds from get_leads; leadIds must contain at least one id (an empty list is refused). Leads are processed one by one, so keep batches small. Returns processed, failed, total, aiSkipped and updatedLeads[] (_id, scores, aiQualification). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. | | `leadIds` | `string[]` | Yes | Array of lead ids from get_leads to re-score. At least one id. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "recalculate_lead_scores", "title": "Re-score leads", "annotations": { "title": "Re-score leads", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id (24 hex characters) from list_websites." }, "leadIds": { "type": "array", "items": { "type": "string" }, "description": "Array of lead ids from get_leads to re-score. At least one id." } }, "required": [ "websiteId", "leadIds" ] } } ``` # reconnect_email_account (/docs/mcp/tools/reconnect-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/reconnect_email_account.mdx. */} **Reconnect a mailbox** · Changes data Tries the saved SMTP and IMAP settings of a disconnected mailbox again; when they work, the mailbox is connected and its paused prospects continue. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "reconnect_email_account", "title": "Reconnect a mailbox", "annotations": { "title": "Reconnect a mailbox", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # remove_from_domain_blacklist (/docs/mcp/tools/remove-from-domain-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_from_domain_blacklist.mdx. */} **Remove blocked-domain group** · Deletes or overwrites data Deletes a whole named group of blocked domains from a website, so those companies can become leads again. It removes every domain in the group; single domains cannot be removed on their own. Get group names from get_domain_blacklist (the csv field). Confirm with the user before calling. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `csv` | `string` | Yes | Exact name of the group to delete, as shown in the csv field of get_domain_blacklist. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_from_domain_blacklist", "title": "Remove blocked-domain group", "annotations": { "title": "Remove blocked-domain group", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "csv": { "type": "string", "description": "Exact name of the group to delete, as shown in the csv field of get_domain_blacklist." } }, "required": [ "websiteId", "csv" ] } } ``` # remove_from_email_blacklist (/docs/mcp/tools/remove-from-email-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_from_email_blacklist.mdx. */} **Remove a group from the email blocklist** · Deletes or overwrites data Removes every address added under one group name; campaigns can email them again. Confirm with the user before calling. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `group` | `string` | Yes | The group name from list_email_blacklist. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_from_email_blacklist", "title": "Remove a group from the email blocklist", "annotations": { "title": "Remove a group from the email blocklist", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "group": { "type": "string", "description": "The group name from list_email_blacklist." } }, "required": [ "websiteId", "group" ] } } ``` # remove_list_items (/docs/mcp/tools/remove-list-items) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_list_items.mdx. */} **Remove items from a list** · Deletes or overwrites data Removes contacts or companies from a list; they stay in the account. Confirm with the user before calling. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | _id from list_lists. | | `itemIds` | `string[]` | Yes | Ids of the contacts or companies to remove, from get_list. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_list_items", "title": "Remove items from a list", "annotations": { "title": "Remove items from a list", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact for lists of people, company for lists of companies." }, "listId": { "type": "string", "description": "_id from list_lists." }, "itemIds": { "type": "array", "items": { "type": "string" }, "description": "Ids of the contacts or companies to remove, from get_list." } }, "required": [ "websiteId", "listType", "listId", "itemIds" ] } } ``` # remove_member (/docs/mcp/tools/remove-member) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_member.mdx. */} **Remove a team member** · Deletes or overwrites data Removes a person from the account: they lose access straight away. Confirm with the user before calling. Needs the master key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `userId` | `string` | Yes | userId from list_members. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_member", "title": "Remove a team member", "annotations": { "title": "Remove a team member", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "userId": { "type": "string", "description": "userId from list_members." } }, "required": [ "userId" ] } } ``` # remove_outreach_domain (/docs/mcp/tools/remove-outreach-domain) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_outreach_domain.mdx. */} **Unpick outreach domain** · Changes data Remove a domain from a website's picked list (purchase cart) before it is bought. Only unpurchased picks can be removed; a bought domain is refused with an error. websiteId comes from list_websites; the domain from add_outreach_domain or list_outreach_domains. Returns success and outreachDomains[] (the remaining picks), or 404 when the domain is not on the list. Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website id from list_websites. | | `domain` | `string` | Yes | Picked domain to remove, e.g. getacme.example. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_outreach_domain", "title": "Unpick outreach domain", "annotations": { "title": "Unpick outreach domain", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website id from list_websites." }, "domain": { "type": "string", "description": "Picked domain to remove, e.g. getacme.example." } }, "required": [ "websiteId", "domain" ] } } ``` # remove_prospect_from_campaign (/docs/mcp/tools/remove-prospect-from-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_prospect_from_campaign.mdx. */} **Remove contact from campaign** · Deletes or overwrites data Delete a prospect from its campaign, like "Remove from campaign" in the app: the prospect and its scheduled emails are deleted, emails already sent stay sent, and its history is gone. Nothing is refunded. To halt the sequence but keep the prospect and its history, use stop_prospect instead. Confirm with the user before calling. prospectId comes from get_prospects or add_prospect_to_campaign; campaignId from list_campaigns. Both must be 24 hex characters. Returns removed: true and the prospectId. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `prospectId` | `string` | Yes | Prospect id (24 hex characters) from get_prospects or add_prospect_to_campaign. | | `campaignId` | `string` | Yes | Id of the campaign the prospect belongs to (24 hex characters), from list_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_prospect_from_campaign", "title": "Remove contact from campaign", "annotations": { "title": "Remove contact from campaign", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "prospectId": { "type": "string", "description": "Prospect id (24 hex characters) from get_prospects or add_prospect_to_campaign." }, "campaignId": { "type": "string", "description": "Id of the campaign the prospect belongs to (24 hex characters), from list_campaigns." } }, "required": [ "prospectId", "campaignId" ] } } ``` # remove_tags_from_lead (/docs/mcp/tools/remove-tags-from-lead) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_tags_from_lead.mdx. */} **Remove a tag from a lead** · Changes data Remove one tag from a lead. The tag itself stays available for other leads. leadId comes from get_leads; tagId comes from list_tags (or the lead's tags in get_lead). Add a tag with tag_lead. Returns status 'Successful', or 'Failed' (404) when nothing was removed. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | | `tagId` | `string` | Yes | Id of the tag to remove (from list_tags). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_tags_from_lead", "title": "Remove a tag from a lead", "annotations": { "title": "Remove a tag from a lead", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." }, "tagId": { "type": "string", "description": "Id of the tag to remove (from list_tags)." } }, "required": [ "leadId", "tagId" ] } } ``` # remove_tracking_domain (/docs/mcp/tools/remove-tracking-domain) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/remove_tracking_domain.mdx. */} **Remove a tracking domain** · Deletes or overwrites data Stops using the custom open and click tracking domain of a mailbox; tracking falls back to the shared domain. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "remove_tracking_domain", "title": "Remove a tracking domain", "annotations": { "title": "Remove a tracking domain", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # rename_email_account (/docs/mcp/tools/rename-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/rename_email_account.mdx. */} **Rename a mailbox** · Changes data Changes the sender name a mailbox shows, and for mailboxes on our servers the part of the address before the @. The mailbox keeps its warmup and history. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | | `fullName` | `string` | No | The sender name. | | `localPart` | `string` | No | Our mailboxes only: the new part before the @. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "rename_email_account", "title": "Rename a mailbox", "annotations": { "title": "Rename a mailbox", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." }, "fullName": { "type": "string", "description": "The sender name." }, "localPart": { "type": "string", "description": "Our mailboxes only: the new part before the @." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # rename_list (/docs/mcp/tools/rename-list) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/rename_list.mdx. */} **Rename a list** · Changes data Renames a contact or company list of this website. Its contacts or companies do not change. listId comes from list_lists. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `listType` | `"contact" \| "company"` | Yes | contact or company. | | `listId` | `string` | Yes | List ID from list_lists. | | `name` | `string` | Yes | The new name. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "rename_list", "title": "Rename a list", "annotations": { "title": "Rename a list", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "listType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact or company." }, "listId": { "type": "string", "description": "List ID from list_lists." }, "name": { "type": "string", "description": "The new name." } }, "required": [ "websiteId", "listType", "listId", "name" ] } } ``` # reorder_campaign_steps (/docs/mcp/tools/reorder-campaign-steps) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/reorder_campaign_steps.mdx. */} **Reorder campaign steps** · Changes data Puts a campaign's emails in a new order. templateIds must list every step of the campaign exactly once, in the new order (from get_campaign, emailCampaignTemplates); anything else returns 400 and changes nothing. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | | `templateIds` | `string[]` | Yes | Every step _id of the campaign, in the new order. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "reorder_campaign_steps", "title": "Reorder campaign steps", "annotations": { "title": "Reorder campaign steps", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." }, "templateIds": { "type": "array", "items": { "type": "string" }, "description": "Every step _id of the campaign, in the new order." } }, "required": [ "websiteId", "campaignId", "templateIds" ] } } ``` # reply_to_prospect (/docs/mcp/tools/reply-to-prospect) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/reply_to_prospect.mdx. */} **Reply to prospect** · Changes data · Acts outside your account Send a reply email to a prospect in an existing outreach conversation. It is sent right away from the mailbox that sent the original email, with the subject "Re: \", and is added to the thread. Confirm the text with the user before calling: it is real email and cannot be recalled. emailId comes from get_inbox_emails (prospects[].emails[].emailId); read the conversation first with get_email_thread. Merge fields such as \{\{ first_name | there \}\} are filled in. Returns a success status, or an error saying the mailbox could not be reached (504), its login failed (401) or delivery failed (502). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `emailId` | `string` | Yes | Email id from get_inbox_emails, prospects[].emails[].emailId. | | `body` | `string` | Yes | The reply text. Merge fields with a fallback, e.g. \{\{ first_name \| there \}\}, are filled in. | | `emailAccountId` | `string` | No | Not used: the reply always goes from the mailbox that sent the original email. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "reply_to_prospect", "title": "Reply to prospect", "annotations": { "title": "Reply to prospect", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "emailId": { "type": "string", "description": "Email id from get_inbox_emails, prospects[].emails[].emailId." }, "body": { "type": "string", "description": "The reply text. Merge fields with a fallback, e.g. {{ first_name | there }}, are filled in." }, "emailAccountId": { "type": "string", "description": "Not used: the reply always goes from the mailbox that sent the original email." } }, "required": [ "emailId", "body" ] } } ``` # rerun_automation_for_lead (/docs/mcp/tools/rerun-automation-for-lead) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/rerun_automation_for_lead.mdx. */} **Rerun automation for one lead** · Changes data · Acts outside your account Runs one type of automation again for a single lead right now and reports the outcome. Use it to resend a failed Slack, CRM, webhook or campaign push. Failed and duplicate checks are skipped for webhooks, so the lead is sent again even if it went before. Use retrigger_automations for many leads, and get_lead_automation_history to see past runs. Get leadId from get_leads. It sends data outside the account, so confirm with the user before calling. Returns \{ status, result: \{ success, message, executedAt \} \}. Errors: 404 'Lead not found' or 'Lead not found in specified website'. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead _id from get_leads. | | `websiteId` | `string` | Yes | Website ID the lead belongs to, from list_websites. | | `automationType` | `string` | Yes | One of: webhook, slack, hubspot, pipedrive, zoho, zapier, salesforce, gohighlevel, mailchimp, email-campaign. Any other value returns success false with 'Unknown automation type'. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "rerun_automation_for_lead", "title": "Rerun automation for one lead", "annotations": { "title": "Rerun automation for one lead", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead _id from get_leads." }, "websiteId": { "type": "string", "description": "Website ID the lead belongs to, from list_websites." }, "automationType": { "type": "string", "description": "One of: webhook, slack, hubspot, pipedrive, zoho, zapier, salesforce, gohighlevel, mailchimp, email-campaign. Any other value returns success false with 'Unknown automation type'." } }, "required": [ "leadId", "websiteId", "automationType" ] } } ``` # reschedule_prospects (/docs/mcp/tools/reschedule-prospects) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/reschedule_prospects.mdx. */} **Reschedule prospects** · Changes data Recalculates when the next email of each prospect goes out, spread over the coming days within the mailbox limits, e.g. after a pause or a limit change. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `campaignId` | `string` | Yes | Campaign ID from list_campaigns. | | `prospectIds` | `string[]` | Yes | Prospect IDs from get_prospects. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "reschedule_prospects", "title": "Reschedule prospects", "annotations": { "title": "Reschedule prospects", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "campaignId": { "type": "string", "description": "Campaign ID from list_campaigns." }, "prospectIds": { "type": "array", "items": { "type": "string" }, "description": "Prospect IDs from get_prospects." } }, "required": [ "websiteId", "campaignId", "prospectIds" ] } } ``` # resume_ai_scout (/docs/mcp/tools/resume-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/resume_ai_scout.mdx. */} **Resume an AI Scout** · Changes data · Acts outside your account · Spends credits or money Resumes a paused AI Scout. It delivers again from its next daily run, 1 credit per lead. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "resume_ai_scout", "title": "Resume an AI Scout", "annotations": { "title": "Resume an AI Scout", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "scoutId": { "type": "string", "description": "AI Scout ID from list_ai_scouts." } }, "required": [ "websiteId", "scoutId" ] } } ``` # resume_auto_search (/docs/mcp/tools/resume-auto-search) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/resume_auto_search.mdx. */} **Resume an Auto Search** · Changes data · Spends credits or money Resumes a paused Auto Search: deliveries start again today, 1 credit per lead delivered. Confirm with the user before calling. Returns the Auto Search with status running, or 404 when it does not belong to the website. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `autoSearchId` | `string` | Yes | _id from list_auto_searches. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "resume_auto_search", "title": "Resume an Auto Search", "annotations": { "title": "Resume an Auto Search", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "autoSearchId": { "type": "string", "description": "_id from list_auto_searches." } }, "required": [ "websiteId", "autoSearchId" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/auto-search/mcp](/docs/leads/prospector/search-prospects/auto-search/mcp) # resume_linkedin_campaign (/docs/mcp/tools/resume-linkedin-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/resume_linkedin_campaign.mdx. */} **Resume a LinkedIn campaign** · Changes data · Acts outside your account Resumes a paused LinkedIn campaign: it continues sending invitations and messages where it stopped. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "resume_linkedin_campaign", "title": "Resume a LinkedIn campaign", "annotations": { "title": "Resume a LinkedIn campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinCampaignId": { "type": "string", "description": "LinkedIn campaign ID from list_linkedin_campaigns." } }, "required": [ "websiteId", "linkedinCampaignId" ] } } ``` # resume_prospects (/docs/mcp/tools/resume-prospects) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/resume_prospects.mdx. */} **Resume prospects** · Changes data · Acts outside your account Resumes paused prospects so their emails are sent again from their next scheduled step. prospectIds come from get_prospects. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `prospectIds` | `string[]` | Yes | Prospect IDs from get_prospects. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "resume_prospects", "title": "Resume prospects", "annotations": { "title": "Resume prospects", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "prospectIds": { "type": "array", "items": { "type": "string" }, "description": "Prospect IDs from get_prospects." } }, "required": [ "websiteId", "prospectIds" ] } } ``` # retrigger_automations (/docs/mcp/tools/retrigger-automations) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/retrigger_automations.mdx. */} **Rerun automations for leads** · Changes data · Acts outside your account Runs a website's automations again for a list of leads, for example after a CRM or Slack connection was fixed. This can send Slack messages, push to CRMs, call webhooks and add people to email campaigns. Confirm with the user before calling. Get leadIds from get_leads and automationIds from list_automations. To rerun one automation type for one lead and see the outcome, use rerun_automation_for_lead. To see what already ran for a lead, use get_lead_automation_history. leadIds and automationIds must both be non-empty lists; otherwise the call returns 400. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `leadIds` | `string[]` | Yes | Lead _ids from get_leads, e.g. ["64f1c2..."]. Must not be empty. | | `automationIds` | `string[]` | Yes | Automation _ids from list_automations to run for these leads, e.g. ["65a0..."]. Must not be empty. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "retrigger_automations", "title": "Rerun automations for leads", "annotations": { "title": "Rerun automations for leads", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "leadIds": { "type": "array", "items": { "type": "string" }, "description": "Lead _ids from get_leads, e.g. [\"64f1c2...\"]. Must not be empty." }, "automationIds": { "type": "array", "items": { "type": "string" }, "description": "Automation _ids from list_automations to run for these leads, e.g. [\"65a0...\"]. Must not be empty." } }, "required": [ "websiteId", "leadIds", "automationIds" ] } } ``` # reveal_contact (/docs/mcp/tools/reveal-contact) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/reveal_contact.mdx. */} **Reveal contact details** · Changes data · Spends credits or money Returns the email address and phone number held for one person from search_people. Use it when the row shows hasEmail or hasPhone true. When neither is held, use find_contact_email to search for an address. Costs 1 credit when an email or phone is held. When nothing is held it costs 0 and returns status 'no-contact-details' with a hint. Returns 402 'Insufficient credits' when the account is out of credits. Confirm with the user before calling. Returns businessEmail, emailStatus, phone, creditsCharged, status and remainingCredits. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## When to use it [#when-to-use-it] After `search_people`, when you want the email and phone of specific people. Pass the `profileId` from a search row. ## Try asking [#try-asking] > Reveal the emails for the first five. ## Good to know [#good-to-know] - **1 credit per person,** and nothing when we hold no details. Check `hasEmail` / `hasPhone` on the search row first. - One person per call: revealing 25 people is 25 calls and up to 25 credits. Turn on tool approval if you want to confirm each one. - No email held? `find_contact_email` looks for one, but costs 50 or 100 credits **even when it finds nothing**. Ask before using it. ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the same one used for search_people). | | `profileId` | `string` | Yes | profileId from a search_people row. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "reveal_contact", "title": "Reveal contact details", "annotations": { "title": "Reveal contact details", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the same one used for search_people)." }, "profileId": { "type": "string", "description": "profileId from a search_people row." } }, "required": [ "websiteId", "profileId" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-prospects/manual-search/mcp](/docs/leads/prospector/search-prospects/manual-search/mcp) # run_ai_scout (/docs/mcp/tools/run-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/run_ai_scout.mdx. */} **Run an AI Scout now** · Changes data · Acts outside your account · Spends credits or money Starts a run of an AI Scout now instead of waiting for its daily run. New people appear under Leads › AI Scout within minutes, 1 credit per lead, within the daily limits. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "run_ai_scout", "title": "Run an AI Scout now", "annotations": { "title": "Run an AI Scout now", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "scoutId": { "type": "string", "description": "AI Scout ID from list_ai_scouts." } }, "required": [ "websiteId", "scoutId" ] } } ``` # run_deliverability_check (/docs/mcp/tools/run-deliverability-check) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/run_deliverability_check.mdx. */} **Check mailbox DNS** · Changes data Run the deliverability check for one mailbox: SPF, DKIM and DMARC of its domain, its custom tracking domain and an IP blacklist score. It sends no email; inbox placement is a separate test started from the dashboard, which sends real mail from the mailbox. emailAccountId comes from list_email_accounts. The result is saved on the mailbox. Returns domain and deliverability with overallStatus (excellent, good, warning or critical), spf, dkim, dmarc, customTrackingDomain, issues[] (what to fix), lastChecked and testScore when the blacklist check answered. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `emailAccountId` | `string` | Yes | Mailbox id from list_email_accounts (_id). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "run_deliverability_check", "title": "Check mailbox DNS", "annotations": { "title": "Check mailbox DNS", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "emailAccountId": { "type": "string", "description": "Mailbox id from list_email_accounts (_id)." } }, "required": [ "emailAccountId" ] } } ``` # search_companies (/docs/mcp/tools/search-companies) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/search_companies.mdx. */} **Search companies** · Read-only Searches the company database by name or domain keyword, industry, HQ country, headcount, revenue and technologies. Use it to build company target lists. For people at those companies use search_people. For the companies visiting your own website use get_leads. Searching uses no credits, but each search that returns results counts against the plan's search limit, and the call returns 400 ('You have reached your limit.' or 'You have no credit.') when the account is out. It can return 503 provider_unavailable; retry after a minute. Returns \{ total, companies[], note \}. Rows have employees (real headcount), employeesRange, country, countryCode (ISO alpha-2), revenueRange (bounds null when unknown), industries and industry (the one your filter matched). When you set employeesMin or employeesMax, every row is inside the range, and total may be an estimate (totalIsEstimate). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. The search runs under this website. | | `query` | `object` | Yes | Search filters as one flat object. Every field is optional; combine them to narrow the search. | | `query.keywords` | `string` | No | Company name or domain keyword, e.g. "acme" or "acme.example". | | `query.industries` | `string[]` | No | Industry names, e.g. ["Marketing and Advertising", "Computer Software"]. | | `query.locations` | `string[]` | No | Company HQ countries by full name, e.g. ["United States", "Germany"]. Continents ("Europe", "Asia") are also accepted. | | `query.employeesMin` | `number` | No | Minimum headcount (whole number). Applied to the real employee count. | | `query.employeesMax` | `number` | No | Maximum headcount (whole number). Applied to the real employee count. | | `query.revenueMin` | `number` | No | Minimum annual revenue (number). Defaults to 0. | | `query.revenueMax` | `number` | No | Maximum annual revenue (number). | | `query.technologies` | `string[]` | No | Technologies the company uses, e.g. ["HubSpot", "Shopify"]. | | `query.page` | `number` | No | Page number, starting at 1. Default 1. | | `query.count` | `number` | No | Results per page. Default 25. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "search_companies", "title": "Search companies", "annotations": { "title": "Search companies", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites. The search runs under this website." }, "query": { "type": "object", "description": "Search filters as one flat object. Every field is optional; combine them to narrow the search.", "properties": { "keywords": { "type": "string", "description": "Company name or domain keyword, e.g. \"acme\" or \"acme.example\"." }, "industries": { "type": "array", "items": { "type": "string" }, "description": "Industry names, e.g. [\"Marketing and Advertising\", \"Computer Software\"]." }, "locations": { "type": "array", "items": { "type": "string" }, "description": "Company HQ countries by full name, e.g. [\"United States\", \"Germany\"]. Continents (\"Europe\", \"Asia\") are also accepted." }, "employeesMin": { "type": "number", "description": "Minimum headcount (whole number). Applied to the real employee count." }, "employeesMax": { "type": "number", "description": "Maximum headcount (whole number). Applied to the real employee count." }, "revenueMin": { "type": "number", "description": "Minimum annual revenue (number). Defaults to 0." }, "revenueMax": { "type": "number", "description": "Maximum annual revenue (number)." }, "technologies": { "type": "array", "items": { "type": "string" }, "description": "Technologies the company uses, e.g. [\"HubSpot\", \"Shopify\"]." }, "page": { "type": "number", "description": "Page number, starting at 1. Default 1." }, "count": { "type": "number", "description": "Results per page. Default 25." } } } }, "required": [ "websiteId", "query" ] } } ``` # search_domain_availability (/docs/mcp/tools/search-domain-availability) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/search_domain_availability.mdx. */} **Check domain availability** · Read-only Check whether a domain can be registered for outreach and what it costs. Call it before add_outreach_domain, which uses this quote (valid for 6 hours). Returns domain, available, price and renewalPrice (USD per year, registration quote), premium and a rating of the name. The amount charged at purchase can be higher than this registration quote; the dashboard checkout shows the final total. Endings that require multi-year registration are refused with an error; HTTP 503 means the lookup was busy, try again shortly. Not available with a website-scoped key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `domain` | `string` | Yes | Domain name to check, e.g. getacme.example. A pasted URL is reduced to its domain. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "search_domain_availability", "title": "Check domain availability", "annotations": { "title": "Check domain availability", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "domain": { "type": "string", "description": "Domain name to check, e.g. getacme.example. A pasted URL is reduced to its domain." } }, "required": [ "domain" ] } } ``` # search_locations (/docs/mcp/tools/search-locations) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/search_locations.mdx. */} **Search locations** · Read-only Looks up location names as the location filters expect them: every country with city data, US states (optionally matching q) or cities matching q (optionally within one country). Use it before filtering leads or prospects by a city or state. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `kind` | `"countries" \| "states" \| "cities"` | Yes | countries, states (US) or cities. | | `q` | `string` | No | Part of the name to search for (needed for cities). | | `country` | `string` | No | Cities only: limit to one country. | | `limit` | `number` | No | Cities only: how many to return (1-100). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "search_locations", "title": "Search locations", "annotations": { "title": "Search locations", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "kind": { "type": "string", "enum": [ "countries", "states", "cities" ], "description": "countries, states (US) or cities." }, "q": { "type": "string", "description": "Part of the name to search for (needed for cities)." }, "country": { "type": "string", "description": "Cities only: limit to one country." }, "limit": { "type": "number", "minimum": 1, "maximum": 100, "description": "Cities only: how many to return (1-100)." } }, "required": [ "websiteId", "kind" ] } } ``` # search_people (/docs/mcp/tools/search-people) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/search_people.mdx. */} **Search people** · Read-only Searches the 209M-contact people database by job title, company, company HQ country, seniority, department, industry, technology and company size. Use it to find decision makers. For companies only use search_companies. For people already visiting your website use get_leads. Searching uses no credits and never returns email or phone. Each search counts against the plan's search limit. Errors: 403 'Your plan does not allow the prospector'; 429 'You exceed the limits' with a reason: either the plan's search limit is used up, or the call came less than a second after the previous search (wait and retry; a refused call is not counted). Returns \{ total, people[], note \}. Rows come in shuffled order, at most `count` per page, with profileId, name, firstName, lastName, jobTitle (the title that matched), jobTitles, position, company/companyName, companyDomain, companyLocation \{city, country, countryCode\} (null when unknown), companyInfo, seniority, department, linkedin, emailStatus, hasEmail, hasPhone. Next steps: reveal_contact (1 credit) when hasEmail or hasPhone is true, otherwise find_contact_email. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## When to use it [#when-to-use-it] Use `search_people` when you want **new** people who match a description: job title, seniority, department, industry, company size, technology or country. **Use something else when:** - You want people who **visited your website**: that’s `get_leads`. - You want **companies**, not people: that’s `search_companies`. - You already know the person and want their email: that’s `reveal_contact`, with the `profileId` from a search. ## Try asking [#try-asking] > Find 25 SaaS founders in the United States at companies with 10–200 employees. The full walkthrough is in [Search for prospects → MCP](/docs/leads/prospector/search-prospects/manual-search/mcp). ## Good to know [#good-to-know] - **Results never include emails or phone numbers.** `hasEmail` and `hasPhone` say whether we hold them; `reveal_contact` gets them for 1 credit each. - **`locations` is the company’s headquarters,** not where the person lives. Country names (“United States”) and continents work. - **List common spellings of a title:** pass both “CTO” and “Chief Technology Officer”. - **25 results per page by default.** Use `page` for more rather than a huge `count`. - Searching doesn’t use credits, but counts toward the plan’s Prospector search limit. ## Common mistakes [#common-mistakes] - Putting company names in `titles`. Companies go in `companies`. - Treating `employeesMin`/`employeesMax` as revenue. They’re headcount. - Inventing filters such as `revenue` or `city`. `search_people` doesn’t have them, though `search_companies` filters on revenue. ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. The search runs under this website. | | `query` | `object` | Yes | Search filters as one flat object. Every field is optional; combine them to narrow the search. | | `query.titles` | `string[]` | No | Job titles to match, e.g. ["VP of Marketing", "Head of Growth"]. | | `query.companies` | `string[]` | No | Company names or domains, e.g. ["acme.example"]. | | `query.locations` | `string[]` | No | Country names, e.g. ["United States"]; continents also accepted. Filters on the company HQ, not where the person lives. | | `query.seniorities` | `string[]` | No | Seniority levels: Intern, Employee, Manager, Director, VP or C-Level. | | `query.departments` | `string[]` | No | Departments, e.g. ["Marketing Department", "Sales Department"]. Only the listed values are accepted. | | `query.industries` | `string[]` | No | Company industries, e.g. ["Computer Software"]. Only the listed values are accepted. | | `query.technologies` | `string[]` | No | Technologies the company uses, e.g. ["Salesforce"]. | | `query.employeesMin` | `number` | No | Minimum company headcount (whole number). | | `query.employeesMax` | `number` | No | Maximum company headcount (whole number). | | `query.page` | `number` | No | Page number, starting at 1. Default 1. | | `query.count` | `number` | No | Results per page. Default 25. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "search_people", "title": "Search people", "annotations": { "title": "Search people", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites. The search runs under this website." }, "query": { "type": "object", "description": "Search filters as one flat object. Every field is optional; combine them to narrow the search.", "properties": { "titles": { "type": "array", "items": { "type": "string" }, "description": "Job titles to match, e.g. [\"VP of Marketing\", \"Head of Growth\"]." }, "companies": { "type": "array", "items": { "type": "string" }, "description": "Company names or domains, e.g. [\"acme.example\"]." }, "locations": { "type": "array", "items": { "type": "string", "enum": [ "Afghanistan", "Åland Islands", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "The Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Republic of the Congo", "Cook Islands", "Costa Rica", "Cote d'Ivoire", "Croatia", "Cuba", "Cyprus", "Czechia", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Ethiopia", "Falkland Islands (Islas Malvinas)", "Faroe Islands", "Fiji", "Finland", "France", "French Guiana", "French Polynesia", "French Southern and Antarctic Lands", "Gabon", "The Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guernsey", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard Island and McDonald Islands", "Holy See (Vatican City)", "Honduras", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Isle of Man", "Israel", "Italy", "Jamaica", "Japan", "Jersey", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "North Korea", "South Korea", "Kuwait", "Kyrgyzstan", "Laos", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg", "Macau", "North Macedonia", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Federated States of Micronesia", "Moldova", "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar (Burma)", "Namibia", "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Palestinian Territory", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar", "Reunion", "Romania", "Russia", "Rwanda", "Saint Helena", "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines", "Western Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Montenegro", "Serbia", "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "Spain", "Sri Lanka", "Sudan", "Suriname", "Svalbard", "Eswatini", "Sweden", "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "Timor-Leste", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan", "Vanuatu", "Venezuela", "Vietnam", "British Virgin Islands", "Virgin Islands", "Wallis and Futuna", "Western Sahara", "Yemen", "Zambia", "Zimbabwe", "Africa", "Asia", "Europe", "North America", "Oceania", "South America" ] }, "description": "Country names, e.g. [\"United States\"]; continents also accepted. Filters on the company HQ, not where the person lives." }, "seniorities": { "type": "array", "items": { "type": "string", "enum": [ "Intern", "Manager", "Director", "VP", "Employee", "C-Level" ] }, "description": "Seniority levels: Intern, Employee, Manager, Director, VP or C-Level." }, "departments": { "type": "array", "items": { "type": "string", "enum": [ "Administrative Department", "Consulting Department", "Creative Department", "Customer Service Department", "University Department", "Engineering Department", "CEO Department", "Finance Department", "HR Department", "Healthcare Department", "IT Department", "Legal Department", "Logistics Department", "Maintenance Department", "Marketing Department", "Operations Department", "Other Department", "Production Department", "Program and Project Management Department", "Purchasing Department", "Quality Assurance Department", "Sales Department" ] }, "description": "Departments, e.g. [\"Marketing Department\", \"Sales Department\"]. Only the listed values are accepted." }, "industries": { "type": "array", "items": { "type": "string", "enum": [ "Accounting", "Airlines/Aviation", "Alternative Dispute Resolution", "Alternative Medicine", "Animation", "Apparel & Fashion", "Architecture & Planning", "Artists and Writers", "Arts and Crafts", "Automotive", "Aviation & Aerospace", "Banking", "Biotechnology", "Broadcast Media", "Building Materials", "Business Consulting and Services", "Business Supplies and Equipment", "Capital Markets", "Chemicals", "Civic & Social Organization", "Civil Engineering", "Commercial Real Estate", "Computer & Network Security", "Computer Games", "Computer Hardware", "Computer Networking", "Computer Software", "Construction", "Consumer Electronics", "Consumer Goods", "Consumer Services", "Cosmetics", "Dairy", "Defense & Space", "Design", "Education Management", "eCommerce", "E-Learning", "Electrical/Electronic Manufacturing", "Entertainment", "Environmental Services", "Events Services", "Executive Office", "Facilities Services", "Farming", "Financial Services", "Fine Art", "Fishery", "Food & Beverages", "Food Production", "Fund-Raising", "Furniture", "Gambling & Casinos", "Glass, Ceramics & Concrete", "Government Administration", "Government Relations", "Graphic Design", "Health, Wellness and Fitness", "Higher Education", "Hospital & Health Care", "Hospitality", "Human Resources", "Import and Export", "Individual & Family Services", "Industrial Automation", "Information Services", "Information Technology and Services", "Insurance", "International Affairs", "International Trade and Development", "Internet", "Internet Marketplace Platforms", "Investment Banking", "Investment Management", "Judiciary", "Law Enforcement", "Law Practice", "Legal Services", "Legislative Office", "Leisure, Travel & Tourism", "Libraries", "Logistics and Supply Chain", "Luxury Goods & Jewelry", "Machinery", "Management Consulting", "Maritime", "Marketing and Advertising", "Market Research", "Mechanical or Industrial Engineering", "Media Production", "Medical Devices", "Medical Practice", "Mental Health Care", "Military", "Mining & Metals", "Mobile Games", "Motion Pictures and Film", "Museums and Institutions", "Music", "Nanotechnology", "Newspapers", "Nonprofit Organization Management", "Oil & Energy", "Online Media", "Other", "Outsourcing/Offshoring", "Package/Freight Delivery", "Packaging and Containers", "Paper & Forest Products", "Performing Arts", "Pharmaceuticals", "Philanthropy", "Photography", "Plastics", "Political Organization", "Primary/Secondary Education", "Printing", "Professional Training & Coaching", "Program Development", "Public Policy", "Public Relations and Communications", "Public Safety", "Publishing", "Railroad Manufacture", "Ranching", "Real Estate", "Recreational Facilities and Services", "Religious Institutions", "Renewables & Environment", "Research", "Restaurants", "Retail", "SaaS", "Security and Investigations", "Semiconductors", "Shipbuilding", "Sporting Goods", "Sports", "Staffing and Recruiting", "Supermarkets", "Telecommunications", "Textiles", "Think Tanks", "Tobacco", "Translation and Localization", "Transportation/Trucking/Railroad", "Utilities", "Venture Capital & Private Equity", "Veterinary", "Warehousing", "Wholesale", "Wine and Spirits", "Wireless", "Writing and Editing" ] }, "description": "Company industries, e.g. [\"Computer Software\"]. Only the listed values are accepted." }, "technologies": { "type": "array", "items": { "type": "string" }, "description": "Technologies the company uses, e.g. [\"Salesforce\"]." }, "employeesMin": { "type": "number", "minimum": 1, "description": "Minimum company headcount (whole number)." }, "employeesMax": { "type": "number", "minimum": 1, "description": "Maximum company headcount (whole number)." }, "page": { "type": "number", "minimum": 1, "description": "Page number, starting at 1. Default 1." }, "count": { "type": "number", "minimum": 1, "description": "Results per page. Default 25." } } } }, "required": [ "websiteId", "query" ] } } ``` # send_prospects_now (/docs/mcp/tools/send-prospects-now) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/send_prospects_now.mdx. */} **Send to prospects now** · Changes data · Acts outside your account Sends the next email of their sequence to the given prospects right away instead of at their scheduled time, within the mailbox limits. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `prospectIds` | `string[]` | Yes | Prospect IDs from get_prospects. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "send_prospects_now", "title": "Send to prospects now", "annotations": { "title": "Send to prospects now", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "prospectIds": { "type": "array", "items": { "type": "string" }, "description": "Prospect IDs from get_prospects." } }, "required": [ "websiteId", "prospectIds" ] } } ``` # send_slack_test_message (/docs/mcp/tools/send-slack-test-message) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/send_slack_test_message.mdx. */} **Send a Slack test message** · Changes data · Acts outside your account Posts a sample lead message to a Slack channel so you can see how it looks. It is a real Slack message. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `channelName` | `string` | No | Channel to post to, e.g. #leads. | | `template` | `string` | No | Optional template to try instead of the saved one. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "send_slack_test_message", "title": "Send a Slack test message", "annotations": { "title": "Send a Slack test message", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "channelName": { "type": "string", "description": "Channel to post to, e.g. #leads." }, "template": { "type": "string", "description": "Optional template to try instead of the saved one." } }, "required": [ "websiteId" ] } } ``` # set_ai_scout_daily_limit (/docs/mcp/tools/set-ai-scout-daily-limit) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_ai_scout_daily_limit.mdx. */} **Set the AI Scout daily limit** · Changes data Sets how many AI Scout leads (= credits) the website may receive per day across all its scouts, 1 to 500. Returns the limit with how many were used and are left today. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `dailyLimit` | `number` | Yes | Leads per day across all scouts, 1-500. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_ai_scout_daily_limit", "title": "Set the AI Scout daily limit", "annotations": { "title": "Set the AI Scout daily limit", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "dailyLimit": { "type": "number", "minimum": 1, "maximum": 500, "description": "Leads per day across all scouts, 1-500." } }, "required": [ "websiteId", "dailyLimit" ] } } ``` # set_auto_topup (/docs/mcp/tools/set-auto-topup) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_auto_topup.mdx. */} **Set auto top-up** · Changes data · Acts outside your account Turns auto top-up on or off and sets the pack of leads bought each time credits run out and the monthly cap in USD. When on, the card on file is charged automatically up to the cap. Account owners and billing admins only. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `enabled` | `boolean` | Yes | true to buy leads automatically, false to stop. | | `packLeads` | `number` | No | Leads bought each time. | | `capUsd` | `number` | No | Most that may be spent per month, in USD. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_auto_topup", "title": "Set auto top-up", "annotations": { "title": "Set auto top-up", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "enabled": { "type": "boolean", "description": "true to buy leads automatically, false to stop." }, "packLeads": { "type": "number", "minimum": 1, "description": "Leads bought each time." }, "capUsd": { "type": "number", "minimum": 0, "description": "Most that may be spent per month, in USD." } }, "required": [ "websiteId", "enabled" ] } } ``` # set_country_blacklist (/docs/mcp/tools/set-country-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_country_blacklist.mdx. */} **Set blocked countries** · Deletes or overwrites data Sets the countries whose visitors are never identified on this website. The list you send replaces the current one: get_country_blacklist first and send the full list; an empty list blocks nothing. Codes are two letters (DE, FR, US). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `countryCodes` | `string[]` | Yes | The full list of two-letter country codes to block. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_country_blacklist", "title": "Set blocked countries", "annotations": { "title": "Set blocked countries", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "countryCodes": { "type": "array", "items": { "type": "string" }, "description": "The full list of two-letter country codes to block." } }, "required": [ "websiteId", "countryCodes" ] } } ``` # set_crm_mappings (/docs/mcp/tools/set-crm-mappings) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_crm_mappings.mdx. */} **Set CRM field mappings** · Deletes or overwrites data Sets the field mappings for contacts or companies pushed to a CRM. The list you send replaces the current one; get_crm_mappings first and list_crm_variables for the fields. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `crm` | `"hubspot" \| "salesforce" \| "pipedrive" \| "zoho" \| "gohighlevel"` | Yes | The CRM. | | `objectType` | `"contact" \| "company"` | Yes | contact or company. | | `mappings` | `object[]` | Yes | The full list: lead field (source) to CRM field (target). | | `mappings[].source` | `string` | No | Lead field, from list_crm_variables. | | `mappings[].target` | `string` | No | CRM field name. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_crm_mappings", "title": "Set CRM field mappings", "annotations": { "title": "Set CRM field mappings", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "crm": { "type": "string", "enum": [ "hubspot", "salesforce", "pipedrive", "zoho", "gohighlevel" ], "description": "The CRM." }, "objectType": { "type": "string", "enum": [ "contact", "company" ], "description": "contact or company." }, "mappings": { "type": "array", "items": { "type": "object", "properties": { "source": { "type": "string", "description": "Lead field, from list_crm_variables." }, "target": { "type": "string", "description": "CRM field name." } } }, "description": "The full list: lead field (source) to CRM field (target)." } }, "required": [ "websiteId", "crm", "objectType", "mappings" ] } } ``` # set_domain_auto_renew (/docs/mcp/tools/set-domain-auto-renew) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_domain_auto_renew.mdx. */} **Set domain auto-renew** · Changes data · Acts outside your account Turns automatic yearly renewal of a sending domain on or off. Off: the domain and its mailboxes stop working when it expires. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `domainId` | `string` | Yes | Domain ID from list_domains. | | `autoRenew` | `boolean` | Yes | true to renew every year. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_domain_auto_renew", "title": "Set domain auto-renew", "annotations": { "title": "Set domain auto-renew", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "domainId": { "type": "string", "description": "Domain ID from list_domains." }, "autoRenew": { "type": "boolean", "description": "true to renew every year." } }, "required": [ "websiteId", "domainId", "autoRenew" ] } } ``` # set_linkedin_keyword_status (/docs/mcp/tools/set-linkedin-keyword-status) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_linkedin_keyword_status.mdx. */} **Pause or resume a LinkedIn keyword** · Changes data Pauses or resumes watching one LinkedIn keyword. Paused keywords find no new people; the leads they already found stay. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `keywordId` | `string` | Yes | Keyword ID from list_linkedin_keywords. | | `status` | `"active" \| "paused"` | Yes | active or paused. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_linkedin_keyword_status", "title": "Pause or resume a LinkedIn keyword", "annotations": { "title": "Pause or resume a LinkedIn keyword", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "keywordId": { "type": "string", "description": "Keyword ID from list_linkedin_keywords." }, "status": { "type": "string", "enum": [ "active", "paused" ], "description": "active or paused." } }, "required": [ "websiteId", "keywordId", "status" ] } } ``` # set_page_tracking_rules (/docs/mcp/tools/set-page-tracking-rules) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_page_tracking_rules.mdx. */} **Set which pages are tracked** · Deletes or overwrites data Sets the page rules of a website. In exclude mode visitors on matching pages are not identified (e.g. careers or login pages); in include mode only visitors on matching pages are. The rules you send replace the current ones; an empty list removes them. Rules that could never match are refused with the reason. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `mode` | `"exclude" \| "include"` | No | exclude (default) or include. | | `rules` | `object[]` | Yes | The full list of rules. | | `rules[].type` | `"starts-with" \| "ends-with" \| "contains" \| "does-not-contain"` | Yes | starts-with, ends-with, contains or does-not-contain. | | `rules[].url` | `string` | Yes | The part of the page URL to match, e.g. /careers. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_page_tracking_rules", "title": "Set which pages are tracked", "annotations": { "title": "Set which pages are tracked", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "mode": { "type": "string", "enum": [ "exclude", "include" ], "description": "exclude (default) or include." }, "rules": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "starts-with", "ends-with", "contains", "does-not-contain" ], "description": "starts-with, ends-with, contains or does-not-contain." }, "url": { "type": "string", "description": "The part of the page URL to match, e.g. /careers." } }, "required": [ "type", "url" ] }, "description": "The full list of rules." } }, "required": [ "websiteId", "rules" ] } } ``` # set_session_recording (/docs/mcp/tools/set-session-recording) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_session_recording.mdx. */} **Turn session recordings on or off** · Changes data Turns session recordings on or off for one website. When on, visits are recorded so you can replay what a lead did; when off, no new recordings are made and existing ones stay until they expire. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `enabled` | `boolean` | Yes | true to record visits, false to stop. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_session_recording", "title": "Turn session recordings on or off", "annotations": { "title": "Turn session recordings on or off", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "enabled": { "type": "boolean", "description": "true to record visits, false to stop." } }, "required": [ "websiteId", "enabled" ] } } ``` # set_slack_message_template (/docs/mcp/tools/set-slack-message-template) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_slack_message_template.mdx. */} **Set the Slack message template** · Changes data Changes the template of the message posted to Slack for each lead. Merge fields like \{\{name\}\} and \{\{company\}\} are filled per lead. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `template` | `string` | Yes | The message template. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_slack_message_template", "title": "Set the Slack message template", "annotations": { "title": "Set the Slack message template", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "template": { "type": "string", "description": "The message template." } }, "required": [ "websiteId", "template" ] } } ``` # set_website_limits (/docs/mcp/tools/set-website-limits) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_website_limits.mdx. */} **Set a website's limits** · Changes data Sets how many of the account's credits and mailboxes one website may use, for accounts that share them between websites (for example one website per client). The credits cannot go above what the account has left. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `credits` | `number` | Yes | Credits this website may use per cycle. | | `emailAccounts` | `number` | Yes | Mailboxes this website may connect. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_website_limits", "title": "Set a website's limits", "annotations": { "title": "Set a website's limits", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "credits": { "type": "number", "minimum": 0, "description": "Credits this website may use per cycle." }, "emailAccounts": { "type": "number", "minimum": 0, "description": "Mailboxes this website may connect." } }, "required": [ "websiteId", "credits", "emailAccounts" ] } } ``` # set_website_tags (/docs/mcp/tools/set-website-tags) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_website_tags.mdx. */} **Set a website's labels** · Changes data Sets the labels of a website, used to group websites (for example by client or market) in the websites list. The list you send replaces the current one. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `tags` | `string[]` | Yes | The full list of labels. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_website_tags", "title": "Set a website's labels", "annotations": { "title": "Set a website's labels", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "tags": { "type": "array", "items": { "type": "string" }, "description": "The full list of labels." } }, "required": [ "websiteId", "tags" ] } } ``` # spam_check_email (/docs/mcp/tools/spam-check-email) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/spam_check_email.mdx. */} **Spam-check an email** · Read-only Checks an email subject and body for words and patterns that send mail to spam, and returns a score with each issue and how to fix it. Nothing is sent. Use it before add_campaign_step or update_campaign_step. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `subject` | `string` | Yes | The subject line. | | `body` | `string` | Yes | The email body (text or HTML). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "spam_check_email", "title": "Spam-check an email", "annotations": { "title": "Spam-check an email", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "subject": { "type": "string", "description": "The subject line." }, "body": { "type": "string", "description": "The email body (text or HTML)." } }, "required": [ "websiteId", "subject", "body" ] } } ``` # stop_prospect (/docs/mcp/tools/stop-prospect) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/stop_prospect.mdx. */} **Stop contact's sequence** · Deletes or overwrites data Stop one prospect's email sequence: no further steps are sent and the prospect is marked manually-paused, keeping it and its history in the campaign. Use remove_prospect_from_campaign to delete it instead, or delete_campaign to end a whole campaign. Confirm with the user before calling. prospectId comes from get_prospects or add_prospect_to_campaign. Stopping never refunds anything. Returns stopped: true and the prospectId, or HTTP 404 when the prospect is not on this account. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `prospectId` | `string` | Yes | Prospect id (24 hex characters) from get_prospects or add_prospect_to_campaign. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "stop_prospect", "title": "Stop contact's sequence", "annotations": { "title": "Stop contact's sequence", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "prospectId": { "type": "string", "description": "Prospect id (24 hex characters) from get_prospects or add_prospect_to_campaign." } }, "required": [ "prospectId" ] } } ``` # subscribe_to_intent_topic (/docs/mcp/tools/subscribe-to-intent-topic) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/subscribe_to_intent_topic.mdx. */} **Subscribe to intent topic** · Changes data · Acts outside your account · Spends credits or money Subscribes a website to an intent topic, so companies researching that topic start arriving as leads each day, up to the daily limit. If the website is already subscribed, the call updates the daily limit and resumes a paused subscription. Each new lead it delivers uses 1 credit, and new leads run the website's CRM pushes and automations. A company that is already a lead is merged into that lead at no charge. Confirm with the user before calling. Get topicSlug from get_intent_topics_catalog. Errors: 403 when intent signals are not enabled for the website, 404 when the topic is not in the catalog. Returns \{ result \} with the subscription. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `topicSlug` | `string` | Yes | Topic slug from get_intent_topics_catalog, e.g. "crm-software". Not case-sensitive. | | `userDailyLimit` | `number` | No | Maximum leads per day from this topic. Positive whole number, capped at 5000. Default 20. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "subscribe_to_intent_topic", "title": "Subscribe to intent topic", "annotations": { "title": "Subscribe to intent topic", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "topicSlug": { "type": "string", "description": "Topic slug from get_intent_topics_catalog, e.g. \"crm-software\". Not case-sensitive." }, "userDailyLimit": { "type": "number", "description": "Maximum leads per day from this topic. Positive whole number, capped at 5000. Default 20." } }, "required": [ "websiteId", "topicSlug" ] } } ``` # suggest_web_scraping_keywords (/docs/mcp/tools/suggest-web-scraping-keywords) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/suggest_web_scraping_keywords.mdx. */} **Suggest Web Scraping keywords** · Read-only Keyword ideas for Web Scraping: phrases the website's buyers would write about themselves on their own sites (never the seller's own category words). Suggestions are cached; regenerate=true asks for new ones. Nothing is saved: add the ones the user picks with update_web_scraping. Not on LTD plans. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `regenerate` | `boolean` | No | Ask for new ideas instead of the cached ones. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "suggest_web_scraping_keywords", "title": "Suggest Web Scraping keywords", "annotations": { "title": "Suggest Web Scraping keywords", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "regenerate": { "type": "boolean", "description": "Ask for new ideas instead of the cached ones." } }, "required": [ "websiteId" ] } } ``` # sync_google_ads_audience_stats (/docs/mcp/tools/sync-google-ads-audience-stats) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/sync_google_ads_audience_stats.mdx. */} **Refresh Google Ads audience stats** · Changes data Fetches the latest impressions, clicks and conversions of an audience’s campaign from Google Ads. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `audienceId` | `string` | Yes | Audience ID from list_google_ads_audiences. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "sync_google_ads_audience_stats", "title": "Refresh Google Ads audience stats", "annotations": { "title": "Refresh Google Ads audience stats", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "audienceId": { "type": "string", "description": "Audience ID from list_google_ads_audiences." } }, "required": [ "websiteId", "audienceId" ] } } ``` # tag_lead (/docs/mcp/tools/tag-lead) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/tag_lead.mdx. */} **Tag a lead** · Changes data · Acts outside your account Attach an existing tag to a lead. Get the tagId from list_tags, or make a new tag with create_tag first; leadId comes from get_leads. Adding a tag starts any of the website's automations that trigger on a tag being added, which can push the lead to a CRM, Slack, a webhook or an email campaign. Fails with 'Tag Id already exist' when the lead already has the tag. Remove a tag with remove_tags_from_lead. Returns status 'Successful'. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). | | `tagId` | `string` | Yes | Tag id (24 hex characters) from list_tags or the tagId returned by create_tag. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "tag_lead", "title": "Tag a lead", "annotations": { "title": "Tag a lead", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "leadId": { "type": "string", "description": "Lead id (the _id of a row returned by get_leads)." }, "tagId": { "type": "string", "description": "Tag id (24 hex characters) from list_tags or the tagId returned by create_tag." } }, "required": [ "leadId", "tagId" ] } } ``` # test_email_account (/docs/mcp/tools/test-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/test_email_account.mdx. */} **Test mailbox settings** · Read-only · Acts outside your account Connects to the SMTP and IMAP servers with these settings and says whether sending and reading work, without saving anything. Use it before add_email_account. Passwords are only used for the test. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `smtpEmail` | `string` | Yes | Login for sending, usually the mailbox address. | | `smtpHost` | `string` | Yes | SMTP server, e.g. smtp.gmail.com. | | `smtpPort` | `number` | Yes | SMTP port, e.g. 465 or 587. | | `smtpTLS` | `boolean` | Yes | true for SSL/TLS. | | `imapEmail` | `string` | Yes | Login for reading replies, usually the mailbox address. | | `imapHost` | `string` | Yes | IMAP server, e.g. imap.gmail.com. | | `imapPort` | `number` | Yes | IMAP port, usually 993. | | `imapTLS` | `boolean` | Yes | true for SSL/TLS. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "test_email_account", "title": "Test mailbox settings", "annotations": { "title": "Test mailbox settings", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "smtpEmail": { "type": "string", "description": "Login for sending, usually the mailbox address." }, "smtpHost": { "type": "string", "description": "SMTP server, e.g. smtp.gmail.com." }, "smtpPort": { "type": "number", "minimum": 1, "maximum": 65535, "description": "SMTP port, e.g. 465 or 587." }, "smtpTLS": { "type": "boolean", "description": "true for SSL/TLS." }, "imapEmail": { "type": "string", "description": "Login for reading replies, usually the mailbox address." }, "imapHost": { "type": "string", "description": "IMAP server, e.g. imap.gmail.com." }, "imapPort": { "type": "number", "minimum": 1, "maximum": 65535, "description": "IMAP port, usually 993." }, "imapTLS": { "type": "boolean", "description": "true for SSL/TLS." } }, "required": [ "smtpEmail", "smtpHost", "smtpPort", "smtpPassword", "smtpTLS", "imapEmail", "imapHost", "imapPort", "imapPassword", "imapTLS" ] } } ``` # test_webhook (/docs/mcp/tools/test-webhook) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/test_webhook.mdx. */} **Test a webhook** · Changes data · Acts outside your account Sends a sample lead, as automations send them, to a URL so you can check your endpoint receives and parses it. Returns the status your endpoint answered. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `webhook` | `string` | Yes | The URL to send the sample lead to. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "test_webhook", "title": "Test a webhook", "annotations": { "title": "Test a webhook", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "webhook": { "type": "string", "description": "The URL to send the sample lead to." } }, "required": [ "websiteId", "webhook" ] } } ``` # toggle_automation (/docs/mcp/tools/toggle-automation) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/toggle_automation.mdx. */} **Turn automation on or off** · Changes data · Acts outside your account Switches an automation on or off without changing its setup. When on, it acts on every matching lead (Slack messages, CRM pushes, campaign emails…). Get automationId from list_automations. An unfinished draft cannot be switched on: the call returns 405 and the draft has to be finished in the app first. Returns the updated automation. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `automationId` | `string` | Yes | Automation _id from list_automations. | | `isActive` | `boolean` | Yes | true switches it on, false switches it off. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "toggle_automation", "title": "Turn automation on or off", "annotations": { "title": "Turn automation on or off", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "automationId": { "type": "string", "description": "Automation _id from list_automations." }, "isActive": { "type": "boolean", "description": "true switches it on, false switches it off." } }, "required": [ "automationId", "isActive" ] } } ``` # toggle_warmup (/docs/mcp/tools/toggle-warmup) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/toggle_warmup.mdx. */} **Turn warmup on or off** · Changes data · Acts outside your account Turn email warmup on or off for one mailbox. While on, the mailbox automatically exchanges AI-written warmup emails with other warmup mailboxes to build its sender reputation, so the owner will see these emails in it. Confirm with the user before turning it on. emailAccountId comes from list_email_accounts; check warmupNeedsFilter / warmupFilterVerified there, since a mailbox that needs an inbox filter only receives warmup once it is verified. Track results with get_warmup_stats. Returns status, warmupEnabled and a message. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `emailAccountId` | `string` | Yes | Mailbox id from list_email_accounts (_id). | | `enabled` | `boolean` | Yes | true to turn warmup on, false to turn it off. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "toggle_warmup", "title": "Turn warmup on or off", "annotations": { "title": "Turn warmup on or off", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "emailAccountId": { "type": "string", "description": "Mailbox id from list_email_accounts (_id)." }, "enabled": { "type": "boolean", "description": "true to turn warmup on, false to turn it off." } }, "required": [ "emailAccountId", "enabled" ] } } ``` # undo_lead_purge (/docs/mcp/tools/undo-lead-purge) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/undo_lead_purge.mdx. */} **Undo a lead purge** · Changes data Brings back the leads removed by the last purge_leads_below_bar, with their tags, comments and history as they were. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "undo_lead_purge", "title": "Undo a lead purge", "annotations": { "title": "Undo a lead purge", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # unmark_email_account_spam (/docs/mcp/tools/unmark-email-account-spam) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/unmark_email_account_spam.mdx. */} **Clear a mailbox spam flag** · Changes data Clears the flag set when a mailbox looked like it was going to spam, so it sends again. Fix the cause first (warmup, content, DNS) with get_warmup_health. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "unmark_email_account_spam", "title": "Clear a mailbox spam flag", "annotations": { "title": "Clear a mailbox spam flag", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # update_account_tracking_settings (/docs/mcp/tools/update-account-tracking-settings) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_account_tracking_settings.mdx. */} **Update account-wide tracking** · Changes data Turns tracking options on or off for every website of the account at once: identify people, suggested contacts, personal emails, session recordings. Switching one off applies to every website. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `trackExactVisitors` | `boolean` | No | Identify the person, not only the company. | | `trackCompanyWithSuggestedContacts` | `boolean` | No | Suggest contacts at companies without an identified person. | | `trackPersonalEmails` | `boolean` | No | Keep leads with a personal email. | | `sessionRecordingEnabled` | `boolean` | No | Record visits. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_account_tracking_settings", "title": "Update account-wide tracking", "annotations": { "title": "Update account-wide tracking", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "trackExactVisitors": { "type": "boolean", "description": "Identify the person, not only the company." }, "trackCompanyWithSuggestedContacts": { "type": "boolean", "description": "Suggest contacts at companies without an identified person." }, "trackPersonalEmails": { "type": "boolean", "description": "Keep leads with a personal email." }, "sessionRecordingEnabled": { "type": "boolean", "description": "Record visits." } }, "required": [ "websiteId" ] } } ``` # update_ai_scout (/docs/mcp/tools/update-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_ai_scout.mdx. */} **Update an AI Scout** · Changes data Changes an AI Scout's name, description, people per day, minimum fit or sources. Only the fields you pass change. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. | | `name` | `string` | No | A short name; made from the description when left out. | | `description` | `string` | No | Who to find, in a sentence or two: roles, industries, company size, where they talk (podcasts, YouTube, review sites). | | `perDay` | `"10" \| "25" \| "50" \| "100"` | No | People per day to deliver: 10, 25, 50 or 100. | | `minFit` | `number` | No | Minimum fit score (10-95, default 70): people below it are skipped. | | `sources` | `object[]` | No | Where the scout reads: Google searches, YouTube searches, playlists or creators, G2 categories. Made from the description when left out; get them first with plan_ai_scout. | | `sources[].kind` | `"google" \| "youtube_search" \| "youtube_playlist" \| "youtube_creators" \| "g2_category"` | Yes | google, youtube_search, youtube_playlist, youtube_creators or g2_category. | | `sources[].ref` | `string` | Yes | The search words, the playlist or channel link, or the G2 category link. | | `sources[].label` | `string` | No | Optional. How the source is shown in the dashboard. | | `sources[].active` | `boolean` | No | false to keep the source but stop reading it. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_ai_scout", "title": "Update an AI Scout", "annotations": { "title": "Update an AI Scout", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "scoutId": { "type": "string", "description": "AI Scout ID from list_ai_scouts." }, "name": { "type": "string", "description": "A short name; made from the description when left out." }, "description": { "type": "string", "description": "Who to find, in a sentence or two: roles, industries, company size, where they talk (podcasts, YouTube, review sites)." }, "perDay": { "type": "number", "enum": [ 10, 25, 50, 100 ], "description": "People per day to deliver: 10, 25, 50 or 100." }, "minFit": { "type": "number", "minimum": 10, "maximum": 95, "description": "Minimum fit score (10-95, default 70): people below it are skipped." }, "sources": { "type": "array", "items": { "type": "object", "properties": { "kind": { "type": "string", "enum": [ "google", "youtube_search", "youtube_playlist", "youtube_creators", "g2_category" ], "description": "google, youtube_search, youtube_playlist, youtube_creators or g2_category." }, "ref": { "type": "string", "description": "The search words, the playlist or channel link, or the G2 category link." }, "label": { "type": "string", "description": "Optional. How the source is shown in the dashboard." }, "active": { "type": "boolean", "description": "false to keep the source but stop reading it." } }, "required": [ "kind", "ref" ] }, "description": "Where the scout reads: Google searches, YouTube searches, playlists or creators, G2 categories. Made from the description when left out; get them first with plan_ai_scout." } }, "required": [ "websiteId", "scoutId" ] } } ``` # update_automation (/docs/mcp/tools/update-automation) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_automation.mdx. */} **Update automation** · Changes data · Acts outside your account Changes an existing automation: its name, rule, action settings or on/off state. Fields you leave out keep their current values, but a new actions object replaces all of the saved action settings. To only switch it on or off, use toggle_automation. Get automationId from list_automations, and read the current setup with get_automation first. Changes apply to every future matching lead, and an active LinkedIn campaign automation enrolls matching leads when saved. Confirm with the user when it changes where leads are sent. Returns the updated automation. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `automationId` | `string` | Yes | Automation _id from list_automations. | | `name` | `string` | No | New name. | | `trigger` | `object` | No | Rule fields to change: when, then, trigger, interval, repeatWindowHours, dedupeScope (same values as create_automation). Other keys are ignored here. | | `actions` | `any[]` | No | The action settings object, e.g. \{ "sentToSlack": \{ "sendMessagesTo": "#leads" \} \}. Replaces all saved action settings. | | `enabled` | `boolean` | No | true to activate, false to deactivate. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_automation", "title": "Update automation", "annotations": { "title": "Update automation", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "automationId": { "type": "string", "description": "Automation _id from list_automations." }, "name": { "type": "string", "description": "New name." }, "trigger": { "type": "object", "description": "Rule fields to change: when, then, trigger, interval, repeatWindowHours, dedupeScope (same values as create_automation). Other keys are ignored here." }, "actions": { "type": "array", "description": "The action settings object, e.g. { \"sentToSlack\": { \"sendMessagesTo\": \"#leads\" } }. Replaces all saved action settings." }, "enabled": { "type": "boolean", "description": "true to activate, false to deactivate." } }, "required": [ "automationId" ] } } ``` # update_blog_article (/docs/mcp/tools/update-blog-article) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_blog_article.mdx. */} **Edit blog article** · Changes data · Acts outside your account Edits a blog article by saving a new version at the same URL (Optimize add-on). If the article is live, the new version goes live at once. status 'live' publishes a draft, and status 'draft' takes a live article offline. Only the fields you pass change. Uses one article from the monthly allowance; with none left it returns 400. Locked articles (guest posts, paid placements) are refused. Get articleId from list_blog_articles, and read the current text with get_blog_article first. Confirm with the user before changing a live article. Returns \{ article, url \}. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `articleId` | `string` | Yes | Article _id from list_blog_articles. | | `title` | `string` | No | New title. | | `html` | `string` | No | New body as HTML (p, h2, h3, ul/ol, blockquote, img, table). Replaces the whole body. | | `metaDescription` | `string` | No | New search-result description. | | `excerpt` | `string` | No | New short summary for the blog index. | | `category` | `string` | No | New category name. | | `coverImage` | `string` | No | New absolute cover image URL (http/https); other values clear it. | | `status` | `"live" \| "draft"` | No | 'live' publishes this version now; 'draft' takes the article offline. Leave it out to keep the current state. | | `faq` | `object[]` | No | Full new FAQ list of \{ q, a \} objects. Replaces the saved FAQ. | | `summary` | `string` | No | What this edit changes, shown in the version history. Default 'Edited by hand'. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_blog_article", "title": "Edit blog article", "annotations": { "title": "Edit blog article", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "articleId": { "type": "string", "description": "Article _id from list_blog_articles." }, "title": { "type": "string", "description": "New title." }, "html": { "type": "string", "description": "New body as HTML (p, h2, h3, ul/ol, blockquote, img, table). Replaces the whole body." }, "metaDescription": { "type": "string", "description": "New search-result description." }, "excerpt": { "type": "string", "description": "New short summary for the blog index." }, "category": { "type": "string", "description": "New category name." }, "coverImage": { "type": "string", "description": "New absolute cover image URL (http/https); other values clear it." }, "status": { "type": "string", "enum": [ "live", "draft" ], "description": "'live' publishes this version now; 'draft' takes the article offline. Leave it out to keep the current state." }, "faq": { "type": "array", "items": { "type": "object" }, "description": "Full new FAQ list of { q, a } objects. Replaces the saved FAQ." }, "summary": { "type": "string", "description": "What this edit changes, shown in the version history. Default 'Edited by hand'." } }, "required": [ "websiteId", "articleId" ] } } ``` # update_campaign_step (/docs/mcp/tools/update-campaign-step) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_campaign_step.mdx. */} **Edit campaign email** · Changes data Rewrite one email (step) of an existing campaign: its subject, body and/or delay. Only the fields you pass change. Get campaignId from list_campaigns and templateId from get_campaign (emailCampaignTemplates[]._id); a templateId that is not a step of that campaign is refused. The edit is rejected (HTTP 400 with the reasons) when a merge field has no fallback or the template cannot render; nothing is saved then. Contacts parked in error-sending because of this step are retried after a successful save. Returns the updated step. Writing rules: Write the body as plain text, one paragraph per line, no blank lines between paragraphs (each line becomes one \; never add empty paragraphs or \\ for spacing). Merge fields need a fallback, e.g. \{\{ first_name | there \}\}, \{\{ company_name | your company \}\}. End every body with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\}, each on its own line, and nothing after them; never type your own sign-off or unsubscribe sentence. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `campaignId` | `string` | Yes | Email campaign id from list_campaigns. | | `templateId` | `string` | Yes | Id of the step to edit, from get_campaign emailCampaignTemplates[]._id (24 hex characters). | | `subject` | `string` | No | Optional new subject line. Merge fields need a fallback, e.g. \{\{ company_name \| your team \}\}. | | `body` | `string` | No | Optional new body: plain text, one paragraph per line, ending with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\}. | | `delayDays` | `number` | No | Optional whole days to wait after the previous step. 0 for the first step. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_campaign_step", "title": "Edit campaign email", "annotations": { "title": "Edit campaign email", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "campaignId": { "type": "string", "description": "Email campaign id from list_campaigns." }, "templateId": { "type": "string", "description": "Id of the step to edit, from get_campaign emailCampaignTemplates[]._id (24 hex characters)." }, "subject": { "type": "string", "description": "Optional new subject line. Merge fields need a fallback, e.g. {{ company_name | your team }}." }, "body": { "type": "string", "description": "Optional new body: plain text, one paragraph per line, ending with {{sender_signature}} then {{unsubscribe_text}}." }, "delayDays": { "type": "number", "description": "Optional whole days to wait after the previous step. 0 for the first step." } }, "required": [ "campaignId", "templateId" ] } } ``` # update_campaign (/docs/mcp/tools/update-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_campaign.mdx. */} **Update a campaign** · Changes data · Acts outside your account Renames a campaign, starts it (status active: emails start going out to its contacts) or pauses it, or changes its sending days (0 Sunday to 6 Saturday), hours (timeSlot start and end, 0-24), timezone or open/click tracking. Fields left out stay as they are. Confirm with the user before setting status active. Returns 404 when the campaign is not one of this website's. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | campaignId from list_campaigns. | | `name` | `string` | No | New name. | | `status` | `"active" \| "paused"` | No | active to start sending, paused to stop. | | `daysRange` | `number[]` | No | Days to send on, 0 (Sunday) to 6 (Saturday). | | `timeSlot` | `object` | No | Sending hours in the campaign timezone. | | `timeSlot.start` | `number` | No | First hour, 0-23. | | `timeSlot.end` | `number` | No | Last hour, 1-24. | | `timezone` | `string` | No | IANA timezone, e.g. Europe/London. | | `isTrackingEnabled` | `boolean` | No | Track opens and clicks. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_campaign", "title": "Update a campaign", "annotations": { "title": "Update a campaign", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites (the campaign's website)." }, "campaignId": { "type": "string", "description": "campaignId from list_campaigns." }, "name": { "type": "string", "description": "New name." }, "status": { "type": "string", "enum": [ "active", "paused" ], "description": "active to start sending, paused to stop." }, "daysRange": { "type": "array", "items": { "type": "number", "minimum": 0, "maximum": 6 }, "description": "Days to send on, 0 (Sunday) to 6 (Saturday)." }, "timeSlot": { "type": "object", "properties": { "start": { "type": "number", "minimum": 0, "maximum": 23, "description": "First hour, 0-23." }, "end": { "type": "number", "minimum": 1, "maximum": 24, "description": "Last hour, 1-24." } }, "description": "Sending hours in the campaign timezone." }, "timezone": { "type": "string", "description": "IANA timezone, e.g. Europe/London." }, "isTrackingEnabled": { "type": "boolean", "description": "Track opens and clicks." } }, "required": [ "websiteId", "campaignId" ] } } ``` # update_email_account (/docs/mcp/tools/update-email-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_email_account.mdx. */} **Update a mailbox** · Changes data Changes a mailbox: the daily sending limit (queued emails are rescheduled to match), the sender name, company, position, phone and the HTML signature. Only the fields you pass change. Passwords and server settings change only in the dashboard. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. | | `messagesPerDayLimit` | `number` | No | Emails per day (1-500); our own mailboxes have a lower cap. | | `firstname` | `string` | No | Sender first name. | | `lastname` | `string` | No | Sender last name. | | `company` | `string` | No | Sender company. | | `position` | `string` | No | Sender job title. | | `phoneNumber` | `string` | No | Sender phone number. | | `signatureHTML` | `string` | No | The signature, as HTML. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_email_account", "title": "Update a mailbox", "annotations": { "title": "Update a mailbox", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "Mailbox ID from list_email_accounts." }, "messagesPerDayLimit": { "type": "number", "minimum": 1, "maximum": 500, "description": "Emails per day (1-500); our own mailboxes have a lower cap." }, "firstname": { "type": "string", "description": "Sender first name." }, "lastname": { "type": "string", "description": "Sender last name." }, "company": { "type": "string", "description": "Sender company." }, "position": { "type": "string", "description": "Sender job title." }, "phoneNumber": { "type": "string", "description": "Sender phone number." }, "signatureHTML": { "type": "string", "description": "The signature, as HTML." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # update_filter (/docs/mcp/tools/update-filter) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_filter.mdx. */} **Favourite a saved filter** · Changes data Marks a saved leads filter as a favourite (shown first) or not. Returns 404 when the filter is not one of this website's. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `filterId` | `string` | Yes | _id from list_filters. | | `isFavorite` | `boolean` | Yes | true to favourite it, false to un-favourite. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_filter", "title": "Favourite a saved filter", "annotations": { "title": "Favourite a saved filter", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "filterId": { "type": "string", "description": "_id from list_filters." }, "isFavorite": { "type": "boolean", "description": "true to favourite it, false to un-favourite." } }, "required": [ "websiteId", "filterId", "isFavorite" ] } } ``` # update_icp (/docs/mcp/tools/update-icp) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_icp.mdx. */} **Update ideal customer profile** · Changes data Changes a website's ideal customer profile: target industries, sectors, HQ locations, headcount and revenue ranges. Only the fields you pass change; the rest keep their saved values. A list you pass replaces the saved list, so read get_icp first and send the full list you want. Costs nothing and only changes settings inside the account. Returns the saved ICP. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `industries` | `string[]` | No | Target industries; replaces the saved list, e.g. ["Computer Software"]. | | `employeesMin` | `number` | No | Smallest company headcount to target (whole number). | | `employeesMax` | `number` | No | Largest company headcount to target (whole number). | | `locations` | `string[]` | No | Target countries; replaces the saved list, e.g. ["United States", "United Kingdom"]. | | `sectors` | `string[]` | No | Target sectors; replaces the saved list. | | `revenueMin` | `number` | No | Smallest annual revenue to target (number). | | `revenueMax` | `number` | No | Largest annual revenue to target (number). | | `excludedDomains` | `string[]` | No | Domains to exclude. Not saved today (see notes); use add_to_domain_blacklist to exclude domains. | | `excludedIndustries` | `string[]` | No | Industries to exclude. Not saved today (see notes). | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_icp", "title": "Update ideal customer profile", "annotations": { "title": "Update ideal customer profile", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "industries": { "type": "array", "items": { "type": "string" }, "description": "Target industries; replaces the saved list, e.g. [\"Computer Software\"]." }, "employeesMin": { "type": "number", "description": "Smallest company headcount to target (whole number)." }, "employeesMax": { "type": "number", "description": "Largest company headcount to target (whole number)." }, "locations": { "type": "array", "items": { "type": "string" }, "description": "Target countries; replaces the saved list, e.g. [\"United States\", \"United Kingdom\"]." }, "sectors": { "type": "array", "items": { "type": "string" }, "description": "Target sectors; replaces the saved list." }, "revenueMin": { "type": "number", "description": "Smallest annual revenue to target (number)." }, "revenueMax": { "type": "number", "description": "Largest annual revenue to target (number)." }, "excludedDomains": { "type": "array", "items": { "type": "string" }, "description": "Domains to exclude. Not saved today (see notes); use add_to_domain_blacklist to exclude domains." }, "excludedIndustries": { "type": "array", "items": { "type": "string" }, "description": "Industries to exclude. Not saved today (see notes)." } }, "required": [ "websiteId" ] } } ``` # update_intent_topic (/docs/mcp/tools/update-intent-topic) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_intent_topic.mdx. */} **Pause or edit intent topic** · Changes data Pauses or resumes an intent topic subscription, or changes its daily lead limit. Pausing stops new deliveries from that topic. To stop following a topic for good, use delete_intent_topic. Pass at least one of paused or userDailyLimit, otherwise the call returns 400. Returns 404 when the website is not subscribed to that topic. Returns \{ result \} with the updated subscription. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `topicSlug` | `string` | Yes | Slug of a subscribed topic, from list_intent_topics. | | `paused` | `boolean` | No | true pauses deliveries, false resumes them. | | `userDailyLimit` | `number` | No | New maximum leads per day. Positive whole number, capped at 5000. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_intent_topic", "title": "Pause or edit intent topic", "annotations": { "title": "Pause or edit intent topic", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "topicSlug": { "type": "string", "description": "Slug of a subscribed topic, from list_intent_topics." }, "paused": { "type": "boolean", "description": "true pauses deliveries, false resumes them." }, "userDailyLimit": { "type": "number", "description": "New maximum leads per day. Positive whole number, capped at 5000." } }, "required": [ "websiteId", "topicSlug" ] } } ``` # update_lead_comment (/docs/mcp/tools/update-lead-comment) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_comment.mdx. */} **Edit a lead comment** · Deletes or overwrites data Replace the text of an existing lead comment. Only the user who wrote the comment can edit it; others get 'You do not have permission'. The previous text is not kept. commentId is the _id from get_lead_comments. Returns status 'Successful'. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `commentId` | `string` | Yes | Comment id (the _id from get_lead_comments). | | `content` | `string` | Yes | The new comment text; replaces the old text entirely. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_lead_comment", "title": "Edit a lead comment", "annotations": { "title": "Edit a lead comment", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "commentId": { "type": "string", "description": "Comment id (the _id from get_lead_comments)." }, "content": { "type": "string", "description": "The new comment text; replaces the old text entirely." } }, "required": [ "commentId", "content" ] } } ``` # update_lead_notes (/docs/mcp/tools/update-lead-notes) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_notes.mdx. */} **Update lead notes** · Changes data Sets the free-form notes on a lead, replacing what was there; an empty string clears them. For a threaded discussion use add_lead_comment instead. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `leadId` | `string` | Yes | Lead ID from get_leads. | | `notes` | `string` | No | The full notes text; empty clears them. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_lead_notes", "title": "Update lead notes", "annotations": { "title": "Update lead notes", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "leadId": { "type": "string", "description": "Lead ID from get_leads." }, "notes": { "type": "string", "description": "The full notes text; empty clears them." } }, "required": [ "websiteId", "leadId" ] } } ``` # update_lead_quality (/docs/mcp/tools/update-lead-quality) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_quality.mdx. */} **Update the lead quality bar** · Changes data Changes the lead quality settings of a website. Leads scoring below the bar are not added (and use no credits). Only the fields you pass change; the highest bar is 80 (20 on lifetime-deal plans). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `minScore` | `number` | No | Minimum ideal-customer score for every source (0-80). | | `bySource` | `object` | No | Per-source bars that override minScore. | | `bySource.visitors` | `number` | No | Minimum score for website visitor leads (0-80); null uses the general bar. | | `bySource.intent` | `number` | No | Minimum score for 3rd-party intent leads (0-80); null uses the general bar. | | `bySource.scraping` | `number` | No | Minimum score for Web Scraping leads (0-80); null uses the general bar. | | `bySource.prospector` | `number` | No | Minimum score for Prospector leads (0-80); null uses the general bar. | | `bySource.scout` | `number` | No | Minimum score for AI Scout leads (0-80); null uses the general bar. | | `contactsOnly` | `boolean` | No | Only keep leads with a person to contact. | | `audienceFocus` | `"B2B" \| "B2C" \| "BOTH"` | No | B2B, B2C or BOTH. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_lead_quality", "title": "Update the lead quality bar", "annotations": { "title": "Update the lead quality bar", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "minScore": { "type": "number", "minimum": 0, "maximum": 80, "description": "Minimum ideal-customer score for every source (0-80)." }, "bySource": { "type": "object", "properties": { "visitors": { "type": "number", "minimum": 0, "maximum": 80, "description": "Minimum score for website visitor leads (0-80); null uses the general bar." }, "intent": { "type": "number", "minimum": 0, "maximum": 80, "description": "Minimum score for 3rd-party intent leads (0-80); null uses the general bar." }, "scraping": { "type": "number", "minimum": 0, "maximum": 80, "description": "Minimum score for Web Scraping leads (0-80); null uses the general bar." }, "prospector": { "type": "number", "minimum": 0, "maximum": 80, "description": "Minimum score for Prospector leads (0-80); null uses the general bar." }, "scout": { "type": "number", "minimum": 0, "maximum": 80, "description": "Minimum score for AI Scout leads (0-80); null uses the general bar." } }, "description": "Per-source bars that override minScore." }, "contactsOnly": { "type": "boolean", "description": "Only keep leads with a person to contact." }, "audienceFocus": { "type": "string", "enum": [ "B2B", "B2C", "BOTH" ], "description": "B2B, B2C or BOTH." } }, "required": [ "websiteId" ] } } ``` # update_lead_scoring_model (/docs/mcp/tools/update-lead-scoring-model) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_scoring_model.mdx. */} **Update a lead scoring model** · Deletes or overwrites data Change a lead scoring model's name, on/off state and/or rules. Every criterion key you pass in criteria replaces that criterion's whole rule list; criteria you leave out are unchanged, so read the model first with get_lead_scoring_model and send the full list for each criterion you change. Rule changes on a live model queue a re-score of recent leads in the background (rescoring.status 'queued'); removing a domain from companyDomain exclusions also unblocks it. Changes are recorded in the model's history. modelId from list_lead_scoring_models. Returns status 'success', the new revision and a summary of changes. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `modelId` | `string` | Yes | Scoring model id from list_lead_scoring_models. | | `name` | `string` | No | New model name. | | `active` | `boolean` | No | true turns the model on (it scores leads), false turns it off. | | `criteria` | `object` | No | Object keyed by criterion name, each value a full list of rules in the shape get_lead_scoring_model returns, e.g. \{"industry":[\{"values":["Software"],"score":8,"filter":"any"\}],"revenue":[\{"values":\{"min":1000000,"max":null\},"score":5\}]\}. score is -10..10; filter is 'any', 'only' or 'excl'. Numeric criteria (revenue, numberVisits, duration, alexaRank) take \{min,max\}; recency takes \{days\}; others take a list of strings. Empty or duplicate rules are dropped. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_lead_scoring_model", "title": "Update a lead scoring model", "annotations": { "title": "Update a lead scoring model", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "modelId": { "type": "string", "description": "Scoring model id from list_lead_scoring_models." }, "name": { "type": "string", "description": "New model name." }, "active": { "type": "boolean", "description": "true turns the model on (it scores leads), false turns it off." }, "criteria": { "type": "object", "description": "Object keyed by criterion name, each value a full list of rules in the shape get_lead_scoring_model returns, e.g. {\"industry\":[{\"values\":[\"Software\"],\"score\":8,\"filter\":\"any\"}],\"revenue\":[{\"values\":{\"min\":1000000,\"max\":null},\"score\":5}]}. score is -10..10; filter is 'any', 'only' or 'excl'. Numeric criteria (revenue, numberVisits, duration, alexaRank) take {min,max}; recency takes {days}; others take a list of strings. Empty or duplicate rules are dropped." } }, "required": [ "modelId" ] } } ``` # update_linkedin_account (/docs/mcp/tools/update-linkedin-account) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_linkedin_account.mdx. */} **Update a LinkedIn account** · Changes data Changes the label of a connected LinkedIn account, or pauses and resumes it (paused: its campaigns send nothing). | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `linkedinAccountId` | `string` | Yes | LinkedIn account ID from list_linkedin_accounts. | | `label` | `string` | No | A name for the account. | | `status` | `"active" \| "paused"` | No | active or paused. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_linkedin_account", "title": "Update a LinkedIn account", "annotations": { "title": "Update a LinkedIn account", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "linkedinAccountId": { "type": "string", "description": "LinkedIn account ID from list_linkedin_accounts." }, "label": { "type": "string", "description": "A name for the account." }, "status": { "type": "string", "enum": [ "active", "paused" ], "description": "active or paused." } }, "required": [ "websiteId", "linkedinAccountId" ] } } ``` # update_member (/docs/mcp/tools/update-member) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_member.mdx. */} **Update a team member** · Changes data Changes a member's role, permissions or websites. Fields left out stay as they are. Confirm with the user before calling. Needs the master key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `userId` | `string` | Yes | userId from list_members. | | `role` | `"Owner" \| "Member"` | No | Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner. | | `preset` | `"full" \| "sales" \| "developer" \| "viewer" \| "team" \| "client"` | No | Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog). | | `permissions` | `string[]` | No | Exact permission ids, from get_permissions_catalog. Overrides the preset. | | `allWebsites` | `boolean` | No | true: access to every current and future website. | | `websites` | `string[]` | No | Website ids the member can see, when allWebsites is false. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_member", "title": "Update a team member", "annotations": { "title": "Update a team member", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "userId": { "type": "string", "description": "userId from list_members." }, "role": { "type": "string", "enum": [ "Owner", "Member" ], "description": "Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner." }, "preset": { "type": "string", "enum": [ "full", "sales", "developer", "viewer", "team", "client" ], "description": "Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog)." }, "permissions": { "type": "array", "items": { "type": "string" }, "description": "Exact permission ids, from get_permissions_catalog. Overrides the preset." }, "allWebsites": { "type": "boolean", "description": "true: access to every current and future website." }, "websites": { "type": "array", "items": { "type": "string" }, "description": "Website ids the member can see, when allWebsites is false." } }, "required": [ "userId" ] } } ``` # update_tag (/docs/mcp/tools/update-tag) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_tag.mdx. */} **Update a tag** · Changes data Renames a tag or changes its colour on this website. Every lead that has the tag keeps it. Pass only what changes. tagId comes from list_tags. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `tagId` | `string` | Yes | Tag ID from list_tags. | | `name` | `string` | No | New tag name. | | `color` | `string` | No | New colour as a hex code, e.g. #1E4EFF. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_tag", "title": "Update a tag", "annotations": { "title": "Update a tag", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "tagId": { "type": "string", "description": "Tag ID from list_tags." }, "name": { "type": "string", "description": "New tag name." }, "color": { "type": "string", "description": "New colour as a hex code, e.g. #1E4EFF." } }, "required": [ "websiteId", "tagId" ] } } ``` # update_warmup_settings (/docs/mcp/tools/update-warmup-settings) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_warmup_settings.mdx. */} **Update warmup settings** · Changes data Changes how hard a mailbox warms up: intensity conservative, normal or aggressive, and the most warmup emails a day (5-100). Returns 404 when the mailbox is not one of this website's. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | _id of the mailbox from list_email_accounts. | | `intensity` | `"conservative" \| "normal" \| "aggressive"` | No | conservative, normal or aggressive. | | `dailyLimit` | `number` | No | Most warmup emails a day, 5-100. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_warmup_settings", "title": "Update warmup settings", "annotations": { "title": "Update warmup settings", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "_id of the mailbox from list_email_accounts." }, "intensity": { "type": "string", "enum": [ "conservative", "normal", "aggressive" ], "description": "conservative, normal or aggressive." }, "dailyLimit": { "type": "number", "minimum": 5, "maximum": 100, "description": "Most warmup emails a day, 5-100." } }, "required": [ "websiteId", "emailAccountId" ] } } ``` # update_web_scraping (/docs/mcp/tools/update-web-scraping) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_web_scraping.mdx. */} **Update Web Scraping keywords** · Changes data · Acts outside your account · Spends credits or money Turns Web Scraping on or off and sets its keywords (exact or fuzzy match, each can be paused), the daily limit (1-500 leads, 1 credit each) and contacts-only (only companies where we found a person). Passing keywords replaces the whole list: get_web_scraping first and send the full list. Not on LTD plans. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `enabled` | `boolean` | No | On or off. | | `keywords` | `object[]` | No | The full keyword list: value (a phrase your buyers write, or a domain in a script such as a competitor's tracker), matchMode (exact or fuzzy), paused. | | `keywords[].value` | `string` | Yes | A phrase your buyers write on their own site, or a domain that appears in a script URL. | | `keywords[].matchMode` | `"exact" \| "fuzzy"` | No | exact (the phrase as written) or fuzzy (close variants too). | | `keywords[].paused` | `boolean` | No | true to keep the keyword but stop searching for it. | | `dailyLimit` | `number` | No | Leads per day, 1-500. | | `contactsOnly` | `boolean` | No | Only add companies where a person was found. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_web_scraping", "title": "Update Web Scraping keywords", "annotations": { "title": "Update Web Scraping keywords", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "enabled": { "type": "boolean", "description": "On or off." }, "keywords": { "type": "array", "items": { "type": "object", "properties": { "value": { "type": "string", "description": "A phrase your buyers write on their own site, or a domain that appears in a script URL." }, "matchMode": { "type": "string", "enum": [ "exact", "fuzzy" ], "description": "exact (the phrase as written) or fuzzy (close variants too)." }, "paused": { "type": "boolean", "description": "true to keep the keyword but stop searching for it." } }, "required": [ "value" ] }, "description": "The full keyword list: value (a phrase your buyers write, or a domain in a script such as a competitor's tracker), matchMode (exact or fuzzy), paused." }, "dailyLimit": { "type": "number", "minimum": 1, "maximum": 500, "description": "Leads per day, 1-500." }, "contactsOnly": { "type": "boolean", "description": "Only add companies where a person was found." } }, "required": [ "websiteId" ] } } ``` # update_website (/docs/mcp/tools/update-website) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_website.mdx. */} **Update website settings** · Changes data Changes a website's name, url and tracking settings. Send only the fields to change. Returns status (success, partial or error), saved (fields stored) and failed (field + reason); fields that are not website settings are listed under ignored. A setting switched off at account level cannot be switched on here (403). websiteId comes from list_websites. Confirm with the user before switching tracking settings off, since that changes which leads are created. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `name` | `string` | No | New display name for the website. | | `url` | `string` | No | Website address, e.g. https://www.acme.example. verify_website checks the home page of this address. | | `trackExactVisitors` | `boolean` | No | true to identify the exact person visiting (name, email, LinkedIn) as well as their company. | | `trackPersonalEmails` | `boolean` | No | true to include personal email addresses (e.g. Gmail) for identified visitors; false for business emails only. | | `enablePersonalEmails` | `boolean` | No | Same as trackPersonalEmails (kept for older clients). trackPersonalEmails wins if both are sent. | | `trackCompanyWithSuggestedContacts` | `boolean` | No | true to still create a lead for the visiting company, with suggested contacts there, when the exact person cannot be identified. | | `identifySettings` | `"both" \| "personal-level-data" \| "company-level-data"` | No | Which leads to show: 'both' (default), 'personal-level-data' (person leads) or 'company-level-data' (company leads). | | `emailTrackingEnabled` | `boolean` | No | Website-level email tracking flag. Open and click tracking for outreach emails is set per campaign. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "update_website", "title": "Update website settings", "annotations": { "title": "Update website settings", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "name": { "type": "string", "description": "New display name for the website." }, "url": { "type": "string", "description": "Website address, e.g. https://www.acme.example. verify_website checks the home page of this address." }, "trackExactVisitors": { "type": "boolean", "description": "true to identify the exact person visiting (name, email, LinkedIn) as well as their company." }, "trackPersonalEmails": { "type": "boolean", "description": "true to include personal email addresses (e.g. Gmail) for identified visitors; false for business emails only." }, "enablePersonalEmails": { "type": "boolean", "description": "Same as trackPersonalEmails (kept for older clients). trackPersonalEmails wins if both are sent." }, "trackCompanyWithSuggestedContacts": { "type": "boolean", "description": "true to still create a lead for the visiting company, with suggested contacts there, when the exact person cannot be identified." }, "identifySettings": { "type": "string", "enum": [ "both", "personal-level-data", "company-level-data" ], "description": "Which leads to show: 'both' (default), 'personal-level-data' (person leads) or 'company-level-data' (company leads)." }, "emailTrackingEnabled": { "type": "boolean", "description": "Website-level email tracking flag. Open and click tracking for outreach emails is set per campaign." } }, "required": [ "websiteId" ] } } ``` # upgrade_plan (/docs/mcp/tools/upgrade-plan) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/upgrade_plan.mdx. */} **Upgrade plan** · Changes data · Acts outside your account · Spends credits or money Moves the subscription to more leads per month right away and charges the card on file today. Same interval: the charge is the extra leads at the new plan's per-lead price, the extra credits are added now and the renewal date stays the same. Switching monthly/yearly: the current subscription is replaced and the full new amount is charged today. If leads is not higher than today's plan, the change is scheduled for the next billing date instead. Run preview_plan_change first, show the price and get an explicit yes. Confirm with the user before calling. Returns status (active, requires_action or scheduled), chargedNowCents and nextBillingDate; 402 means the card was declined, 409 means the subscription is paused. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `leads` | `number` | Yes | Leads per month of the new plan; use the same value you previewed. | | `annual` | `boolean` | No | true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "upgrade_plan", "title": "Upgrade plan", "annotations": { "title": "Upgrade plan", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "leads": { "type": "number", "description": "Leads per month of the new plan; use the same value you previewed." }, "annual": { "type": "boolean", "description": "true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch." } }, "required": [ "leads" ] } } ``` # verify_contact (/docs/mcp/tools/verify-contact) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/verify_contact.mdx. */} **Verify contact email** · Changes data · Acts outside your account · Spends credits or money Checks whether the email of a saved contact is valid and deliverable. If the contact has no email but has a domain, it tries firstnamelastname@domain and firstname.lastname@domain. Pass the contactId returned by create_contact; a raw email is not accepted. For people from search_people use reveal_contact or find_contact_email instead. Needs the Email Waterfall add-on: without it the call returns 402 with an upgradeUrl. A valid or catch-all result can use a credit, and the call returns 400 'You do not have enough credits!' when credits run out. Confirm with the user before calling. Returns \{ email, phone, verificationStatus \} (e.g. valid, catch-all), or 404 'Contact Details not found' with email null. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `contactId` | `string` | Yes | The _id returned by create_contact (24 hex characters). | | `websiteId` | `string` | Yes | Website ID from list_websites. Used for the credit check. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "verify_contact", "title": "Verify contact email", "annotations": { "title": "Verify contact email", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "contactId": { "type": "string", "description": "The _id returned by create_contact (24 hex characters)." }, "websiteId": { "type": "string", "description": "Website ID from list_websites. Used for the credit check." } }, "required": [ "contactId", "websiteId" ] } } ``` # verify_tracking_domain (/docs/mcp/tools/verify-tracking-domain) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/verify_tracking_domain.mdx. */} **Verify a tracking domain** · Changes data · Acts outside your account Checks that a mailbox's custom tracking domain has its CNAME record set, so open and click tracking links use your own domain. Returns what is missing when it is not set. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | _id of the mailbox from list_email_accounts. | | `customDomain` | `string` | Yes | The tracking domain, e.g. track.yourdomain.com. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "verify_tracking_domain", "title": "Verify a tracking domain", "annotations": { "title": "Verify a tracking domain", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "emailAccountId": { "type": "string", "description": "_id of the mailbox from list_email_accounts." }, "customDomain": { "type": "string", "description": "The tracking domain, e.g. track.yourdomain.com." } }, "required": [ "websiteId", "emailAccountId", "customDomain" ] } } ``` # verify_website (/docs/mcp/tools/verify-website) {/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/verify_website.mdx. */} **Verify installation** · Changes data · Acts outside your account Loads the website's home page (from its saved url) and checks whether this website's tracking snippet is in the HTML. When found, the website is marked verified and the response contains 'verified'; an empty response means the snippet was not found, the page could not be loaded, or no url is set (set it with update_website). Use after installing the snippet from get_tracking_pixel. For deeper problems (no leads arriving, credits, blocks) use get_website_diagnostics. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `websiteId` | `string` | Yes | Website ID from list_websites. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "verify_website", "title": "Verify installation", "annotations": { "title": "Verify installation", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." } }, "required": [ "websiteId" ] } } ``` # Blog articles > Your hosted blog (Optimize add-on): articles written for your ideal customer, reviewed and published by you. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/optimize/blog-articles With the Optimize add-on your website gets a hosted blog. New articles are proposed for your ideal customer; you read, edit, approve or reject each one, and every change is kept as a version you can go back to. 1. **Optimize → SEO** lists your articles; filter and sort them. 2. **Open a proposed article**, edit it if you like, then **Approve** or **Reject**. 3. **History** shows every version; **Revert** brings one back. 4. Change not showing? **Clear cache**. --- ## API — From your code Source: /docs/optimize/blog-articles/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Publish from your CMS [#use-case-publish-from-your-cms] `POST /v3/blog/articles` with the `title`, `slug` and `html`; `status: "draft"` keeps it off the site until you are ready. ### Use case: Fix a typo in a live article [#use-case-fix-a-typo-in-a-live-article] `PUT /v3/blog/articles/{articleId}` saves a new version at the same URL; the old one stays in the history. --- ## MCP — AI agents Source: /docs/optimize/blog-articles/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Which blog articles got the most visits this month? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` ### Use case [#use-case-1] > Add an FAQ answering 'how is pricing calculated' to my pricing article. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "articleId": "6a2f00000000000000000002", "faq": [ { "q": "How is pricing calculated?", "a": "By the number of identified visitors per month." } ] } ``` # AI Assist > Describe your business and who you sell to; AI proposes the scoring rules. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/qualify/ai-assist No time to write rules? AI Assist reads your website (or your description), asks who you sell to, and proposes rules you accept or skip one by one. 1. **Open a model → ✦ AI Assist.** 2. **Let it read your website**, or describe your business yourself. 3. **Generate rules**, then accept or skip each one and save. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/qualify/ai-assist/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: A model per product [#use-case-a-model-per-product] Call `POST /v3/lead-scoring/ai-generate` once per product line with its own description. --- ## MCP — AI agents Source: /docs/qualify/ai-assist/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Build me a scoring model: we sell HR software to UK and US companies with 50 to 1,000 staff. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "description": "HR software for UK and US companies with 50-1,000 employees; HR directors and COOs buy it." } ``` # Exclude leads > Keep companies, domains, countries, industries or job titles out of your leads, and addresses out of your campaigns. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/qualify/exclusions An **Exclude** rule in a scoring model keeps every matching lead out before it comes in: a country, a company domain, an industry, a job title… From code you can also block domains, and keep email addresses out of every campaign. 1. **Open a model → find the criterion** (country, domain, industry…). 2. **Exclude** it, or **Only include** to allow just those. 3. **Save** — it applies to new leads. --- ## API — From your code Source: /docs/qualify/exclusions/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Keep your customers out of campaigns [#use-case-keep-your-customers-out-of-campaigns] `POST /admin/email-blacklist` with `{ "websiteId": …, "csv": "customers", "email": [ … ] }` — campaigns never send to those addresses. --- ## MCP — AI agents Source: /docs/qualify/exclusions/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Never email anyone at our customers: acme.example and northwind.example. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "domains": [ "acme.example", "northwind.example" ] } ``` # Ideal customer profile > Your ideal customer in one place: industries, company size, revenue, locations and the domains or industries to leave out. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/qualify/icp The ideal customer profile is the short version of who you sell to: industries, company size, revenue and locations, plus domains and industries to leave out. AI assistants read it to search for prospects that fit. 1. **Read it** with `GET /v3/icp` or by asking your AI assistant. 2. **Change it** with `PUT /v3/icp`. 3. For full control over scoring, use [Scoring models](/docs/qualify/scoring-models). ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/qualify/icp/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Keep it in sync with your CRM [#use-case-keep-it-in-sync-with-your-crm] `PUT /v3/icp` with the industries and company sizes of your best customers. --- ## MCP — AI agents Source: /docs/qualify/icp/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Find prospects that match my ideal customer profile. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Qualify (/docs/qualify) Qualify checks each lead against the rules you set — company size, industry, location, job title, pages visited — and gives it a score. Your best-fit leads show up first, your automations can act on the score, and leads that match an Exclude rule are left out. Step-by-step guides for Qualify are coming next. Until then, ask the support chat on this page anything about it. # Re-qualify existing leads > Score the leads you already have again after changing a model. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/qualify/requalify New rules score new leads straight away. To apply them to leads you already have, rescore them. 1. **Qualify → ⋯ on a model.** 2. **Rescore recent leads** (the last 90 days). 3. **Make this the default** to choose which model scores new leads. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/qualify/requalify/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Rescore after a CRM update [#use-case-rescore-after-a-crm-update] `POST /v3/lead-scoring/recalculate` with the `leadIds` whose data changed. --- ## MCP — AI agents Source: /docs/qualify/requalify/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Rescore the leads from this week with my new rules. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "leadIds": [ "6530c1d2e3f4a5b6c7d8e9f2" ] } ``` # Scoring models > Score every new lead against your ideal customer with rules for company, location, pages visited and more. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/qualify/scoring-models A scoring model is your definition of a good lead: rules for company size, industry, location, pages visited, job title and more, each with a weight. Every new lead gets a score from it. 1. **Qualify → open a model.** 2. **Add or change rules** and their weight (Penalize … Very important). 3. **Test a website** to see how any company would score, then **Save and Close**. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/qualify/scoring-models/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Read a model’s rules [#use-case-read-a-models-rules] `GET /admin/lead-scoring/{id}` returns its criteria; change them with `PUT /v3/lead-scoring/{modelId}` — each criterion you send replaces that criterion’s rules. --- ## MCP — AI agents Source: /docs/qualify/scoring-models/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Show me how my default scoring model works. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Website analytics > Visits, identified leads, ICP match rate and who your visitors are, per website. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/websites/analytics The dashboard shows how a website is doing: identified leads, how many fit your ideal customer, and who they are. 1. **Dashboard:** plan, pixel status, leads this cycle. 2. **Identifications** and **ICP match rate** over 30 days. 3. **Who they are:** industries, company sizes, job titles. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/websites/analytics/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: A weekly report [#use-case-a-weekly-report] `GET /admin/website/daily-stats?websiteId=…` returns the last 30 days, day by day. --- ## MCP — AI agents Source: /docs/websites/analytics/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > How many leads did acme.example get this month? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Websites & tracking (/docs/websites) Each website has its own tracking pixel, leads, settings and keys. Add one, install the pixel, and identified visitors start showing up in Leads. # Install the tracking pixel > Install the pixel with Google Tag Manager, WordPress or a snippet of HTML, then check it works. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/websites/tracking-pixel The pixel identifies your website visitors. Install it once, on every page, with the method that fits your website. 1. **Pick a method:** Google Tag Manager, WordPress or HTML. 2. **Paste the code** in the head of every page, or send it to your developer. 3. **Verify** it: the dashboard shows when it last saw a visit. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/websites/tracking-pixel/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Install for a client [#use-case-install-for-a-client] `GET /v3/websites/{websiteId}/pixel` returns the snippet; `POST /utilities/verify-website` checks it is live. --- ## MCP — AI agents Source: /docs/websites/tracking-pixel/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Give me the pixel code for acme.example and check if it is installed. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # Websites > Add, edit and remove the websites you track. Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP). ## Guide — In the dashboard Source: /docs/websites/websites Each website you add gets its own tracking pixel and its own leads. Switch between them from the website switcher. 1. **Websites → Add new website.** 2. **Install its pixel.** 3. **Quick edit** a website to see its plan, credits and pixel. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. --- ## API — From your code Source: /docs/websites/websites/api Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Create a website for a new client [#use-case-create-a-website-for-a-new-client] `POST /admin/websites` with its name; the answer includes its tracking script. --- ## MCP — AI agents Source: /docs/websites/websites/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > List my websites. ```json {} ``` # Add a client (/docs/white-label/add-a-client) When a client signs up on **your** marketing site, your server creates their website, saves its id, [starts their trial](/docs/white-label/start-trial) and invites them. Every client gets **one website**. Create it in your sign-up code, right after you create the client's company in your own database, with your master key (`HL_MASTER_KEY`, sent as `?privateKey=`). ## 1. Create the website [#1-create-the-website] `POST /admin/websites` with the client's name and domain. The domain may be empty: the install screen asks the client for it. The answer is the new website's id. ## 2. Save the websiteId on your client [#2-save-the-websiteid-on-your-client] Store the `websiteId` on your own customer record (for example `company.happierleadsWebsiteId`). It is the only link between your client and their website: credits, trial, paid, cancel and every screen you open later need it. Lose it and that client cannot open their screens. ```js // after POST /admin/websites, before anything else await db.companies.update(company.id, { happierleadsWebsiteId: websiteId }); ``` ## 3. Then give it credits [#3-then-give-it-credits] In the same sign-up request, right after saving the id: [start a trial](./start-trial), or [switch it to paid](./switch-to-paid) if the client paid at sign-up. ## If our API is down at sign-up [#if-our-api-is-down-at-sign-up] Let the sign-up succeed anyway: flag the company (for example `happierleadsPending`) and retry from a background job. Never create a second website for a company that already has a `websiteId`. ## Invite the client [#invite-the-client] Last, invite them with the **Client** role on their own website. They get an invite email from your sender address and sign in at `reveal.youragency.example`. `POST /admin/invite` with `preset: "client"` and their website. The **Client** role sees their own website only: no buying, no team, no account or billing pages. Need a different role for someone (for example your own account managers)? See [Team](/docs/account/team). ```js title="The same in Node.js" await hl('POST', '/admin/invite', { invites: [{ email: user.email, firstName: user.firstName, preset: 'client', websites: [websiteId] }], }); ``` **Next:** [start their trial](/docs/white-label/start-trial). # Build it with your AI coding assistant (/docs/white-label/build-with-ai) Paste this into Claude (or any AI coding assistant) inside your marketing site's or billing service's code base. Do the [setup](/docs/white-label/setup) in your dashboard first. ```text title="Prompt" Connect our billing to Happierleads for a full white label (clients use reveal.ourdomain.com). Key on the server only: HL_MASTER_KEY (master-priv-…). Never send it to the browser, never log it. Add it to .env.example. API base: https://rest-admin.happierleads.com (add ?privateKey=HL_MASTER_KEY to every call). 1. Sign-up on our marketing site: POST /admin/websites { name, domain } → { websiteId }; store it on the customer. Then PUT /admin/websites/set-limits/{websiteId} { credits: 500, emailAccounts: 2 } and PUT /admin/websites/toggle-limits/{websiteId} { trialEnabled: true, trialExpireDate: 7 days from now, enableWebsiteLimits: true }. Then POST /admin/invite { invites: [{ email, firstName, preset: "client", websites: [websiteId] }] } so they get our branded invite. 2. Billing webhook (Stripe/Chargebee/Paddle): on invoice paid, set-limits { credits for their plan } and toggle-limits { trialEnabled: false, activeWebsite: true, enableWebsiteLimits: true, refreshOnDate: the period end }. On cancellation, set-limits { credits: 0, emailAccounts: 0 } (tracking stops, data is kept). 3. Keep a mapping billing customer → websiteId, make the webhook idempotent and log every call's status. Match this project's code style and add tests for the webhook handler. ``` # Cancel or unpaid (/docs/white-label/cancel) A client cancels, or stops paying. Two calls: no more leads, then stop the monthly refill. **Tracking stops; their leads and settings are kept**, so a returning client picks up where they left off. ## 1. Leads to 0 [#1-leads-to-0] ## 2. Stop the monthly refill [#2-stop-the-monthly-refill] ## They come back [#they-come-back] Run the two [switch to paid](./switch-to-paid) calls again: everything works at once. ## Leaving for good [#leaving-for-good] Only when a client asks for their data to be removed: `DELETE /admin/websites/{id}` removes the website **and all its leads**. It cannot be undone, and never call it from a browser. **Next:** [build it with your AI coding assistant](/docs/white-label/build-with-ai). # Change plan or billing date (/docs/white-label/change-plan) **A normal monthly renewal needs no call**: on `refreshOnDate` the leads refill to the plan's number and the date moves on a month. Call us only when something changes. ## Upgrade or downgrade [#upgrade-or-downgrade] `PUT /admin/websites/set-limits/{websiteId}` with the new numbers. - **Upgrade:** the extra leads are added to what is left now (limit 1,000 with 377 left → 5,000 gives 4,377 left). - **Downgrade:** what is left is capped at the new number. Try it with Mock data: the sample website has 1,000 leads a month with 377 left. ## Billing date moved, or refill now [#billing-date-moved-or-refill-now] Run both [switch to paid](./switch-to-paid) calls again with the new date: paid mode with the new `refreshOnDate`, then the plan's leads with `resetCredits: true`. **Next:** [cancel or unpaid](/docs/white-label/cancel). # Introduction (/docs/white-label) Your clients sign in at **your** address (for example `reveal.youragency.example`) and use the full dashboard: their leads, pixel install, automations, campaigns. Your logo, your colours, your sender emails. You sell it and bill it; your server tells us what each client paid for. ## Is this the right one? [#is-this-the-right-one] | | [API only](/docs/websites/websites/api) | [Embedded screens](/docs/embed) | [Full white label](/docs/white-label) | | --- | --- | --- | --- | | **Where your clients work** | Your own screens, fed by our API | Your app, with our screens in an iframe | Our dashboard on your domain (`reveal.yourdomain.com`) | | **Who signs them in** | You | You (we never see their password) | Our sign-in page, with your brand | | **What you build** | The leads list, pixel install, settings | One server endpoint and an iframe | Your marketing site and your billing | | **Who bills your clients** | You | You | You: your server calls our API on every payment | | **Time to launch** | Weeks | A day | A few days (DNS + branding) | All three use the same building blocks: **one website per client**, created with your master key, and **leads (credits) that follow what the client pays you**. Want the screens **inside your own app** instead, with your own sign-in? Use [Embedded screens](/docs/embed). ## What you build, in order [#what-you-build-in-order] | # | Step | Where | When | | --- | --- | --- | --- | | 1 | [Your domain, brand and assets](/docs/white-label/setup) | Your Happierleads dashboard | Once | | 2 | [Add a client: website, credits, invite](/docs/white-label/add-a-client) | Your server, sign-up code | Every new client | | 3 | [Start a trial](/docs/white-label/start-trial), [switch to paid](/docs/white-label/switch-to-paid), [change plan](/docs/white-label/change-plan), [cancel](/docs/white-label/cancel) | Your server, billing webhook | Every payment change | Every call page has a playground: run it on sample data or on your own account. In a hurry? [Let your AI coding assistant build it](/docs/white-label/build-with-ai). ## Your key [#your-key] Every call uses your **master key** (`master-priv-…`, from **Account settings → API Keys**), sent as `?privateKey=`. Keep it on your server only: never in a web page, a mobile app or a public repository. See [Authentication](/docs/authentication). ## What your clients get [#what-your-clients-get] - One website each, with its own pixel, leads and settings. - The **Client** role: their own website only. No buying, no team, no account or billing pages, so everything about money stays with you. - Emails (invites, password resets, alerts) from your sender address, with your brand. # Your domain, brand and assets (/docs/white-label/setup) Once, in your Happierleads dashboard: **Account settings → White label → Start setup**. The wizard has five steps. ## Steps 1 and 2: your domain [#steps-1-and-2-your-domain] Your clients must never see happierleads.com. The **White label** wizard puts everything on two addresses of yours: one for the screens and one for the API. ### Choose your two addresses [#choose-your-two-addresses] Open **Account settings → White label** and click **Start setup**. Type a subdomain (for example `reveal`) and your domain. The wizard sets up: - `reveal.youragency.example`: the screens (the dashboard, or the embedded screens) - `rest-dash.youragency.example`: the API Fill in the sender details for system emails and click **Save & continue**. ![Choose your domains](/images/embed/wizard-domains.png) ### Add the DNS records [#add-the-dns-records] The wizard shows two **CNAME** records. Add them at your DNS provider exactly as shown. Set **Proxy status** to **DNS only** (grey cloud). Proxied records stop the SSL certificate from being issued. ![Verify your DNS](/images/embed/wizard-dns.png) ### Verify [#verify] Click **Verify DNS & continue**, usually 5 to 30 minutes after adding the records. Records turn green once they are found. If one says *Not yet*, fix it, wait a few minutes and click Verify again. Once verified you can call the API on `https://rest-dash.youragency.example` instead of `https://rest-admin.happierleads.com`: same endpoints, same keys. ## Step 3: your brand [#step-3-your-brand] | Field | Used for | | --- | --- | | Company name | Everywhere our name would appear | | Sender name and sender email | Invites, password resets and alerts your clients receive | | Bounce address (optional) | Where undeliverable emails are reported | | Brand color | Buttons and highlights | ## Step 4: your brand assets [#step-4-your-brand-assets] Upload your **logo** (light background), the **header logo** (dark background), the **sign-in hero image**, the **favicon** and the logo for the automations page. Anything you skip can be added later in the same place. ## Step 5: you're live [#step-5-youre-live] Your clients can now sign in at `reveal.youragency.example`, and your server can call the API on `rest-dash.youragency.example`. **Next:** [add your first client](/docs/white-label/add-a-client). # Start a trial (/docs/white-label/start-trial) A trial gives a new client a number of leads until an end date. Two calls, from your sign-up code right after [creating the website](./create-website). ## 1. How many leads and email accounts [#1-how-many-leads-and-email-accounts] `PUT /admin/websites/set-limits/{websiteId}`. Both `credits` and `emailAccounts` are required (a `405` otherwise). ## 2. Trial until the end date [#2-trial-until-the-end-date] `PUT /admin/websites/toggle-limits/{websiteId}` with `trialEnabled: true` and the end date. ## What happens without you [#what-happens-without-you] When the trial ends, its leads go to 0 and tracking stops. Nothing to call, unless they pay: then [switch them to paid](./switch-to-paid). ## The same in your dashboard [#the-same-in-your-dashboard] **Website settings → Credits for this website**, handy to check what your code did: | In the dashboard | In the API | | --- | --- | | Give it its own limit | `enableWebsiteLimits: true` | | Trial (one-off) | `trialEnabled: true` | | Leads for the trial | `credits` | | Trial ends on | `trialExpireDate` | ![Trial in Website settings](/images/embed/ui-trial.png) **Next:** [switch to paid](/docs/white-label/switch-to-paid). # Switch to paid (/docs/white-label/switch-to-paid) A client pays: at sign-up for a paid plan, or in your *payment succeeded* webhook when a trial converts. Two calls, **in this order**. ## 1. Paid mode, with the monthly refill date [#1-paid-mode-with-the-monthly-refill-date] `PUT /admin/websites/toggle-limits/{websiteId}` with `activeWebsite: true` and `refreshOnDate` = their next billing date. This ends a trial. ## 2. The plan's leads, refilled to full now [#2-the-plans-leads-refilled-to-full-now] `PUT /admin/websites/set-limits/{websiteId}` with the plan's numbers and `resetCredits: true`. Call both from your billing webhook and make it idempotent: the same event twice must give the same result. The **JavaScript** tab of each playground has the code. ## What happens without you [#what-happens-without-you] Every month on `refreshOnDate` their leads refill to the plan's number and the date moves on a month. A normal renewal needs no call. ## The same in your dashboard [#the-same-in-your-dashboard] | In the dashboard | In the API | | --- | --- | | Give it its own limit | `enableWebsiteLimits: true` | | Every month | `activeWebsite: true, trialEnabled: false` | | Leads per month | `credits` | | Refills on | `refreshOnDate` | | Refill now | `resetCredits: true` | ![Paid in Website settings](/images/embed/ui-paid.png) **Next:** [change plan or billing date](/docs/white-label/change-plan).