# Plan, billing & credits > Your plan, who can manage it, invoices and how credits are used. 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. **Who can manage billing:** before your account pays (trial or expired trial), anyone on the team can open Billing and upgrade. Once it pays, only the account owner and teammates with the **Billing & plan** permission can; other teammates see who the owner is and can ask them. The owner gives that permission under [Team](/docs/account/team). 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 (owner or the **Billing & plan** permission). A cancelled plan stays usable until the end of the period you paid for, and you can restart it before then. ### Choose or change your plan [#choose-or-change-your-plan] Go to **Billing** and click **Change plan** (on a trial, any **Upgrade** button opens the same page). 1. **How many leads per month?** Move the slider; the price follows your volume. Excluding people you don't sell to (your ICP) keeps the number you need lower. 2. **Optional power-ups** add to the price per lead: LinkedIn Verification, Email Waterfall, Inbox Creation (mailboxes and domains for your campaigns) and, from 10,000 leads a month, White-label. 3. Tick **Save 30% with annual billing** to pay yearly. 4. Check the summary, then **Subscribe Now**. 5. **Pay:** use your saved card or **+ Use a new card**. Have a promo code? Type it and click **Apply**. To put your company name, VAT or tax number and address on your invoices, click **Set up** next to business details and **Save details**. Then confirm the payment. You can add or change them later on the Billing page (business details, **Edit**); they apply to the next invoices. On a paid plan, the same page changes it. More leads: the difference is charged today and the extra credits are added straight away. Fewer leads: the change is scheduled for your next billing date, and nothing is charged or refunded now. ### How credits are used [#how-credits-are-used] One credit is used for each new lead, and every one is listed in **Credit history** with your balance before and after. Your plan includes a number of leads per billing cycle; leads bought on top are used only after those run out, at your plan's price per lead. Never charged: - **Returning visitors.** A person is charged once; coming back is free. - **Duplicates.** If the same lead is created twice, the copy is removed and refunded. - **Leads your Lead quality bar, ICP or Qualify rules block.** They are never shown, so never charged. - **Your own team.** Visits from you and your teammates are free. Hiding or deleting a lead does not give the credit back, because you were shown it. To get this cycle's credits back for leads you don't want, raise the Lead quality bar on the Leads page and remove the leads under it. ### When your leads run out [#when-your-leads-run-out] If you use all your plan's leads before it renews, new website visitors stop being identified until the next billing date. To keep going: - **Auto top-up** adds a pack of leads each time you run out, at your plan's price per lead with no extra fee, and never spends more than the monthly limit you set. Turn it on in the auto top-up card on Billing (it is also offered right after you subscribe), and change or switch it off there any time. - **Buy extra leads** once from the rollover leads card on Billing. Bought leads roll over until you use them. - Or move to a bigger plan under **Choose or change your plan**. ### Common questions [#common-questions] **What is a credit? What is a lead?** A lead is one person Platform identified for you (a website visitor, or someone found by Prospector, AI Scout, Web Scraping or 3rd-party intent). A credit is what one lead costs: your plan gives you a number of credits per billing cycle and each new lead uses one. The same person coming back is free. **What happens when my trial ends?** New leads stop; nothing is deleted. Your leads, Qualify, automations, Slack, CRM, webhooks and alerts keep working. Details: [When your trial ends](/docs/account/trials-and-codes#when-your-trial-ends). **What happens when I run out of credits?** New visitors stop being identified until your next billing date; everything else keeps working. On a paid plan, **auto top-up** buys a pack of leads the moment you run out, at your plan's price per lead, within the monthly limit you set; or buy extra leads once, or move up a plan ([When your leads run out](#when-your-leads-run-out)). Auto top-up needs an active paid plan with a card on file; it does not run on a trial, a lifetime deal or a paused plan. **Do unused leads roll over?** Your plan's leads refresh at each billing date. Leads you bought on top (rollover leads, auto top-up packs) stay until you use them. **Can I pause instead of cancelling?** Yes, for 1 to 6 months: nothing is charged, no new leads come in, and the plan resumes by itself ([Cancel or pause your plan](/docs/account/cancel-or-pause)). **Who can see and change billing?** The account owner and teammates with the **Billing & plan** permission (anyone, while the account is still on a trial). Other teammates see the owner's email so they can ask. **How do I put my company name and VAT number on invoices?** Billing → business details → **Set up** (or **Edit**), fill in the company name, VAT or tax number and address, then **Save details**. They appear on the next invoices. ### More on billing [#more-on-billing] - [Cancel or pause your plan](/docs/account/cancel-or-pause), and restarting it. - [Trials, offers and lifetime deal codes](/docs/account/trials-and-codes). ### 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" } ``` > What would 10,000 leads a month cost us, and what would we pay today? ```json { "leads": 10000 } ``` Nothing changes: it answers the new monthly price and what would be charged today. Your assistant keeps your billing interval (monthly or yearly) unless you ask to switch. Run it before `upgrade_plan`, which charges the card. > Yes, go ahead: move us to 10,000 leads a month. ```json { "leads": 10000 } ``` The card on file is charged today for the extra leads, and the new credits are there straight away. If your bank asks you to confirm the payment, the answer comes back with a link (`confirmUrl`) where you confirm it. > 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. > We're closed for the holidays. Pause our plan for 2 months. ```json { "months": 2 } ``` Pauses last 1 to 6 whole months. Nothing is charged and no new leads come in while paused; the plan resumes by itself on the date in the answer (`pausedUntil`), or earlier with `reactivate_subscription`. > 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. > Actually, keep our subscription. Undo the cancellation. ```json {} ``` It undoes a cancellation that has not taken effect yet, or ends a pause early (billing restarts). If nothing was cancelled or paused, it changes nothing and says so. # Cancel or pause your plan > Cancel, pause, unpause or restart 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/cancel-or-pause Need a break, or want to stop? Both start from **Cancel plan** on the Billing page. Only the account owner, or a teammate with the **Billing & plan** permission, can do this. 1. Go to **Billing** and click **Cancel plan**. 2. Pick what is not working. Depending on your answer you can report a bug and pause for free, book a free setup call, or get a discount to stay. Each offer has a **No thanks** link to carry on. 3. Need a break rather than an exit? Choose **Pause** for 1 to 6 months: nothing is charged and no new leads come in, and the plan resumes by itself. 4. To leave, write a short note on why (it is required), then click **Yes, cancel my subscription**. The plan keeps working until the end of the period you paid for. Changed your mind? **Reactivate subscription** on the Billing page undoes the cancellation, and **Unpause now** ends a pause early. After the paid period has ended, the dashboard offers **Restart subscription**: the same plan at the same price, charged to the card on file once you click **Confirm and pay**. If your bank asks to confirm the payment, or the card no longer works, you are taken to the upgrade page to finish. ### While your plan is paused [#while-your-plan-is-paused] The dashboard shows **Your subscription is paused**: website visitors are not identified until it resumes on the date shown. The owner can click **Unpause my subscription** to restart billing now, or **Pick a plan to restart** on a different plan. Teammates see who the owner is and can ask them. If a plan cannot be unpaused from the dashboard, the screen says so and our support team does it for you. ### Common questions [#common-questions] **Pause or cancel?** Pause when you want a break and your data as it is: nothing is charged for 1 to 6 months and the plan comes back by itself. Cancel when you want to stop paying for good; the plan still runs until the end of the period you paid for. **Do I lose my leads and settings when I cancel?** No. Nothing is deleted. After the paid period ends, new leads stop; your leads, Qualify rules, automations and team stay, and the dashboard offers **Restart subscription** whenever you want to come back. **What keeps working while paused?** Everything except new leads: your existing leads, Qualify, automations, Slack, your CRM, webhooks and alerts. Website visitors are identified again on the resume date, or as soon as you click **Unpause now**. **Can I change my plan instead?** Yes. **Change plan** on the Billing page moves you to fewer leads from your next billing date, with nothing charged or refunded now ([Choose or change your plan](/docs/account/billing#choose-or-change-your-plan)). **Who can cancel or pause?** The account owner, or a teammate with the **Billing & plan** permission ([Team members](/docs/account/team)). ### Every control on these screens [#every-control-on-these-screens] Every button, field and switch, with what it does. # Team & account (/docs/account) Invite your team with exactly the access they need, understand your plan and credits, and keep your account settings and keys in order. ## Common questions [#common-questions] **What is a credit?** What one lead costs. Your plan gives you credits every month; each new lead uses one. [Plan, billing & credits](/docs/account/billing). **What happens when my trial ends?** New leads stop. Nothing is deleted: your leads, scoring models, automations and campaigns are all there when you upgrade. [Trials, offers and lifetime deal codes](/docs/account/trials-and-codes). **What happens when I run out of credits?** New leads stop until your next monthly refill. On a paid plan you can turn on auto top-up, which buys a pack of leads at your plan's price per lead whenever you run out, up to a monthly cap you set. Scoring, automations and campaigns keep running either way. [Plan, billing & credits](/docs/account/billing). **Can I pause instead of cancelling?** Yes. [Cancel or pause your plan](/docs/account/cancel-or-pause). **Can a teammate see only one website?** Yes. When you invite someone you choose the websites they see and what they can do. [Team members](/docs/account/team). # Partner programs > Community, the Affiliate Program, the Creator Program and the Agency Creator Program. 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/partners ### Community [#community] **Community** in the sidebar has four tabs: - **Skool Community:** the free Platform community, with the courses and other customers. Click **Join free on Skool** ([revealid.xyz/skool](https://app.revealid.xyz)). - **Help Center:** the help articles, inside the dashboard; **Open in new tab** opens them full size. - **Creator Program** and **Affiliate Program:** the partner programs on this page. ### Affiliate Program [#affiliate-program] Earn 40% of what each customer you refer pays, for their first 12 months. Joining is free: open **Community → Affiliate Program**, read the four rules and click **I accept – let's make some money!** The rules, in short: - **Paid monthly by PayPal, Wise or bank transfer**, 60 days after each payment the customer makes. There is no minimum payout: every payable cent goes out. - **Your link counts for 90 days.** If someone clicks more than one partner link, the last one wins. Every first sale is reviewed. - **No paid ads:** a referral from a paid ad click earns nothing, and never bid on our brand name. - **Email the right way:** from your own domains and mailboxes, in small personal volumes, with an easy opt-out, following GDPR, CAN-SPAM and local rules. No bought lists, no spam, and never pretend to work for us. - **No self-referrals:** not yourself, your company, or people who are already customers. **Read the full terms** on the join screen opens the complete list; they are also published as the [Affiliate Program Terms](https://app.revealid.xyz). Run outbound for clients? **Are you a lead generation expert?** opens our [outbound partnership page](https://app.revealid.xyz) with who we sell to. In your partner dashboard: 1. **Your partner link:** click **Copy link** and share it. 2. **Your funnel** shows clicks, sign-ups and paying customers. **Needs your push** lists referrals who are stuck; a message from you can move them forward. 3. Introduced someone who did not use your link? **Add a lead manually** with their email; we review it before it counts. 4. **Earnings** and **Statement** show every commission and when it is paid. 5. **Set up payout** with your PayPal email, or your bank / Wise account details, then **Save payout method**. 6. Optionally, **Review & sign** the partner agreement online; you can download the signed PDF. ### Creator Program [#creator-program] Get paid for posts about Platform: up to $1,000 per post in cash by PayPal, or 1.5 times that value in lead credits. Payment depends on the reach your post has on day 7. Full tiers: [revealid.xyz/creators](https://app.revealid.xyz). 1. Open **Community → Creator Program**, read the terms and click **I accept – let's start posting**. 2. After posting, paste the **Post URL**, choose **Paid in lead credits** or **Cash via PayPal**, and click **Submit for review**. No screenshots needed. 3. We review on day 7, when views settle. **Your submissions** shows each post's progress; a rejected post comes with the reason, and **Fix and resubmit** sends it again. 4. For cash, **Set up PayPal** first (separate from the affiliate payout). Credits are added to your account when the post is approved. The rules, in short: organic reach only (no boosting, no follow-for-follow), don't claim things the product doesn't do, and stay within the monthly caps per platform (LinkedIn 4, X 12, YouTube 4, Instagram 8, TikTok 8). Every approved post earns at least 125 lead credits. After day 7 we may repost your content on our own channels. ### Agency Creator Program [#agency-creator-program] For agency accounts: keep your own website active for free by posting about Platform twice a month. 1. When your trial ends, click **Agencies can earn free access** on the upgrade screen (or open `/agency-creator` in the dashboard), then **Join the program — activate my website free**. 2. Each month, submit two posts: paste the **Post URL**, pick the **Platform** (LinkedIn, X, YouTube, Instagram, TikTok or other) and click **Submit post**. Two posts keep your own website active for another 30 days; the status card shows this month's posts and how long your access lasts. 3. **Client websites:** add as many as you like. Each starts as a 7-day trial, you can **Extend trial +7 days** once per client website, and **Upgrade to activate** turns it into a paid website. Posts are reviewed; access stops for posts that don't meet the program rules. ### 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. ### Edit your profile [#edit-your-profile] **Edit profile** (account menu) changes your name and the email you sign in with; click **Save**. The new email works straight away and must not belong to another user. To change your password, enter your **Current Password**, then the new one twice (at least 6 characters) and click **Change Password**. Signed up with Google and never set a password? You can set one here without a current password, then sign in either way. ### Sign in [#sign-in] Sign in with your email and password and click **Login**, or click **Continue with Google**. New here? **Create Account**. If you signed up with Google, there is no password yet: use **Continue with Google**, or **Forgot password?** to create one. After 10 failed attempts for the same email from the same network within 15 minutes, sign-in pauses and the page says how many minutes to wait (15 at most); a successful sign-in resets the count. ### Forgot your password [#forgot-your-password] On the sign-in page, click **Forgot password**, type your email and click **Email me a recovery link**. Open the link in the email, type a new password (at least 6 characters) and save it. The link works once and for 24 hours; after that, ask for a new one. No email after a few minutes? Check your spam folder. If your account has recovery emails switched off, the page says so: ask your account administrator to reset it. ### Settings for all your websites [#settings-for-all-your-websites] **Account Settings → Global settings** switches how visitors are identified on every website at once: exact visitors (the person), companies with suggested contacts, people with personal emails, and session recordings. To change one website only, use its own Website Settings. ### Delete your account [#delete-your-account] **Account Settings → Danger Zone → Delete Account** removes your team, mailboxes, automations, campaigns, templates and lists. Type `confirm` to go ahead; it cannot be undone. Only the account owner can do this, and only on an account without a paid plan: cancel your subscription on the Billing page first. No Danger Zone in your settings? Contact support to delete your account. ### Compliance (GDPR & DPA) [#compliance-gdpr--dpa] Who we are, how data is handled, the services that process it (sub-processors), and the Data Processing Agreement (DPA) you can sign and download. Open it at `/compliance` in your dashboard; if your dashboard has no Compliance page, ask support for the DPA. To sign the DPA: 1. Fill in **Your full name**, **Your role** and **Company (legal name)**; the company address is optional. 2. Draw your signature in the box (**Clear signature** starts again). 3. Tick **I have read the DPA and am authorised to sign** and click **Sign the DPA**. 4. The signed PDF is emailed to you straight away; **Download PDF** gets it again from the page any time. ### 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**, and paste one or many email addresses (one per line, or separated by commas). 2. **Pick the role.** Owner gives everything on every website (only an Owner can make another Owner). For a Member, start from a preset, then tick or untick single permissions. 3. **Pick the websites:** tick **All current and future websites**, or search and tick the ones they may open (**Select all** / **Clear** help with long lists). A Member needs at least one. 4. **Send invite** — they get an email to join. No email? Click their row and **Copy invite link** to send it yourself. Each person uses one of your plan's invitations (unlimited on paid plans, 100 on a trial); removing someone gives it back. Team opens for Owners and for teammates with the **Invite & manage team** permission; anyone else is sent back to the dashboard. ### Read the team list [#read-the-team-list] Search by name or email, or show only **Owners** or **Pending** people. - **Access:** *Everything* for an Owner, the preset's name, *Edited · 5 of 21* when single permissions were ticked or unticked, or *No access yet*. - **Websites:** *All websites*, the websites they can open, or *No websites yet*. - **Status:** *Pending* until they accept the invite and set a password, then *Active*. ### Change someone's access [#change-someones-access] Click their row, change the preset, the permissions or the websites, then **Save changes**. Only what you change is saved, and it applies the next time they load a page. You can't give more than you have yourself. ### Remove someone [#remove-someone] Click their row, then **Remove from account**. They lose access straight away and their invitation goes back to you for someone else. Only an Owner can remove another Owner, and the last Owner can't be removed. ### What members can do [#what-members-can-do] Start from a preset, then tick or untick single permissions. | Preset | Gives | | --- | --- | | **Full access** | Everything except deleting websites, the master API key, billing and white-label settings | | **Sales** | View leads, export and reveal contacts, campaigns, the master inbox | | **Developer** | Install the tracking pixel and the master API key | | **View only** | View leads | | **Team** / **Client** | For agencies running client workspaces: your own staff, or the client who owns the website | The permissions, by area: - **Setup:** install and verify the tracking pixel; add websites (each uses one of the plan's website slots); website settings; delete websites (removes all their leads); integrations and automations. - **Leads and Qualify:** view leads; export and reveal contacts (CSV, CRM push); edit the Qualify model, which decides how credits are spent. - **Engage:** create and edit campaigns; buy domains and mailboxes (charged to the account); connect and manage mailboxes; email warm-up; master inbox and replies. - **Account:** invite and manage the team; the master API key; billing and plan; white-label settings. Only Owners can add or remove Owners, delete the account, and sign in as a teammate. Permissions apply on the websites you choose for that person, or on all websites. ### 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 } ] } ``` Each person gets an invitation email to set a password, unless invite emails are switched off; the answer then says `emailed: false`, and you copy their join link from the Team page. The answer lists the new members under `team`, with their `userId`. Every person uses one of your plan's invitations, and a batch larger than what you have left is refused. > Who is on my team, and what can each person do? ```json {} ``` Each person comes back with their `userId`, role, `preset`, exact `permissions`, `allWebsites`, the website ids they can see (`websites`, empty when they see all of them) and `invitePending` while they haven't accepted yet. > What does the Sales preset let someone do? ```json {} ``` > Limit Jo to our main website only. ```json { "userId": "6650a1b2c3d4e5f6a7b8c9e1", "allWebsites": false, "websites": ["64b7f0a1c2d3e4f5a6b7c8d9"] } ``` Only what you send changes. `websites` replaces their whole list, so send every website they should keep, with `allWebsites: false`. Giving an Owner a preset or permissions makes them a Member. > Remove Jo from the account. ```json { "userId": "6650a1b2c3d4e5f6a7b8c9e1" } ``` Your assistant gets the `userId` from `list_members` first. It can only give the permissions and websites you have yourself, and never removes the last Owner. Only an Owner can remove another Owner. A removed person loses access straight away, and their invitation goes back to you to use on someone else. # Trials, offers and lifetime deal codes > What a free account and a trial include, the 2X trial bonus, offer codes and lifetime deal codes. 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/trials-and-codes Trials, offers and lifetime deals, with what each one gives you and how to use it. ### Free account [#free-account] A free account can sign in, see the dashboard and use the [free MCP tools](/docs/mcp#free-tools). Engage, Automations, Integrations and CSV export need a paid plan: opening them, or clicking **Export CSV**, shows **Upgrade to Starter**, and **Upgrade now** takes you to the plans. ### Your trial [#your-trial] A trial lasts **7 days** and starts with **500 credits**, or **1,000 credits** when you sign up with a business email address (not Gmail, Yahoo, Outlook and the like). One credit is one identified lead. Everything except sending campaigns from Engage is open during the trial: install the pixel, see your leads, set up Qualify, automations and your CRM. ### When your trial ends [#when-your-trial-ends] Your account and everything you set up stay. What stops is **new leads**: website visitors are no longer identified, and 3rd-party intent and Web Scraping stop adding people. Everything else keeps working on the leads you already have, including Qualify, automations, Slack, your CRM, webhooks and alerts. During the trial itself, only sending email and LinkedIn campaigns from Engage is locked. If your trial ended before you saw at least 10 leads (often because the tracking script was not installed yet), you are offered **another week on us** instead: click **Yes, extend my trial** for 7 more days with your trial credits topped back up. The extension is offered once per account. Use the week to [install the tracking script](/docs/websites/tracking-pixel) and check it is verified. Otherwise, when the trial has ended, the dashboard shows an upgrade screen: - **Upgrade now** opens the plans, with the current first-month offer applied. - **Unlock for 30 minutes** lets you look around and export what you need first. - **Agencies can earn free access** (agency accounts) explains the Agency Creator Program, which keeps your own website active. ### Trial bonus: 2X leads [#trial-bonus-2x-leads] During your trial you can double the leads you get by verifying a phone number. It is offered as the last sign-up step, and later under **Get 2X leads** on the Leads page. 1. Pick your country code and type your number. 2. Tick **Yes, text me about my account** (needed to claim), then click **Text me a code to claim 2X leads**. 3. Type the code from the text and click **Verify & claim 2X leads**. The extra leads apply straight away, and a free outreach domain comes with the bonus. Each phone number can claim it once: a number already used on another account verifies, but the trial carries on without the bonus. ### Offer links and codes [#offer-links-and-codes] Seasonal offers (Black Friday and similar) come as a link with a code. The page shows what the offer includes and its terms under **The small print**. Click **Grab the deal**: without an account you go to sign-up, signed in you go to the upgrade page, and either way the code is already filled in. Offer codes apply to your plan only, not to mailboxes or domains. ### Lifetime deal codes [#lifetime-deal-codes] Bought a lifetime deal? Each code adds 1,000 credits, 5 email accounts and 1 website to your account, and every 10 codes add one more set for free. - **New account:** open the [lifetime deal sign-up page](https://app.revealid.xyz/coupon), fill in your name, email and a password, add your codes (press Enter or type a comma after each one) and click **Register**. - **Existing account:** go to **Account settings → Redeem Code** (on a lifetime deal account also in the account menu, your name in the sidebar: **Redeem Existing LTD codes**), paste one code and click **Redeem Code**. Repeat for each code. It is there for the owner and teammates with the **Billing & plan** permission, on any account without a paid monthly or yearly plan; on a paid plan, contact support. A code works once. If it says it is already used, contact support with the code and the email you bought it with. Buying codes through our checkout: after paying you land on **Payment Successful**, and your account updates within about a minute; **Go to Dashboard** takes you back. If the new credits still don't show after a few minutes, refresh the page, then contact support with the email you paid with. If you leave the checkout, **Payment Canceled** confirms nothing was charged; **Try again** takes you back to the checkout. ### Every control on these screens [#every-control-on-these-screens] Every button, field and switch, with what it does. # 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] - **Ask about this page** answers questions from the page’s own text. - **Copy for LLM** copies the page as Markdown. On a feature page it copies **every tab** — Guide, API and MCP — 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. - **Set up agent** (feature pages only) jumps to that feature’s MCP tab: the questions to ask an assistant once it is connected. ## 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/mcp) lets it actually do the work in your account — search prospects, reveal contacts, and more. Every feature page has an **MCP** tab with the questions to ask for that feature. # 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 your dashboard under **Integrations → API**. | Key | Who has it | What it can reach | | --- | --- | --- | | **Master Account API Key** | Owners, and teammates with the **Master API key** permission | Every website on the account, plus account and billing | | **Website API Key** | Each website | That one website only | A website key only reaches its own website. Over the REST API, a request that names another website (its `websiteId`, or a lead, automation or campaign that belongs to it) is refused with 403. Through the MCP server, a different `websiteId` is replaced by the key's own website. 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 the same URL without the `?token=…` part instead; they then act as the person who signed in, with that person’s permissions. Every password sign-in allows 10 failed attempts per email and network in 15 minutes; after that it is refused (HTTP 429, *Too many failed sign-in attempts. Try again in N minutes.*) until the 15 minutes are up. 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**, then confirm. The new key is shown once in the confirmation; it is also under **Show** / **Copy** on the same tab. The master key can also be rotated under **Account settings → Advanced**. Rotating the master key needs the **Master API key** permission; a website key needs the **Integrations** permission on that website. 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 our 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 An automation is a rule that runs without you: **when** a lead arrives, **if** it matches your filter, **then** do something with it (post to Slack, push to your CRM, add to an email campaign, call a webhook, send an email alert). Automations run on every plan, trial included. The builder walks you through five steps, in this order: 1. **Source** — what starts it. Usually **A new lead is identified** (a visitor we put a name and company to). Other sources: a new 3rd-party intent signal, a web-scraping keyword signal, a Prospector or AI Scout lead, LinkedIn post engagement. 2. **Filter** — which leads qualify: **All leads** or a saved filter (industry, company size, country, pages visited, ICP score…). **+ New filter rules** builds one on the spot: add rules from the catalogue, see a live preview of how many leads of the last 30 days it would let through (with a few examples), name it and **Save filter**. A saved filter also shows on the Leads page, so you can reuse it there. 3. **Frequency** — what a returning visitor does: **Only the first time** or **Every visit**. With Every visit, **Limit repeats** caps it (once every 12 hours up to once every 6 months), counted per company or per person. 4. **Action** — where the lead goes: Slack, a CRM, an email campaign, a webhook, Clay, an email alert, an ad audience. 5. **Save & activate** (or **Save as paused**). Give it a name; its runs show on the card. ### Good to know [#good-to-know] - **Connecting a CRM sends nothing by itself.** An automation pushes the matching leads ([CRM setup](/docs/automations/crm/overview)). To send one lead by hand, open it and use **Send contact / Send company**. - **Start narrow:** your best-fit leads to Slack and the CRM, the rest to an email campaign. Widen the rules once you trust what comes through. - **Drafts never run.** An automation you closed before the last step is saved as a draft; finish it from the **Drafts** tab. - **Nothing ran?** Check the automation is switched on, then open its [run history](/docs/automations/run-history): every lead it skipped shows the rule that stopped it. ### Common questions [#common-questions] **Does an automation run on old leads or only new ones?** Only on leads that arrive after you save it. Right after saving a new automation you are offered **Retrigger for existing leads**: pick a period (last 7 days up to since the beginning) and whether to include only the leads that failed or never ran (the safe choice) or every lead. **All leads (force retrigger)** also sends again the leads this automation already delivered, so Slack, webhooks and email alerts get them a second time. For an automation that already exists, tick leads on the Leads page and use **Retrigger**, or retry from its [run history](/docs/automations/run-history). **Why did my automation not fire?** In this order: is it **Active** (not Paused, not a Draft)? Did the lead pass the **filter** (the [run history](/docs/automations/run-history) names the rule that stopped it)? Was it a **returning visitor** on an automation set to Only the first time? Is the integration still connected (a banner on the card offers **Reconnect**)? **Can I re-run a failed one?** Yes. Open **View runs**, go to **Failed**, and click **Retry this lead**, or select several and **Retry N leads**. Fix the cause first (reconnect the CRM, fix the webhook URL), or it fails again. [Run history & re-run](/docs/automations/run-history). **Do automations run on a trial?** Yes, on every plan, trial included. During the trial only the **Send to Email Campaign** and LinkedIn campaign actions are locked (that is email and LinkedIn sending from Engage). When the trial ends or credits run out, **new leads** stop; your automations keep running on the leads you have. [Trials and codes](/docs/account/trials-and-codes). **Can I send only leads above a score?** Yes. In the filter step, add a rule for the **ICP score**: pick the scoring model and the range (from/to). Or use **Also only leads with <ICP fit>** next to the filter. The score comes from your [scoring model](/docs/qualify/scoring-models). **Which fields reach my CRM or Slack?** Slack posts the message you choose, built from merge fields (company, contact, visit, campaign) — see [Slack](/docs/automations/slack). A CRM gets the fields you mapped under Integrations → CRMs → Configure — see [Connect & map fields](/docs/automations/crm/overview). A webhook gets the person, the company, the pages they saw and the lead link — see [Webhooks](/docs/automations/webhook). **Can an automation just email me?** Yes. Pick the action **Send Email Alert**, add the recipients (type an address or pick a teammate) and **Preview the email**. **Why does the same company keep coming through?** Its frequency is **Every visit** with no limit. Switch on **Limit repeats** and choose how often (for example no more than once every 7 days), counted per company. ### 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: Check which automations are running [#use-case-check-which-automations-are-running] `GET /admin/automations?websiteId=…` lists every automation of the website. For each one, `isActive` says whether it runs, `draft: true` means it was never finished in the builder (a draft never runs), and `errorMessage` says why the last run failed, for example a disconnected integration (`null` when all is well). `when`, `then` and `interval` say what starts it, where leads go and how often. ### Use case: Spot automations that stopped delivering [#use-case-spot-automations-that-stopped-delivering] `GET /v3/automations/stats?websiteId=…` answers the last 7 days for every automation, keyed by its id: `runs7d` (leads it ran on), `delivered7d`, `failed7d`, `failedLeads7d` (leads still failing after retries) and `lastRunAt`, plus a `series` with one row per day. Runs that are neither delivered nor failed were skipped by the automation's filters. An active automation with `failedLeads7d` above 0 usually has a disconnected integration: `GET /admin/automations/{id}` shows its `errorMessage`. ### Use case: Try a filter before using it [#use-case-try-a-filter-before-using-it] `POST /v3/automations/filter-preview` with `websiteId`, a saved `filterId` and `days` (default 7, up to 90) answers how many leads of that window the filter would have let through: `total7d` (all leads) and `matched7d` (matching ones). Both cover `windowDays`, whatever the names say. It also returns up to 8 sample companies and the top industries. A filter that doesn't exist answers 404. ### Use case: Change where an automation sends leads [#use-case-change-where-an-automation-sends-leads] `PUT /admin/automations/{id}` saves the whole setup: send `name`, `isActive`, `when` and `then` every time, plus the fields you change. `actions` replaces all the action settings, so read the automation with `GET /admin/automations/{id}` and send them back complete. Saving a draft this way finishes it. ### Use case: Pause an automation [#use-case-pause-an-automation] `PATCH /admin/automations/{id}` with `{ "isActive": false }`; `true` switches it back on. Only `isActive` changes, the rest of the setup stays. A draft (`draft: true`) can't be switched on: the call answers 405 until it is finished in the builder. --- ## 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" } ``` Each automation comes back with its name, whether it is on, and the last 7 days: runs, leads delivered, failed attempts and `failedLeads7d` (leads still failing after retries). Runs that are neither delivered nor failed were skipped by the automation's filters. ### Use case [#use-case-1] > List my automations. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` ### Use case [#use-case-2] > Why isn't my HubSpot automation sending anything? ```json { "automationId": "64b7f0a1c2d3e4f5a6b7c8e1" } ``` Your assistant checks `isActive`, whether it is still a `draft` (a draft never runs) and `errorMessage`, which says why the last run failed, for example a disconnected HubSpot. ### Use case [#use-case-3] > How many leads would my "Software, 50+ people" filter have sent in the last 30 days? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "filterId": "64b7f0a1c2d3e4f5a6b7c8f1", "days": 30 } ``` The answer compares `matched7d` (leads the filter lets through) with `total7d` (all leads in those days; both cover `windowDays` despite the names) and shows a few sample companies, so you can check the filter before an automation uses it. The assistant finds the `filterId` with `list_filters`. ### Use case [#use-case-4] > Send the leads of my "New leads to Slack" automation to #sales instead, and only once a day per company. ```json { "automationId": "64b7f0a1c2d3e4f5a6b7c8e2", "trigger": { "repeatWindowHours": 24, "dedupeScope": "company" }, "actions": { "sentToSlack": { "sendMessagesTo": "sales", "howManyToAdd": 5 } } } ``` Your assistant reads the automation with `get_automation` first: what you don't mention stays as it is, but `actions` replaces all the action settings, so it sends them complete. > Only send leads with a verified email from now on. ```json { "automationId": "64b7f0a1c2d3e4f5a6b7c8e2", "trigger": { "emailVerification": { "allowOnlyValidEmails": true, "allowCatchAllEmails": false, "allowGuessedEmails": false, "allowWithoutEmails": false } } } ``` ### Use case [#use-case-5] > Pause the HubSpot automation for now. ```json { "automationId": "64b7f0a1c2d3e4f5a6b7c8e1", "isActive": false } ``` Only the on/off switch changes; the setup stays, and `isActive: true` turns it back on. An unfinished draft can't be switched on until it's finished in the builder. ### Use case [#use-case-6] > Delete the old "Test webhook" automation. ```json { "automationId": "64b7f0a1c2d3e4f5a6b7c8e3" } ``` Deleting is permanent; leads already sent to a CRM, Slack or a campaign stay there. To stop an automation but keep its setup, ask to pause it instead (`toggle_automation`). # 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 Clay is a spreadsheet-like tool for enriching and routing contacts. Each lead that matches the automation is added as a new row of a Clay table, through the table's own webhook URL. Clay can then enrich it further and send it on to wherever you work. 1. **In Clay**, open your table, add a **Webhook** source and copy the URL Clay shows you. 2. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Send to Clay**, and paste the URL. 3. **Choose** every lead or only leads with a suggested contact, then **Save & activate**. ### Common questions [#common-questions] **Which leads go to Clay?** The ones that pass your filter. **Every lead** sends each matching company; **only leads with a suggested contact** sends only leads that come with the exact person who visited, so each row has a name to enrich. Add a score rule to the filter to send only your best-fit leads ([Build an automation](/docs/automations/automations)). **Where do I find my Clay webhook URL?** In Clay, in the table's sources: add a Webhook source and Clay gives you a URL that starts with `https://api.clay.com/v3/sources/webhook/…`. Paste it into the automation. **Why did a lead not reach my Clay table?** Open the automation's [run history](/docs/automations/run-history): a **Filtered** run names the rule that stopped it, a **Failed** run shows what Clay answered. Check the URL is the table's current webhook, then **Retry this lead**. **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. **Does Clay run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the automation keeps running on the leads you have. --- ## 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; `every-time` sends every matching lead. The URL is the webhook source of your Clay table. ### Use case: Pause or check it [#use-case-pause-or-check-it] `PATCH /admin/automations/{id}` with `{ "isActive": false }` pauses it without losing the setup. `GET /admin/automations?websiteId=…` shows each automation's `isActive` and `errorMessage` (why the last run failed, `null` when all is well). --- ## 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" } } } } ``` Your assistant asks for the table's webhook URL (from the Webhook source in Clay) and confirms before creating it, since every future matching lead is sent to Clay. Leave out `whenToPush` or set it to `every-time` to send every matching company, with or without a person. # 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. Once. 2. **Configure** and map the fields you want filled, **Test integration**, **Save mapping**. 3. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Send to GoHighLevel**. Choose the **Record type** (contact only, or contact + opportunity), and for an opportunity the **Pipeline**, **Stage** and an optional **Opportunity value**. Add **Tags** if you like, pick the owner, **Save & activate**. ### Common questions [#common-questions] **Does connecting GoHighLevel send leads by itself?** No. Connecting gives us access; an automation decides which leads are pushed, or you push one by hand from the lead's panel. [Connect & map fields](/docs/automations/crm/overview). **Will it create duplicate contacts?** No. Before creating a contact we search GoHighLevel for the lead's email, and when GoHighLevel reports a match on another field (such as the phone number) the existing contact is updated instead. **Which fields go to GoHighLevel?** Each lead becomes a **contact** in GoHighLevel, filled with the fields in your [field mapping](/docs/automations/crm/overview) and the **Tags** you set in the automation. With record type contact + opportunity, an **opportunity** is also created in the pipeline stage you chose, with the value you set. Set it once under Integrations → CRMs → **Configure**; the same mapping is used by every GoHighLevel automation of the website. **Who owns the leads in GoHighLevel?** The GoHighLevel user you pick in the automation (**Assign new records to**). **Why did a lead not reach GoHighLevel?** Open the automation's [run history](/docs/automations/run-history): a **Filtered** run names the rule that stopped it; a **Failed** run shows what GoHighLevel answered. If the connection expired, the card offers **Reconnect**; then **Retry this lead**. **Can the automation create an opportunity in a pipeline?** Yes. In the action step choose the record type **contact + opportunity**, then pick the **Pipeline** and **Stage** and, if you like, an **Opportunity value ($)**. Each matching lead then gets a contact and an opportunity in that stage. **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. [Build an automation](/docs/automations/automations). **Does the GoHighLevel push run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the automation keeps pushing the leads you have. --- ## 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: Also create an opportunity [#use-case-also-create-an-opportunity] With `createOpportunity: true`, give the `pipelineId` and `pipelineStageId` where it should land (`GET /v3/crm/pipelines?crm=gohighlevel` lists your pipelines with the ids of their stages) and, if you like, `opportunityStatus` (`open`, `won`, `lost` or `abandoned`; `open` is the usual choice). Leave `createOpportunity` out to create the contact only. `tags` are added to the contact. ### Use case: Push one lead now [#use-case-push-one-lead-now] `POST /v3/crm/push` with `crm: "gohighlevel"`, `websiteId`, a `leadId` and `contactData` (its `email`) 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, "pipelineId": "PIPELINE_ID", "pipelineStageId": "STAGE_ID", "opportunityStatus": "open", "tags": [ "website-visitor" ], "assignContactsTo": "OWNER_ID" } } } } ``` Your assistant finds Sarah's id with `list_crm_owners` and the pipeline and stage ids with `list_crm_pipelines` (`crm: "gohighlevel"`), then confirms before creating it. Without `createOpportunity`, only the contact is created. ### Use case [#use-case-1] > Send this lead to GoHighLevel now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "gohighlevel", "leadId": "6a3f00000000000000000003", "contactData": { "email": "jane.doe@acme.example" } } ``` # HubSpot > Push leads to HubSpot as contacts linked to their company, owned by the person you pick, and optionally a deal for each. 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 Each lead becomes a HubSpot contact, linked to its company: the company is found by its domain, or created if HubSpot doesn't have it yet, and a contact whose email is already in HubSpot isn't created twice. The contact gets the owner you pick. Fields are filled from your [field mapping](/docs/automations/crm/overview); an automation decides which leads go. To also get a deal, choose **Contact + Deal** in the automation and pick a deal pipeline and stage (and an amount if you like): each lead then gets one deal, named after its company, linked to the contact and company and owned by the same owner. A lead that already has an open deal in that pipeline isn't given a second one. 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, optionally **Contact + Deal** with a pipeline and stage, **Save**. HubSpot connected before 31 October 2026 without deal access? Creating deals asks you to **reconnect HubSpot** once (Integrations → CRMs → HubSpot), so it can grant access to deals. --- ## 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: Also create a deal [#use-case-also-create-a-deal] Add `createDeal: true`, a `pipelineId` and a `dealStageId` to `sentToHubspot` (and `dealAmount` if you want one). `GET /v3/crm/pipelines?crm=hubspot` lists your deal pipelines with the ids of their stages. Each lead then also gets a deal in that stage, linked to its contact and company; a lead with an open deal in that pipeline isn't given a second one. ```json "sentToHubspot": { "assignContactsTo": "OWNER_ID", "createDeal": true, "pipelineId": "default", "dealStageId": "appointmentscheduled", "dealAmount": 5000 } ``` ### 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": { "assignContactsTo": "OWNER_ID" } } } } ``` ### Use case [#use-case-1] > Push new leads to HubSpot and open a deal for each in my sales pipeline. The assistant reads your deal pipelines and stage ids with `list_crm_pipelines`, then: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New leads to HubSpot with a deal", "trigger": { "then": "send-to-hubspot", "actions": { "sentToHubspot": { "assignContactsTo": "OWNER_ID", "createDeal": true, "pipelineId": "default", "dealStageId": "appointmentscheduled" } } } } ``` ### Use case [#use-case-2] > Send this lead to HubSpot now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "hubspot", "leadId": "6a3f00000000000000000003", "ownerId": "123456789", "contactData": { "email": "ana.ruiz@acme.example", "firstName": "Ana", "lastName": "Ruiz", "position": "Head of Growth" } } ``` Your assistant takes the person from the lead, picks the owner with `list_crm_owners` (HubSpot needs one) and asks you before it writes to your CRM. # Connect & map fields > Connect HubSpot, Pipedrive, Zoho, Salesforce or GoHighLevel, map the fields, and let an automation send the leads that match. 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 Three steps, each done once: **connect** your CRM (HubSpot, Pipedrive, Zoho CRM, Salesforce or GoHighLevel) under Integrations → CRMs, **map the fields** (which lead detail fills which CRM field), then create an **automation** that pushes the leads that match your filter. Connecting alone sends nothing. 1. **Integrations → CRMs → Connect** on your CRM's card and sign in to it. 2. **Configure** opens the field mapping: a **Contact Fields** tab and a **Company Fields** tab. Each row pairs a CRM field with a lead field (or a fixed text). **Test integration**, then **Save mapping**. 3. **Create an automation** from the card: pick the source, filter and frequency, choose the owner, **Save & activate**. ### Common questions [#common-questions] **Does connecting my CRM send leads by itself?** No. Connecting only gives us access. Leads are sent by an automation ([Build an automation](/docs/automations/automations)), or one at a time by hand from the lead's panel (**Send contact** / **Send company**). **What is field mapping?** The list of which lead detail goes into which field of your CRM: for example the person's email into the CRM's email field, the company's industry into your "Industry" field, or a fixed text such as "Website visitor" into a "Source" field. Fields you switch off are not sent. The CRM field is named by its API name in your CRM. **Which fields can I map?** The person (name, email, job title, phone, LinkedIn), the company (name, domain, description, industry, size, revenue, location, phone, LinkedIn), the visit (pages, first and last seen, ICP score) and the campaign that brought them. The same fields are listed as merge fields on the [Slack](/docs/automations/slack) page. **Why is Save mapping greyed out?** **Save mapping** turns on once **Test integration** passes. The test writes a sample contact and company to your CRM, reads them back and deletes them. Any edit after the test asks you to test again. Save saves only the tab you are on, so test and save Contact Fields and Company Fields separately. **Can I send one lead to my CRM by hand?** Yes. Open the lead and click **Send contact** or **Send company** next to the CRM's icon; once sent, the icon opens the record in your CRM. (GoHighLevel is pushed through automations or the [API](/docs/automations/crm/gohighlevel/api).) **Connecting showed "Integration Failed". What now?** Your CRM did not grant access, usually because the sign-in window was closed or **Deny** was clicked, or because the CRM user isn't allowed to install apps. The page shows the CRM's own reason; **Back to Integrations** takes you back to try again, signed in as a CRM admin. **How do I disconnect a CRM?** On its card under **Integrations → CRMs**, click **Disconnect** and confirm. Automations that push to that CRM stop until you connect it again; nothing is deleted in the CRM, and your field mapping is kept for when you reconnect. **Do CRM pushes run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the automation keeps pushing the leads you have. ### 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 `crm` (`hubspot`, `pipedrive`, `salesforce`, `zoho` or `gohighlevel`), `websiteId` and `contactData` (`email` is required; `firstName`, `lastName`, `position` optional). Pass `leadId` to take the person's details from that lead and mark it as added to the CRM. HubSpot, Zoho and Pipedrive also need `ownerId`, from `GET /v3/crm/owners?crm=…`. Answers 401 when the CRM login has expired (reconnect under Integrations → CRMs). ### Use case: Read and change the field mapping [#use-case-read-and-change-the-field-mapping] `GET /v3/crm/variables?websiteId=…` lists the lead and company fields you can map (name, email, job title, company size, pages visited, score…), each with its `key` (what goes in `variable`), `label`, an `example` and its `category`. `GET /v3/crm/{crm}/mappings?websiteId=…&objectType=contact` (or `company`) returns the current mapping; `PUT /v3/crm/{crm}/mappings` with `objectType` and the full `mappings` list replaces it. Each row has `crmField` (the CRM field name) and is filled from a lead field (`valueType: "variable"`, `variable`: a `key` from the list above) or with fixed text (`valueType: "static"`, `staticValue`); `enabled: false` skips it. A list where no row has a `crmField` is refused, so a mistake can't wipe your mapping; an empty list clears it. --- ## 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" } ``` Each owner comes back as `id`, `name` and `email`. Your assistant finds Jane's `id` in that list, then pushes the lead and confirms with you first, because it writes to your CRM: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "hubspot", "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "ownerId": "OWNER_ID", "contactData": { "email": "jane.doe@acme.example" } } ``` ### Use case [#use-case-1] > Which lead fields can I send to my CRM? ```json {} ``` Each field comes with its `key` (what a mapping row uses as `variable`), a label, an example and its category: Person, Company, Visit, UTM (campaign tags) or Lead. ### Use case [#use-case-2] > Also send the pages each lead visited to the "Website pages" field in HubSpot. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "hubspot", "objectType": "contact" } ``` Your assistant reads the current contact mapping and the fields it can use (`list_crm_variables`), then saves the full list with the new row added: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "hubspot", "objectType": "contact", "mappings": [ { "crmField": "email", "valueType": "variable", "variable": "lead.person.businessEmail" }, { "crmField": "firstname", "valueType": "variable", "variable": "lead.person.firstName" }, { "crmField": "website_pages", "valueType": "variable", "variable": "lead.visit.pageList" } ] } ``` The list you send replaces the saved one, so rows you leave out are no longer filled. Each row names the CRM field (`crmField`) and fills it from a lead field (`valueType: "variable"`) or with the same text every time (`valueType: "static"`, `staticValue`). The answer of `get_crm_mappings` says `source: "default"` until you save your own mapping. # 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. Once. 2. **Configure** and map the fields you want filled, **Test integration**, **Save mapping**. 3. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Send to Pipedrive CRM**, pick the owner under **Assign new records to**, **Save & activate**. ### Common questions [#common-questions] **Does connecting Pipedrive send leads by itself?** No. Connecting gives us access; an automation decides which leads are pushed, or you push one by hand from the lead's panel. [Connect & map fields](/docs/automations/crm/overview). **Will it create duplicate contacts?** No. Before creating a person we search Pipedrive for the lead's email; if they are already there, that person is used instead of a second one being created. **Which fields go to Pipedrive?** Each lead becomes a **person** linked to an **organisation** in Pipedrive, filled with the fields in your [field mapping](/docs/automations/crm/overview): the person's name, email, job title, phone and LinkedIn; the company's name, domain, industry, size and location; and whatever else you map. Set it once under Integrations → CRMs → **Configure**; the same mapping is used by every Pipedrive automation of the website. **Who owns the leads in Pipedrive?** The Pipedrive user you pick in the automation (**Assign new records to**). Every record the automation creates is assigned to that user. **Why did a lead not reach Pipedrive?** Open the automation's [run history](/docs/automations/run-history): a **Filtered** run names the rule that stopped it; a **Failed** run shows what Pipedrive answered. If the connection expired, the card offers **Reconnect**; then **Retry this lead**. **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. [Build an automation](/docs/automations/automations). **Does the Pipedrive push run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the automation keeps pushing the leads you have. --- ## 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"`, `websiteId`, a `leadId`, an `ownerId` from the owner list, and `contactData` (its `email`) 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" } } } } ``` ### Use case [#use-case-1] > Send this lead to Pipedrive now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "pipedrive", "leadId": "6a3f00000000000000000003", "ownerId": "OWNER_ID", "contactData": { "email": "jane.doe@acme.example" } } ``` # 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. Once. 2. **Configure** and map the fields you want filled, **Test integration**, **Save mapping**. 3. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Send to Salesforce**, pick the owner under **Assign new records to**, **Save & activate**. ### Common questions [#common-questions] **Does connecting Salesforce send leads by itself?** No. Connecting gives us access; an automation decides which leads are pushed, or you push one by hand from the lead's panel. [Connect & map fields](/docs/automations/crm/overview). **Will it create duplicate contacts?** No. Before creating a contact we search Salesforce for the lead's email; if they are already there, that contact is used instead of a second one being created. **Which fields go to Salesforce?** Each matching visitor becomes a **Lead** in Salesforce, filled with the fields in your [field mapping](/docs/automations/crm/overview): the person's name, email, job title, phone and LinkedIn, the company's name, domain, industry, size and location, and whatever else you map. Set it once under Integrations → CRMs → **Configure**; the same mapping is used by every Salesforce automation of the website. **Who owns the leads in Salesforce?** The Salesforce user you pick in the automation (**Assign new records to**). Every lead the automation creates is owned by that user. **Why did a lead not reach Salesforce?** Open the automation's [run history](/docs/automations/run-history): a **Filtered** run names the rule that stopped it; a **Failed** run shows what Salesforce answered. If the connection expired, the card offers **Reconnect**; then **Retry this lead**. **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. [Build an automation](/docs/automations/automations). **Does the Salesforce push run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the automation keeps pushing the leads you have. --- ## 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"`, `websiteId`, a `leadId`, and `contactData` (its `email`) 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" } } } } ``` ### Use case [#use-case-1] > Send this lead to Salesforce now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "salesforce", "leadId": "6a3f00000000000000000003", "contactData": { "email": "jane.doe@acme.example" } } ``` # 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. Once. 2. **Configure** and map the fields you want filled, **Test integration**, **Save mapping**. 3. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Send to Zoho CRM**, pick the owner under **Assign new records to**, **Save & activate**. ### Push one visitor by hand [#push-one-visitor-by-hand] On a lead, click the **Zoho** icon next to the person, pick the owner and choose **Create in Zoho as**: - **Contact** (default) — a Contact in Zoho's Contacts module. - **Lead** — a Lead in Zoho's Leads module, with the company details (website, industry, employees, revenue, location, LinkedIn) filled in, ready to convert. Then click **Push**. Once pushed, the Zoho icon turns on and opens the record in Zoho. ### Common questions [#common-questions] **Does connecting Zoho CRM send leads by itself?** No. Connecting gives us access; an automation decides which leads are pushed, or you push one by hand from the lead's panel. [Connect & map fields](/docs/automations/crm/overview). **Will it create duplicate contacts?** No. Before creating a contact we search Zoho for the lead's email; if they are already there, that contact is used instead of a second one being created. If Zoho cannot be reached for the search, nothing is created rather than risk a duplicate. **Which fields go to Zoho CRM?** An automation creates a **Lead** in Zoho, filled with the fields in your [field mapping](/docs/automations/crm/overview): the person's name, email, job title, phone and LinkedIn, the company's name, domain, industry, size and location, and whatever else you map. Pushing one visitor by hand lets you choose Contact or Lead (see above). Set it once under Integrations → CRMs → **Configure**; the same mapping is used by every Zoho CRM automation of the website. **Who owns the leads in Zoho CRM?** The Zoho user you pick in the automation (**Assign new records to**), or the owner you pick when pushing one visitor by hand. **Why did a lead not reach Zoho CRM?** Open the automation's [run history](/docs/automations/run-history): a **Filtered** run names the rule that stopped it; a **Failed** run shows what Zoho CRM answered. If the connection expired, the card offers **Reconnect**; then **Retry this lead**. **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. [Build an automation](/docs/automations/automations). **Does the Zoho CRM push run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the automation keeps pushing the leads you have. --- ## 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"`, `websiteId`, a `leadId`, an `ownerId` from the owner list, and `contactData` (its `email`) 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" } } } } ``` ### Use case [#use-case-1] > Send this lead to Zoho CRM now. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "crm": "zoho", "leadId": "6a3f00000000000000000003", "ownerId": "OWNER_ID", "contactData": { "email": "jane.doe@acme.example" } } ``` # 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](/docs/engage/email-campaigns) as a contact and starts its sequence from the first step, sent from the mailboxes you choose. The campaign itself (emails, sending window, mailboxes) is set up under Engage; the automation only decides who joins it. 1. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Send to Email Campaign**. 2. **Pick the campaign** (or **Create a new email campaign**) and, if you like, the mailboxes that send. You can also forward warm replies to your inbox or a teammate. 3. **Save & activate.** The campaign must be active for the emails to go out. ### Common questions [#common-questions] **Is this action locked on a trial?** Yes. Sending from campaigns is what a trial does not include, so **Send to Email Campaign** (and the LinkedIn campaign action) is locked until you are on a paid plan; on the automations list its on/off switch is hidden until then. Every other action (Slack, CRM, webhook, Clay, email alert) runs on the trial. [Trials and codes](/docs/account/trials-and-codes). **When does an added lead get the first email?** When the campaign next sends: the lead joins as a contact at step 1 and the campaign sends inside the window you set under Engage (days and hours). An inactive or paused campaign sends nothing until you switch it on. [Email campaigns](/docs/engage/email-campaigns). **Which mailboxes send?** The ones you tick in the automation (**Send from mailboxes**, with **Select all** / **Clear all**). Connect your own mailbox or buy managed ones from the same step if you have none yet. **Why was a lead not added to my campaign?** Open the automation's [run history](/docs/automations/run-history): a **Filtered** run names the rule that stopped it, a **Failed** run shows the reason. A lead without an email cannot join a campaign; by default only leads with an email are sent. **Can I only add leads with a verified email?** Yes. The automation's email verification settings decide which emails count: only verified ones, catch-all ones, guessed ones. Ask your AI assistant to set it ([MCP tab](/docs/automations/email-campaigns/mcp)) or set it over the [API](/docs/automations/email-campaigns/api). **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. [Build an automation](/docs/automations/automations). --- ## 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?websiteId=…` lists the website's campaigns (newest first, paged); use one's `_id` as `emailCampaign`. A missing or invalid campaign id answers 405. ### Use case: Choose the mailboxes [#use-case-choose-the-mailboxes] Add `emailAccounts` to `sentToEmailCampaign`, a list of mailbox ids, to send only from those mailboxes; leave it out to use the campaign's mailboxes. ### Use case: Only leads with a verified email [#use-case-only-leads-with-a-verified-email] Add `emailVerification` next to `actions`: `{ "allowOnlyValidEmails": true, "allowCatchAllEmails": false, "allowGuessedEmails": false, "allowWithoutEmails": false }`. By default guessed emails are allowed and leads without an email are skipped. --- ## 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" } ] } ``` Your assistant finds the campaign id first and confirms before creating it, because every future matching lead will be emailed: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` ### Use case [#use-case-1] > Only add leads with a verified email to the campaign. ```json { "automationId": "64b7f0a1c2d3e4f5a6b7c8e4", "trigger": { "emailVerification": { "allowOnlyValidEmails": true, "allowCatchAllEmails": false, "allowGuessedEmails": false, "allowWithoutEmails": false } } } ``` Guessed and catch-all addresses are then skipped, so the campaign only emails people whose address we verified. # 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, send it to Clay, add it to an email campaign or email you an alert. Automations keep running on every plan, trial included. ## Build one in four steps [#build-one-in-four-steps] Every automation is built the same way in **Automations → Add**: 1. **Source:** which leads to watch (for example, a new website visitor is identified). 2. **Filter:** which of them count (ICP score, country, company size, pages visited, tags…). You can preview how many recent leads would have matched. 3. **Frequency:** only the first time a lead matches, or every visit (with a cap on repeats). 4. **Action:** where the lead goes. [Build an automation](/docs/automations/automations) walks through it with a live demo. ## Where you can send leads [#where-you-can-send-leads] ## Common questions [#common-questions] **Do automations run on old leads or only new ones?** New ones, from the moment you save the automation. Existing leads are not sent again. **Why did my automation not run for a lead?** Open [Run history](/docs/automations/run-history): it shows every run, which lead it handled, when, and whether it succeeded (and why not). A lead that is not there at all did not pass the filter; the preview in the builder shows how many recent leads would. **Something failed on the CRM side. Do I lose the lead?** No. Fix the connection or the field mapping, then re-run it from [Run history](/docs/automations/run-history). **Do automations stop when my trial ends or credits run out?** No. They run on every plan. Only new leads stop when there are no credits. # 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 time an automation looks at a lead, a run is kept: **Delivered** (it did its job), **Filtered** (a rule stopped it, and the run names the rule) or **Failed** (something went wrong, and the run shows the reason). Fix the cause, then retry. 1. **View runs** on an automation's card. The card itself shows the last 7 days: Successful / Filtered / Failed. 2. **Failed** shows what went wrong for each lead: company, result, when. 3. **Retry this lead**, or select several and **Retry N leads**. ### Common questions [#common-questions] **What do Delivered, Filtered and Failed mean?** **Delivered**: the lead reached Slack, your CRM, the webhook or the campaign. **Filtered**: the lead did not match a filter rule or the frequency (for example a returning visitor on Only the first time); nothing was sent and nothing is wrong. **Failed**: we tried and the other side refused (a disconnected CRM, a webhook URL that errors, an archived Slack channel). **Why didn't my automation run for a lead?** Open the lead's row in the run history or the **Automations** column on the Leads page. A Filtered run names the rule; no run at all means the automation was paused, a draft or saved after the lead arrived. [Build an automation](/docs/automations/automations) explains how to run it on older leads. **How do I retry a failed one?** Fix the cause first (reconnect the integration, fix the URL), then **Retry this lead**. The retry is a real send to the same destination. **Can I retry many leads at once?** Yes. Tick the runs (**Select all loaded runs** or **Select all N matching**) and click **Retry N leads**; it runs in the background. You can also tick leads on the Leads page and use **Retrigger**, choosing which automations to run and whether to include leads that already succeeded. **How do I see which automations ran for one lead?** On the Leads page, the **Automations** column and the lead's panel list every automation that ran for it and the result. **Can I export the run history?** Yes, **Export CSV** in the run history panel. ### 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: What happened to one lead [#use-case-what-happened-to-one-lead] `GET /v3/leads/{leadId}/automation-history` lists every run recorded for that lead, newest first: `status`, `message` (the result or the error text), `automation` (`_id`, `name` and `then`, the action it runs) and `executedAt`. `status` is `success`, `failed`, `skipped` (the automation's filters left the lead out) or, for a run you started by hand, `manual`, `rerun-automation-manually` or `Retriggered automation-manually`. A `leadId` that isn't 24 characters answers 400; an unknown one answers 404 `Lead not found`. Use it to check whether a lead reached Slack, a CRM, a webhook or a campaign, and why a run failed. ### Use case: What one automation did [#use-case-what-one-automation-did] `GET /v3/automations/{automationId}/runs?websiteId=…` lists the automation's runs of the last 7 days, newest first, one row per lead (its latest attempt): `lead`, `company`, `domain`, `result` (`delivered`, `filtered` when the automation's filters skipped the lead, or `failed`), `detail` (the outcome or the error text), `durationMs` and `executedAt`. `counts` gives `all`, `delivered`, `filtered` and `failed` for the same 7 days. Add `result=failed` to see only failures; page with `limit` (1–200, default 50) and `skip` (default 0). `GET /v3/automations/stats?websiteId=…` sums the last 7 days per automation (`runs7d`, `delivered7d`, `failed7d`, `failedLeads7d`). ### Use case: Retry after a fix [#use-case-retry-after-a-fix] `GET /v3/automations/{automationId}/runs?websiteId=…&result=failed&idsOnly=true` answers just `leadIds` (up to 20,000) of the leads whose latest attempt failed this week: send them as `leadIds` below. `POST /admin/automations/re-trigger` with `websiteId` and the `leadIds` to run again (1–20,000 lead ids): those leads go back in the queue and every active automation of the website runs for them within a few minutes. Leads of another website are ignored; the answer's `requeued` says how many were queued, and each lead's history shows the real outcome once it has run. To rerun only one kind of automation for one lead, `POST /admin/automations/rerun-single` with `leadId`, `websiteId` and `automationType` (`webhook`, `slack`, `hubspot`, `pipedrive`, `zoho`, `salesforce`, `gohighlevel`, `zapier`, `mailchimp` or `email-campaign`). It runs right away and answers `result`: `success`, `message` (what happened, or the error) and `executedAt`. A webhook is sent again even if it went before. On success the lead's earlier failed runs of that automation are cleared from its history and any pending automatic retry is cancelled. An unknown `automationType` or a malformed id answers 400; a lead that isn't on that website, 404. Both calls are real sends. --- ## 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" } ``` Every run for that lead comes back, newest first, with the automation's name and action, its `status` (`success`, `failed`, or `skipped` when the automation's filters left the lead out) and the result or error text, so your assistant can tell a filtered lead from a failed push. ### Use case [#use-case-1] > Show me the failed runs of my Slack automation. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "automationId": "64b7f0a1c2d3e4f5a6b7c8e2", "result": "failed", "limit": 50, "skip": 0 } ``` Each run of the last 7 days shows the lead, its company, `result` (`delivered`, `filtered` when the automation's filters skipped it, or `failed`) and `detail`, the error text. `counts` totals each result for the week. ### Use case [#use-case-2] > Retry every lead my HubSpot automation failed on this week. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "automationId": "64b7f0a1c2d3e4f5a6b7c8e1", "result": "failed", "idsOnly": true } ``` With `idsOnly` only the `leadIds` come back (leads whose latest attempt failed). Your assistant confirms, then sends them to `retrigger_automations` with that automation's id. ### Use case [#use-case-3] > I reconnected HubSpot. Send this lead again. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "automationType": "hubspot" } ``` `automationType` is one of `webhook`, `slack`, `hubspot`, `pipedrive`, `zoho`, `salesforce`, `gohighlevel`, `zapier`, `mailchimp` or `email-campaign`. Your assistant confirms first, since it is a real push, and reports the outcome. ### Use case [#use-case-4] > Re-run the Slack and HubSpot automations for these three leads. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "leadIds": ["6530c1d2e3f4a5b6c7d8e9f2", "6530c1d2e3f4a5b6c7d8e9f3", "6530c1d2e3f4a5b6c7d8e9f4"], "automationIds": ["64b7f0a1c2d3e4f5a6b7c8e1", "64b7f0a1c2d3e4f5a6b7c8e2"], "retriggerSuccessful": false } ``` Your assistant gets the lead ids from `get_leads` and the automation ids from `list_automations`, then asks you to confirm: this sends real messages and CRM records. A lead an automation already delivered is skipped, so nobody gets a duplicate; to send it again anyway (say the Slack message was deleted), ask for it and `retriggerSuccessful` is `true`. The answer counts the leads processed, failed and skipped, and the automations run, skipped and failed, with the errors. # 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. The default message shows the company (name, domain, industry, size, revenue, LinkedIn) and its top contact (name, email, position, phone, LinkedIn). You choose the channel and can change the message. 1. **Integrations → Notifications → Connect Slack** and allow the app in your Slack workspace. You do this once. **Disconnect** on the same card removes it again (it asks to confirm); every Slack automation of this website stops until you connect again. 2. **Automations → New automation.** Pick the source (usually **A new lead is identified**), the filter (all leads or a saved filter) and the frequency, then the action **Send to Slack**. 3. **Pick the channel** and, if you like, **Edit message template**. **Send test notification** posts a sample lead so you see how it looks. 4. **Save & activate.** ### Change the message [#change-the-message] The message uses Slack formatting (`*bold*`, `_italic_`) and merge fields in double braces, filled for each lead. A field we don't know for a lead is left empty. The message can be up to 3,000 characters; clear it to go back to the default. | About | Merge fields | | --- | --- | | Company | `{{lead.company.name}}` `{{lead.company.domain}}` `{{lead.company.industry}}` `{{lead.company.sector}}` `{{lead.company.employees}}` `{{lead.company.employeesRange}}` `{{lead.company.estimatedRevenue}}` `{{lead.company.description}}` `{{lead.company.linkedinPage}}` `{{lead.company.phone}}` `{{lead.company.foundedYear}}` `{{lead.company.city}}` `{{lead.company.state}}` `{{lead.company.country}}` | | Contact | `{{lead.person.firstName}}` `{{lead.person.lastName}}` `{{lead.person.position}}` `{{lead.person.seniority}}` `{{lead.person.department}}` `{{lead.person.businessEmail}}` `{{lead.person.personalEmail}}` `{{lead.person.phone}}` `{{lead.person.linkedin}}` | | Visit | `{{lead.visit.pageList}}` `{{lead.visit.pageCount}}` `{{lead.visit.sessionCount}}` `{{lead.visit.city}}` `{{lead.visit.state}}` `{{lead.visit.countryCode}}` `{{lead.firstSeen}}` `{{lead.lastSeen}}` `{{lead.score}}` | | Campaign | `{{lead.utm.source}}` `{{lead.utm.medium}}` `{{lead.utm.campaign}}` `{{lead.utm.term}}` `{{lead.utm.referrer}}` | The same fields work in [CRM field mapping](/docs/automations/crm/overview). ### Common questions [#common-questions] **Why is nothing posted to Slack?** Check, in this order: the automation is **Active**; the lead passed the filter (the [run history](/docs/automations/run-history) names the rule that stopped it); the channel still exists under the same name (a renamed or archived channel fails); for a private channel, the app was invited. Then **Retry this lead** from the run history. **Do I have to invite the app to the channel?** Only for a private channel: type `/invite @Platform` in that channel and it appears in the channel list. Public channels work without an invite. **Does Slack work on a trial?** Yes. Slack automations run on every plan, trial included, and keep running after the trial ends on the leads you already have. **Can I get the same company more than once?** Set the frequency to **Every visit** and switch on **Limit repeats** to cap it (for example once every 24 hours per company). With **Only the first time**, a returning visitor is not posted again. **Can I use a different message per automation?** The saved message is used by every Slack automation of the website. Edit it from any Slack automation (**Edit message template**); **Reset to default** brings the standard message back. --- ## 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 (archived ones left out), each with `id`, `name`, `isPrivate`, `isMember` and `members`; use a `name` as `sendMessagesTo`. The app can post to any public channel without being in it; a private channel only shows up after you invite the app to it (`/invite` in Slack). Without Slack connected the call answers 405 `Slack Integration not connected`. ### Use case: Change the message [#use-case-change-the-message] `PUT /v3/slack/message-template` with `websiteId` and `template` (up to 3,000 characters, merge fields like `{{lead.company.name}}`) saves the message for every Slack automation of the website; an empty `template` goes back to the default. The answer lists `unknownFields` when the template uses a merge field that doesn't exist, since it would show empty. `GET /v3/slack/message-template` returns the saved `template` (`null` = default) and the `defaultTemplate`. ### Use case: Try the message [#use-case-try-the-message] `POST /v3/slack/test-message` posts a sample lead, marked *[Test Notification]*, with the saved template or the `template` you pass. Give `channelName` (a name from the channel list), or leave it out to use the channel of your first active Slack automation. It answers `{ "success": true, "channel": "leads" }`, plus `unknownFields` when the template uses a merge field that doesn't exist (it would show empty). When Slack refuses the post (the channel was renamed or archived, or the app isn't in it) it answers 400 with the reason in `status` and the Slack code in `slackError`. --- ## 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 to #sales in Slack. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "New US leads to #sales", "trigger": { "then": "send-to-slack", "actions": { "sentToSlack": { "sendMessagesTo": "sales" } } } } ``` ### Use case [#use-case-1] > Which Slack channels can you post leads to? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` Each channel comes back with its `name`, whether it is private and whether the app is in it (`isMember`). Public channels work without inviting the app; a private channel only appears once you invite the app to it (`/invite` in Slack). ### Use case [#use-case-2] > Add the pages they visited to our Slack lead message. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` Your assistant reads the current message and the merge fields it can use, then saves the new version: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "template": "*New lead:* {{lead.company.name}} ({{lead.company.domain}})\n{{lead.person.firstName}} {{lead.person.lastName}}, {{lead.person.position}}\n*Pages:* {{lead.visit.pageList}}" } ``` If the answer lists `unknownFields`, a merge field was misspelt and would show empty. An empty `template` goes back to the default message. ### Use case [#use-case-3] > 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 A webhook is a URL that receives data. Each lead that matches the automation is sent to your URL as a JSON POST: the person, their company, the pages they saw and the lead link. Tools like Make, n8n and Zapier give you such a URL in one click, so you need no code of your own. Once your website has a signing secret, every request is signed so you can check it came from us. 1. **Automations → New automation.** Pick the source, the filter and the frequency, then the action **Trigger webhook**. 2. **Paste your URL** and choose: every lead, or only leads with a suggested contact. **Sample payload** shows the JSON you will receive. 3. **Send test webhook** to check your endpoint answers, then **Save & activate**. Saved without a successful test, the automation is kept **paused** until you test it. ### Verify the signature [#verify-the-signature] 1. In the webhook step, click **Generate signing secret** and copy it. There is one secret per website, shared by all its webhook automations; **Regenerate** replaces it, and the old one stops working at once. 2. Each request then carries two headers: `X-Platform-Timestamp` (Unix seconds) and `X-Platform-Signature`, the hex HMAC-SHA256 of `timestamp + "." + raw request body`, keyed with your secret. 3. On your server, compute the same value from the raw body (before parsing it) and compare. Refuse requests older than 5 minutes to stop replays. ```js import crypto from 'node:crypto'; function isFromUs(rawBody, headers, secret) { const ts = headers['x-platform-timestamp']; const expected = crypto.createHmac('sha256', secret).update(`${ts}.${rawBody}`).digest('hex'); const given = Buffer.from(headers['x-platform-signature'] || ''); const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300; return fresh && given.length === expected.length && crypto.timingSafeEqual(given, Buffer.from(expected)); } ``` Without a secret, requests are sent unsigned. ### The older website-wide webhook [#the-older-website-wide-webhook] Accounts set up before automations may still have one webhook for the whole website, under **Websites → your website → Webhook**. It keeps sending every new lead to its URL. A **Trigger webhook** automation does the same with filters, a schedule, a signing secret and a run history, so set one up and clear the old URL when you move over. The URL must be a public `http(s)` address; local or private ones are refused. ### Common questions [#common-questions] **Can I use a webhook without writing code?** Yes. In Make, n8n or Zapier create a webhook trigger, copy the URL it gives you and paste it here. Send a test lead so the tool learns the fields, then build the rest of your flow there. **What does "only leads with a suggested contact" mean?** Every lead is a company; most also come with the exact person who visited. Choose this option to receive only leads that have a person attached, so your flow always has a name and email to work with. **Why did my webhook fail?** Your URL answered with an error or did not answer. Open the [run history](/docs/automations/run-history): each failed run shows the reason. Fix the endpoint, then **Retry this lead**. The URL must be a public `http(s)` address; a local or private one is refused. **Does it run on old leads?** Only on leads that arrive after you save it, unless you choose **Retrigger for existing leads** right after saving, or tick leads on the Leads page and **Retrigger**. [Build an automation](/docs/automations/automations). **Do webhooks run on a trial?** Yes, on every plan. When the trial or credits run out, new leads stop; the webhook keeps running on the leads you have. --- ## 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 `websiteId` and `webhook` set to your URL sends a sample lead, shaped like the ones automations send and signed with your website's secret if it has one, and returns what your endpoint answered (`status` and `data`). The URL must be a public `http(s)` address; a private or local one answers 400. When the test succeeds, leads whose webhook delivery had failed are queued to be sent again. ### Use case: Only leads with a person attached [#use-case-only-leads-with-a-person-attached] Set `whenToPush` to `only-with-suggested-contacts` so your endpoint only receives leads that come with the identified person; `every-time` sends every matching lead. ### Use case: Check what was delivered [#use-case-check-what-was-delivered] `GET /v3/automations/{automationId}/runs?websiteId=…` lists the automation's runs, newest first, with the lead, the time and whether your endpoint accepted it. `GET /admin/automations?websiteId=…` shows `errorMessage` when the last run failed. --- ## 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" } } } } ``` ### Use case [#use-case-1] > Test my webhook with a sample lead. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "webhook": "https://n8n.example/webhook/leads" } ``` Your assistant reports the status your endpoint answered. A failing URL is the usual reason a webhook automation shows failed runs. ### Use case [#use-case-2] > Did my n8n webhook receive yesterday's leads? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "automationId": "64b7f0a1c2d3e4f5a6b7c8e3", "limit": 50 } ``` Each run names the lead, when it ran and whether your endpoint accepted it (and why not). Failed ones can be sent again with `rerun_automation_for_lead` (type `webhook`). # 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 An ads audience is a list of your identified visitors that an ad platform can show ads to. Connect your ad account, create or link a campaign under **Engage**, and the leads you choose are uploaded to that audience. 1. **Integrations → Paid Ads:** connect Google Ads, LinkedIn Ads or Meta Ads (a sign-in with that platform) and pick the ad account. 2. **Engage → Google Ads / LinkedIn Ads / Meta Ads:** for Google Ads, link a campaign that already exists in your Google Ads account; for LinkedIn or Meta, create an audience (it is created in the ad platform at the same time). 3. **Fill it:** for Google Ads, an [automation](/docs/automations/automations) with the **Push to Google Ads** action adds every lead that matches your filter; you can also paste contacts by hand under the campaign's **Contacts** tab. ### Common questions [#common-questions] **Which leads are sent to the audience?** The ones that match the automation's filter, for example leads with a high ICP score or visitors of your pricing page. Set the filter in the automation; nothing is uploaded without one, unless you add contacts by hand. **Why does my audience say "Too small" or "Matching"?** Ad platforms only serve ads once enough people are matched: LinkedIn needs 300+ matched people, Meta about 100+. *Matching* means the platform is still comparing your list with its users; *Ready* means ads can run. **Can I see how the ads perform?** Yes, for Google Ads: the campaign's **Overview** tab shows impressions, clicks and spend, and **Open in Google Ads** jumps to the campaign. LinkedIn and Meta audiences open in their ad manager. **Does deleting an audience here delete it in the ad platform?** Yes, for LinkedIn and Meta the audience is removed on the platform too. Disconnecting an ad account under Integrations → Paid Ads takes effect on one click, with no confirmation. ### 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 Read your Google Ads retargeting audiences and refresh their numbers. LinkedIn and Meta audiences are managed in the dashboard only. 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" } ``` The tools cover Google Ads audiences only; LinkedIn and Meta audiences are managed in the dashboard. # 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 are the people a campaign emails. They come in from your leads, by hand or through an [automation](/docs/automations/email-campaigns), and each one moves through the sequence on its own. The **Contacts** tab shows where every person is. 1. **Add people:** open a lead → **Add to campaign**, or let an [automation](/docs/automations/email-campaigns) add every new lead that matches a filter. The campaign must be on and have at least one email. 2. **Open the campaign → Contacts** and use the status tabs to see who is scheduled, contacted, bounced or replied. 3. **Overview** shows the totals: opened, clicked, replied and warm. ### Common questions [#common-questions] **What do the statuses mean?** *Scheduled*: the next email is due. *Contacted*: at least one email was sent. *Warm reply* / *Cold reply*: the person answered, and the sequence stopped for them. *Out of office*: an automatic reply, not a real one; their remaining emails are paused until you **Reschedule & send** them. *Bounced*: the address did not accept the email. *Unsubscribed*: they opted out. *Error sending*: the mailbox could not send (usually disconnected or over its limit). *Manually paused*: you stopped them. **How do I see who replied?** The *Warm reply* and *Cold reply* tabs here, or the [Master Inbox](/docs/engage/master-inbox), where you can read and answer every reply. **How do I stop emailing one person?** On the lead, hover the sequence bar → **Remove from campaign** (then confirm). That deletes the person and their unsent emails from the campaign; emails already sent stay sent. To stop the emails but keep the person and their history, ask your AI assistant to stop the prospect ([MCP tab](/docs/engage/campaign-contacts/mcp)). Someone who replied is stopped for you. **Does adding a contact cost credits?** Not lead credits. Each contact added to a campaign uses one from your account's prospecting allowance (the same allowance Prospector uses), whether or not the email goes out. Stopping or removing a contact does not give it back. **Why is a contact stuck on scheduled?** Either the campaign is off, it is outside the sending window, or the mailbox has reached its daily limit so the email waits for the next free slot. Hover the campaign status chip on the lead for the exact reason and a fix button (Reconnect mailbox, Raise daily limit, Send now…). **Can I pick which mailbox emails a contact?** By default the connected mailbox with the most free capacity that day is used. When a mailbox is disconnected, the fix card on the lead lets you change the sender; your AI assistant can also move people to another mailbox ([MCP tab](/docs/engage/campaign-contacts/mcp)). ### 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 Add people to a campaign from your own app or CRM, stop them, and read a campaign's results. 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 (`firstName`, `lastName`, `position`, `domain` for the company, `custom` for your own fields). The campaign must be active and have at least one email; each contact uses one from your prospecting allowance. ### Use case: Someone asked you to stop [#use-case-someone-asked-you-to-stop] `POST /admin/email-campaigns/stop?leadId=…&email=…` stops every campaign for that address and adds it to your unsubscribe list, so no campaign emails them again. --- ## 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" } ``` The campaign must be active and have at least one email. The assistant asks before adding, stopping or removing anyone: adding uses one from your prospecting allowance, and removing deletes the person's history in the campaign (`stop_prospect` keeps it). # 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. It looks at the campaign's mailboxes, their daily limits and warmup, and how many contacts are waiting, then tells you what limits the sending and what to do about it. You see it on the campaign row (hover for details) and as a banner inside the campaign. 1. **Open a campaign:** the banner shows its health and the recommended actions. 2. **Follow the recommended action**, e.g. reconnect a mailbox, add a mailbox or raise a daily limit. 3. **Dismiss** a recommendation you have handled; it stays hidden for a week by default. ### Common questions [#common-questions] **Why is my campaign sending so few emails?** A campaign can only send what its mailboxes allow: each mailbox has a daily limit, and a new one starts low and ramps up over a few weeks. If the campaign has more contacts waiting than its mailboxes can reach in time, the banner says so. Sorting the campaign list by **Health** shows which campaigns need attention first. **How do I send more emails a day?** Add another mailbox ([Email accounts](/docs/engage/mailboxes/email-accounts)) or raise a mailbox's limit (Email Accounts → ⋮ → **Daily Sending Limit**). Raise limits slowly: a sudden jump on a new mailbox is what gets emails sent to spam. Mailboxes bought from us are capped at 40 a day; others go up to 500. **What does Rebalance Mailboxes do?** On Integrations → Email Accounts, it moves emails that are already scheduled from overloaded mailboxes to connected mailboxes with free capacity. The dashboard suggests it when the load is uneven. **What does "healthy" mean?** No mailbox problem, enough daily capacity for the contacts waiting, and no sending errors. Nothing to do. --- ## API — From your code Source: /docs/engage/campaign-health/api Read how many emails a campaign can send a day and what limits it, for your own dashboards or alerts. 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 is one outreach to a group of people. It sends a sequence of emails (the first email, then follow-ups) to its contacts, from mailboxes you connected, only on the days and hours you set. 1. **Connect a mailbox first** under [Integrations → Email Accounts](/docs/engage/mailboxes/email-accounts). Nothing sends without one. 2. **Engage → + New Campaign → Email Campaign.** Name it and set the sending window: hours, days of the week, timezone. You can change all of it later under the campaign's **Settings** tab. 3. **Write the emails** under the [Sequences](/docs/engage/sequences) tab, then [add contacts](/docs/engage/campaign-contacts) by hand or with an [automation](/docs/automations/email-campaigns). 4. **Switch it on** with the on/off switch on its row (or the **Active** switch at the top of the campaign). Off = paused: nothing is sent, contacts keep their place. ### Common questions [#common-questions] **Do campaigns send on a trial?** No. On a trial you can build campaigns, write sequences and add contacts, so everything is ready; sending starts when you move to a paid plan. The banner at the top of Engage says so while you are on a trial. **Can I send from my Gmail or Outlook?** Yes. Campaigns always send from a mailbox you connect: Gmail, Outlook / Office 365, or any mailbox with SMTP and IMAP. [Email accounts](/docs/engage/mailboxes/email-accounts). For cold outreach to people who do not know you, send from a separate [outreach domain](/docs/engage/mailboxes/domains) so your main domain is never at risk. **Why isn't my campaign sending?** Check, in this order: the campaign switch is on; it has at least one email in Sequences and at least one contact; a mailbox is connected (not Disconnected or Marked as Spam); it is inside the sending window you set; the mailbox has not used up its daily limit. The health banner on the campaign tells you which one it is. [Campaign health](/docs/engage/campaign-health). **How many emails a day does a campaign send?** As many as its mailboxes allow. The daily limit is set per mailbox (Email Accounts → ⋮ → Daily Sending Limit), and a new mailbox starts low and ramps up over a few weeks. More mailboxes = more emails a day. [Campaign health](/docs/engage/campaign-health) shows the number for each campaign. **What happens when someone replies?** The reply arrives in that mailbox and in the [Master Inbox](/docs/engage/master-inbox), the rest of the sequence stops for that person, and their row in Contacts moves to a reply status. Answer from the Master Inbox; the answer goes out from the same mailbox. **Why are my emails going to spam?** Usually a new mailbox that was not warmed up, missing SPF / DKIM / DMARC records, or spammy wording. Turn on [warmup](/docs/engage/mailboxes/warmup), run the [deliverability check](/docs/engage/mailboxes/deliverability), use the **SPAM Check** button in the email editor, and keep **Track Opens & Clicks** off in the campaign Settings (tracking links hurt deliverability). **Can I copy a campaign?** Yes: ⋮ on its row → **Clone Campaign**. The copy has the same emails and settings, starts paused and has no contacts. Note that **Delete Campaign** has no confirmation step and removes the campaign, its emails and all its contacts for good. ### 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 Create, list, change, pause and clone your email campaigns from your own code or scripts. Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: List your campaigns [#use-case-list-your-campaigns] `GET /admin/email-campaigns?websiteId=…` answers `totalDocs` (campaigns on the website), `remaining` (campaigns after this page; 0 or less means the last page) and `emailCampaigns`. Each campaign has its `_id`, `name`, `isActive`, its steps (`emailCampaignTemplates`), `stats`, a `health` status and summary, and `user`, who created it (id, name and email). Pages hold 1–100 campaigns (`limit`, default 100) from `page` 1; sort with `sortProperty` (`createdAt`, `updatedAt`, `name`, `isActive`) and `order` (`asc` or `desc`, default newest first). ### Use case: Pause a campaign [#use-case-pause-a-campaign] `PUT /admin/email-campaigns/{id}` with `{ "status": "paused" }`; `"active"` starts it again (`isActive: false`/`true` does the same; any other status answers 405). Paused contacts keep their place; when the campaign starts again, contacts that went overdue are spread out from today instead of all sending at once. ### Use case: Change the sending schedule [#use-case-change-the-sending-schedule] Send `timeSlot` as hours in the campaign's `timezone`: `{ "start": 8, "end": 18 }` sends from 08:00 until 18:00 (`start` 0–23, `end` 1–24). `daysRange` lists the sending days as numbers, 0 = Sunday to 6 = Saturday, so `[1, 2, 3, 4, 5]` is Monday to Friday. `timezone` is one of the listed zones (default `America/Los_Angeles`). --- ## 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 } ] } ``` The campaign is created with the default window (Monday to Friday, 9:00–17:00) unless you say otherwise. `emailAccountId` is required by the tool but any connected mailbox id will do: the sending mailbox is chosen per contact. Nothing is sent until contacts are added. ### Use case [#use-case-1] > Which of my campaigns are running, and how are they doing? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "page": 1, "limit": 100, "sortProperty": "createdAt", "order": "desc" } ``` Each campaign comes back with `isActive` (running or paused), its steps, a `health` status and a `statsRollup` snapshot (sent, opens, clicks, replies, bounces and their rates, refreshed about every 5 minutes). `totalDocs` is how many campaigns the website has; up to 100 come per page. For exact live numbers of one campaign your assistant uses `get_campaign`. # Engage (/docs/engage) Engage turns leads into conversations: email sequences sent from your own mailboxes, LinkedIn connection requests from your own LinkedIn account, 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. ## Set it up, in order [#set-it-up-in-order] 1. **[Connect a mailbox](/docs/engage/mailboxes/email-accounts)** (Gmail, Outlook or any SMTP/IMAP mailbox). For cold outreach, send from a [separate outreach domain](/docs/engage/mailboxes/domains) so your main domain is never at risk. 2. **[Warm it up](/docs/engage/mailboxes/warmup)** and **[check deliverability](/docs/engage/mailboxes/deliverability)** (SPF, DKIM, DMARC) so your emails land in the inbox, not in spam. 3. **[Create a campaign](/docs/engage/email-campaigns)** and write its **[sequence](/docs/engage/sequences)**: which emails, in what order, with what wait in between. 4. **[Add contacts](/docs/engage/campaign-contacts)** by hand, from a list, or [automatically from new leads](/docs/automations/email-campaigns). 5. **[Answer replies in the Master Inbox](/docs/engage/master-inbox)** and watch [campaign health](/docs/engage/campaign-health) to see what limits your sending. ## Mailboxes and domains [#mailboxes-and-domains] ## Common questions [#common-questions] **Can I send on a trial?** You can build campaigns, sequences and contact lists on a trial and see exactly how they would run. Sending starts on a paid plan. **Do emails go from Platform or from me?** From you: your own mailbox, your own domain. Replies come back to that mailbox and show up in the [Master Inbox](/docs/engage/master-inbox). **Why should I use a separate domain?** Cold outreach can hurt a domain's reputation. An [outreach domain](/docs/engage/mailboxes/domains) keeps that risk away from the domain your company email runs on. **Someone replied. What now?** Replies land in the [Master Inbox](/docs/engage/master-inbox) and count in the campaign overview. If someone answered you somewhere else (a call, LinkedIn), stop their sequence from [Campaign contacts](/docs/engage/campaign-contacts) so they get no more emails. # 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 A LinkedIn campaign sends connection requests to your leads from your own LinkedIn account, through the [Platform Chrome extension](/docs/engage/linkedin-extension) in your own browser. Each request can carry a personalised note (up to 300 characters), written by you or adapted by AI for each person. The note takes the same [spintax](/docs/engage/sequences) and merge fields as emails (`[[Hi | Hey]] {{ first_name | there }}`); it must fit 300 characters even with the longest option of each spin and a long name, or the campaign is refused. 1. **Pair your account:** install the [LinkedIn Chrome extension](/docs/engage/linkedin-extension) and click **Connect this Chrome**; the account appears under **Integrations → LinkedIn Accounts**. 2. **Engage → LinkedIn → + New Campaign → LinkedIn Campaign.** Name it, write the note (optional), then **Activate now** or **Save as draft**. Days, hours and holidays are under the campaign's **Settings** tab. 3. **Add people:** an [automation](/docs/automations/automations) with the **Send to LinkedIn Campaign** action adds every new lead that matches your filter. 4. **Watch** Total, Sent, Accepted and Failed on the LinkedIn tab, and each person's status under the campaign's **Contacts** tab. LinkedIn is in BETA. It is available on every plan except lifetime deals. On a trial you can pair your account and build the campaign; requests are sent on a paid plan. ### Common questions [#common-questions] **Does Platform send LinkedIn messages too?** No. Today a LinkedIn campaign sends **connection requests** only, each with an optional note. It never scrapes profiles, reads your messages or posts for you. (Watching LinkedIn posts and keywords to find new leads is a separate feature, LinkedIn Fans.) **How many requests a day can I send?** A few per account, spread hours apart, rising slowly during the first weeks. The **Ramp-up** schedule on the account row (Integrations → LinkedIn Accounts) sets the start, the maximum and over how many days. Today's requests and the cap show on the same row. [Why the limits](/docs/engage/linkedin-extension#what-it-sends-and-when). **What do the contact statuses mean?** *Scheduled*: waiting for a free slot. *Sending*: in flight now. *Request Sent*: delivered, not yet answered. *Connected*: they accepted. *Declined*: they did not accept. *Error*: LinkedIn did not accept it (tried at most twice). *Deleted*: you removed them. **Nothing is being sent. Why?** Chrome must be open and signed in to LinkedIn on the computer that paired the account, the time must be inside the campaign's schedule, today's cap must not be used up, and the account must not be paused or cooling down after a LinkedIn warning. The **readiness** box on the LinkedIn tab shows which one it is. [Troubleshooting](/docs/engage/linkedin-extension#troubleshooting). **Can I pause a campaign or one account?** Yes. The on/off switch on the campaign row pauses the campaign; people keep their place. Pausing the account (Integrations → LinkedIn Accounts) stops every campaign on it. **Can I rename a campaign later?** Only while it is a draft. Once activated the name is fixed; the note, days and hours stay editable. ### 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 Read, start, pause and delete LinkedIn campaigns, and manage the LinkedIn accounts, keywords and tracked posts behind them. 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 status (`draft`, `active`, `paused` or `completed`), its counts and its progress; `GET …/{linkedinCampaignId}/timeline` gives the day-by-day numbers for up to 90 days. --- ## 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 Platform 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. On a trial you can install the extension and pair your account; connection requests are sent on a paid plan. ### Install it [#install-it] 1. Open Chrome on the computer where you are signed in to LinkedIn. 2. Install **[Platform LinkedIn from the Chrome Web Store](https://chromewebstore.google.com/detail/platform-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 **Platform 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 closed or sleeping laptop sends nothing until it is open again. A laptop that is only open in the evening still sends, inside its local hours. To send from two LinkedIn accounts, install the extension in two Chrome profiles, one signed in to each account; each appears as its own row with its own daily cap. ### 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 Receiving mail servers check three DNS records on your domain before trusting an email. The deliverability check tells you whether each is in place for a mailbox's domain, whether your custom tracking domain is set, and whether the sending address is on a blacklist. It sends no email. 1. **Integrations → Email Accounts:** the **Deliverability** column shows SPF / DKIM / DMARC / tracking for each mailbox. 2. **⋮ → Check DNS Records** (or **Check Now**) after you change DNS; the result lists what is still missing and how to fix it. 3. **⋮ → Custom Tracking Domain** to track opens and clicks through your own domain instead of a shared one. ### Common questions [#common-questions] **What are SPF, DKIM and DMARC?** Three DNS records on your domain that prove an email really comes from you. **SPF** lists which servers may send for the domain. **DKIM** signs each email so it cannot be altered. **DMARC** tells receivers what to do when a check fails. Missing records are the most common reason emails land in spam. Domains bought from us have all three set up for you ([Outreach domains](/docs/engage/mailboxes/domains)); for your own domain, add the records at your DNS provider, then run the check again. **What does the overall status mean?** *Excellent* or *Good*: nothing to do. *Warning*: a record is missing or weak; fix it soon. *Critical*: emails from this mailbox are likely to be rejected or spam-foldered; fix it before sending. **How do I know whether my emails land in the inbox or in spam?** That is a separate test: ⋮ → **Run Deliverability Test** sends real test emails from the mailbox and reports where they landed; the result shows in the **Test Score** column. You can run it from the email editor too (**Get Deliverability Report**) to test a specific email. **Should I track opens and clicks?** Tracking rewrites links and adds an invisible image, which some providers treat as a spam signal. For cold outreach keep **Track Opens & Clicks** off in the campaign Settings. If you do track, set a **Custom Tracking Domain** (a CNAME record on a subdomain such as track.yourdomain.example) so the links carry your own name. **How do I set up the tracking domain?** ⋮ → **Custom Tracking Domain**, enter a subdomain (for example track.yourdomain.example), create the CNAME record it shows at your DNS provider, then **Verify DNS**. **Remove tracking domain** goes back to the shared one. --- ## API — From your code Source: /docs/engage/mailboxes/deliverability/api Run the DNS and tracking-domain checks for a mailbox from your own code, for example after you change DNS. 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 to people who do not know you can hurt a domain's reputation. Send it from domains that look like yours but are not the one your company email runs on. Buy ready-to-send domains with mailboxes here, or bring a spare domain you already own. 1. **Integrations → Domains.** 2. **Buy a new domain:** search a name (we suggest look-alikes of your domain, e.g. get-, try- or -hq), check availability, enter the sender name and job title for each mailbox (up to 4 per domain), then **Pay & Set Up**. Or **Bring your own domain:** enter it and point its nameservers to the ones shown. 3. **Keep auto-renew on** so the domain, and the mailboxes on it, never stop. ### Common questions [#common-questions] **What do I get when I buy a domain?** Everything set up for you: the registration, DNS, the SPF / DKIM / DMARC records, the mailboxes you asked for (one per domain by default, named first.last) and warmup switched on. Mailboxes bought this way send up to 40 emails a day each. **How long does setup take?** Setup runs in the background in five steps (purchased, DNS configured, mail setup, mailboxes created, ready) and you get an email when it is done. Watch progress on the Domains tab; a failed step is retried automatically. **How much does it cost?** The checkout shows the exact total before you pay: the domain's first year is charged at once, and each mailbox is a monthly subscription. Renewal prices show in the **Next renewal cost** column. Your AI assistant can quote your mailbox price ([MCP tab](/docs/engage/mailboxes/domains/mcp)). **Can I use my own domain?** Yes, with **Bring your own domain**. We then manage its DNS completely: you point the domain's nameservers at ours and its existing DNS records are deleted. Only do this with a spare domain; the wizard warns you when the name looks like your main domain, because your website and company email would stop working. The row shows **Recheck** until the nameserver change is seen. **What happens if I turn auto-renew off?** The domain expires at the end of its term and every mailbox on it stops sending; campaigns using those mailboxes stall. The switch asks you to confirm. **Can I add mailboxes to a domain later?** Yes: ⋮ on the domain → **Add mailboxes…**. Each new mailbox uses one of your account's mailbox slots ([Email accounts](/docs/engage/mailboxes/email-accounts)). ### 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 Suggest, check, pick and manage outreach domains from your own code. Buying is done in the dashboard checkout. 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, never from a Platform address. Connect Gmail, Outlook / Office 365, or any mailbox with SMTP (sending) and IMAP (reading replies). Each mailbox shows its connection status, how many emails it sent today, its DNS checks and its warmup. 1. **Integrations → Email Accounts → Add Mailbox.** 2. **Pick the provider.** *Gmail*: turn on 2-step verification in your Google account, create an **App Password** (16 characters) and paste it; the wizard links to the right Google page at each step. *Outlook / Office 365*: click **Continue with Outlook** and sign in with Microsoft. *Other*: enter the SMTP and IMAP host, port and password from your provider, then **Test and Save**. 3. **Check the row:** status **Connected**, then set the **Daily Sending Limit**, your **Signature** and turn on [warmup](/docs/engage/mailboxes/warmup) (⋮ menu). Don't have a spare mailbox? **Buy Domains & Mailboxes** sets up ready-to-send ones in minutes ([Outreach domains](/docs/engage/mailboxes/domains)). ### Common questions [#common-questions] **How many emails can a mailbox send a day?** You set it: ⋮ → **Daily Sending Limit**. Mailboxes bought from us are capped at 40 a day; others go up to 500. Keep **Auto-Ramping** on for a new mailbox: it starts at a low number (2 a day) and rises to the limit over a few weeks (20 a day over 4 weeks by default), which is what keeps new mailboxes out of spam. Changing the limit reschedules the emails already queued. **How many mailboxes can I connect?** Your account has a number of mailbox slots; when they are used up, Add Mailbox says you cannot create more. Deleting a mailbox frees its slot. **Why is my mailbox Disconnected?** The saved password or server settings stopped working, most often because the password or app password was changed, or the provider turned off access. Hover the status for the reason, fix it at the provider, then ⋮ → **Reconnect**. While a mailbox is disconnected its contacts wait; they continue as soon as it reconnects. **My work mailbox won't connect.** Your IT admin may block it. On Google Workspace the admin must allow 2-step verification and App Passwords; on Microsoft 365 the admin may need to approve the app before you can sign in. Yahoo, Zoho and other providers connect under **Other** with SMTP and IMAP. **What does "Marked as Spam" mean?** Platform paused the mailbox because its emails were starting to land in spam. Fix the cause first (turn on [warmup](/docs/engage/mailboxes/warmup), run the [deliverability check](/docs/engage/mailboxes/deliverability), tone down the wording), then click ⋮ → **I Fixed It** to resume sending. **How do I set my signature?** ⋮ → **Edit Signature**: name, company, position, phone and the signature itself. Every campaign email from that mailbox ends with it. **What happens when I delete a mailbox?** It is removed from Platform only; the mailbox itself keeps working at your provider. People who were scheduled on it are paused with an *Error sending* status until you give them another 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 Connect, list, change, reconnect and remove sending mailboxes from your own code. 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 Mail providers distrust a mailbox that suddenly sends many emails. Warmup fixes that: your mailbox exchanges a few friendly, AI-written emails a day with other warmup mailboxes, which get opened and answered, and the number rises slowly. Providers learn to trust the mailbox before your campaigns use it. 1. **Integrations → Email Accounts → ⋮ on a mailbox → Email Warmup Settings** (or the Warmup switch on the row). 2. **Pick how hard** (conservative, normal, aggressive) and the **Target Daily Limit** (5–60 warmup emails a day), then **Enable Warmup**. 3. **Watch the Warmup column** (sent / limit) grow toward the target. Switching warmup off is immediate. ### Common questions [#common-questions] **How long does warmup take?** Give a new mailbox **at least 14 days** of warmup before it sends campaigns. Start it the day you connect the mailbox, and keep campaign volume low until the Warmup column has reached its target. Warmup can stay on while campaigns run; it keeps the reputation up. **Do I need warmup on an old mailbox?** If the mailbox has sent normal business email for months, it already has a reputation and can start with a modest daily limit. Turn warmup on anyway when its emails start landing in spam or after a long pause. **Conservative, normal or aggressive?** The intensity sets how many warmup emails a day the mailbox sends, rising week by week (your Target Daily Limit caps it): | Intensity | Week 1 | Week 2 | Week 3 | Week 4 | From week 5 | Best for | |---|---|---|---|---|---|---| | Conservative | 5 | 8 | 12 | 15 | 20 | a brand-new domain | | Normal | 8 | 15 | 25 | 35 | 40 | most mailboxes | | Aggressive | 15 | 25 | 40 | 50 | 60 | domains that have sent email for a long time | **Why am I receiving strange emails?** Those are warmup emails from other warmup mailboxes. They look like short conversations, are answered automatically, and are normal while warmup is on. **What is the warmup filter?** Some providers (Gmail in particular) need a filter so warmup emails skip your inbox and are not flagged. When a mailbox needs one, the Warmup column shows **Set up filter**: download the filter file, import it into Gmail, then click **Verify filter**. Until it is verified that mailbox does not receive warmup emails. **Can I send campaigns while warmup is running?** Yes. Warmup emails and campaign emails are counted separately: the warmup limit is set here, the campaign limit under ⋮ → **Daily Sending Limit** ([Email accounts](/docs/engage/mailboxes/email-accounts)). Keep the campaign limit low while the mailbox is new. **How do I know it is working?** The Warmup column shows today's warmup emails sent against the limit. Your AI assistant can also report inbox vs spam placement of the warmup emails and the mailbox's reputation ([MCP tab](/docs/engage/mailboxes/warmup/mcp)); the reputation is only shown once a health check from the last 7 days backs it. --- ## API — From your code Source: /docs/engage/mailboxes/warmup/api Turn warmup on or off, change its intensity and read warmup health for your mailboxes. 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", "dailyLimit": 20 }`. `intensity` is `conservative`, `normal` or `aggressive`; `dailyLimit` is 5–100 warmup emails a day. --- ## 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" } ``` > Turn on warmup for jane@acme.example, normal intensity, 20 a day. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "emailAccountId": "6530c1d2e3f4a5b6c7d8e9f6", "intensity": "normal", "dailyLimit": 20 } ``` `intensity` is `conservative`, `normal` or `aggressive`; `dailyLimit` is 5–100. The assistant asks before switching warmup on, because you will see the warmup emails in that mailbox. # 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 The Master Inbox collects the replies to all your campaigns, from every connected mailbox, in one place. Read them, answer them and archive them without opening each mailbox. 1. **Open Master Inbox** in the sidebar. Folders: **Inbox** (people who replied), **Sent**, **Scheduled** (emails due but not yet sent) and **Archived**. 2. **Open a conversation** to see your email and every reply under it, then click **Reply** and send. 3. **Archive** what is done. **View in Campaign** jumps to the person's row in the campaign. ### Common questions [#common-questions] **Which mailbox does my reply go from?** Always the mailbox that sent the original email, as "Re: original subject". The person sees a normal reply from the same address. **Why don't I see a reply I know arrived?** Click the refresh button to pull new messages from your mailboxes. If the mailbox shows **Disconnected** under Integrations → Email Accounts, replies cannot be read until you reconnect it. The Master Inbox only collects replies to campaign emails. **Do out-of-office replies count?** They show in the Inbox so you can see them, but the contact is marked *Out of office*, separate from warm and cold replies. The rest of that person's sequence is paused, and nothing is rescheduled by itself: when they are back, use **Reschedule & send** on the lead to continue. A real reply (warm or cold) stops the sequence for that person for good. **Can I change an email before it is sent?** Yes. In the **Scheduled** folder, open the conversation and click **Edit** to change the sender, subject or text of the email that is waiting to go out. **Does archiving change anything for the person?** No. It only moves the conversation out of your Inbox view; nothing is sent and the contact's status stays the same. ### 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 Read campaign replies, answer them and archive them from your own tools, for example a helpdesk. 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` (`status=inbox` lists people who replied; `contacted`, `scheduled` and `archived` are the other views), read each thread with `GET /v3/inbox/{emailId}`, and answer with `POST /v3/inbox/{emailId}/reply`. The reply goes out at once from the mailbox that sent the original email. --- ## 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" } ``` `status` is `inbox` (people who replied, the default), `contacted`, `scheduled` or `archived`. The assistant reads a thread with `get_email_thread` before answering with `reply_to_prospect`; a reply is real email and cannot be recalled, so it should show you the text first. # 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 A sequence is the list of emails a campaign sends to each contact. Each step is one email, sent a number of days after the previous one. Merge fields such as `{{ first_name | there }}` fill in the person's details. 1. **Open a campaign → Sequences.** 2. **Edit a step** (pencil) or **Add Step** for a follow-up. Write the subject and body, then **Save**. 3. **Set the delay** ("After N days": days after the previous email; the first email has no delay) and reorder steps with the up/down arrows. ### Writing tips [#writing-tips] - **Write soon after the visit.** An [automation](/docs/automations/email-campaigns) adds new leads to the campaign while the visit is fresh. - **Short, about them, one ask.** A few lines on their problem and one clear next step beat a product pitch. - **Give follow-ups room:** a few days between steps; a handful of steps is enough. - **Relevant, not creepy.** Speak to the topic they looked at; never quote exact pages, times or durations. - **Make leaving easy:** end every email with `{{unsubscribe_text}}`. Anyone who opts out is never emailed by a campaign again. ### Common questions [#common-questions] **Which merge fields can I use?** Click **{} Add Dynamic Field** in the editor. The fields are `first_name`, `last_name`, `full_name`, `position`, `company_name`, `website`, `industry`, `compliment_company` (written by AI for each company), `sender_first_name` and `unsubscribe_text`. You can also insert **spintax** (several variations of a phrase; each email picks one). **How do I write spintax?** Wrap the options in double square brackets, separated by `|`: `[[Hi | Hello | Hey]] {{ first_name | there }}`. Each email picks one option at random, in the subject and the body, and you can use several blocks in one email. **{} Add Dynamic Field → + Create your own…** builds one for you (one variation per line). Square brackets are for spintax, curly braces for merge fields. **Preview** shows one version. **What happens if the first name is missing?** Give every field a fallback: `{{ first_name | there }}` writes "there" when the name is unknown, `{{ company_name | your company }}` writes "your company". The **Fallback value** box appears when you insert a field. A field without a fallback is left empty when the data is missing. **Where do the signature and the unsubscribe link come from?** The signature is the one saved on the sending mailbox (Email Accounts → ⋮ → **Edit Signature**). The unsubscribe link is the `unsubscribe_text` field; put it at the end of the email so people can opt out instead of marking you as spam. **How do I test an email before it goes out?** **Preview** shows the email with sample data. **Test** sends it to you from a mailbox you pick. **SPAM Check** scores the wording and offers fixes you can accept with one click. **Get Deliverability Report** checks where a test email lands. **Can AI write or adapt the emails?** Yes. In the editor, **AI Personalization** rewrites parts of the email for each person following rules you write, and **AI Conditions** skips the email for people who match a rule (for example "skip if they are a competitor"). Both have a **Run preview** so you see the result before saving. **Can I delete a step?** Yes, with the bin icon on the step; there is no confirmation. Contacts who already received that email keep it; nobody else gets it. ### 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 Read and change the emails (steps) of a campaign, run the spam check, or let AI write a sequence. 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 `websiteId`, `emailCampaignId`, `name`, `type` (`initial` for the first email, `followup` for the rest), `subjectTemplate`, `bodyTemplate`, `fromTemplate` and `sendingPeriod` (0–365 days after the previous step). Give every merge field a fallback, e.g. `{{ first_name | there }}`, and end the body with `{{sender_signature}}` and `{{unsubscribe_text}}`. --- ## 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. ### Something looks broken or out of date? [#something-looks-broken-or-out-of-date] After an update your browser may still show an old copy of the dashboard. Reload without the cache: **Ctrl+Shift+R** (Windows) or **⌘+Shift+R** (Mac). Still wrong? Clear the site data for the dashboard's address only (in Chrome: the icon left of the address → **Site settings → Delete data**), then sign in again. ### Every control on this screen [#every-control-on-this-screen] Every button, field and switch, with what it does. # Glossary (/docs/glossary) Short definitions, each with the page that goes deeper. ### Lead [#lead] A person Platform identified for you: a website visitor, a company researching your topic, a match from Web Scraping, or someone found by Prospector or AI Scout. Every lead has a person, a company, what they did and an ICP score. [See your leads](/docs/leads/website-visitors/see-your-leads). ### Credit [#credit] What one lead costs. Your plan gives you a number of credits a month; each new lead uses one. Hiding or deleting a lead does not give its credit back. When credits run out, new leads stop until the next refill (or an [auto top-up](/docs/account/billing) on a paid plan); everything else keeps working. [Plan, billing & credits](/docs/account/billing). ### Exact person vs company [#exact-person-vs-company] In 174 countries, the UK included, we identify the exact visitor: name, email, phone, LinkedIn, plus their company. In the EU and the EEA, GDPR limits us to the company, plus a suggested contact there who fits your ICP. [Which countries get the exact person?](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person) ### Tracking pixel (tracking script, snippet) [#tracking-pixel-tracking-script-snippet] A few lines of code you add to every page of your website, once. It is how we see your visitors. [Install the tracking pixel](/docs/websites/tracking-pixel). ### Verified / unverified [#verified--unverified] A website is **verified** once the dashboard has seen the pixel on your site. **Unverified** means it has not seen it yet; **failed** means it looked and did not find it. [Install the tracking pixel](/docs/websites/tracking-pixel). ### ICP (ideal customer profile) and ICP score [#icp-ideal-customer-profile-and-icp-score] Your ICP is who you sell to: industries, company size, revenue, locations. Qualify compares every lead with it and gives a score, so the best fits come first. [Ideal customer profile](/docs/qualify/icp) · [Scoring models](/docs/qualify/scoring-models). ### Scoring model [#scoring-model] The rules Qualify uses to score a lead: company size, industry, location, job title, pages visited and more. You can write the rules or let [AI Assist](/docs/qualify/ai-assist) propose them. [Scoring models](/docs/qualify/scoring-models). ### Exclusion (Exclude rule) [#exclusion-exclude-rule] A rule that keeps certain companies, domains, countries, industries or job titles out of your leads, and addresses out of your campaigns. [Exclude leads](/docs/qualify/exclusions). ### Prospect / Prospector [#prospect--prospector] A person or company found in the Platform contact database rather than on your website. Prospector is the search; a prospect becomes a lead when you add them. [Manual search](/docs/leads/prospector/search-prospects/manual-search) · [Auto Search](/docs/leads/prospector/search-prospects/auto-search). ### 3rd-party intent [#3rd-party-intent] Companies researching the topics you sell into on other websites, before they ever visit yours. [3rd-Party Intent](/docs/leads/intent-topics). ### Automation [#automation] A rule that acts the moment a new lead matches: post to Slack, push to your CRM, call a webhook, send to Clay or add to an email campaign. Automations run on every plan, trial included. [Automations](/docs/automations). ### Campaign and sequence [#campaign-and-sequence] A campaign is an outreach to a set of people; its sequence is the emails it sends, in order, with the wait between them. [Email campaigns](/docs/engage/email-campaigns) · [Sequences](/docs/engage/sequences). ### Mailbox (email account) [#mailbox-email-account] The address a campaign sends from: Gmail, Outlook or any mailbox with SMTP/IMAP. Connect as many as your plan allows. [Email accounts](/docs/engage/mailboxes/email-accounts). ### Warmup [#warmup] Sending and replying to a small number of friendly emails from a new mailbox for a few weeks, so mail providers trust it and your campaign emails land in the inbox. [Warmup](/docs/engage/mailboxes/warmup). ### Master Inbox [#master-inbox] One inbox with every reply to every campaign, from all your mailboxes. [Master Inbox](/docs/engage/master-inbox). ### List [#list] A saved group of people or companies, for campaigns and exports. You can also upload your own from a CSV. [Lists](/docs/leads/lists). ### Saved view [#saved-view] A set of filters on the leads table, saved so you can open it again in one click. [Saved views](/docs/leads/saved-filters). ### Tag [#tag] A label you put on leads to group them, filter by them or use them in automations. [Tag leads](/docs/leads/tags). ### Website ID and `{workspace}` [#website-id-and-workspace] Every website has a 24-character ID, used in the API and by AI assistants. In dashboard links, `{workspace}` stands for the website you currently have selected. [Authentication](/docs/authentication#website-ids). ### Master key and website key [#master-key-and-website-key] Your two kinds of API key. The master key reaches every website on the account plus billing; a website key reaches that one website only. [Authentication](/docs/authentication). ### MCP [#mcp] The open standard that lets an AI assistant (Claude, ChatGPT, Cursor) use Platform for you. You connect once, then ask in plain English. [Connect your AI assistant](/docs/mcp). ### Trial [#trial] A free period with a set number of leads. When it ends, new leads stop; your leads, scoring and automations stay. [Trials, offers and lifetime deal codes](/docs/account/trials-and-codes). # Introduction (/docs) Platform tells you **who** is visiting your website: the person (name, email, phone, LinkedIn) and their company, even when they never fill in a form. It then scores each visitor against your ideal customer, sends the good ones to your team, your CRM or Slack, and lets you email or message them, all from one dashboard. ## Start here: your first leads in five steps [#start-here-your-first-leads-in-five-steps] 1. **[Add your website](/docs/websites/websites)** in the dashboard. You get one tracking snippet per website. 2. **[Install the tracking pixel](/docs/websites/tracking-pixel)** with Google Tag Manager, the WordPress plugin or a line of HTML. Takes a few minutes; the dashboard confirms when it sees your site. 3. **[See your leads](/docs/leads/website-visitors/see-your-leads).** Identified visitors appear under **Leads → Website Visitors**, newest first. 4. **[Tell us who your ideal customer is](/docs/qualify)** so the best-fit leads rise to the top and the rest stay out of your way. 5. **[Act on them](/docs/automations):** post new leads to Slack, push them to your CRM, or [email them](/docs/engage) from your own mailboxes. No visitors yet? You can still [find new people to reach](/docs/leads/prospector/search-prospects/manual-search) in the Platform contact database. ## How these docs are organised [#how-these-docs-are-organised] Every feature has one page with three tabs, so you pick the way you work: | Tab | Use it when you… | | --- | --- | | **Guide** | work in the dashboard. Most pages include a live demo you can click through. | | **API** | build something with the REST API. Every endpoint has a playground you can run on sample data or your own account. | | **MCP** | ask an AI assistant (Claude, ChatGPT, Cursor) to do it for you. | New to the words we use (credits, ICP, pixel, sequence)? See the [glossary](/docs/glossary). ## Features [#features] ## For agencies, partners and developers [#for-agencies-partners-and-developers] ## 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). ## Still stuck? [#still-stuck] Use **Ask about this page** at the top of any page, or the chat bubble in the corner: it answers from these docs and from your own account. # 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. ### Common questions [#common-questions] **What does it cost?** 1 credit per person added. Each scout delivers 10, 25, 50 or 100 people a day, and the website has one daily limit across all its scouts (1 to 500), so several scouts never spend more than you set. **What is the minimum fit?** A score from 10 to 95 (70 by default) for how well a person matches your description. People under it are skipped and cost nothing. Lower it to get more people, raise it to get closer ones. **Why did my scout find nobody?** Open **See the plan & sources** on its chip: it shows where the scout reads and the latest people it picked, with why they fit. A very high minimum fit or a very narrow description leaves few matches; **Run now** in the ⋯ menu starts a run without waiting for the daily one, and new people appear within minutes. **Does pausing or deleting a scout remove its leads?** No. Pause stops new deliveries until you resume; delete stops the scout for good. The leads it delivered stay under Leads. **Can the people go straight into a campaign?** Yes: pick a campaign when you create the scout, and each new person is added to it. **Why do I not see AI Scout?** It is not included on lifetime-deal plans. ### 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 Create and manage AI Scouts from your own code: plan one for free, create it, run it now, pause it, and cap what all scouts may spend in a day. 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` with `perDay` (10, 25, 50 or 100) and `minFit` (10 to 95, default 70). The first run starts right away, 1 credit per person. ### Use case: Keep spend in check [#use-case-keep-spend-in-check] `PUT /v3/ai-scouts/daily-limit` with `{ "websiteId": …, "dailyLimit": 100 }` caps the leads per day across all scouts of the website (1 to 500); `perDay` caps each scout. The response tells you how many were used and are left today. ### 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. Your assistant plans the scout first (free), shows you the sources, and creates it when you agree; each person it delivers costs 1 credit. ### 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, "minFit": 70 } ``` ### Use case [#use-case-1] > Never spend more than 50 credits a day on scouts. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dailyLimit": 50 } ``` ### Use case [#use-case-2] > 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. ### Common questions [#common-questions] **Who can see my notes?** Everyone on your team, on that lead, signed with the name of whoever wrote them. Customers and visitors never see them. **Can I edit or delete a note?** Only the person who wrote it. The old text is not kept once edited. **Do notes go to my CRM?** No. Notes stay in Platform. From your own code you can read them with `GET /v3/leads/{leadId}/comments` and write them wherever you like ([API](/docs/leads/comments/api)). **Can my AI assistant or my phone system add notes?** Yes: a note can be added from your [AI assistant](/docs/leads/comments/mcp) or from code, for example "Called, follow up Friday" after a call. --- ## API — From your code Source: /docs/leads/comments/api Read and write the team notes on a lead from your own code. Each note has a `commentId`, its text, who wrote it and when. The `leadId` comes from `GET /v3/leads`. 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" }`. Every call adds a new note, signed with the user the API key belongs to. ### Use case: Correct or remove a note [#use-case-correct-or-remove-a-note] `PUT /v3/comments/{commentId}` with the new `content` replaces the text; `DELETE /v3/comments/{commentId}` removes it. Both work only for the user who wrote the note; anyone else gets `You do not have permission`. --- ## MCP — AI agents Source: /docs/leads/comments/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant finds the lead, reads the notes already there and adds yours, signed with your name. ### 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 > Look a company up from its domain: its profile from the API, and the people who work there from your AI assistant. 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 Enrichment turns a domain into what we know about the company. It is for your own tools and AI assistant rather than a dashboard screen: for example, to fill in the company behind each new sign-up. 1. **From code:** `GET /v3/enrich?domain=…` with your key returns the company profile: name, industry, sector, company type, founded year, country, employee range, estimated revenue and LinkedIn page. 2. **From your AI assistant:** `enrich_domain` returns the people we know at that domain, with their position, email and LinkedIn and whether they are a decision maker, scored against your scoring models. 3. **Try it:** the public demo page below looks up a domain without an account. ### Common questions [#common-questions] **What data does enrichment return?** The API returns the company profile (industry, size, revenue, location, LinkedIn). The AI assistant's `enrich_domain` returns the people at the company. For a free company profile with its technologies, ask your assistant to use `free_enrich_company` instead. **Does enrichment cost credits?** `enrich_domain` costs 1 credit the first time your account gets contacts for a domain; the same domain again is free, and nothing is charged when no people are found. `free_enrich_company` costs nothing (free tools share 10 calls a day per account). **Can I enrich a company from the dashboard?** There is no enrichment screen. For a company that visited you, open the lead: its Company card already has the profile, and your assistant can list the people there. [Lead details](/docs/leads/lead-details). **How do I find the decision makers at a company?** Ask your assistant: `enrich_domain` marks each person as a decision maker or not; `free_find_decision_makers` returns up to 5 senior people at a company for free. To search by job title, use [Prospector](/docs/leads/prospector/search-prospects/manual-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/company-enrichment/api Send a domain, get the company's profile: name, industry, sector, company type, founded year, country, employee range, estimated revenue and LinkedIn page. 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. Send the bare domain (`northwind-analytics.example`), not a full address or URL. --- ## MCP — AI agents Source: /docs/leads/company-enrichment/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. `enrich_domain` returns the people we know at a domain (name, position, email, LinkedIn, decision maker or not), 1 credit the first time per domain, so your assistant confirms with you before calling it. For the company's profile without credits it uses `free_enrich_company`. ### Use case [#use-case] > Who works at northwind-analytics.example, and who there decides? ```json { "domain": "northwind-analytics.example", "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` # 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. ### Common questions [#common-questions] **Where do I find my exports?** In the **CSV Exports** tab of Leads: each file with its size, status, when you asked for it and when it expires (30 days). **Download** it there, or use the link in the email. **Does exporting cost credits?** No lead credits. Each finished export uses one of your plan's CSV downloads; when none are left the export does not start. **How many exports can I do?** It depends on your plan's number of CSV downloads. [Plan, billing & credits](/docs/account/billing). **Why did my export fail?** Click **Retry** on the row. If it fails again, or your plan has no CSV downloads left, ask us in the chat. **Can I export only some leads?** The export is by source (step 2) and, from the API, by date range. For a hand-picked set, put the leads in a [list](/docs/leads/lists) and download the list. **Can I export a list instead?** Yes: open the list under **Lists** and click **Download 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/csv-export/api Queue a CSV export of a website's leads from your own code. The file is built in the background and emailed; the call itself does not return the file. 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` (matched on each lead's last visit). It answers `status: "queued"` with a `job` (id, stage, progress, rowCount, fileName, expiresAt); the download link is emailed to you and the file stays under **CSV Exports** for 30 days. Each finished export uses one of your plan's CSV downloads and fails when none are left. To read leads in your code instead, use `GET /v3/leads`. --- ## MCP — AI agents Source: /docs/leads/csv-export/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. The file is emailed to you and listed under **CSV Exports**; to read leads inside the conversation your assistant uses `get_leads` instead. ### 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) hides the lead; nothing is deleted. 2. **Block company / person** keeps them out of automations. 3. **Tick several → trash** deletes them together. ### Common questions [#common-questions] **Does removing a lead give the credit back?** No. The credit was used when the lead was identified, whether you hide or delete it. To get this cycle's credits back for leads that don't fit, raise the **Lead quality bar** on the Leads page and delete the leads under it; that refund can be undone for 5 days. [See your leads](/docs/leads/website-visitors/see-your-leads#common-questions). **Hide or delete?** Hiding takes a lead off the list but keeps its data, and can be undone. Deleting is permanent and, in addition, puts the lead's company on your website's **Exclude** list in [Qualify](/docs/qualify/exclusions), so no new leads from that company appear. Delete only companies you never want to see again. **Why does a company never show up any more after I deleted its lead?** Because deleting added it to the Exclude list. Remove the company's domain from the Exclude rules in Qualify and its visitors become leads again. **How do I stop automations for one company?** **⋮ → Block company from automations** (or **Block person from automations**): your automations (CRM pushes, Slack, webhooks, campaigns) skip them from then on. To stop a company from becoming a lead at all, use an [Exclude rule](/docs/qualify/exclusions) instead. **How do I get a hidden lead back?** Hidden leads are not shown in the table or the API. From your [AI assistant](/docs/leads/hide-delete/mcp) or the [API](/docs/leads/hide-delete/api), unhide it with `hide: false`. **How do I keep my own team out of my leads?** Add your company's domain as an [Exclude rule](/docs/qualify/exclusions): visitors from it are not identified and use no credits. --- ## API — From your code Source: /docs/leads/hide-delete/api Hide a lead (reversible) or delete leads for good from your own code. Neither gives the credit back. 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; it disappears from `GET /v3/leads` but keeps its data. `{ "hide": false }` brings it back. Hiding an already hidden lead answers `Lead is already hidden`. ### Use case: Delete leads for good [#use-case-delete-leads-for-good] `POST /v3/leads/delete` with `{ "leadIds": ["6530c1d2e3f4a5b6c7d8e9f2", "6530c1d2e3f4a5b6c7d8e9f5"] }` deletes several leads of one website. This cannot be undone, and the companies of the deleted leads are added to the website's Exclude list, so new leads from them stop appearing. The response's `deletedCount` says how many were deleted (leads outside your account are skipped). --- ## MCP — AI agents Source: /docs/leads/hide-delete/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant hides leads straight away and asks you to confirm before deleting, because deleting is permanent and blocks the company from becoming a lead again. ### Use case [#use-case] > Hide the leads from our own office. It finds them with `get_leads` (searching your domain), then for each one: ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "hide": true } ``` ### Use case [#use-case-1] > Bring back the lead I hid yesterday. ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "hide": false } ``` # Leads (/docs/leads) A lead is a person we identified for you, with their company, what they did and how well they fit your ideal customer. Leads come from five sources; all of them land in the same **Leads** table, where you filter, tag, export and act on them. ## Which source do I need? [#which-source-do-i-need] | You want to… | Use | Needs the pixel? | | --- | --- | --- | | know who is on your website right now | [Website visitors](/docs/leads/website-visitors/see-your-leads) | Yes | | find companies researching your topic before they visit you | [3rd-Party Intent](/docs/leads/intent-topics) | No | | find websites that mention a keyword or run a competitor's script | [Web Scraping](/docs/leads/web-scraping) | No | | search a contact database by title, industry, size and location | [Prospector](/docs/leads/prospector/search-prospects/manual-search) | No | | let AI find people who fit a description, every day | [AI Scout](/docs/leads/ai-scout) | No | Most customers start with website visitors: [install the pixel](/docs/websites/tracking-pixel) and the leads arrive on their own. ## Lead sources [#lead-sources] ## Organise and export [#organise-and-export] ## Working with a lead [#working-with-a-lead] ## Common questions [#common-questions] **Why do I see the company but not the person?** In the EU and the EEA, GDPR limits us to the company plus a suggested contact who fits your ICP. Everywhere else we show the exact person when we can match them. [Which countries get the exact person?](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person) **Why is a visitor I know about not in my leads?** Most likely they are not in our database; every tool has its own data. Also check that the pixel is on the page they visited ([Install the tracking pixel](/docs/websites/tracking-pixel)) and that no [Exclude rule](/docs/qualify/exclusions) keeps them out. **Does hiding or deleting a lead give the credit back?** No. A credit is used when the lead is identified. Hiding keeps the lead's data and is reversible; deleting is permanent. [Remove or block leads](/docs/leads/hide-delete). **Can I get leads without the pixel?** Yes: 3rd-Party Intent, Web Scraping, Prospector and AI Scout all work without it. # 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 3rd-party intent is research we see companies doing elsewhere on the web, not on your site. Pick topics like “CRM Software” or “Cybersecurity” and get the companies actively researching them, each day, with a daily limit you set. Each one matches your ICP and comes with a contact whose role fits the topic, ready for outreach that opens with what they're researching. 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. ### Daily limits and credits [#daily-limits-and-credits] - Each topic has its own daily limit: 20 by default, up to 5,000. Change it with **−5 / +5** in the topics list. - Each new company delivered uses 1 credit and runs your CRM pushes and automations. A company that is already a lead is merged into it, free. - Deliveries stop when your credits run out. **Pause** stops a topic without losing it; **Stop tracking** removes it. - Track a few topics that match what you sell rather than every related one: closer topics, better leads. ### No intent leads? [#no-intent-leads] - **No 3rd-Party Intent tab:** 3rd-Party Intent is included on every plan and on the trial (it is not part of lifetime-deal codes). If the tab is missing on your website, ask us in the chat and we switch it on. - **A topic delivers nothing:** check it isn't paused and you have credits left. Your [ICP exclusions](/docs/qualify/exclusions) and blocked countries and domains apply to intent leads too, so a narrow ICP can filter out every company. Very large companies are skipped. A topic also delivers only as many companies as are researching it that day, so a high limit is a cap, not a promise. - **No page visits on an intent lead:** expected. The company was researching the topic elsewhere, not on your site. ### Common questions [#common-questions] **Do intent leads come with a person to contact?** Yes, always: each company comes with a contact whose role fits the topic (for intent, **Only leads with contacts** is always on in the Lead quality panel). **Does pausing or stopping a topic delete its leads?** No. Pause keeps the topic and its counters and stops new deliveries; Stop tracking removes the topic. The leads it already delivered stay in your table either way. Note that **Delete topic** in the ⋯ menu acts at once, with no confirmation. **Where do I see which topic a lead came from?** Click a topic chip above the table to see only its companies. In the [lead's details](/docs/leads/lead-details), **Signal source** says whether the lead came from a website visit, a topic, or both. **Can I export intent leads?** Yes: in [CSV Exports](/docs/leads/csv-export), tick **Export from: 3rd-Party Intent**. ### Intent or website visitors? [#intent-or-website-visitors] | Use | When | |---|---| | [Website visitors](/docs/leads/website-visitors/see-your-leads) | You want people on your site right now, which pages they read, and who your ads sent. | | 3rd-party intent | Your traffic is small, or you run outbound and need new companies that haven't found you yet. | Use both: a company researching your topic that later visits your site is a much warmer lead, and it stays one lead row. ### 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 Browse the topic catalogue, follow a topic, change its daily limit, pause it or stop it from your own code. 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": "crm-software", "userDailyLimit": 20 }`. Calling it again for a topic you already follow updates the limit and resumes it if paused; nothing is duplicated. ### Use case: Pause over the holidays [#use-case-pause-over-the-holidays] `PATCH /admin/intent-topics` with `{ "websiteId": …, "topicSlug": …, "paused": true }`; send `"paused": false` to resume. Counters and leads are kept. `DELETE /admin/intent-topics` stops the topic for good (its leads stay). ### Use case: Is intent on for this website? [#use-case-is-intent-on-for-this-website] `GET /admin/intent-topics` returns `featureEnabled: false` and an empty list when intent is not switched on for the website, instead of an error. --- ## MCP — AI agents Source: /docs/leads/intent-topics/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant browses the topic catalogue, follows a topic with the daily limit you want, and pauses or stops it later. ### Use case [#use-case] > Which intent topics fit a company selling CRM add-ons? Track the best one, 20 companies a day. ```json {} ``` It reads the catalogue, suggests the closest topics, and once you pick one: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "topicSlug": "crm-software", "userDailyLimit": 20 } ``` ### Use case [#use-case-1] > Pause the CRM Software topic until next month. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "topicSlug": "crm-software", "paused": true } ``` # 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. ### Common questions [#common-questions] **What is the AI summary?** About 50 words on what this visitor did on your site, written from their company, country and the pages they viewed, ending with a verdict: **Ready to Buy**, **Research** or **Just Browsing**. It is written fresh each time, so the wording can change. **Exact Visitor or Suggested Contact?** **Exact Visitor** means the person in the card is the one who visited. **Suggested Contact** means we identified the company and are suggesting someone there who fits your ICP (the rule in the EU and the EEA). [Which countries get the exact person?](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person) **What is Signal source?** Where the lead came from: a visit to your website, an [intent topic](/docs/leads/intent-topics) they were researching elsewhere, or both. **The visitor is not the buyer. Who else works there?** Ask your AI assistant for the people at the lead's company, by department (for example Sales), with their title, seniority and LinkedIn; it is free. From code, `GET /v3/leads/{leadId}/company-people`. **How do I send a lead to my CRM?** Connect the CRM under [Automations](/docs/automations/crm/overview); the Contact and Company cards then show **Send to HubSpot / Pipedrive / Zoho / Salesforce** and, once sent, **Open in …**. Automations can do this for every new lead. **Where are notes and tags?** Both are on the card: **+ Add tag** and **Notes**. [Notes on leads](/docs/leads/comments) · [Tag leads](/docs/leads/tags). ### 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 Read one lead in full from your own code: the person, the company, every page visit, an AI summary, and the other people at their company. The `leadId` is the `_id` of a row from `GET /v3/leads`. Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Show the visit in your CRM [#use-case-show-the-visit-in-your-crm] `GET /v3/leads/{leadId}` returns `exactPerson` (name, emails, phone, position, LinkedIn, or `null` when only the company is known), `exactPersonType` (`Exact Visitor` or `Suggested Contact`), the company, `pageVisits[]` with time spent per page, and `summary` (total visits, last visit, referrer). ### Use case: Get the summary of one lead [#use-case-get-the-summary-of-one-lead] `GET /v3/leads/{leadId}/summary` returns `aISummary`: about 50 words on what they looked at, ending with `Ready to Buy`, `Research` or `Just Browsing`. It is generated on each call, so cache it if you show it often. ### Use case: Find the buyer at the company [#use-case-find-the-buyer-at-the-company] `GET /v3/leads/{leadId}/company-people?department=Sales Department` lists other people at the lead's company (name, title, department, seniority, LinkedIn), free. `PUT /v3/leads/{leadId}/notes` replaces the lead's notes text. --- ## MCP — AI agents Source: /docs/leads/lead-details/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant finds the lead with `get_leads`, then reads its full page history, summary and the people at the company. ### Use case [#use-case] > Tell me about the most recent lead from acme.example and what they looked at. ```json { "leadId": "6530c1d2e3f4a5b6c7d8e9f2" } ``` ### Use case [#use-case-1] > The visitor was a developer. Who in sales at that company should I contact? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "leadId": "6530c1d2e3f4a5b6c7d8e9f2", "department": "Sales Department", "limit": 10 } ``` # 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. ### Common questions [#common-questions] **What does uploading a CSV cost?** 1 lead credit per person whose email verifies. The upload dialog shows the cost before you confirm **Verify & add N people**. Map your columns (name, email, company…) first, then choose a new list or an existing one. **Contact list or company list?** A contact list holds people, a company list holds companies. Pick the kind when you create the list; a person cannot go into a company list. **Does deleting a list delete the people in it?** No. Deleting a list, or removing someone from it, leaves them in your account. **How do I get a list out?** Open it and click **Download CSV**, or **Download CSV** on its row. From the API the file is emailed to you. **Where do I rename a list?** **Rename list** on its row; press Enter to 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/leads/lists/api Create, read, rename, empty, delete and export your contact and company lists from your own code. Every call takes `listType`: `contact` for people, `company` for companies. 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. People are added to the list from the dashboard or a campaign. ### Use case: Tidy up [#use-case-tidy-up] `DELETE /admin/lists/{id}/items` removes people from a list (they stay in your account); `DELETE /admin/lists/{id}` deletes the list itself; `PUT /v3/lists/{listId}/name` renames it. --- ## MCP — AI agents Source: /docs/leads/lists/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant creates, reads, renames, exports and deletes your lists; it asks before deleting anything. ### Use case [#use-case] > Make a list called “Q4 founders”. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "listType": "contact", "name": "Q4 founders" } ``` ### Use case [#use-case-1] > Email me the “Q4 founders” list as a CSV. It finds the list's id with `list_lists`, then: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "listType": "contact", "listId": "6530c1d2e3f4a5b6c7d8e9f4" } ``` # 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 person from a Prospector search has no email, we can look for one: likely address patterns at their company are tried and each one is verified. It costs **50 credits** (popular) or **100** (deep), charged even when nothing is found. It is available from the [API](/docs/leads/prospector/find-email/api) and your [AI assistant](/docs/leads/prospector/find-email/mcp); there is no button for it in the dashboard. 1. **Search people** first ([Manual search](/docs/leads/prospector/search-prospects/manual-search/api)) to get the person's `profileId`. 2. **Try a reveal first:** when the row shows we hold an email or phone, revealing costs 1 credit. 3. **Only then find an email**, popular or deep. ### Common questions [#common-questions] **What does finding an email cost?** 50 credits for **popular**, 100 for **deep**. A reveal costs 1 credit when we already hold an email or phone, and nothing when we hold neither, so always reveal first. **What is the difference between popular and deep?** Popular tries the common address patterns at the company. Deep tries more patterns, so it finds more but costs twice as much. **Am I charged when no email is found?** Yes. Credits are charged whether or not an address is found, which is why the AI assistant confirms the cost with you first. **Can I find an email from the dashboard?** Not today. In the dashboard, Manual search adds only people whose email verifies (1 credit each). Find an email is for your own code and AI assistant. --- ## API — From your code Source: /docs/leads/prospector/find-email/api Look for a business email for one person from a Prospector search, when the reveal came back empty. 50 credits (popular) or 100 (deep), charged whether or not an address is found. 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 `status: "no-contact-details"` (no charge), call `POST /v3/prospector/people/find-email` with the same `websiteId` and `profileId`. Start with `"depth": "popular"` (50 credits); try `"deep"` (100 credits) only when popular found nothing. --- ## MCP — AI agents Source: /docs/leads/prospector/find-email/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant tries the 1-credit reveal first and confirms the 50 or 100 credits with you before looking for an address. ### 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 Platform 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 **Search database** in the dashboard looks up one company or person by name. From the [API](/docs/leads/prospector/search-companies/api) or your [AI assistant](/docs/leads/prospector/search-companies/mcp) you can also search companies by industry, size, revenue, location and technology to build target lists. 1. **Leads → Prospector → Search database.** 2. **People or Companies**, then type a name. Click a company row to see its people. 3. **Import** adds a person to your leads (1 credit when their email verifies). ### Common questions [#common-questions] **Does searching cost credits?** No. Searching is free; each search that returns results counts towards your plan's number of searches. Importing a person costs 1 credit. **How do I find companies using HubSpot?** Ask your AI assistant ("find software companies in the US that use HubSpot") or call the API with `"technologies": ["HubSpot"]`. The dashboard search is by name only. **Can I import a whole company?** You import people, not companies: open the company row and import the people you want. To work with companies as a group, put them in a company [list](/docs/leads/lists). **How is this different from Manual search?** Search database is for a name you already know. [Manual search](/docs/leads/prospector/search-prospects/manual-search) finds people you don't know yet, by job title, seniority, industry, location and company size. --- ## API — From your code Source: /docs/leads/prospector/search-companies/api Search the company database from your own code to build target lists. Searching costs no credits; each search that returns results counts towards your plan's number of searches. 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. Add `"locations": ["Europe"]` (countries or continents, the company's headquarters) and `"employeesMin": 50` to narrow it; `"keywords": "acme"` looks a company up by name or domain. ### Use case: Then find the people [#use-case-then-find-the-people] Rows come back with `industry`, `employees`, `country` and `revenueRange`. For the people at those companies, pass the domain to `POST /admin/prospector/people/search` ([Manual search](/docs/leads/prospector/search-prospects/manual-search/api)). --- ## MCP — AI agents Source: /docs/leads/prospector/search-companies/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Searching is free; your assistant can go on to find the people at those companies with `search_people`. ### 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 } } ``` ### Use case [#use-case-1] > Which European companies use HubSpot? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "query": { "technologies": ["HubSpot"], "locations": ["Europe"] } } ``` # 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. ### Common questions [#common-questions] **What do Must, High, Prefer and Bonus mean?** **Must** is required: a person without it is never delivered. **High**, **Prefer** and **Bonus** are not required; they raise a person's score, from a lot to a little, so the best matches come first. Too many Musts shrink the pool; check the **Pool size** as you add them. **Can I exclude companies or people I already have?** Yes. Under **Never include (hard rules)** add a company name, a domain or a person's name; they are left out whatever the preferences say. Use it for your customers, your own company and your competitors. **How many leads per day should I pick?** 25, 50, 100, 200 or 500; each one costs 1 credit, so pick what you can follow up and what your monthly credits allow. You can also set how many people per company you want. Change it any time under **Edit settings** in the chip's ⋯ menu. **Why did my Auto Search stop delivering?** Look at the chip's status: **done today** means it reached its daily number, **out of credits** means your account has none left (**Get more credits** fixes it), and a paused search shows as paused. A small pool can also run dry: widen the preferences. **Can I run it now instead of waiting?** Yes: **Run now** in the chip's ⋯ menu. **Duplicate (as paused)** makes a copy to try a different profile without touching the original. **Do the people come with emails?** Yes. Each person is verified before being added; you pay only for the ones delivered. ### 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-dash.revealid.xyz`, 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-dash.revealid.xyz/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 Platform 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). ### Common questions [#common-questions] **Do I need the tracking script to use Prospector?** No. Prospector searches a contact database of 209 million people; it has nothing to do with who visits your website. **Does searching cost credits?** No. Searching is free; each search counts towards your plan's number of searches. You pay 1 credit per person you add, and only when their email verifies. **Can I filter by state or city, not just country?** Location means the company's headquarters, by country or continent (for example "Germany" or "Europe"). State and city filters exist for your [website visitors](/docs/leads/website-visitors/filters), not for Prospector. **Why does a person I added have no email?** We add people only when their email verifies, so an added person always has one. If a search result shows no email or phone, [Find an email](/docs/leads/prospector/find-email) can look for one. **How do I add these people to a campaign?** Add them to Leads first, then open the lead and click **Add to campaign**, or put them in a [list](/docs/leads/lists) and use the list in your [email campaign](/docs/engage/email-campaigns). **How do I export them?** **Export to CSV** at the top of Leads, then tick **Export from: Prospector**. [CSV Exports](/docs/leads/csv-export). ### 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-dash.revealid.xyz`, 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-dash.revealid.xyz/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. Your views are in the **Saved views** menu at the top of the table (**All leads** is the view with no filters). ### Common questions [#common-questions] **Can an automation use a saved view?** Yes. When you create an [automation](/docs/automations/automations), pick a saved view as its segment and it runs only for leads that match, for example "ICP score 80%+ from Google Ads" to Slack. **Does a saved view keep the date range?** No. A view saves the filters only, so it applies to whatever period you pick. **What happens to an automation when I delete its view?** The automation switches to **All leads** and runs for every new lead. Check your automations before deleting a view they use. **Can I give a view the same name twice?** Yes, and you get two views. Rename or delete the old one first. --- ## API — From your code Source: /docs/leads/saved-filters/api List, create, mark and delete saved views from your own code. A view is a name plus a query string of the same filter parameters `GET /v3/leads` takes. 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 its `url` (the filters as a query string). ### Use case: Save a view [#use-case-save-a-view] `POST /admin/filters` with `{ "websiteId": …, "name": "US software visitors", "url": "?visitorLocation=US&industries=Software&tag=HOT" }`. Date and page parameters are dropped before saving, so the view applies to any period. Saving the same name twice creates two views. ### Use case: Delete a view an automation uses [#use-case-delete-a-view-an-automation-uses] `DELETE /admin/filters/{id}` also switches any automation that used the view as its segment to all leads; check your automations first. --- ## MCP — AI agents Source: /docs/leads/saved-filters/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant lists your views, saves a new one from the filters you describe, and asks before deleting one. ### Use case [#use-case] > Show me my saved views. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` ### Use case [#use-case-1] > Save a view of US visitors from software companies tagged HOT. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "name": "US software visitors", "url": "?visitorLocation=US&industries=Software&tag=HOT" } ``` # 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 A session recording is a replay of one visit to your website, page by page, as the lead saw it. When recordings are on, 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. ### Common questions [#common-questions] **Why is there no recording for a lead?** Recordings exist only for visits made while recording was switched on for that website, so earlier visits have none. The player also reaches only the website's 100 most recent recordings. And recordings come from your website, so leads from 3rd-Party Intent, Web Scraping, Prospector or AI Scout never have one. **How do I turn recordings on or off?** In your website's settings (or ask your [AI assistant](/docs/leads/session-recordings/mcp)). Off means no new recordings are made; the existing ones stay until they expire. **Are session recordings included in my plan?** Yes on every monthly and annual plan, at no extra cost; on a trial they are on from the start. On lifetime-deal plans they are a paid add-on ($9 a month) you switch on from Billing. **Can I share a recording?** A playback link from the [API](/docs/leads/session-recordings/api) works for 5 minutes, so open or forward it right away and request a new one later. **Does a recording show who the person is?** The replay shows what was done on the page; the person's name and contact details are on the lead itself. A recording is attached to a lead through the lead's email. ### 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 List a lead's recordings, get a link to watch one, and switch recording on or off for a website from your own code. 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, newest first (up to 100), each with `session_id`, `client_id`, when it started and ended, its length and page count. `GET /v3/recordings/{sessionId}/url?clientId=…` returns a link to watch one; the link expires after 5 minutes, so request it when someone clicks rather than storing it. Pass `clientId` instead of `email` to list a whole website's recordings; the `clientId` is in your website's details (`GET /admin/websites`, see [Websites](/docs/websites/websites/api)). ### Use case: Switch recording on [#use-case-switch-recording-on] `PUT /v3/websites/{websiteId}/session-recording` with `{ "enabled": true }`. With `false`, no new recordings are made and the existing ones stay until they expire. --- ## MCP — AI agents Source: /docs/leads/session-recordings/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant lists a lead's recordings, hands you a link to watch one (valid for 5 minutes), and can switch recording on or off for a website. ### Use case [#use-case] > What did ava.thompson@northwind-analytics.example look at on our site? ```json { "email": "ava.thompson@northwind-analytics.example" } ``` Then, for the one you want to watch, it takes `session_id` and `client_id` from that list: ```json { "sessionId": "9f2c7a1e4b8d4c3a", "clientId": "a1b2c3d4e5f60718" } ``` ### Use case [#use-case-1] > Start recording visits on our website. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "enabled": true } ``` # 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. ### Common questions [#common-questions] **Can automations use tags?** Yes. An [automation](/docs/automations/automations) can start when a tag is added to a lead, so tagging someone "Hot" can push them to your CRM, Slack, a webhook or an email campaign. A tag added from the API or your AI assistant starts those automations too. **Why is my tag in capital letters?** Tag names are stored in capitals ("Hot account" becomes "HOT ACCOUNT") and must be unique on the website. **How do I filter leads by tag?** **+ Filter → CRM, lists & tags**, or pick the tag in a [saved view](/docs/leads/saved-filters). **How do I remove a tag from one lead?** Click the tag in the row, or the × next to it in the lead's details. The tag stays available for other leads. **Does deleting a tag delete the leads?** No. Deleting a tag removes it from every lead that had it; the leads stay. Renaming or recolouring a tag changes it everywhere. **Are there built-in tags?** Yes, a few default tags come with every website, next to the ones you create. ### 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 Create tags and add them to or remove them from leads from your own code. 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` (`{ "websiteId": …, "name": "Hot account", "color": "#059669" }`; the name is stored as `HOT ACCOUNT`), then `POST /v3/leads/{leadId}/tags/{tagId}` for each lead. Adding a tag starts the website's automations that trigger on a tag being added. A lead that already has the tag answers `Tag Id already exist`. ### Use case: Find tagged leads [#use-case-find-tagged-leads] `GET /v3/leads?tag=HOT ACCOUNT` filters by the tag's name, as `GET /v3/tags` lists it. --- ## MCP — AI agents Source: /docs/leads/tags/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant finds the leads, reuses an existing tag or creates one, and tags each lead. ### Use case [#use-case] > Tag every lead from acme.example as “Hot”. It finds the leads with `get_leads` (searching "acme.example"), looks the tag up with `list_tags` or creates it, then for each lead: ```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. ### Common questions [#common-questions] **What does it cost?** 1 credit per company added, up to the daily limit you set (10 to 500 a day in the dashboard). Looking for keywords and reading the suggestions is free. **Exact or Fuzzy?** Exact adds a company only when the keyword appears as you typed it. Fuzzy also accepts close variations of it. Start with Exact for a domain such as a competitor's tracker, and Fuzzy for a phrase people word differently. **Which keywords bring leads?** Each keyword chip shows its leads; keywords with nothing in the last 7 days are grouped under **+N with no matches**. Pause the silent ones from the ⋯ menu and try a suggestion instead. **Where do the suggestions come from?** They are phrases your buyers would write about themselves on their own websites, never your own category words. **↻ Refresh suggestions** asks for new ones; nothing is saved until you add one. **Can I only get companies where you found a person?** Yes: switch on **Web scraping: Only leads with contacts** in the Lead quality panel on the Leads page. **Why do I not see Web Scraping?** It is not included on lifetime-deal plans. ### 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 Read your Web Scraping keywords and their results, change them, or ask for keyword ideas from your own code. 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, so `GET /v3/web-scraping` first and add to what it returns. `dailyLimit` is 1 to 500 leads a day (1 credit each); `contactsOnly: true` adds only companies where a person was found. ### 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 with `"paused": true` on that keyword in the next `PUT`. ### Use case: Keyword ideas [#use-case-keyword-ideas] `POST /v3/web-scraping/keyword-suggestions` returns phrases your buyers would write about themselves; `regenerate: true` asks for new ones. Nothing is saved until you `PUT` them. --- ## MCP — AI agents Source: /docs/leads/web-scraping/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant reads your current keywords first, so adding one never wipes the others, and asks you before anything that spends credits. ### 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", "paused": false } ], "dailyLimit": 50, "contactsOnly": true } ``` ### 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. ### Common questions [#common-questions] **Why does another Leads tab show different columns?** Each tab has its own set. Pick the tab under **Apply to** at the top of the columns dialog before you tick columns. **Do my columns change what goes into a CSV export?** No. The export has its own field picker, remembered separately. [CSV Exports](/docs/leads/csv-export). **I can't find a column.** Use **Search columns** in the dialog: it finds a field by name across every group. # 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). ### Common questions [#common-questions] **How do I find my best leads?** Click an **ICP score** chip: 70%+, 80%+, 90%+ or a custom range. The score is how well the lead fits your [scoring models](/docs/qualify/scoring-models); you can also filter on one model's score under **Scoring & qualification**. **How do I see only leads from my ads?** Click a **Traffic** chip: Google Ads, Meta Ads or LinkedIn Ads. For a specific campaign, source or medium, use the **Campaign attribution** filters. **Can I filter by state or city?** Yes. Under **Location**, filter the visitor's country, state or city, or the company's headquarters (a different thing: a visitor in Texas can work for a company based in London). **How do I see only leads with a phone number, or only exact people?** Under **People & contacts**: filter on how the visitor was identified (exact visitor or suggested contact) and on having a phone number. **Why did my filters disappear?** Filters are chips on the table you are looking at, not a setting. To come back to the same set in one click, [save it as a view](/docs/leads/saved-filters) and make it your default. **Where are the leads from before this month?** The period filters on each lead's **last** visit. Widen the date range (up to **All the Time**) to see older leads. --- ## API — From your code Source: /docs/leads/website-visitors/filters/api Every filter of the Leads table is a query parameter of `GET /v3/leads`; the location endpoints give you the country, state and city names the filters expect. Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)). ### Use case: Decision makers from Germany [#use-case-decision-makers-from-germany] `visitorLocation=DE` (two-letter country code), `employeesMin=50` and `exactVisitor=true` over the month: people at mid-size German companies, not just their company. For a state, add `visitorLocationState=Bavaria`. ### Use case: Who came from your Google Ads [#use-case-who-came-from-your-google-ads] `utmSource=[["contains","google"]]` (and `utmMedium=[["contains","cpc"]]`) with the period you want. UTM and page filters are a JSON list of `[operator, value]` pairs, URL-encoded; the operators are `contains`, `not-contains`, `starts-with` and `ends-with`. A plain string makes the call fail. ### Use case: Who looked at pricing [#use-case-who-looked-at-pricing] `pageVisited=[["contains","pricing"]]`. Combine with `visits_lower_bound=2` for people who came back. ### Use case: One industry, one tag [#use-case-one-industry-one-tag] `industries=Software` matches part of the industry name (one value, not a list); `tag=HOT` filters by a tag's name, as `GET /v3/tags` lists it. --- ## MCP — AI agents Source: /docs/leads/website-visitors/filters/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant turns the question into the right filters; `search_locations` gives it the exact country, state and city names. ### Use case [#use-case] > Who from software companies with 50+ people visited our pricing page this week? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-24", "dateTo": "2026-10-30", "industries": "Software", "employeesMin": 50, "pageVisited": "[[\"contains\",\"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": "[[\"contains\",\"google\"]]" } ``` ### Use case [#use-case-2] > Which Californian visitors came back more than once? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-01", "dateTo": "2026-10-30", "visitorLocation": "US", "visitorLocationState": "California", "visits_lower_bound": 2 } ``` # 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). ### Which countries get the exact person? [#which-countries-get-the-exact-person] We identify visitors in 223 countries and territories, and the company in every one of them. Whether we also name the exact person (name, email, phone, LinkedIn) depends on the country: | Exact person | Where | |---|---| | **Yes** | United States, Canada, Mexico, Australia, New Zealand, Hong Kong, Switzerland, Bahrain, Oman, Puerto Rico, Guam, US Virgin Islands, Northern Mariana Islands, American Samoa | | **Partly** | 160 more countries, the UK included: people who opted in through our partner network, so coverage grows as the network grows | | **No** | The EU, the EEA and their territories (49): GDPR limits us to the company, plus a suggested contact there who fits your [ICP](/docs/qualify/icp). There is no setting to change this. | Hover a country to see its coverage, pick a level to filter, or search for one: Coverage is strongest in the USA, Europe and Australia, then Asia. Match rates depend on your audience and traffic sources, so the reliable way to know yours is to install the pixel and watch your own leads. ### Common questions [#common-questions] **Why do I see a company but no person?** In the EU and the EEA we show the company plus a suggested contact who fits your ICP (see above). Everywhere else we show the exact person when we can match them. The [lead's details](/docs/leads/lead-details) say which one it is: **Exact Visitor** or **Suggested Contact**. To keep only leads with a person to contact, switch on **Only leads with contacts** in the Lead quality panel. **Why is a visitor I know about not in my leads?** Most likely they are not in our database; every tool has its own data. Also check that the [pixel](/docs/websites/tracking-pixel) is on the page they visited and your website shows as verified, that no [Exclude rule](/docs/qualify/exclusions) keeps them out, and that you have leads left (the **Leads left** popup at the top). **Does hiding or deleting a lead give the credit back?** No: a credit is used when the lead is identified. To get this cycle's credits back for leads you don't want, raise the Lead quality bar and delete the leads under it; you have 5 days to undo. [Remove or block leads](/docs/leads/hide-delete). **How fresh are my leads?** The table (and the API) can be up to 60 seconds behind; there is nothing to refresh by hand. Leads are listed newest first, and the period you pick filters on each lead's **last** visit, so someone who came back yesterday shows under yesterday. **What is the Lead quality bar?** The minimum ICP fit a lead needs to be added. Leads under the bar are not added and use no credits. Set one bar for every source or one per source (website visitors, 3rd-party intent, Web Scraping, Prospector, AI Scout); the highest bar is 80 (20 on lifetime-deal plans). Scores come from your [scoring models](/docs/qualify/scoring-models). **What does Leads left mean?** Your remaining credits for this billing cycle, how many you use a day and when they run out. From there you can see your credit history or switch on auto top-up on a paid plan. [Plan, billing & credits](/docs/account/billing). ### Spotted wrong data? [#spotted-wrong-data] Use the **Rate our Data Quality** bar at the bottom of Leads: pick a face from 1 to 5 and, in **Tell Us More**, say what was wrong (a wrong company, an old job title, a bounced email). **Dismiss** hides the bar. For one specific lead, use **Feedback → Report a bug** and name the lead. ### 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 List your website visitors from your own code, and read or change the Lead quality bar. 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=DE` (the two-letter country code) and the month as `dateFrom`/`dateTo`. Results come 50 a page, newest first; pass `page` for more. When `paginationCapped` is true, narrow the dates or filters to reach every lead. Hidden leads are never listed. ### Use case: Only add leads that fit [#use-case-only-add-leads-that-fit] `PUT /v3/websites/{websiteId}/lead-quality` with `{ "minScore": 70, "contactsOnly": true }`: leads scoring under 70, or without a person to contact, are not added and use no credits. `POST …/lead-quality/purge` removes the leads already in the table that fall under the bar; `…/undo-purge` brings them back. --- ## MCP — AI agents Source: /docs/leads/website-visitors/see-your-leads/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. Your assistant lists your website visitors for you, and can read or change the Lead quality bar. ### 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": "DE", "pageVisited": "[[\"contains\",\"pricing\"]]" } ``` ### Use case [#use-case-1] > Only keep leads that score 70 or more and have someone to contact. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "minScore": 70, "contactsOnly": true } ``` # Errors and troubleshooting (/docs/mcp/errors) There are two kinds of problem: - **Connection problems:** the assistant can’t reach Platform 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 Platform tools | The connector isn’t added, it’s switched off for this chat, or the chat started before you added it | Add it ([Quickstart](/docs/mcp#quickstart)), enable it in the chat’s connector menu, then start a **new** chat | | It asks you to sign in to Platform | Your connection URL has no `?token=…` part, so the assistant uses OAuth: this is expected once. Sign in with your dashboard email and password (10 failed attempts in 15 minutes lock sign-in for 15 minutes) | Sign in, or paste the full connection URL with `?token=…` from **Integrations → MCP Server** so no sign-in is needed | | It asks you to sign in **although** you pasted a URL with `?token=…`, or reports `401 unauthorized` (*Bearer token required…*) | The key in the URL is wrong: cut short when pasting, or rotated since you copied it | Copy the whole connection URL again from **Integrations → MCP Server** and replace the old one in your assistant | | “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.revealid.xyz` | ## 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, such as `list_websites` or `get_account` | Tell you the account owner needs to do it, or connect with the owner’s URL | | It returns another website’s data, or ignores the website you named | A team member’s URL reaches one website only: any `websiteId` the assistant sends is replaced by that website’s id, without an error | Connect with the account owner’s URL, or copy a URL while the right website is open. See [What each connection can reach](/docs/mcp/security#what-each-connection-can-reach) | | “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” (403) | The plan doesn’t include that feature | Stop and tell you; the fix is a plan change, not a retry | | “You exceed the limits” (429) | On a search: the plan’s search limit is used up, or the call came less than a second after the previous search (a refused call is not counted) | Wait a second and retry once; if the plan limit is used up, stop and tell you | | “Free tools: 10 calls a day per account, resets 00:00 UTC.” (429), or `emailStatus` “daily free limit reached — resets 00:00 UTC” | The [free tools](/docs/mcp/free-tools) share 10 calls and 10 verified business emails per account per day | Wait for 00:00 UTC, or use the paid tools such as `search_people` | | “You have reached your limit.” / “You have no credit.” (400), “Insufficient credits” (402), “You cannot add more websites, please upgrade” (401) | A plan limit or the credit balance is used up | Stop and tell you; `get_account` shows what is left. The fix is more credits or a plan change | | Payment required, with an upgrade link (402) | The tool needs an add-on, e.g. `verify_contact` needs Email Waterfall | Show you the link; don’t retry | | `503 provider_unavailable`, or “Free tools are unavailable right now, please retry.” | The data source behind that tool was busy (`search_companies`, `search_domain_availability`, the free tools) | Retry once after a minute; nothing was charged | | 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. Treat `503` as temporary: one retry after a pause. - The server validates every input. The tool descriptions say which lookup tool provides each ID (`list_websites` → `websiteId`, `search_people` → `profileId`). - A missing or bad key is an HTTP `401` with a `WWW-Authenticate` header pointing at `/.well-known/oauth-protected-resource`, so OAuth-capable clients start sign-in by themselves. # free_companies_using_tech (/docs/mcp/free-tools/free-companies-using-tech) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `tech` | `string` | Yes | any | Technology name, e.g. HubSpot, Salesforce, Shopify, Stripe. Partial match, case-insensitive. | | `industry` | `string` | No | any | Optional industry filter (partial, case-insensitive), e.g. SaaS, Financial Services. | | `country` | `string` | No | any | Optional headquarters country: ISO code (US, GB, DE) or country name. | | `employeesMin` | `number` | No | any | Optional minimum employee count (compared with the lower end of the company's headcount range). | | `employeesMax` | `number` | No | any | Optional maximum employee count (compared with the upper end of the company's headcount range). | | `limit` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `domain` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `domain` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/company-enrichment](/docs/leads/company-enrichment) - [/docs/leads/company-enrichment/mcp](/docs/leads/company-enrichment/mcp) # free_find_decision_makers (/docs/mcp/free-tools/free-find-decision-makers) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `domain` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/company-enrichment](/docs/leads/company-enrichment) # free_find_lookalikes (/docs/mcp/free-tools/free-find-lookalikes) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `domain` | `string` | Yes | any | Domain of the company to find lookalikes for, e.g. acme.example. | | `limit` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `topic` | `string` | Yes | any | 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 | any | Optional contact country: ISO code (US, GB, DE) or country name. | | `industry` | `string` | No | any | Optional industry of the contact's company (partial, case-insensitive), e.g. software, financial services, SaaS / Software. | | `limit` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `role` | `string` | Yes | any | Job title or part of it (case-insensitive), e.g. "VP of Sales", "Head of Marketing", "CTO". | | `domain` | `string` | No | any | Optional company domain to search within, e.g. acme.example. When set, industry and country are ignored. | | `industry` | `string` | No | any | Optional industry of the person's company (partial match), e.g. SaaS, FinTech. Used only without domain. | | `country` | `string` | No | any | Optional company headquarters country: ISO code (US, GB) or name. Used only without domain; an unrecognised value is ignored. | | `limit` | `number` | No | any | 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 Platform account your assistant gets a set of tools at no cost, free forever with a small daily limit: **10 calls and 10 verified business emails per account per day**, reset at 00:00 UTC, on every plan. Connect the [MCP server](/docs/mcp#quickstart) with your free account to use them. ## Common questions [#common-questions] **Do they use my credits?** No. The free tools never use credits, on any plan. **What counts against the daily limit?** Every call to a `free_` tool counts as one of the 10 calls. The 10 verified business emails are shared across `free_find_decision_makers`, `free_people_search` and `free_intent_signals`; past that, a person is still returned with the address masked and `emailStatus` *daily free limit reached — resets 00:00 UTC*. **What happens when I reach it?** The call is refused with *Free tools: 10 calls a day per account, resets 00:00 UTC* until midnight UTC. For more, use the paid tools, for example [`search_people`](/docs/mcp/tools/search-people) and `reveal_contact` (1 credit per person). See [Errors and troubleshooting](/docs/mcp/errors#tool-errors). **Do they stop when my trial ends?** No. They stay free on every plan, after the trial too. Only the paid tools follow your plan, credits and websites. **Do they need a website?** No. The free tools take a company domain, a technology or a role, not a `websiteId`, so they work before any tracking script is installed. # Connect your AI assistant (/docs/mcp) ## Quickstart [#quickstart] You need a Platform account (a [free account](https://app.revealid.xyz/signup?utm_source=docs&utm_medium=mcp) is enough) and an AI assistant that supports MCP connectors: Claude (web, desktop and mobile), ChatGPT, Claude Code, Cursor, VS Code with Copilot, Perplexity or any other remote MCP client. ### 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. The first time, it may ask you to allow the tool: that is your assistant’s own approval step, so allow it. If it says it has no Platform tools, asks you to sign in or reports an error, 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 Platform account, including after your trial ends, so all you need is a [free account](https://app.revealid.xyz/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 Platform tools and their descriptions. 2. It picks the tool that fits and fills in its parameters from your words. 3. Platform 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). ## Common questions [#common-questions] **Do I need a paid plan?** No. A free account gets the [free tools](/docs/mcp/free-tools) (10 calls and 10 verified business emails a day). Every other tool works within your plan, credits and websites, exactly as the dashboard does. **Which assistants work?** Claude on the web, Claude Desktop and the Claude mobile app (the connector syncs), ChatGPT, Claude Code, Cursor, VS Code with Copilot, Perplexity and any assistant that supports remote MCP servers. Pick yours under [Add it to your assistant](#2-add-it-to-your-assistant). **Can it spend my credits?** Only through tools labelled *Spends credits or money*, for example `reveal_contact` (1 credit per person). Turn on tool approval in your assistant to confirm each one; see [Security and permissions](/docs/mcp/security#what-tools-can-do). **Can I limit it to one website?** Yes: connect with a team member’s connection URL, which reaches only the website that was open when it was copied and refuses account and billing tools. See [What each connection can reach](/docs/mcp/security#what-each-connection-can-reach). **It asks for a websiteId. Where do I find it?** Ask “List my websites.” The assistant calls `list_websites` and uses the id itself; you never type it. More in [Website IDs](/docs/authentication#website-ids). **How do I disconnect it?** Remove the Platform connector in your assistant’s settings. If a connection URL leaked, rotate the key: [Disconnect or replace a key](/docs/mcp/security#disconnect-or-replace-a-key). ## 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 Platform 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | campaignId from list_campaigns. | | `subject` | `string` | Yes | any | Subject line; merge fields like \{\{ first_name \| there \}\} allowed. | | `body` | `string` | Yes | any | Email body as plain text, one paragraph per line, ending with \{\{sender_signature\}\} and \{\{unsubscribe_text\}\}. | | `delayDays` | `number` | No | min 0 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `email` | `string` | Yes | any | The mailbox's from-address, e.g. jane@acme.example. | | `fullName` | `string` | Yes | any | 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 | any | SMTP login username, usually the same as email. | | `smtpHost` | `string` | Yes | any | SMTP server host name, e.g. smtp.example.com. | | `smtpPort` | `number` | Yes | any | SMTP port, e.g. 465 (TLS) or 587. | | `smtpTLS` | `boolean` | No | any | Use TLS for SMTP. Default true. | | `imapEmail` | `string` | Yes | any | IMAP login username, usually the same as email. | | `imapHost` | `string` | Yes | any | IMAP server host name, e.g. imap.example.com. | | `imapPort` | `number` | Yes | any | IMAP port, usually 993. | | `imapTLS` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | Lead id (the _id of a row returned by get_leads). | | `content` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `keyword` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `url` | `string` | Yes | any | The LinkedIn post URL. | | `isOwn` | `boolean` | No | any | 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 platform-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) 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id from list_websites to attach the domain to. | | `domain` | `string` | Yes | any | Domain name to pick, e.g. getacme.example. | | `replacePicked` | `boolean` | No | any | 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." }, "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" ] } } ``` # add_prospect_to_campaign (/docs/mcp/tools/add-prospect-to-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `campaignId` | `string` | Yes | any | Email campaign id from list_campaigns or create_campaign. | | `email` | `string` | Yes | any | The contact's email address. Must be a valid address. | | `domain` | `string` | No | any | Optional company domain of the contact, e.g. acme.example. Used for company merge fields and exclusion checks. | | `firstName` | `string` | No | any | Optional first name, used by \{\{ first_name \}\}. | | `lastName` | `string` | No | any | Optional last name. | | `position` | `string` | No | any | Optional job title, used by \{\{ position \}\}. | | `phone` | `string` | No | any | Optional phone number. | | `scheduledFor` | `string` | No | any | 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 | any | 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 | `valid`, `catch-all`, `risky` | 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 | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `csv` | `string` | Yes | any | Name of the new group, e.g. "internal" or "customers". Must not already exist on this website. | | `domains` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emails` | `string[]` | Yes | any | The email addresses to block. | | `group` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `name` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `description` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/qualify/ai-assist](/docs/qualify/ai-assist) # archive_email (/docs/mcp/tools/archive-email) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `emailId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `domain` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `email` | `string` | No | any | Their email. | | `linkedinUrl` | `string` | No | any | Their LinkedIn profile URL. | | `name` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `description` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `reason` | `string` | Yes | [7 values](#accepted-values) | 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` | Yes | 3–2000 characters | Why they are cancelling, in the customer's own words: at least 3 characters (10 when reason is 'other'), at most 2000. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `reason` [#reason] `bugs` · `expensive` · `no_value` · `bad_icp` · `switching` · `no_need` · `other` ## 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", "enum": [ "bugs", "expensive", "no_value", "bad_icp", "switching", "no_need", "other" ], "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", "minLength": 3, "maxLength": 2000, "description": "Why they are cancelling, in the customer's own words: at least 3 characters (10 when reason is 'other'), at most 2000." } }, "required": [ "reason", "feedback" ] } } ``` # change_prospects_mailbox (/docs/mcp/tools/change-prospects-mailbox) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `prospectIds` | `string[]` | Yes | any | Prospect IDs from get_prospects. | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/optimize/blog-articles](/docs/optimize/blog-articles) # clone_campaign (/docs/mcp/tools/clone-campaign) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `name` | `string` | No | any | Optional. A short name; made from the description when left out. | | `description` | `string` | Yes | any | Who to find, in a sentence or two: roles, industries, company size, where they talk (podcasts, YouTube, review sites). | | `perDay` | `number` | No | `10`, `25`, `50`, `100` | People per day to deliver: 10, 25, 50 or 100. | | `minFit` | `number` | No | 10–95 | Minimum fit score (10-95, default 70): people below it are skipped. | | `sources` | `object[]` | No | any | 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` | `string` | Yes | `google`, `youtube_search`, `youtube_playlist`, `youtube_creators`, `g2_category` | google, youtube_search, youtube_playlist, youtube_creators or g2_category. | | `sources[].ref` | `string` | Yes | any | The search words, the playlist or channel link, or the G2 category link. | | `sources[].label` | `string` | No | any | Optional. How the source is shown in the dashboard. | | `sources[].active` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `name` | `string` | Yes | any | A short name, e.g. 'US SaaS founders'. | | `description` | `string` | No | any | Optional. The plain-English description it was built from. | | `prefs` | `object[]` | Yes | any | 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` | `string` | Yes | [10 values](#accepted-values) | 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 | any | The values that match, e.g. ["CEO", "Founder"] for job or ["United States"] for hq. | | `prefs[].weight` | `string` | No | `Must`, `High`, `Prefer`, `Bonus` | Must (required), High, Prefer or Bonus (raise the score). Default Prefer. | | `excludes` | `object[]` | No | any | Optional. Companies or people to leave out: field cname (company name), domain or pname (person name), values. | | `excludes[].field` | `string` | Yes | `cname`, `domain`, `pname` | cname (company name), domain (company domain) or pname (person name). | | `excludes[].values` | `string[]` | Yes | any | The names or domains to leave out. | | `perDay` | `number` | No | `25`, `50`, `100`, `200`, `500` | Leads per day: 25, 50, 100, 200 or 500. Default 100. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `prefs[].field` [#prefsfield] `job` · `seniority` · `department` · `industry` · `emp` · `revenue` · `funding` · `round` · `tech` · `hq` ## 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `name` | `string` | Yes | any | Name shown in the automation list. | | `trigger` | `object` | Yes | any | The rule and the action settings; each key below has a default. | | `trigger.when` | `string` | No | [7 values](#accepted-values) | What starts it (default new-lead-is-identified). | | `trigger.then` | `string` | No | [16 values](#accepted-values) | The action: where matching leads go. Without it, send-to-slack, or send-to-emailCampaign when actions has a campaign. | | `trigger.trigger` | `string` | No | `only-on-first-visit`, `on-every-visit`, `none` | only-on-first-visit (default), on-every-visit or none. | | `trigger.interval` | `string` | No | `immediately`, `after-session`, `daily`, `weekly`, `monthly` | immediately (default), after-session, daily, weekly or monthly. | | `trigger.repeatWindowHours` | `integer` | No | [7 values](#accepted-values) | Act at most once per company or person in this many hours (12, 24, 72, 168, 720, 2160 or 4320); leave out for no limit. | | `trigger.dedupeScope` | `string` | No | `contact`, `company` | What counts as the same for the repeat limit: contact (default) or company. | | `trigger.contactSelectionStrategy` | `string` | No | `flexible-job-titles`, `exact-job-titles`, `flexible-find-at-least-one-job-titles` | How contacts are matched to your job titles: flexible-job-titles (default), exact-job-titles or flexible-find-at-least-one-job-titles. | | `trigger.maxContactsToSend` | `integer` | No | min 1 | Most contacts sent per company (default 1). | | `trigger.filter` | `string` | No | any | A saved filter id from list_filters; only leads matching it. | | `trigger.emailVerification` | `object` | No | any | Which emails count: allowOnlyValidEmails, allowCatchAllEmails, allowGuessedEmails, allowWithoutEmails (true/false). | | `trigger.actions` | `object` | No | any | The action settings, e.g. \{ sentToSlack: \{ sendMessagesTo: '#leads' \} \} or \{ sentToWebhook: \{ url \} \}. HubSpot: \{ sentToHubspot: \{ assignContactsTo, createDeal: true, pipelineId, dealStageId, dealAmount \} \} also creates a deal per lead (pipeline and stage ids from list_crm_pipelines); without createDeal only the contact and its company are created. | | `actions` | `object[]` | No | any | 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. | | `actions[].emailCampaign` | `string` | No | any | A campaign id from list_campaigns. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `trigger.when` [#triggerwhen] `new-lead-is-identified` · `new-intent-data-triggered` · `new-prospector-lead` · `new-web-scraping-signal` · `new-scout-lead` · `new-linkedin-engagement` · `new-tag-added-to-lead` ### `trigger.then` [#triggerthen] `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` · `send-to-googleAdsCampaign` · `send-to-linkedinAdsAudience` · `send-to-metaAdsAudience` ### `trigger.repeatWindowHours` [#triggerrepeatwindowhours] `12` · `24` · `72` · `168` · `720` · `2160` · `4320` ## 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", "properties": { "when": { "type": "string", "enum": [ "new-lead-is-identified", "new-intent-data-triggered", "new-prospector-lead", "new-web-scraping-signal", "new-scout-lead", "new-linkedin-engagement", "new-tag-added-to-lead" ], "description": "What starts it (default new-lead-is-identified)." }, "then": { "type": "string", "enum": [ "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", "send-to-googleAdsCampaign", "send-to-linkedinAdsAudience", "send-to-metaAdsAudience" ], "description": "The action: where matching leads go. Without it, send-to-slack, or send-to-emailCampaign when actions has a campaign." }, "trigger": { "type": "string", "enum": [ "only-on-first-visit", "on-every-visit", "none" ], "description": "only-on-first-visit (default), on-every-visit or none." }, "interval": { "type": "string", "enum": [ "immediately", "after-session", "daily", "weekly", "monthly" ], "description": "immediately (default), after-session, daily, weekly or monthly." }, "repeatWindowHours": { "type": "integer", "enum": [ 12, 24, 72, 168, 720, 2160, 4320 ], "description": "Act at most once per company or person in this many hours (12, 24, 72, 168, 720, 2160 or 4320); leave out for no limit." }, "dedupeScope": { "type": "string", "enum": [ "contact", "company" ], "description": "What counts as the same for the repeat limit: contact (default) or company." }, "contactSelectionStrategy": { "type": "string", "enum": [ "flexible-job-titles", "exact-job-titles", "flexible-find-at-least-one-job-titles" ], "description": "How contacts are matched to your job titles: flexible-job-titles (default), exact-job-titles or flexible-find-at-least-one-job-titles." }, "maxContactsToSend": { "type": "integer", "minimum": 1, "description": "Most contacts sent per company (default 1)." }, "filter": { "type": "string", "description": "A saved filter id from list_filters; only leads matching it." }, "emailVerification": { "type": "object", "description": "Which emails count: allowOnlyValidEmails, allowCatchAllEmails, allowGuessedEmails, allowWithoutEmails (true/false)." }, "actions": { "type": "object", "description": "The action settings, e.g. { sentToSlack: { sendMessagesTo: '#leads' } } or { sentToWebhook: { url } }. HubSpot: { sentToHubspot: { assignContactsTo, createDeal: true, pipelineId, dealStageId, dealAmount } } also creates a deal per lead (pipeline and stage ids from list_crm_pipelines); without createDeal only the contact and its company are created." } }, "description": "The rule and the action settings; each key below has a default." }, "actions": { "type": "array", "items": { "type": "object", "properties": { "emailCampaign": { "type": "string", "description": "A campaign id from list_campaigns." } } }, "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" ] } } ``` # create_blog_article (/docs/mcp/tools/create-blog-article) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `title` | `string` | Yes | any | Article title (H1). Required. | | `html` | `string` | Yes | any | Article body as HTML. Supported: p, h2, h3, ul/ol, blockquote, img, table. Required. | | `metaDescription` | `string` | No | any | Search-result description, about 150–160 characters. | | `excerpt` | `string` | No | any | Short summary for the blog index. Defaults to the meta description. | | `category` | `string` | No | any | Category name. Default 'Guides'. | | `coverImage` | `string` | No | any | Absolute cover image URL starting with http(s)://; other values are dropped. | | `slug` | `string` | No | any | URL path segment, e.g. "lead-scoring-guide". Defaults to the title. A number is added if the slug is already taken. | | `status` | `string` | No | `live`, `draft` | 'live' (default) publishes now; 'draft' saves without publishing. | | `faq` | `object[]` | No | any | FAQ entries shown under the article. Entries missing q or a are dropped. | | `faq[].q` | `string` | No | any | Question text. | | `faq[].a` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | any | Campaign name shown in the app. | | `emailAccountId` | `string` | Yes | any | 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 | any | 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 | any | Subject line. Merge fields need a fallback, e.g. Quick idea for \{\{ company_name \| your team \}\}. | | `steps[].body` | `string` | Yes | any | Plain text, one paragraph per line, no blank lines, ending with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\} on their own lines. | | `steps[].delayDays` | `number` | No | any | Whole days to wait after the previous step. 0 for the first step. Default 0. | | `settings` | `object` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. Required by the tool schema; the saved record is not linked to it. | | `firstName` | `string` | Yes | any | Person's first name. Required. | | `lastName` | `string` | Yes | any | Person's last name. Required. | | `position` | `string` | Yes | any | Job title, e.g. "Head of Marketing". Required. | | `domain` | `string` | No | any | Company domain without protocol, e.g. "acme.example". Without it verify_contact cannot guess an address. | | `businessEmail` | `string` | No | any | Work email. Saved on the contact; verify_contact checks it. | | `personalEmail` | `string` | No | any | Personal email, used only when businessEmail is not given. | | `linkedinUrl` | `string` | No | any | LinkedIn profile URL. Accepted but not stored. | | `phone` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | any | Name shown for the saved view, e.g. "US SaaS visitors". | | `url` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | any | Model name, unique on the website, e.g. "Enterprise SaaS". | | `active` | `boolean` | No | any | true (default) to score leads with it straight away, false to save it switched off. | | `criteria` | `object` | No | any | 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 | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact for lists of people, company for lists of companies. | | `name` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `name` | `string` | Yes | any | Tag name, e.g. "Hot account" (saved as "HOT ACCOUNT"). | | `color` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `scoutId` | `string` | Yes | any | 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 platform-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', 404 'No automation found', or 405 when automationId is not an automation id. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `automationId` | `string` | Yes | any | 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", "pattern": "^[0-9a-fA-F]{24}$", "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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | campaignId from list_campaigns. | | `templateId` | `string` | Yes | any | _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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `campaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `filterId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `topicSlug` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `commentId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `modelId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadIds` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `keywordId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | any | _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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `tagId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `campaignId` | `string` | Yes | any | Campaign ID from list_campaigns. | | `dismissDays` | `number` | No | 1–90 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leads` | `integer` | Yes | 1–1000000 | Leads per month of the plan to switch to at the next billing date: a whole number from 1 to 1,000,000. | | `annual` | `boolean` | No | any | 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": "integer", "minimum": 1, "maximum": 1000000, "description": "Leads per month of the plan to switch to at the next billing date: a whole number from 1 to 1,000,000." }, "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" ] } } ``` ## Used in [#used-in] - [/docs/account/billing/mcp](/docs/account/billing/mcp) # enrich_domain (/docs/mcp/tools/enrich-domain) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `domain` | `string` | Yes | any | Company domain, e.g. "acme.example" (a full URL is reduced to its domain). | | `websiteId` | `string` | No | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/company-enrichment](/docs/leads/company-enrichment) - [/docs/leads/company-enrichment/mcp](/docs/leads/company-enrichment/mcp) # export_leads_csv (/docs/mcp/tools/export-leads-csv) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `dateFrom` | `string` | Yes | any | Start of the range (last visit date). Accepts YYYY-MM-DD, MM/DD/YYYY, ISO 8601 or epoch milliseconds. | | `dateTo` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | any | _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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the same one used for search_people). | | `profileId` | `string` | Yes | any | profileId from a search_people row. | | `depth` | `string` | No | `popular`, `deep` | '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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `campaignId` | `string` | Yes | any | 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 platform-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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `scoutId` | `string` | Yes | any | 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 platform-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 at your plan's price per lead, up to a monthly cap in USD. Returns eligible (true only on an active, unpaused paid subscription with a card on file; false on a trial or lifetime plan), enabled, packLeads, capUsd and minCapUsd (the lowest cap allowed: your plan price), perLeadCents and packPriceCents, spentThisCycleCents and refreshOn (when the cycle restarts), lowThreshold (credits left when it buys), recent (the last 10 top-ups), extraLeads (bought leads still unused; they roll over) and monthlyLeadsLeft. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Optional, kept for older callers: auto top-up is set per account, so the result is the same for every website. | ## 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": "Optional, kept for older callers: auto top-up is set per account, so the result is the same for every website." } } } } ``` # get_automation_runs (/docs/mcp/tools/get-automation-runs) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `automationId` | `string` | Yes | any | Automation ID from list_automations. | | `limit` | `number` | No | 1–200 | Runs to return (1-200). | | `skip` | `number` | No | min 0 | 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", "pattern": "^[0-9a-fA-F]{24}$", "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 platform-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 Last 7 days (UTC) for every automation of a website, keyed by automation id, each with its name and isActive: runs7d (leads it ran on), delivered7d (sent), failed7d (failed attempts), failedLeads7d (leads whose latest attempt still failed; retries that worked drop out), lastRunAt (last run within 90 days) and series (one row per day). Runs that are neither delivered nor failed were skipped by the automation's filters. Paused automations count nothing. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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, plus draft (true = unfinished, never runs) and errorMessage (why the last run failed, null when fine). 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `automationId` | `string` | Yes | any | 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", "pattern": "^[0-9a-fA-F]{24}$", "description": "Automation _id from list_automations (24 hex characters)." } }, "required": [ "automationId" ] } } ``` ## Used in [#used-in] - [/docs/automations/automations/mcp](/docs/automations/automations/mcp) # get_billing (/docs/mcp/tools/get-billing) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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. Billing is per account, so websiteId is optional and does not change the result. Prefer get_subscription. Needs an account-level key. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Optional, kept for older callers: the result always 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": "Optional, kept for older callers: the result always covers the whole account." } } } } ``` # get_blog_article (/docs/mcp/tools/get-blog-article) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `articleId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `campaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `leadId` | `string` | Yes | any | Lead ID from get_leads. | | `department` | `string` | No | any | Only this department, e.g. Sales Department. | | `page` | `number` | No | min 1 | Page of results, from 1. | | `limit` | `number` | No | 1–100 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/qualify/exclusions/mcp](/docs/qualify/exclusions/mcp) # get_credit_history (/docs/mcp/tools/get-credit-history) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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, INTENT_SIGNALS, WEB_SCRAPING, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, ADJUSTMENT, OTHER), a reason and createdAt. Returns \{ count, hasMore, logs \}. Filter by date range, website, source, operation or lead domain to answer 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `page` | `integer` | No | min 1 · default 1 | Page number, a whole number from 1 (default 1). Use hasMore in the result to know if there is a next page. | | `limit` | `integer` | No | 1–500 · default 100 | Rows per page, a whole number from 1 to 500 (default 100). | | `from` | `string` | No | date | Earliest date, ISO (2026-10-01; a time may follow). Default: 90 days ago. | | `to` | `string` | No | date | Latest date, ISO (2026-10-31; a time may follow). Default: now. | | `websiteId` | `string` | No | any | Only this website's rows (from list_websites). Leave out for the whole account. | | `source` | `string` | No | [9 values](#accepted-values) | Only one source category: WEBSITE_VISITOR, INTENT_SIGNALS, WEB_SCRAPING, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, ADJUSTMENT or OTHER. | | `operation` | `string` | No | `CHARGE`, `REFUND`, `DUPLICATE_PREVENTED` | Only CHARGE (credit used), REFUND (credit given back) or DUPLICATE_PREVENTED (a repeat that cost nothing). | | `domain` | `string` | No | any | Only rows for leads from this company domain, e.g. acme.com. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `source` [#source] `WEBSITE_VISITOR` · `INTENT_SIGNALS` · `WEB_SCRAPING` · `PROSPECTOR` · `ENRICHMENT` · `EMAIL_VERIFICATION` · `CONTACT_UNLOCK` · `ADJUSTMENT` · `OTHER` ## 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": "integer", "minimum": 1, "default": 1, "description": "Page number, a whole number from 1 (default 1). Use hasMore in the result to know if there is a next page." }, "limit": { "type": "integer", "minimum": 1, "maximum": 500, "default": 100, "description": "Rows per page, a whole number from 1 to 500 (default 100)." }, "from": { "type": "string", "format": "date", "description": "Earliest date, ISO (2026-10-01; a time may follow). Default: 90 days ago." }, "to": { "type": "string", "format": "date", "description": "Latest date, ISO (2026-10-31; a time may follow). Default: now." }, "websiteId": { "type": "string", "description": "Only this website's rows (from list_websites). Leave out for the whole account." }, "source": { "type": "string", "enum": [ "WEBSITE_VISITOR", "INTENT_SIGNALS", "WEB_SCRAPING", "PROSPECTOR", "ENRICHMENT", "EMAIL_VERIFICATION", "CONTACT_UNLOCK", "ADJUSTMENT", "OTHER" ], "description": "Only one source category: WEBSITE_VISITOR, INTENT_SIGNALS, WEB_SCRAPING, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, ADJUSTMENT or OTHER." }, "operation": { "type": "string", "enum": [ "CHARGE", "REFUND", "DUPLICATE_PREVENTED" ], "description": "Only CHARGE (credit used), REFUND (credit given back) or DUPLICATE_PREVENTED (a repeat that cost nothing)." }, "domain": { "type": "string", "description": "Only rows for leads from this company domain, e.g. acme.com." } } } } ``` # get_credit_summary (/docs/mcp/tools/get-credit-summary) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 (byDay: charges, refunds and duplicates prevented per date, UTC), with the plan limit, what is left and leads bought. For single credit events use get_credit_history. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `cycle` | `integer` | No | 0–5 · default 0 | Which billing cycle: 0 = the current one (default), 1 = the one before, up to 5 (the last six cycles are kept; none before the account was created). The answer's cycles list shows each one's dates. | ## 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": "integer", "minimum": 0, "maximum": 5, "default": 0, "description": "Which billing cycle: 0 = the current one (default), 1 = the one before, up to 5 (the last six cycles are kept; none before the account was created). The answer's cycles list shows each one's dates." } }, "required": [ "websiteId" ] } } ``` # get_crm_mappings (/docs/mcp/tools/get-crm-mappings) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `crm` | `string` | Yes | `hubspot`, `salesforce`, `pipedrive`, `zoho`, `gohighlevel` | The CRM. | | `objectType` | `string` | No | `contact`, `company` | 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" ] } } ``` ## Used in [#used-in] - [/docs/automations/crm/overview/mcp](/docs/automations/crm/overview/mcp) # get_domain_blacklist (/docs/mcp/tools/get-domain-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `campaignId` | `string` | Yes | any | Campaign ID from list_campaigns. | | `templateId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `emailId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/engage/master-inbox/mcp](/docs/engage/master-inbox/mcp) # get_google_ads_audience (/docs/mcp/tools/get-google-ads-audience) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `audienceId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id from list_websites. | | `status` | `string` | No | any | 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 | any | Page number, starting at 1. Default 1. | | `limit` | `number` | No | any | Prospects per page. Default 20. | | `searchQuery` | `string` | No | any | 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 platform-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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `clientId` | `string` | No | any | The website's clientId (16-32 characters) from get_website or get_tracking_pixel. | | `email` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `modelId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `dateFrom` | `string` | Yes | any | 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 | any | End of the range (inclusive, whole day). Same formats as dateFrom. | | `page` | `number` | No | any | Page number, 1-based, 50 leads per page. Default 1; pages beyond 100 return page 100. | | `domain` | `string` | No | any | Free-text search across company name and domain, person names and emails, e.g. "acme.example" or "Jane Smith". | | `industries` | `string` | No | any | One industry to match (case-insensitive, partial match), e.g. "Software". A single value, not a list. | | `sectors` | `string` | No | any | One company sector to match (case-insensitive, partial match). | | `visitorLocation` | `string` | No | any | Visitor country as a two-letter ISO code, e.g. "US", "GB" (case-insensitive). | | `visitorLocationState` | `string` | No | any | Visitor state/region, e.g. "California". When set without visitorLocation, results are limited to US visitors. | | `tag` | `string` | No | any | 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 | any | Minimum number of visits (sessions). Default 0. | | `visits_upper_bound` | `number` | No | any | Maximum number of visits (sessions). Leave it out to include every lead, however many visits. | | `employeesMin` | `number` | No | any | Smallest company headcount to include, e.g. 10. | | `employeesMax` | `number` | No | any | Largest company headcount to include, e.g. 200. | | `tech` | `string` | No | any | Technology the company uses, case-insensitive partial match, e.g. "HubSpot", or a JSON array string of several: '["HubSpot","Shopify"]'. | | `exactVisitor` | `boolean` | No | any | 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 | any | 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 | any | JSON array string of [operator, value] pairs, e.g. '[["contains","cpc"]]'. Same operators as utmSource. | | `pageVisited` | `string` | No | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/automations/run-history/mcp](/docs/automations/run-history/mcp) - [/docs/leads/csv-export/mcp](/docs/leads/csv-export/mcp) - [/docs/leads/hide-delete/mcp](/docs/leads/hide-delete/mcp) - [/docs/leads/lead-details/mcp](/docs/leads/lead-details/mcp) - [/docs/leads/tags/mcp](/docs/leads/tags/mcp) # get_linkedin_campaign_timeline (/docs/mcp/tools/get-linkedin-campaign-timeline) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | any | LinkedIn campaign ID from list_linkedin_campaigns. | | `days` | `number` | No | 1–90 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | any | LinkedIn campaign ID from list_linkedin_campaigns. | | `status` | `string` | No | any | Only people with this status. | | `page` | `number` | No | min 1 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | any | _id from list_lists. | | `page` | `number` | No | min 1 | Page of items, starting at 1. | | `limit` | `number` | No | min 1 | 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 platform-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 platform-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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `campaignId` | `string` | No | any | Optional email campaign id from list_campaigns. Limits the list to that campaign. | | `page` | `number` | No | any | Page number, starting at 1. Default 1. | | `status` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `sessionId` | `string` | Yes | any | Recording id (session_id from get_lead_recordings), 16-64 characters. | | `clientId` | `string` | Yes | any | 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 platform-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: template (null = the default is used), defaultTemplate and mergeFields (every field a template may use). Merge fields are written \{\{lead.company.name\}\}, \{\{lead.person.firstName\}\} and so on. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/websites/websites/mcp](/docs/websites/websites/mcp) # get_warmup_health (/docs/mcp/tools/get-warmup-health) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | _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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `dateFrom` | `string` | No | any | 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 | any | 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 platform-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: [...] \}, newest first, 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (24-character ID). | ## 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)." } }, "required": [ "websiteId" ] } } ``` # get_website_daily_stats (/docs/mcp/tools/get-website-daily-stats) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `dateFrom` | `string` | No | any | 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 | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/websites/tracking-pixel](/docs/websites/tracking-pixel) - [/docs/websites/tracking-pixel/mcp](/docs/websites/tracking-pixel/mcp) # get_website (/docs/mcp/tools/get-website) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | Lead id (the _id of a row returned by get_leads). | | `hide` | `boolean` | No | any | 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. **232 tools**: 100 read-only, 101 that change data, 31 that delete or overwrite data, 44 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 (byDay: charges, refunds and duplicates prevented per date, UTC), with the plan limit, what is left and leads bought. | Read-only | | [`list_billing_domains`](/docs/mcp/tools/list-billing-domains) | The account's sending domains with their billing: price and renewalPrice (USD a year), expiresAt (renewal date), autoRenew and cancelAtPeriodEnd, setupCompleted and activeDate. | Read-only | | [`list_open_invoices`](/docs/mcp/tools/list-open-invoices) | The account invoices that are still unpaid (open or past due): amount, currency, due date, what it is for, the payment status, the PDF link and hosted (the page where it can be paid); at most 5, newest first; plus the next upcoming invoice (amount and the date the period ends), or null on a cancelled or lifetime plan. | Read-only | | [`list_invoices`](/docs/mcp/tools/list-invoices) | The account's invoices, newest first: date, amount, refunded amount, currency, status (paid, open, void, uncollectible, refunded, partially_refunded), description (what it was for), a link to the PDF and hosted (the invoice's web page, where an open one can be paid). | 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 at your plan's price per lead, 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, INTENT_SIGNALS, WEB_SCRAPING, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, 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, allWebsites, websites (website ids, empty when allWebsites is true) and whether their invite is still pending (invitePending). | 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 gets an invitation email to set a password (emailed: false when invite emails are off, then they copy the join link from the Team page). | Changes data | | [`update_member`](/docs/mcp/tools/update-member) | Changes a member's role, permissions or websites and returns the member as list_members does. | Changes data | | [`remove_member`](/docs/mcp/tools/remove-member) | Removes a person from the account: they lose access straight away, their website access is removed and the invitation is given back. | 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: template (null = the default is used), defaultTemplate and mergeFields (every field a template may use). | 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 (Slack formatting: *bold*, _italic_). | Changes data | | [`send_slack_test_message`](/docs/mcp/tools/send-slack-test-message) | Posts a sample lead message (marked [Test Notification]) 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 (days, default 7, at most 90) that match a saved filter, before you use it in an automation. | Read-only | | [`get_automation_stats`](/docs/mcp/tools/get-automation-stats) | Last 7 days (UTC) for every automation of a website, keyed by automation id, each with its name and isActive: runs7d (leads it ran on), delivered7d (sent), failed7d (failed attempts), failedLeads7d (leads whose latest attempt still failed; retries that worked drop out), lastRunAt (last run within 90 days) and series (one row per day). | 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 (archived ones left out), to pick one for a Slack automation: id, name, isPrivate, isMember (the app is in it) and members. | 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, plus draft (true = unfinished, never runs) and errorMessage (why the last run failed, null when fine). | 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 | | [`list_crm_pipelines`](/docs/mcp/tools/list-crm-pipelines) | Lists the deal pipelines of a connected CRM and the stages in each. | 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 | | [`set_website_billing_mode`](/docs/mcp/tools/set-website-billing-mode) | For websites you run for your own clients: start a trial until a date (its leads go to 0 when it ends), switch to paid (the leads refill to the website's limit every month on refreshOn, then the date moves on a month) or stop the monthly refill when a client cancels. | 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 platform-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 gets an invitation email to set a password (emailed: false when invite emails are off, then they copy the join link from the Team page). Returns the new members under team (userId, preset, websites) for update_member. One invitation is used per person; a batch larger than the invitations left is refused. 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `invites` | `object[]` | Yes | any | One entry per person to invite. | | `invites[].email` | `string` | Yes | any | Their email address. An invitation email is sent to it. | | `invites[].role` | `string` | No | `Owner`, `Member` | Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner. | | `invites[].preset` | `string` | No | `full`, `sales`, `developer`, `viewer`, `team`, `client` | Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog). | | `invites[].permissions` | `string[]` | No | [21 values](#accepted-values) | Exact permission ids, from get_permissions_catalog. Overrides the preset. | | `invites[].allWebsites` | `boolean` | No | any | true: access to every current and future website. | | `invites[].websites` | `string[]` | No | any | Website ids the member can see, when allWebsites is false. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `invites[].permissions` [#invitespermissions] `pixel` · `add_website` · `website` · `delete_website` · `integrations` · `leads_view` · `leads_export` · `qualify` · `campaigns` · `buy_mailboxes` · `connect_mailboxes` · `warmup` · `inbox` · `optimize_seo` · `optimize_google_ads` · `optimize_meta_ads` · `optimize_linkedin_ads` · `team` · `api_keys` · `billing` · `whitelabel` ## 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", "enum": [ "pixel", "add_website", "website", "delete_website", "integrations", "leads_view", "leads_export", "qualify", "campaigns", "buy_mailboxes", "connect_mailboxes", "warmup", "inbox", "optimize_seo", "optimize_google_ads", "optimize_meta_ads", "optimize_linkedin_ads", "team", "api_keys", "billing", "whitelabel" ] }, "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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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, draft, errorMessage, when (the trigger event), then (the action), trigger, interval and the settings of the action it uses (get_automation returns all of them). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/automations/run-history/mcp](/docs/automations/run-history/mcp) # list_billing_domains (/docs/mcp/tools/list-billing-domains) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 account's sending domains with their billing: price and renewalPrice (USD a year), expiresAt (renewal date), autoRenew and cancelAtPeriodEnd, setupCompleted and activeDate. source says how the domain came in: bundle (the outreach bundle), premium (bought on its own through the extras checkout) or imported (the customer's own domain: it renews at their registrar and is never billed here). isPremium is separate: true when the registration price is above $14. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Optional, kept for older callers: billed domains belong to the account, so the list is the same for every website. | ## 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": "Optional, kept for older callers: billed domains belong to the account, so the list is the same for every website." } } } } ``` # list_blog_articles (/docs/mcp/tools/list-blog-articles) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Website id (24 hex characters) from list_websites. Required by the server. | | `page` | `number` | No | any | 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 platform-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: [\{ id, name, email \}] \} — use id as ownerId. 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `crm` | `string` | Yes | `hubspot`, `pipedrive`, `salesforce`, `zoho`, `gohighlevel` | One of: hubspot, pipedrive, salesforce, zoho, gohighlevel. | | `websiteId` | `string` | Yes | any | 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", "enum": [ "hubspot", "pipedrive", "salesforce", "zoho", "gohighlevel" ], "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" ] } } ``` ## Used in [#used-in] - [/docs/automations/crm/gohighlevel/mcp](/docs/automations/crm/gohighlevel/mcp) - [/docs/automations/crm/hubspot/mcp](/docs/automations/crm/hubspot/mcp) # list_crm_pipelines (/docs/mcp/tools/list-crm-pipelines) {/* Generated by scripts/sync-mcp-tools.mjs from platform-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/list_crm_pipelines.mdx. */} **List CRM deal pipelines** · Read-only · Acts outside your account Lists the deal pipelines of a connected CRM and the stages in each. Use it to get the pipelineId and dealStageId that create_automation or update_automation need for a HubSpot automation that also creates deals (\{ sentToHubspot: \{ createDeal: true, pipelineId, dealStageId \} \}). Reads from the CRM and changes nothing. Returns \{ data \}: the CRM's pipelines with their id and stages (each stage has an id). Errors: the CRM is not connected for this website, 401 or 403 when the CRM connection must be reconnected to allow deals. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `crm` | `string` | Yes | `hubspot`, `gohighlevel` | One of: hubspot, gohighlevel. | | `websiteId` | `string` | Yes | any | 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_pipelines", "title": "List CRM deal pipelines", "annotations": { "title": "List CRM deal pipelines", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true }, "inputSchema": { "type": "object", "properties": { "crm": { "type": "string", "enum": [ "hubspot", "gohighlevel" ], "description": "One of: hubspot, gohighlevel." }, "websiteId": { "type": "string", "description": "Website ID from list_websites; the CRM must be connected on this website." } }, "required": [ "crm", "websiteId" ] } } ``` ## Used in [#used-in] - [/docs/automations/crm/gohighlevel/mcp](/docs/automations/crm/gohighlevel/mcp) - [/docs/automations/crm/hubspot/mcp](/docs/automations/crm/hubspot/mcp) # list_crm_variables (/docs/mcp/tools/list-crm-variables) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/automations/crm/overview/mcp](/docs/automations/crm/overview/mcp) # list_domains (/docs/mcp/tools/list-domains) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `email` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/automations/automations/mcp](/docs/automations/automations/mcp) # list_google_ads_audiences (/docs/mcp/tools/list-google-ads-audiences) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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, refunded amount, currency, status (paid, open, void, uncollectible, refunded, partially_refunded), description (what it was for), a link to the PDF and hosted (the invoice's web page, where an open one can be paid). Paged: when hasMore is true, pass nextCursor as startingAfter. Account owners and billing admins only. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Optional, kept for older callers: invoices belong to the account, so the list is the same for every website. | | `limit` | `integer` | No | 1–50 · default 10 | Invoices per page, a whole number from 1 to 50 (default 10). | | `startingAfter` | `string` | No | any | For the next page: the nextCursor from the previous answer. Leave empty for the newest invoices. | ## 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": "Optional, kept for older callers: invoices belong to the account, so the list is the same for every website." }, "limit": { "type": "integer", "minimum": 1, "maximum": 50, "default": 10, "description": "Invoices per page, a whole number from 1 to 50 (default 10)." }, "startingAfter": { "type": "string", "description": "For the next page: the nextCursor from the previous answer. Leave empty for the newest invoices." } } } } ``` # list_lead_scoring_models (/docs/mcp/tools/list-lead-scoring-models) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `page` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact for lists of people, company for lists of companies. | | `page` | `number` | No | min 1 | Page number, starting at 1. | | `limit` | `number` | No | min 1 | 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/lists/mcp](/docs/leads/lists/mcp) # list_members (/docs/mcp/tools/list-members) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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, allWebsites, websites (website ids, empty when allWebsites is true) and whether their invite is still pending (invitePending). status is false until they set a password. 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": {} } } ``` ## Used in [#used-in] - [/docs/account/team/mcp](/docs/account/team/mcp) # list_open_invoices (/docs/mcp/tools/list-open-invoices) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 unpaid (open or past due): amount, currency, due date, what it is for, the payment status, the PDF link and hosted (the page where it can be paid); at most 5, newest first; plus the next upcoming invoice (amount and the date the period ends), or null on a cancelled or lifetime plan. Free. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Optional, kept for older callers: invoices belong to the account, so the list is the same for every website. | ## 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": "Optional, kept for older callers: invoices belong to the account, so the list is the same for every website." } } } } ``` # list_outreach_domains (/docs/mcp/tools/list-outreach-domains) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 (archived ones left out), to pick one for a Slack automation: id, name, isPrivate, isMember (the app is in it) and members. The app can post to any public channel, member or not; a private channel only appears here once someone invites the app to it (/invite in Slack). Returns an error when Slack is not connected. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/tags/mcp](/docs/leads/tags/mcp) # list_websites (/docs/mcp/tools/list-websites) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `page` | `number` | No | any | Page number, starting at 1 (default 1). | | `limit` | `number` | No | any | Websites per page (default 50, max 100). | | `search` | `string` | No | any | 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." } } } } ``` ## Used in [#used-in] - [/docs/websites/tracking-pixel/mcp](/docs/websites/tracking-pixel/mcp) # pause_ai_scout (/docs/mcp/tools/pause-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `scoutId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `autoSearchId` | `string` | Yes | any | _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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `months` | `integer` | Yes | `1`, `2`, `3`, `4`, `5`, `6` | 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": "integer", "enum": [ 1, 2, 3, 4, 5, 6 ], "description": "Number of months to pause, 1 to 6." } }, "required": [ "months" ] } } ``` ## Used in [#used-in] - [/docs/account/billing/mcp](/docs/account/billing/mcp) # plan_ai_scout (/docs/mcp/tools/plan-ai-scout) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `description` | `string` | Yes | any | 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 platform-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 (days, default 7, at most 90) that match a saved filter, before you use it in an automation. Answers total7d (all leads in the window) and matched7d (leads the filter lets through) — both cover windowDays despite the names — plus up to 8 samples (name, domain, industry, employees, country, score) and the top 4 industries with their share among the first 50 matching leads. Takes a few seconds. 404 when the filter does not exist. Free. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `filterId` | `string` | Yes | any | Saved filter ID from list_filters. | | `days` | `number` | No | 1–90 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leads` | `integer` | Yes | 1–1000000 | Leads per month of the new plan: a whole number from 1 to 1,000,000. Below 300 is priced as 300. | | `annual` | `boolean` | No | any | 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": "integer", "minimum": 1, "maximum": 1000000, "description": "Leads per month of the new plan: a whole number from 1 to 1,000,000. Below 300 is priced as 300." }, "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" ] } } ``` ## Used in [#used-in] - [/docs/engage/mailboxes/domains/mcp](/docs/engage/mailboxes/domains/mcp) # purchase_outreach_domains (/docs/mcp/tools/purchase-outreach-domains) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id from list_websites whose picked domains are bought. | | `domains` | `any[]` | Yes | any | 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 | any | Id of the saved payment card to charge. Required unless a coupon makes the order free. | | `emailSenderInfo` | `object` | No | any | Sender details for the new mailboxes: \{ firstName, lastName, jobTitle \}, all three required. | | `couponCode` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | No | any | Lead _id from get_leads (optional). Supplies the person's details and links the CRM record to the lead. | | `crm` | `string` | Yes | `hubspot`, `pipedrive`, `salesforce`, `zoho`, `gohighlevel` | One of: hubspot, pipedrive, salesforce, zoho, gohighlevel. | | `websiteId` | `string` | Yes | any | Website ID from list_websites; the CRM must be connected on this website. | | `ownerId` | `string` | No | any | CRM user id to assign the contact to, from list_crm_owners. Required for hubspot, zoho and pipedrive. | | `contactData` | `object` | Yes | any | 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", "enum": [ "hubspot", "pipedrive", "salesforce", "zoho", "gohighlevel" ], "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 platform-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; when nothing was paused or set to cancel it changes nothing and returns changed: false with a message. | 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": {} } } ``` ## Used in [#used-in] - [/docs/account/billing/mcp](/docs/account/billing/mcp) # recalculate_lead_scores (/docs/mcp/tools/recalculate-lead-scores) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id (24 hex characters) from list_websites. | | `leadIds` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `csv` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `group` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact for lists of people, company for lists of companies. | | `listId` | `string` | Yes | any | _id from list_lists. | | `itemIds` | `string[]` | Yes | any | 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 platform-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, their website access is removed and the invitation is given back. Refused for the last Owner, and only an Owner can remove an Owner. 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `userId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website id from list_websites. | | `domain` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `prospectId` | `string` | Yes | any | Prospect id (24 hex characters) from get_prospects or add_prospect_to_campaign. | | `campaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | Lead id (the _id of a row returned by get_leads). | | `tagId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | Mailbox ID from list_email_accounts. | | `fullName` | `string` | No | any | The sender name. | | `localPart` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `listType` | `string` | Yes | `contact`, `company` | contact or company. | | `listId` | `string` | Yes | any | List ID from list_lists. | | `name` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | campaignId from list_campaigns. | | `templateIds` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `emailId` | `string` | Yes | any | Email id from get_inbox_emails, prospects[].emails[].emailId. | | `body` | `string` | Yes | any | The reply text. Merge fields with a fallback, e.g. \{\{ first_name \| there \}\}, are filled in. | | `emailAccountId` | `string` | No | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/engage/master-inbox/mcp](/docs/engage/master-inbox/mcp) # rerun_automation_for_lead (/docs/mcp/tools/rerun-automation-for-lead) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | Lead _id from get_leads. | | `websiteId` | `string` | Yes | any | Website ID the lead belongs to, from list_websites. | | `automationType` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/automations/webhook/mcp](/docs/automations/webhook/mcp) # reschedule_prospects (/docs/mcp/tools/reschedule-prospects) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `campaignId` | `string` | Yes | any | Campaign ID from list_campaigns. | | `prospectIds` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `scoutId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `autoSearchId` | `string` | Yes | any | _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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinCampaignId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `prospectIds` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `leadIds` | `string[]` | Yes | any | Lead _ids from get_leads, e.g. ["64f1c2..."]. Must not be empty. | | `automationIds` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the same one used for search_people). | | `profileId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `scoutId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. The search runs under this website. | | `query` | `object` | Yes | any | Search filters as one flat object. Every field is optional; combine them to narrow the search. | | `query.keywords` | `string` | No | any | Company name or domain keyword, e.g. "acme" or "acme.example". | | `query.industries` | `string[]` | No | [154 values](#accepted-values) | Industries to match (any of them). Only the values in the accepted list work; anything else is refused. | | `query.locations` | `string[]` | No | [249 values](#accepted-values) | Company HQ countries by full English name, or a continent (Africa, Asia, Europe, North America, Oceania, South America) for all its countries. Only the values in the accepted list work, spelled exactly ("Germany", not "germany" or "DE"). | | `query.employeesMin` | `integer` | No | min 1 | Minimum headcount (whole number, at least 1). Applied to the real employee count. | | `query.employeesMax` | `integer` | No | min 1 | Maximum headcount (whole number, at least 1). Applied to the real employee count. | | `query.revenueMin` | `number` | No | min 0 | Minimum annual revenue in US dollars (0 or more). Defaults to 0. | | `query.revenueMax` | `number` | No | min 0 | Maximum annual revenue in US dollars (0 or more). | | `query.technologies` | `string[]` | No | any | Technologies the company uses, by product name. Case-sensitive: "Hubspot" and "Shopify" match, "hubspot" returns nothing. With this filter, total is the unfiltered count. | | `query.page` | `integer` | No | min 1 · default 1 | Page number, whole number from 1. Default 1. | | `query.count` | `integer` | No | min 1 · default 25 | Results per page, whole number from 1. Default 25. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `query.industries` [#queryindustries] `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` ### `query.locations` [#querylocations] `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` ## 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", "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": "Industries to match (any of them). Only the values in the accepted list work; anything else is refused." }, "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": "Company HQ countries by full English name, or a continent (Africa, Asia, Europe, North America, Oceania, South America) for all its countries. Only the values in the accepted list work, spelled exactly (\"Germany\", not \"germany\" or \"DE\")." }, "employeesMin": { "type": "integer", "minimum": 1, "description": "Minimum headcount (whole number, at least 1). Applied to the real employee count." }, "employeesMax": { "type": "integer", "minimum": 1, "description": "Maximum headcount (whole number, at least 1). Applied to the real employee count." }, "revenueMin": { "type": "number", "minimum": 0, "description": "Minimum annual revenue in US dollars (0 or more). Defaults to 0." }, "revenueMax": { "type": "number", "minimum": 0, "description": "Maximum annual revenue in US dollars (0 or more)." }, "technologies": { "type": "array", "items": { "type": "string" }, "description": "Technologies the company uses, by product name. Case-sensitive: \"Hubspot\" and \"Shopify\" match, \"hubspot\" returns nothing. With this filter, total is the unfiltered count." }, "page": { "type": "integer", "minimum": 1, "default": 1, "description": "Page number, whole number from 1. Default 1." }, "count": { "type": "integer", "minimum": 1, "default": 25, "description": "Results per page, whole number from 1. Default 25." } } } }, "required": [ "websiteId", "query" ] } } ``` # search_domain_availability (/docs/mcp/tools/search-domain-availability) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `domain` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `kind` | `string` | Yes | `countries`, `states`, `cities` | countries, states (US) or cities. | | `q` | `string` | No | any | Part of the name to search for (needed for cities). | | `country` | `string` | No | any | Cities only: limit to one country. | | `limit` | `number` | No | 1–100 | 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/website-visitors/filters/mcp](/docs/leads/website-visitors/filters/mcp) # search_people (/docs/mcp/tools/search-people) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. The search runs under this website. | | `query` | `object` | Yes | any | Search filters as one flat object. Every field is optional; combine them to narrow the search. | | `query.titles` | `string[]` | No | any | Job titles to match, e.g. ["VP of Marketing", "Head of Growth"]. | | `query.companies` | `string[]` | No | any | Company names or domains, e.g. ["acme.example"]. | | `query.locations` | `string[]` | No | [249 values](#accepted-values) | Country names, e.g. ["United States"]; continents also accepted. Filters on the company HQ, not where the person lives. | | `query.seniorities` | `string[]` | No | `Intern`, `Manager`, `Director`, `VP`, `Employee`, `C-Level` | Seniority levels: Intern, Employee, Manager, Director, VP or C-Level. | | `query.departments` | `string[]` | No | [22 values](#accepted-values) | Departments, e.g. ["Marketing Department", "Sales Department"]. Only the listed values are accepted. | | `query.industries` | `string[]` | No | [154 values](#accepted-values) | Company industries, e.g. ["Computer Software"]. Only the listed values are accepted. | | `query.technologies` | `string[]` | No | any | Technologies the company uses, e.g. ["Salesforce"]. | | `query.employeesMin` | `number` | No | min 1 | Minimum company headcount (whole number). | | `query.employeesMax` | `number` | No | min 1 | Maximum company headcount (whole number). | | `query.page` | `number` | No | min 1 | Page number, starting at 1. Default 1. | | `query.count` | `number` | No | min 1 | Results per page. Default 25. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `query.locations` [#querylocations] `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` ### `query.departments` [#querydepartments] `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` ### `query.industries` [#queryindustries] `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` ## 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" ] } } ``` ## Used in [#used-in] - [/docs/leads/prospector/search-companies/mcp](/docs/leads/prospector/search-companies/mcp) # send_prospects_now (/docs/mcp/tools/send-prospects-now) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `prospectIds` | `string[]` | Yes | any | 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 platform-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 (marked [Test Notification]) to a Slack channel so you can see how it looks. It is a real Slack message. Without channelName it uses the channel of the first active Slack automation. Answers \{ success, channel \} plus unknownFields when the template uses merge fields that don't exist; when Slack refuses (channel not found, app not invited to it, archived) it answers 400 with the reason and slackError. | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `channelName` | `string` | No | any | Channel name from list_slack_channels, e.g. leads. Optional: defaults to the channel of the first active Slack automation. | | `template` | `string` | No | any | 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 name from list_slack_channels, e.g. leads. Optional: defaults to the channel of the first active Slack automation." }, "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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `dailyLimit` | `number` | Yes | 1–500 | 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 platform-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. Returns the same summary as get_auto_topup: when eligible is false (a trial or lifetime plan, a paused plan or no card on file) the setting is saved but nothing will be bought, so tell the user. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | No | any | Optional, kept for older callers: auto top-up is set per account, so it changes the same setting for every website. | | `enabled` | `boolean` | Yes | any | true to buy leads automatically, false to stop. | | `packLeads` | `integer` | No | 1–100000 | Leads bought each time credits run out: a whole number from 1 to 100,000. Needed the first time you turn it on; the price per lead is your plan's (perLeadCents in get_auto_topup). | | `capUsd` | `number` | No | min 1 | Most auto top-up may spend per billing cycle, in USD. At least your plan's monthly price (minCapUsd in get_auto_topup); a lower value is refused. Leave it out to keep the current limit. | ## 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": "Optional, kept for older callers: auto top-up is set per account, so it changes the same setting for every website." }, "enabled": { "type": "boolean", "description": "true to buy leads automatically, false to stop." }, "packLeads": { "type": "integer", "minimum": 1, "maximum": 100000, "description": "Leads bought each time credits run out: a whole number from 1 to 100,000. Needed the first time you turn it on; the price per lead is your plan's (perLeadCents in get_auto_topup)." }, "capUsd": { "type": "number", "minimum": 1, "description": "Most auto top-up may spend per billing cycle, in USD. At least your plan's monthly price (minCapUsd in get_auto_topup); a lower value is refused. Leave it out to keep the current limit." } }, "required": [ "enabled" ] } } ``` # set_country_blacklist (/docs/mcp/tools/set-country-blacklist) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `countryCodes` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `crm` | `string` | Yes | `hubspot`, `salesforce`, `pipedrive`, `zoho`, `gohighlevel` | The CRM. | | `objectType` | `string` | Yes | `contact`, `company` | contact or company. | | `mappings` | `object[]` | Yes | any | The full list for this CRM and object type; it replaces what is saved (an empty list clears it). | | `mappings[].crmField` | `string` | Yes | any | The CRM field name (its API name, e.g. firstname in HubSpot). | | `mappings[].crmFieldLabel` | `string` | No | any | Optional label shown in the dashboard; defaults to crmField. | | `mappings[].valueType` | `string` | No | default "variable" · `variable`, `static` | variable (fill from the lead, default) or static (the same text every time). | | `mappings[].variable` | `string` | No | [40 values](#accepted-values) | The lead field when valueType is variable, from list_crm_variables. | | `mappings[].staticValue` | `string` | No | any | The fixed text when valueType is static. | | `mappings[].enabled` | `boolean` | No | default true | false keeps the row but skips it (default true). | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `mappings[].variable` [#mappingsvariable] `lead.person.firstName` · `lead.person.lastName` · `lead.person.businessEmail` · `lead.person.personalEmail` · `lead.person.phone` · `lead.person.position` · `lead.person.linkedin` · `lead.person.department` · `lead.person.seniority` · `lead.company.name` · `lead.company.domain` · `lead.company.phone` · `lead.company.city` · `lead.company.state` · `lead.company.country` · `lead.company.countryCode` · `lead.company.industry` · `lead.company.sector` · `lead.company.employees` · `lead.company.employeesRange` · `lead.company.estimatedRevenue` · `lead.company.foundedYear` · `lead.company.linkedinPage` · `lead.company.description` · `lead.visit.pageCount` · `lead.visit.pageList` · `lead.visit.sessionCount` · `lead.visit.ipAddress` · `lead.visit.city` · `lead.visit.state` · `lead.visit.countryCode` · `lead.utm.source` · `lead.utm.medium` · `lead.utm.campaign` · `lead.utm.term` · `lead.utm.referrer` · `lead.score` · `lead.firstSeen` · `lead.lastSeen` · `lead.contactType` ## 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": { "crmField": { "type": "string", "description": "The CRM field name (its API name, e.g. firstname in HubSpot)." }, "crmFieldLabel": { "type": "string", "description": "Optional label shown in the dashboard; defaults to crmField." }, "valueType": { "type": "string", "enum": [ "variable", "static" ], "default": "variable", "description": "variable (fill from the lead, default) or static (the same text every time)." }, "variable": { "type": "string", "enum": [ "lead.person.firstName", "lead.person.lastName", "lead.person.businessEmail", "lead.person.personalEmail", "lead.person.phone", "lead.person.position", "lead.person.linkedin", "lead.person.department", "lead.person.seniority", "lead.company.name", "lead.company.domain", "lead.company.phone", "lead.company.city", "lead.company.state", "lead.company.country", "lead.company.countryCode", "lead.company.industry", "lead.company.sector", "lead.company.employees", "lead.company.employeesRange", "lead.company.estimatedRevenue", "lead.company.foundedYear", "lead.company.linkedinPage", "lead.company.description", "lead.visit.pageCount", "lead.visit.pageList", "lead.visit.sessionCount", "lead.visit.ipAddress", "lead.visit.city", "lead.visit.state", "lead.visit.countryCode", "lead.utm.source", "lead.utm.medium", "lead.utm.campaign", "lead.utm.term", "lead.utm.referrer", "lead.score", "lead.firstSeen", "lead.lastSeen", "lead.contactType" ], "description": "The lead field when valueType is variable, from list_crm_variables." }, "staticValue": { "type": "string", "description": "The fixed text when valueType is static." }, "enabled": { "type": "boolean", "default": true, "description": "false keeps the row but skips it (default true)." } }, "required": [ "crmField" ] }, "description": "The full list for this CRM and object type; it replaces what is saved (an empty list clears it)." } }, "required": [ "websiteId", "crm", "objectType", "mappings" ] } } ``` # set_domain_auto_renew (/docs/mcp/tools/set-domain-auto-renew) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `domainId` | `string` | Yes | any | Domain ID from list_domains. | | `autoRenew` | `boolean` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `keywordId` | `string` | Yes | any | Keyword ID from list_linkedin_keywords. | | `status` | `string` | Yes | `active`, `paused` | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `mode` | `string` | No | `exclude`, `include` | exclude (default) or include. | | `rules` | `object[]` | Yes | any | The full list of rules. | | `rules[].type` | `string` | Yes | `starts-with`, `ends-with`, `contains`, `does-not-contain` | starts-with, ends-with, contains or does-not-contain. | | `rules[].url` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `enabled` | `boolean` | Yes | any | 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 platform-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 (Slack formatting: *bold*, _italic_). Merge fields are filled per lead and left empty when unknown: \{\{lead.company.name\}\}, \{\{lead.company.domain\}\}, \{\{lead.company.industry\}\}, \{\{lead.company.employees\}\}, \{\{lead.person.firstName\}\}, \{\{lead.person.lastName\}\}, \{\{lead.person.businessEmail\}\}, \{\{lead.person.position\}\}, \{\{lead.person.linkedin\}\}, \{\{lead.visit.pageList\}\}, \{\{lead.utm.source\}\} and the other lead.* fields of get_slack_message_template's default. Up to 3000 characters; an empty template goes back to the default. Answers \{ success \} plus unknownFields when the template uses merge fields that don't exist (they would show empty). | Connection | Account URL, team member URL or OAuth | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `template` | `string` | Yes | max 3000 characters | The message: Slack formatting (*bold*, _italic_) and merge fields like \{\{lead.company.name\}\} (see mergeFields in get_slack_message_template). Up to 3000 characters; an empty string goes back to the default. | ## 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", "maxLength": 3000, "description": "The message: Slack formatting (*bold*, _italic_) and merge fields like {{lead.company.name}} (see mergeFields in get_slack_message_template). Up to 3000 characters; an empty string goes back to the default." } }, "required": [ "websiteId", "template" ] } } ``` # set_website_billing_mode (/docs/mcp/tools/set-website-billing-mode) {/* Generated by scripts/sync-mcp-tools.mjs from platform-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/set_website_billing_mode.mdx. */} **Set a website's trial or paid mode** · Changes data For websites you run for your own clients: start a trial until a date (its leads go to 0 when it ends), switch to paid (the leads refill to the website's limit every month on refreshOn, then the date moves on a month) or stop the monthly refill when a client cancels. Set the leads themselves with set_website_limits. | Connection | Account-owner URL or OAuth (not a team member URL) | | --- | --- | ## Parameters [#parameters] | Parameter | Type | Required | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `mode` | `string` | Yes | `trial`, `paid`, `stop_refill` | trial, paid or stop_refill. | | `trialEndsAt` | `string` | No | any | When the trial ends (ISO date). Required for trial. | | `refreshOn` | `string` | No | any | The client's next billing date (ISO date). Required for paid. | ## Tool definition [#tool-definition] What your assistant receives from `tools/list`: ```json { "name": "set_website_billing_mode", "title": "Set a website's trial or paid mode", "annotations": { "title": "Set a website's trial or paid mode", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false }, "inputSchema": { "type": "object", "properties": { "websiteId": { "type": "string", "description": "Website ID from list_websites." }, "mode": { "type": "string", "enum": [ "trial", "paid", "stop_refill" ], "description": "trial, paid or stop_refill." }, "trialEndsAt": { "type": "string", "description": "When the trial ends (ISO date). Required for trial." }, "refreshOn": { "type": "string", "description": "The client's next billing date (ISO date). Required for paid." } }, "required": [ "websiteId", "mode" ] } } ``` # set_website_limits (/docs/mcp/tools/set-website-limits) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `credits` | `number` | Yes | min 0 | Credits this website may use per cycle. | | `emailAccounts` | `number` | Yes | min 0 | Mailboxes this website may connect. | | `resetCredits` | `boolean` | No | any | true refills what is left to the full allowance now (use it when a client pays). | ## 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." }, "resetCredits": { "type": "boolean", "description": "true refills what is left to the full allowance now (use it when a client pays)." } }, "required": [ "websiteId", "credits", "emailAccounts" ] } } ``` # set_website_tags (/docs/mcp/tools/set-website-tags) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `tags` | `string[]` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `subject` | `string` | Yes | any | The subject line. | | `body` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `prospectId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/engage/campaign-contacts/mcp](/docs/engage/campaign-contacts/mcp) # subscribe_to_intent_topic (/docs/mcp/tools/subscribe-to-intent-topic) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `topicSlug` | `string` | Yes | any | Topic slug from get_intent_topics_catalog, e.g. "crm-software". Not case-sensitive. | | `userDailyLimit` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `regenerate` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `audienceId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leadId` | `string` | Yes | any | Lead id (the _id of a row returned by get_leads). | | `tagId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `smtpEmail` | `string` | Yes | any | Login for sending, usually the mailbox address. | | `smtpHost` | `string` | Yes | any | SMTP server, e.g. smtp.gmail.com. | | `smtpPort` | `number` | Yes | 1–65535 | SMTP port, e.g. 465 or 587. | | `smtpTLS` | `boolean` | Yes | any | true for SSL/TLS. | | `imapEmail` | `string` | Yes | any | Login for reading replies, usually the mailbox address. | | `imapHost` | `string` | Yes | any | IMAP server, e.g. imap.gmail.com. | | `imapPort` | `number` | Yes | 1–65535 | IMAP port, usually 993. | | `imapTLS` | `boolean` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `webhook` | `string` | Yes | uri | The public http(s) URL to send the sample lead to (private or local addresses are refused). | | `signalType` | `string` | No | default "visit" · `visit`, `topic`, `web_scraping` | Which sample to send, shaped like the automation that will use it: visit (a website visitor, default), topic (3rd-party intent) or web_scraping (a web-scraping signal). | ## 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", "format": "uri", "description": "The public http(s) URL to send the sample lead to (private or local addresses are refused)." }, "signalType": { "type": "string", "enum": [ "visit", "topic", "web_scraping" ], "default": "visit", "description": "Which sample to send, shaped like the automation that will use it: visit (a website visitor, default), topic (3rd-party intent) or web_scraping (a web-scraping signal)." } }, "required": [ "websiteId", "webhook" ] } } ``` # toggle_automation (/docs/mcp/tools/toggle-automation) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `automationId` | `string` | Yes | any | Automation _id from list_automations. | | `isActive` | `boolean` | Yes | any | 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", "pattern": "^[0-9a-fA-F]{24}$", "description": "Automation _id from list_automations." }, "isActive": { "type": "boolean", "description": "true switches it on, false switches it off." } }, "required": [ "automationId", "isActive" ] } } ``` ## Used in [#used-in] - [/docs/automations/automations/mcp](/docs/automations/automations/mcp) # toggle_warmup (/docs/mcp/tools/toggle-warmup) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `emailAccountId` | `string` | Yes | any | Mailbox id from list_email_accounts (_id). | | `enabled` | `boolean` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `trackExactVisitors` | `boolean` | No | any | Identify the person, not only the company. | | `trackCompanyWithSuggestedContacts` | `boolean` | No | any | Suggest contacts at companies without an identified person. | | `trackPersonalEmails` | `boolean` | No | any | Keep leads with a personal email. | | `sessionRecordingEnabled` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `scoutId` | `string` | Yes | any | AI Scout ID from list_ai_scouts. | | `name` | `string` | No | any | A short name; made from the description when left out. | | `description` | `string` | No | any | Who to find, in a sentence or two: roles, industries, company size, where they talk (podcasts, YouTube, review sites). | | `perDay` | `number` | No | `10`, `25`, `50`, `100` | People per day to deliver: 10, 25, 50 or 100. | | `minFit` | `number` | No | 10–95 | Minimum fit score (10-95, default 70): people below it are skipped. | | `sources` | `object[]` | No | any | 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` | `string` | Yes | `google`, `youtube_search`, `youtube_playlist`, `youtube_creators`, `g2_category` | google, youtube_search, youtube_playlist, youtube_creators or g2_category. | | `sources[].ref` | `string` | Yes | any | The search words, the playlist or channel link, or the G2 category link. | | `sources[].label` | `string` | No | any | Optional. How the source is shown in the dashboard. | | `sources[].active` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `automationId` | `string` | Yes | any | Automation _id from list_automations. | | `name` | `string` | No | any | New name. | | `trigger` | `object` | No | any | Rule fields to change (same values as create_automation); anything left out keeps its saved value. | | `trigger.when` | `string` | No | [7 values](#accepted-values) | What starts it. | | `trigger.then` | `string` | No | [16 values](#accepted-values) | The action: where matching leads go. | | `trigger.trigger` | `string` | No | `only-on-first-visit`, `on-every-visit`, `none` | only-on-first-visit, on-every-visit or none. | | `trigger.interval` | `string` | No | `immediately`, `after-session`, `daily`, `weekly`, `monthly` | immediately, after-session, daily, weekly or monthly. | | `trigger.repeatWindowHours` | `integer` | No | [7 values](#accepted-values) | Act at most once per company or person in this many hours. | | `trigger.dedupeScope` | `string` | No | `contact`, `company` | What counts as the same for the repeat limit: contact or company. | | `trigger.contactSelectionStrategy` | `string` | No | `flexible-job-titles`, `exact-job-titles`, `flexible-find-at-least-one-job-titles` | How contacts are matched to the job titles: flexible-job-titles, exact-job-titles or flexible-find-at-least-one-job-titles. | | `trigger.maxContactsToSend` | `integer` | No | min 1 | Most contacts sent per company (at least 1). | | `trigger.emailVerification` | `object` | No | any | Which emails count: allowOnlyValidEmails, allowCatchAllEmails, allowGuessedEmails, allowWithoutEmails (true/false). | | `trigger.filter` | `string` | No | any | A saved filter id from list_filters, or null to drop the filter. | | `actions` | `object` | No | any | The action settings object, e.g. \{ "sentToSlack": \{ "sendMessagesTo": "leads" \} \}. Replaces all saved action settings. For HubSpot, \{ sentToHubspot: \{ createDeal: true, pipelineId, dealStageId \} \} also creates a deal per lead (ids from list_crm_pipelines). | | `enabled` | `boolean` | No | any | true to activate, false to deactivate. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `trigger.when` [#triggerwhen] `new-lead-is-identified` · `new-intent-data-triggered` · `new-prospector-lead` · `new-web-scraping-signal` · `new-scout-lead` · `new-linkedin-engagement` · `new-tag-added-to-lead` ### `trigger.then` [#triggerthen] `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` · `send-to-googleAdsCampaign` · `send-to-linkedinAdsAudience` · `send-to-metaAdsAudience` ### `trigger.repeatWindowHours` [#triggerrepeatwindowhours] `12` · `24` · `72` · `168` · `720` · `2160` · `4320` ## 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", "pattern": "^[0-9a-fA-F]{24}$", "description": "Automation _id from list_automations." }, "name": { "type": "string", "description": "New name." }, "trigger": { "type": "object", "properties": { "when": { "type": "string", "enum": [ "new-lead-is-identified", "new-intent-data-triggered", "new-prospector-lead", "new-web-scraping-signal", "new-scout-lead", "new-linkedin-engagement", "new-tag-added-to-lead" ], "description": "What starts it." }, "then": { "type": "string", "enum": [ "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", "send-to-googleAdsCampaign", "send-to-linkedinAdsAudience", "send-to-metaAdsAudience" ], "description": "The action: where matching leads go." }, "trigger": { "type": "string", "enum": [ "only-on-first-visit", "on-every-visit", "none" ], "description": "only-on-first-visit, on-every-visit or none." }, "interval": { "type": "string", "enum": [ "immediately", "after-session", "daily", "weekly", "monthly" ], "description": "immediately, after-session, daily, weekly or monthly." }, "repeatWindowHours": { "type": "integer", "enum": [ 12, 24, 72, 168, 720, 2160, 4320 ], "description": "Act at most once per company or person in this many hours." }, "dedupeScope": { "type": "string", "enum": [ "contact", "company" ], "description": "What counts as the same for the repeat limit: contact or company." }, "contactSelectionStrategy": { "type": "string", "enum": [ "flexible-job-titles", "exact-job-titles", "flexible-find-at-least-one-job-titles" ], "description": "How contacts are matched to the job titles: flexible-job-titles, exact-job-titles or flexible-find-at-least-one-job-titles." }, "maxContactsToSend": { "type": "integer", "minimum": 1, "description": "Most contacts sent per company (at least 1)." }, "emailVerification": { "type": "object", "description": "Which emails count: allowOnlyValidEmails, allowCatchAllEmails, allowGuessedEmails, allowWithoutEmails (true/false)." }, "filter": { "type": "string", "description": "A saved filter id from list_filters, or null to drop the filter." } }, "description": "Rule fields to change (same values as create_automation); anything left out keeps its saved value." }, "actions": { "type": "object", "description": "The action settings object, e.g. { \"sentToSlack\": { \"sendMessagesTo\": \"leads\" } }. Replaces all saved action settings. For HubSpot, { sentToHubspot: { createDeal: true, pipelineId, dealStageId } } also creates a deal per lead (ids from list_crm_pipelines)." }, "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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `articleId` | `string` | Yes | any | Article _id from list_blog_articles. | | `title` | `string` | No | any | New title. | | `html` | `string` | No | any | New body as HTML (p, h2, h3, ul/ol, blockquote, img, table). Replaces the whole body. | | `metaDescription` | `string` | No | any | New search-result description. | | `excerpt` | `string` | No | any | New short summary for the blog index. | | `category` | `string` | No | any | New category name. | | `coverImage` | `string` | No | any | New absolute cover image URL (http/https); other values clear it. | | `status` | `string` | No | `live`, `draft` | 'live' publishes this version now; 'draft' takes the article offline. Leave it out to keep the current state. | | `faq` | `object[]` | No | any | Full new FAQ list of \{ q, a \} objects. Replaces the saved FAQ. | | `summary` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `campaignId` | `string` | Yes | any | Email campaign id from list_campaigns. | | `templateId` | `string` | Yes | any | Id of the step to edit, from get_campaign emailCampaignTemplates[]._id (24 hex characters). | | `subject` | `string` | No | any | Optional new subject line. Merge fields need a fallback, e.g. \{\{ company_name \| your team \}\}. | | `body` | `string` | No | any | Optional new body: plain text, one paragraph per line, ending with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\}. | | `delayDays` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites (the campaign's website). | | `campaignId` | `string` | Yes | any | campaignId from list_campaigns. | | `name` | `string` | No | any | New name. | | `status` | `string` | No | `active`, `paused` | active to start sending, paused to stop. | | `daysRange` | `number[]` | No | 0–6 | Days to send on, 0 (Sunday) to 6 (Saturday). | | `timeSlot` | `object` | No | any | Sending hours in the campaign timezone. | | `timeSlot.start` | `number` | No | 0–23 | First hour, 0-23. | | `timeSlot.end` | `number` | No | 1–24 | Last hour, 1-24. | | `timezone` | `string` | No | any | IANA timezone, e.g. Europe/London. | | `isTrackingEnabled` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | Mailbox ID from list_email_accounts. | | `messagesPerDayLimit` | `number` | No | 1–500 | Emails per day (1-500); our own mailboxes have a lower cap. | | `firstname` | `string` | No | any | Sender first name. | | `lastname` | `string` | No | any | Sender last name. | | `company` | `string` | No | any | Sender company. | | `position` | `string` | No | any | Sender job title. | | `phoneNumber` | `string` | No | any | Sender phone number. | | `signatureHTML` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `filterId` | `string` | Yes | any | _id from list_filters. | | `isFavorite` | `boolean` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `industries` | `string[]` | No | any | Target industries; replaces the saved list, e.g. ["Computer Software"]. | | `employeesMin` | `number` | No | any | Smallest company headcount to target (whole number). | | `employeesMax` | `number` | No | any | Largest company headcount to target (whole number). | | `locations` | `string[]` | No | any | Target countries; replaces the saved list, e.g. ["United States", "United Kingdom"]. | | `sectors` | `string[]` | No | any | Target sectors; replaces the saved list. | | `revenueMin` | `number` | No | any | Smallest annual revenue to target (number). | | `revenueMax` | `number` | No | any | Largest annual revenue to target (number). | | `excludedDomains` | `string[]` | No | any | Domains to exclude. Not saved today (see notes); use add_to_domain_blacklist to exclude domains. | | `excludedIndustries` | `string[]` | No | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/qualify/icp](/docs/qualify/icp) # update_intent_topic (/docs/mcp/tools/update-intent-topic) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `topicSlug` | `string` | Yes | any | Slug of a subscribed topic, from list_intent_topics. | | `paused` | `boolean` | No | any | true pauses deliveries, false resumes them. | | `userDailyLimit` | `number` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `commentId` | `string` | Yes | any | Comment id (the _id from get_lead_comments). | | `content` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `leadId` | `string` | Yes | any | Lead ID from get_leads. | | `notes` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `minScore` | `number` | No | 0–80 | Minimum ideal-customer score for every source (0-80). | | `bySource` | `object` | No | any | Per-source bars that override minScore. | | `bySource.visitors` | `number` | No | 0–80 | Minimum score for website visitor leads (0-80); null uses the general bar. | | `bySource.intent` | `number` | No | 0–80 | Minimum score for 3rd-party intent leads (0-80); null uses the general bar. | | `bySource.scraping` | `number` | No | 0–80 | Minimum score for Web Scraping leads (0-80); null uses the general bar. | | `bySource.prospector` | `number` | No | 0–80 | Minimum score for Prospector leads (0-80); null uses the general bar. | | `bySource.scout` | `number` | No | 0–80 | Minimum score for AI Scout leads (0-80); null uses the general bar. | | `contactsOnly` | `boolean` | No | any | Only keep leads with a person to contact. | | `audienceFocus` | `string` | No | `B2B`, `B2C`, `BOTH` | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `modelId` | `string` | Yes | any | Scoring model id from list_lead_scoring_models. | | `name` | `string` | No | any | New model name. | | `active` | `boolean` | No | any | true turns the model on (it scores leads), false turns it off. | | `criteria` | `object` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `linkedinAccountId` | `string` | Yes | any | LinkedIn account ID from list_linkedin_accounts. | | `label` | `string` | No | any | A name for the account. | | `status` | `string` | No | `active`, `paused` | 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 platform-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 and returns the member as list_members does. Fields left out stay as they are; websites replaces the whole list (send allWebsites false with it). Giving an Owner a preset or permissions makes them a Member; the last Owner cannot be changed. 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `userId` | `string` | Yes | any | userId from list_members. | | `role` | `string` | No | `Owner`, `Member` | Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner. | | `preset` | `string` | No | `full`, `sales`, `developer`, `viewer`, `team`, `client` | Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog). | | `permissions` | `string[]` | No | [21 values](#accepted-values) | Exact permission ids, from get_permissions_catalog. Overrides the preset. | | `allWebsites` | `boolean` | No | any | true: access to every current and future website. | | `websites` | `string[]` | No | any | Website ids the member can see, when allWebsites is false. | ## Accepted values [#accepted-values] The exact values these fields take; anything else is refused. ### `permissions` [#permissions] `pixel` · `add_website` · `website` · `delete_website` · `integrations` · `leads_view` · `leads_export` · `qualify` · `campaigns` · `buy_mailboxes` · `connect_mailboxes` · `warmup` · `inbox` · `optimize_seo` · `optimize_google_ads` · `optimize_meta_ads` · `optimize_linkedin_ads` · `team` · `api_keys` · `billing` · `whitelabel` ## 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", "enum": [ "pixel", "add_website", "website", "delete_website", "integrations", "leads_view", "leads_export", "qualify", "campaigns", "buy_mailboxes", "connect_mailboxes", "warmup", "inbox", "optimize_seo", "optimize_google_ads", "optimize_meta_ads", "optimize_linkedin_ads", "team", "api_keys", "billing", "whitelabel" ] }, "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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `tagId` | `string` | Yes | any | Tag ID from list_tags. | | `name` | `string` | No | any | New tag name. | | `color` | `string` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | _id of the mailbox from list_email_accounts. | | `intensity` | `string` | No | `conservative`, `normal`, `aggressive` | conservative, normal or aggressive. | | `dailyLimit` | `number` | No | 5–100 | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `enabled` | `boolean` | No | any | On or off. | | `keywords` | `object[]` | No | any | 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 | any | A phrase your buyers write on their own site, or a domain that appears in a script URL. | | `keywords[].matchMode` | `string` | No | `exact`, `fuzzy` | exact (the phrase as written) or fuzzy (close variants too). | | `keywords[].paused` | `boolean` | No | any | true to keep the keyword but stop searching for it. | | `dailyLimit` | `number` | No | 1–500 | Leads per day, 1-500. | | `contactsOnly` | `boolean` | No | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `name` | `string` | No | any | New display name for the website. | | `url` | `string` | No | any | Website address, e.g. https://www.acme.example. verify_website checks the home page of this address. | | `trackExactVisitors` | `boolean` | No | any | true to identify the exact person visiting (name, email, LinkedIn) as well as their company. | | `trackPersonalEmails` | `boolean` | No | any | true to include personal email addresses (e.g. Gmail) for identified visitors; false for business emails only. | | `enablePersonalEmails` | `boolean` | No | any | Same as trackPersonalEmails (kept for older clients). trackPersonalEmails wins if both are sent. | | `trackCompanyWithSuggestedContacts` | `boolean` | No | any | true to still create a lead for the visiting company, with suggested contacts there, when the exact person cannot be identified. | | `identifySettings` | `string` | No | `both`, `personal-level-data`, `company-level-data` | Which leads to show: 'both' (default), 'personal-level-data' (person leads) or 'company-level-data' (company leads). | | `emailTrackingEnabled` | `boolean` | No | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/websites/tracking-pixel/mcp](/docs/websites/tracking-pixel/mcp) - [/docs/websites/websites/mcp](/docs/websites/websites/mcp) # upgrade_plan (/docs/mcp/tools/upgrade-plan) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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; requires_action means the bank wants the cardholder to confirm the payment: give the user confirmUrl (or send them to the Billing page). 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 | Accepts | Description | | --- | --- | --- | --- | --- | | `leads` | `integer` | Yes | 1–1000000 | Leads per month of the new plan: a whole number from 1 to 1,000,000; use the same value you previewed. | | `annual` | `boolean` | No | any | 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": "integer", "minimum": 1, "maximum": 1000000, "description": "Leads per month of the new plan: a whole number from 1 to 1,000,000; 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" ] } } ``` ## Used in [#used-in] - [/docs/account/billing/mcp](/docs/account/billing/mcp) # verify_contact (/docs/mcp/tools/verify-contact) {/* Generated by scripts/sync-mcp-tools.mjs from platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `contactId` | `string` | Yes | any | The _id returned by create_contact (24 hex characters). | | `websiteId` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | Website ID from list_websites. | | `emailAccountId` | `string` | Yes | any | _id of the mailbox from list_email_accounts. | | `customDomain` | `string` | Yes | any | 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 platform-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 | Accepts | Description | | --- | --- | --- | --- | --- | | `websiteId` | `string` | Yes | any | 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" ] } } ``` ## Used in [#used-in] - [/docs/websites/tracking-pixel](/docs/websites/tracking-pixel) - [/docs/websites/websites/mcp](/docs/websites/websites/mcp) # 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**. ### Common questions [#common-questions] **Who writes the articles?** They are proposed for you, written for the ideal customer in your [scoring model](/docs/qualify/scoring-models). Nothing goes live until you approve it. You can also publish your own text from your [AI assistant](/docs/optimize/blog-articles/mcp) or the [API](/docs/optimize/blog-articles/api). **Does a draft use one of my articles?** Yes. Your plan includes a number of articles a month, and each new article or edit uses one, whether it is live or a draft. **What happens when I have none left this month?** New articles and edits are refused until the next month. Add more articles from the Billing page ([Plan, billing & credits](/docs/account/billing)). **My change does not show on the blog.** Click **Clear cache** on the SEO page (or ask your assistant to `clear_blog_cache`), then reload the blog. **Can I go back to an older version?** Yes. Open the article's **History**, pick the version and click **Revert**. The article keeps the same address. **Can I edit a guest post or a paid placement?** No. Those articles are locked; edits to them are refused. **How do I know if an article works?** Each article shows its visits and how well its visitors match your ideal customer, for the first version and the current one, so you can see whether an edit helped. --- ## 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 a description you type), asks who you sell to, and proposes scoring rules. You accept or skip them one by one, so nothing is added without you. 1. **Qualify → open a model → ✦ AI Assist.** 2. **Let it read your website**, or skip that and describe your business yourself. 3. **Tell it who you sell to**, click **Generate rules**, then accept or skip each proposed rule and **Save and Close**. ### AI prompts: questions the AI answers about each lead [#ai-prompts-questions-the-ai-answers-about-each-lead] Besides rules, a model can hold **AI prompts**: plain-English questions such as "Is this company a software vendor selling to finance teams?". The AI answers them for each lead and the answer feeds the score. Add one under **✦ AI Prompts → + Add AI prompt**, or click **✦ Suggest prompts**, describe your ideal customer and your domain, and add the suggestions you like. **Business context** (what you sell and who buys it) helps the AI answer well. ### Common questions [#common-questions] **Can AI build my scoring model?** Yes. AI Assist proposes the rules from your website and your answers; you keep the ones that fit. From your [AI assistant](/docs/qualify/ai-assist/mcp) or the [API](/docs/qualify/ai-assist/api), `ai_generate_scoring_model` builds a whole model named "ICP Score - AI Generated" in one go, once per website. **Can I edit what AI proposes?** Yes. Every proposed rule is a normal rule: skip it, change its values or its weight, delete it later. The model is yours ([Scoring models](/docs/qualify/scoring-models)). **AI Assist got my business wrong.** Skip the rules that do not fit and run it again with your own description instead of your website; what you write takes priority over what the site suggests. You can also set **Business context** in the editor. **Does AI Assist cost credits?** Lead credits are only ever used for new leads ([How credits are used](/docs/account/billing#how-credits-are-used)). AI prompts are answered per lead from your plan's monthly AI qualification allowance, not from your lead credits. **Do I still need my own rules?** Not necessarily, but check the result with **Test a website** on a few real customers: they should come out warm or hot. Add or tighten rules until they do. ### 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 first model for a new website [#use-case-a-first-model-for-a-new-website] `POST /v3/lead-scoring/ai-generate` reads the website's pages, builds a model named "ICP Score - AI Generated" and saves it; `description` steers it, and what you write there takes priority over what the site suggests. It works once per website: a second call is refused with "AI Lead scoring model has already been generated!". For more models (one per product line, for example) create them with `POST /admin/lead-scoring` and set their rules with `PUT /v3/lead-scoring/{modelId}` ([Scoring models API](/docs/qualify/scoring-models/api)). --- ## 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, job titles or pages 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 your [scoring model](/docs/qualify/scoring-models) keeps every matching visitor out before they become a lead: a country, a company domain, an industry, a job title, a page on your site. Excluded visitors are never shown and never use a credit. **Only include** does the opposite: it keeps only the visitors that match. 1. **Qualify → open your model → find the criterion** (country, domain, industry, page visited…). 2. Choose **Exclude** and pick the values to leave out, or **Only include** to allow just those. 3. **Save** — it applies to new leads from now on. ### What you can exclude [#what-you-can-exclude] - **Your own company and your customers:** a **Company domain** rule with their domains (`acme.example`). Visits from you and your teammates are free anyway ([How credits are used](/docs/account/billing#how-credits-are-used)). - **Countries** you do not sell to. - **Industries** or **job titles** you never want. - **Pages:** a **Page visited** rule in exclude mode leaves out visitors who only saw, say, your careers or login pages. In include mode, only visitors of the listed pages become leads (track only your pricing and product pages, for example). A rule matches the part of the address you give: starts with, ends with, contains or does not contain `/careers`. - **One person:** from the Leads page, **⋮ → Block company / person** keeps them out ([Remove or block leads](/docs/leads/hide-delete)). For email campaigns there is a separate list: addresses that campaigns must never write to (your customers, people who asked not to be contacted). Your AI assistant or the API manage it ([MCP tab](/docs/qualify/exclusions/mcp), [API tab](/docs/qualify/exclusions/api)). ### Common questions [#common-questions] **Do excluded leads use credits?** No. A visitor your rules keep out is never shown and never charged. **Do exclusions remove the leads I already have?** No. They apply to new leads from the moment you save. To clean up existing leads, use [Re-qualify](/docs/qualify/requalify) or remove them from the Leads page ([Remove or block leads](/docs/leads/hide-delete)). **I excluded a domain by mistake.** Remove it from the rule and save: the domain is unblocked and its visitors become leads again. **Exclude or Penalize?** **Exclude** means never show them. A **Penalize** weight on a normal rule keeps the lead but lowers its score, so it sorts to the bottom. Use Penalize when you still want to see them. **Can I exclude people who are not in my ideal customer profile at all?** Yes: give the criteria that define your ICP (industry, company size, country) an **Only include** rule, and everyone else is left out. Fewer leads shown means fewer credits used. ### 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/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": ["jo@acme.example"] }` — campaigns on that website never send to those addresses. `csv` is the group name they are saved under (an empty string for one-off entries). ### Use case: Never count your own company or a competitor as a lead [#use-case-never-count-your-own-company-or-a-competitor-as-a-lead] `POST /v3/exclusions/domains` with `{ "websiteId": "…", "domain": "acme.example" }` blocks one company domain: its visitors are not identified and use no credits. `POST /admin/domain-blacklist` does the same under a named group (`csv`). `POST /admin/websites/blacklist` with `{ "websiteId": "…", "countryCode": ["DE", "FR"] }` blocks whole countries (two-letter codes; the list replaces the saved one). ### Use case: Track only your product pages [#use-case-track-only-your-product-pages] `PUT /v3/websites/{websiteId}/page-rules` with `{ "mode": "include", "rules": [{ "type": "starts-with", "url": "/pricing" }, { "type": "starts-with", "url": "/product" }] }` — only visitors of those pages become leads. `mode: "exclude"` leaves out pages such as `/careers` instead. Rule types: `starts-with`, `ends-with`, `contains`, `does-not-contain`. --- ## MCP — AI agents Source: /docs/qualify/exclusions/mcp Connect the [MCP server](/docs/mcp#quickstart), then just ask. ### Use case [#use-case] > Never show visitors from our customers acme.example and northwind.example as leads. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "csv": "customers", "domains": [ "acme.example", "northwind.example" ] } ``` Blocked domains never become leads and never use a credit. `csv` names the group they are saved under, so you can remove them together later; a group name that already exists on the website is refused, so your assistant picks a new one (or removes the group and adds it again with the full list). > Stop identifying visitors from Germany and France on this website. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "countryCodes": ["DE", "FR"] } ``` The list replaces the saved one, so your assistant reads `get_country_blacklist` first and sends the full list. > Don't count anyone who only visits our careers or login pages. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "mode": "exclude", "rules": [ { "type": "starts-with", "url": "/careers" }, { "type": "contains", "url": "/login" } ] } ``` `mode: "include"` does the opposite: only visitors of the listed pages become leads. > Never email our existing customers from any campaign. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "group": "customers", "emails": ["jo@acme.example", "sam@northwind.example"] } ``` This list is for campaigns only: the addresses can still appear as leads, but no campaign on this website writes to them. # 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 Your **ideal customer profile (ICP)** is who you sell to, in a few facts: industries, company size, revenue and locations, plus the domains and industries to leave out. In the dashboard you describe it with the rules of your [scoring model](/docs/qualify/scoring-models); the model turns it into the **ICP score** every lead gets. Platform also keeps a short, structured copy of the ICP for each website. Your AI assistant reads it to explain why a lead fits or not and to search for prospects that match, and in the EU and the EEA it decides which contact we suggest at an identified company ([which countries get the exact person](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person)). 1. **Read it** by asking your [AI assistant](/docs/qualify/icp/mcp) or with `GET /v3/icp` ([API](/docs/qualify/icp/api)). 2. **Change it** with `update_icp` or `PUT /v3/icp`: industries, sectors, locations, headcount and revenue ranges. Only the fields you send change. 3. For scoring with weights, pages visited and job titles, use [Scoring models](/docs/qualify/scoring-models); [AI Assist](/docs/qualify/ai-assist) can write them from your website. ### Common questions [#common-questions] **What is the ICP?** Your ideal customer profile: the type of company (and person) you want as a customer. Everything in Qualify compares leads with it. **Is the ICP the same as my scoring model?** Related, not the same. The scoring model is the full set of rules and weights that produce the score. The ICP record is the short summary your AI assistant reads; changing one does not change the other. **Where do I set it in the dashboard?** Build your scoring model under **Qualify**, or let **AI Assist** read your website and propose it. The structured ICP record is changed from your AI assistant or the API. **Does changing the ICP cost anything?** No. It only changes settings inside your account; no credits are used. **Why does the Leads page ask who I sell to (B2B or B2C)?** The Lead quality panel on the Leads page uses it to set a sensible minimum fit for your leads. It is separate from the ICP record described here. ### 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. ## Set it up, in order [#set-it-up-in-order] 1. **[Describe your ideal customer](/docs/qualify/icp):** industries, company size, revenue, locations. This is the ICP every score is measured against. 2. **[Build a scoring model](/docs/qualify/scoring-models)** with rules, or let **[AI Assist](/docs/qualify/ai-assist)** propose the rules from a description of your business. 3. **[Re-qualify the leads you already have](/docs/qualify/requalify)** so old leads get the new score too. 4. **[Exclude who you never want](/docs/qualify/exclusions):** competitors, your own company, countries you do not sell to, job titles that never buy. ## Common questions [#common-questions] **Does a low score delete a lead?** No. The score only decides the order and what your automations do. Only an Exclude rule keeps a lead out. [Exclude leads](/docs/qualify/exclusions). **Do I need a scoring model to get leads?** No. Leads arrive without one; a model just tells you which ones to call first and lets automations act on the good ones. **I changed my model. Are my old leads re-scored?** Not by themselves. Run [Re-qualify](/docs/qualify/requalify) once and every existing lead gets the new score. **Does Qualify stop when my trial ends or my credits run out?** No. Scoring and exclusions keep running on every plan; only new leads stop when there are no credits. # 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. The leads you already have keep their old score until you re-qualify them. 1. **Right after you save or publish a model**, the dashboard asks **Re-qualify existing leads?** Choose **Yes, re-qualify**, pick **Last 7 days**, **Last 30 days** or **Last 3 months**, and click **Re-qualify leads**. **No, new leads only** keeps the old scores. 2. **Any time later:** **Qualify → ⋯ on the model → Rescore recent leads** (the last 90 days). 3. **Make this the default** to choose which model's score the Leads table shows. ### Common questions [#common-questions] **Do changes apply to old leads?** Not by themselves. Rescore them with the steps above, and their ICP score, warm/hot band and sorting follow the new rules. **How far back can I rescore?** Up to the last 90 days (3 months) from the dashboard. Older leads keep their score. From the [API](/docs/qualify/requalify/api) or your [AI assistant](/docs/qualify/requalify/mcp) you can rescore any specific leads by id. **Does rescoring cost credits?** No lead credits. If your model has AI prompts, a lead that is missing an answer uses your plan's monthly AI qualification allowance; leads that already have every answer are rescored without AI. **Why did my leads' scores change?** Someone saved rule changes on a live model and re-qualified, or changed the default model (the Leads table shows the default model's score). Every rule change is recorded in the model's history. ### 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 (at least one; an empty list is refused). Leads are processed one by one, so send small batches. The answer has `processed`, `failed`, `aiSkipped` (leads rescored without any AI use because every AI prompt was already answered) and `updatedLeads[]` with each lead's new scores. --- ## 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. It is a list of rules: company size, industry, location, pages visited, job title and more, each with a weight. Every new lead is checked against the rules and gets a score from 0 to 100. The score is the **ICP score** you see on every lead, and it is what sorts your best leads to the top. 1. **Qualify → open a model** (or **+ New model**, or **Create your first model**). 2. **Add or change rules:** find a criterion, choose the values, set the weight from **Penalize** to **Very important**. 3. **Test a website** to see how any company would score, then **Save and Close**. ### How a rule works [#how-a-rule-works] Pick a criterion (for example *Industry*), then decide what it does: - **Score it:** leads that match gain points; the weight says how many. A negative weight (**Penalize**) takes points away. - **Only include:** only leads that match are kept; everyone else is left out. - **Exclude:** leads that match are left out before they come in ([Exclude leads](/docs/qualify/exclusions)). The **Live impact** panel on the right shows, for the last 30 days, how many leads were identified, how many passed your filters and how many were hot, so you see the effect before you save. ### Warm and hot [#warm-and-hot] Scores fall into bands: below warm, **warm** and **hot**. Warm starts at 40 and hot at 70 unless you change it under **Edit score bands** (**Reset to 40 / 70** brings the defaults back). Changing the bands only changes the labels; it never rescores leads. Your [automations](/docs/automations) can act on the band, for example "post hot leads to Slack". ### Draft, live, default [#draft-live-default] - A **draft** is saved but scores nothing yet. **Publish** makes it **live**. - The **default** model is the one whose score shows in the Leads table. Only a live model can be the default (**⋯ → Make this the default**). - **Archive** stops a model scoring at once; you can **Restore** it. **Duplicate** creates a draft copy to experiment with. New rules score new leads straight away. To apply them to the leads you already have, see [Re-qualify existing leads](/docs/qualify/requalify). ### Common questions [#common-questions] **Do I need a scoring model to get leads?** No. Visitors are identified and shown with or without one. A model adds the score that sorts them and that your automations can act on, and its Exclude rules keep out the leads you never want. **Does a low score delete the lead?** No. A low score only means a low ICP score; the lead stays in your list and is still charged a credit. Leads are kept out only by an **Exclude** or **Only include** rule, or by the Lead quality bar on the Leads page ([Remove or block leads](/docs/leads/hide-delete)), and those leads never use a credit. **Does qualifying cost credits?** Rules cost nothing. **AI prompts** (questions the AI answers about each lead) use your plan's monthly AI qualification allowance, not your lead credits; a lead that already has every answer is rescored without any AI use. **What makes a lead hot?** A score at or above your hot band (70 by default). Which rules get it there is up to you: a company in your target industry and size, on a pricing page, with a job title that buys from you, for example. **Can I have several models?** Yes, as many as you like, each with its own rules: one per product line or market. The default model is the one the Leads table shows. Names must be unique on a website. **What is the ICP?** Your ideal customer profile: who you sell to. In the dashboard you describe it with the rules of your scoring model; [Ideal customer profile](/docs/qualify/icp) explains the short version your AI assistant reads. **How do I test a model?** Click **Test a website**, type any company's domain and **Score it** to see how it would score. The calibration run scores 5 to 20 domains at once, good to check that your real customers come out hot. ### 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 (the logo in the sidebar takes you back to it) shows how the selected website is doing: how many leads were identified, how many of them fit your ideal customer, and who they are. 1. **The cards at the top:** your plan (trial end or next credit refresh), the tracking pixel (installed, last seen), leads identified this billing cycle and your average ICP score. 2. **Identify:** the **Website Identifications** chart, one bar per day for the last 30 days. 3. **Qualify:** the **ICP Match Rate** over the same 30 days, then **Top Industries**, **Company Sizes** and **Top Job Titles** of the people identified. ### Common questions [#common-questions] **How many of my visitors are identified?** The **Leads Identified** card counts the leads of this billing cycle; the **Website Identifications** chart shows them day by day for the last 30 days. Each person counts once, on the day of their latest visit. **Why is it fewer than my analytics tool shows?** An analytics tool counts every visit; we count people we could identify. In 174 countries that is the exact person; in the EU and the EEA, GDPR limits us to the company plus a suggested contact ([which countries get the exact person](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person)). Visitors your [Exclude rules](/docs/qualify/exclusions) keep out are not counted either. **What is the ICP match rate?** The share of identified leads that fit your ideal customer, according to your default [scoring model](/docs/qualify/scoring-models). Low? Make your rules match who you sell to, or let [AI Assist](/docs/qualify/ai-assist) propose them. **What is the Avg ICP Score?** The average score of your identified leads (0 to 100) from your default scoring model. Click the card to set your model up when you have none yet. **Can I see other dates, or export it?** The dashboard shows the last 30 days. For any date range, use the [API](/docs/websites/analytics/api) or ask your [AI assistant](/docs/websites/analytics/mcp); the [Leads page](/docs/leads/website-visitors/see-your-leads) has every lead and the [CSV export](/docs/leads/csv-export). ### 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" } ``` It answers with the top 10 industries, all company-size ranges, the top 10 job titles and the top 5 countries of the leads identified in the last 30 days, each with a count. For another period, your assistant passes `dateFrom` and `dateTo` together (for example `2026-10-01` and `2026-10-31`). > Show me leads per day for the last two weeks, with the average ICP score. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "dateFrom": "2026-10-17", "dateTo": "2026-10-31" } ``` One row per day, every day included even with 0: `leadsIdentified`, `avgIcpScore` and `leadsWithIcpScore`. A returning lead counts on the day of its latest visit. > My website is verified but I have had no leads for a week. Why? ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` The answer says in one line whether new leads are blocked and why (trial ended, no credits left, account paused), the credits the website can use, how many leads came in the last 48 hours and when the last one was created. If nothing is blocked and the pixel is verified, the site simply had no visitors we could identify in that time ([which countries get the exact person](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person)). # 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. ## Set it up, in order [#set-it-up-in-order] 1. **[Add the website](/docs/websites/websites)** with its address. You get a tracking snippet for it. 2. **[Install the pixel](/docs/websites/tracking-pixel)** with Google Tag Manager, the WordPress plugin or a line of HTML, on every page. 3. **Check it:** the website turns **verified** in the dashboard once it has seen the pixel. If it stays unverified, the pixel page explains what to check. 4. **[Read the analytics](/docs/websites/analytics):** visits, identified leads, ICP match rate and who your visitors are. ## Common questions [#common-questions] **Can I track more than one website?** Yes. Each website is added separately, with its own pixel, leads, settings and website key. Switch between them with the website switcher at the top of the dashboard. **Does the pixel slow my website down?** It loads after your page, like any analytics script, and is built to be small. [Install the tracking pixel](/docs/websites/tracking-pixel). **I installed it. Why no leads yet?** Give it a little traffic first; then check the website is verified and that your visitors come from countries we cover. The [pixel page](/docs/websites/tracking-pixel) has the checklist. # 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 tracking pixel is a few lines of code that go on your website. It is how Platform sees your visitors and turns them into leads. You install it once, on every page, and never touch it again. Open **Website Settings → Tracking Pixel** for the website you want to track and pick the method that matches how your website is built. 1. **Pick a method:** Google Tag Manager, WordPress or HTML. 2. **Install it** by following the steps for that method below. 3. **Verify** it: click **Verify my website**. The website turns **verified** when we see the code on your site. ### Method 1: Google Tag Manager [#method-1-google-tag-manager] Use this if your website already loads Google Tag Manager (a marketer or developer set it up). 1. Click **Google Tag Manager**. 2. Click **Continue with Google** and sign in with the Google account that owns your Tag Manager container. 3. We add the Platform tag to your container and publish it. Nothing to paste. 4. Back on the screen, click **Verify my website**. Want it out again later? The same screen shows **Google Tag Manager — installed** with an **Uninstall tracking pixel** button. ### Method 2: WordPress [#method-2-wordpress] The Platform plugin is in the official WordPress plugin directory. There is nothing to download from Platform. 1. In your WordPress admin, go to **Plugins → Add New**. 2. Search for **Platform**, click **Install Now**, then **Activate**. 3. Back in Platform, click **Verify my website**. The plugin adds the code to every page for you, so there is no snippet to paste. ### Method 3: HTML (any other website) [#method-3-html-any-other-website] Use this for Shopify, Webflow, Wix, Squarespace, HubSpot or any website where you (or your developer) can edit the code of the page. 1. Click **HTML (any other website)**. 2. Under **Where will you paste it?**, pick your platform, or click **Not sure? Detect it**. The steps on the screen then match your platform: where its code box is and how to save. 3. Click **Copy code** under **Your pixel code**. 4. Paste the code inside the `` of your website, in the place your platform uses for site-wide code (often called "custom code", "header code" or "code injection"). It must load on **every page**, so use a site-wide setting, not a single page. 5. Publish your website if your platform needs it, then click **Verify my website**. Not technical? Click **Not technical? Invite your web developer**, type their email and an optional message, and click **Send**: they get the code and the steps. After a verification attempt you can also click **Email these steps to a developer**. #### Where the code goes on each platform [#where-the-code-goes-on-each-platform] Paste the code exactly as copied, site-wide, then publish and **Verify**. | Platform | Where | |---|---| | Hand-coded HTML | Just before ``. If your pages share a header or template file, add it there once; otherwise add it to every page, then upload the files. | | BigCommerce | **Storefront → Script Manager → Create a Script.** Placement **Head**, Location **All pages**, Script category **Targeting**, Script type **Script**; paste the code and **Save**. | | Drupal | Easiest: the Google Tag Manager module, then [Method 1](#method-1-google-tag-manager). Or a head-script module such as **Header and Footer Scripts** (paste in **Header**), or just before `` in your theme's `html.html.twig` (Drupal 7: `html.tpl.php`). Then **Configuration → Performance → Clear all caches**. | | GoDaddy Website Builder | **Edit Website → Settings → Site-wide code**, paste it in the head box, then **Publish**. Use the site-wide setting, not an HTML section on one page: a section only covers the page it sits on. | | Joomla | Easiest: a header-code extension (paste it in its head / header field, then enable it). Or edit your template: **System → Site Templates** (Joomla 3: **Extensions → Templates**) → your template → `index.php`, just before ``. Then clear the Joomla cache. | | Magento | **Content → Design → Configuration**, edit your store view → **HTML Head → Scripts and Style Sheets**, paste, **Save Configuration**, then flush the cache (System → Cache Management). Magento 1: **System → Configuration → Design → HTML Head → Miscellaneous Scripts**. | | PrestaShop | Easiest: a header-code module (paste it in its header / `` field). Or, in your theme files, just before `` in `templates/_partials/head.tpl`. Then **Advanced Parameters → Performance → Clear cache**. | | Shopify | **Online Store → Themes → ⋯ → Edit code**, open `layout/theme.liquid`, paste just before `` and **Save**. | | Squarespace | **Settings → Developer Tools → Code Injection**, paste into **Header**, **Save**. Code Injection is not on Squarespace's Personal plan. | | Webflow | **Project Settings → Custom Code**, paste into **Head Code**, **Save**, then **Publish**: code only goes live after publishing. Site-wide custom code needs a paid Webflow site plan. | | Weebly | **Settings → SEO → Header Code**, paste, **Save**, then **Publish**. | | Wix | **Settings → Custom Code → + Add Custom Code**, paste, place it in **Head**, apply to **All pages**, **Apply**, then **Publish**. Custom Code needs a Premium Wix plan with a connected domain. | ### Check that it works [#check-that-it-works] Click **Verify my website**. We load the home page of the domain shown under **Website domain** and look for your code; we also count real visits from your site in the last 24 hours. - **Pixel verified:** the website is marked **verified**. Click **Continue**, or **Qualify Setup** to go straight to [scoring your leads](/docs/qualify/scoring-models). - **Pixel not found yet:** the screen shows what we found and what to check for your platform. Fix it, then click **Verify again**. Afterwards the **Tracking Pixel** card on your dashboard shows that it is installed and when it last saw a visit, and the website shows as **verified** in [Websites](/docs/websites/websites). A website shows **unverified** until we have seen the code, and **failed** when we looked and did not find it. From your AI assistant or your code, `verify_website` does the same check, and `get_website_diagnostics` explains why a verified website gets no leads ([MCP tab](/docs/websites/tracking-pixel/mcp), [API tab](/docs/websites/tracking-pixel/api)). ### Still unverified? [#still-unverified] Go through this list, then click **Verify again**: 1. **Is the domain right?** The check loads the domain under **Website domain**. If your site lives on `www.` or on another domain, click **Different domain? Change**. 2. **Is the change live?** Site builders and WordPress caching plugins often need you to **publish** or **clear the cache** before the new code is on the page. 3. **Is the code on the home page?** The check loads your home page. Code pasted into a single page or a blog template is not enough: it must be in a site-wide setting. 4. **Is it the whole code?** Click **Copy code again** and paste it once more; a partly pasted snippet is not recognised. 5. **Google Tag Manager:** make sure the container that got the tag is the one your website loads, and that it is published. If visitors are already reaching your site, the check also passes from their visits in the last 24 hours, even before we find the code on the page. Still stuck? Click **Need a hand? Ask the assistant** on the screen, or **Email these steps to a developer**. ### Pass your own data [#pass-your-own-data] Attach your own value to each visitor (a session key, Google Analytics ID, user or CRM ID) by setting it **before** the pixel loads: ```js window.trackingExtraInfo = { sessionKey: 'abc123', userId: 'u_42' }; // or a plain string ``` It comes back as `customData` in [webhooks](/docs/automations/webhook) (an object arrives as JSON text: parse it), as `platformExtraInfo` on the lead in the API, and as the **Custom Data** column in CSV exports. It is not returned over MCP. If the value contains an email address, the pixel also uses it to identify the visitor. Run `window.trackingTestExtraInfo()` in the browser console to create a test lead with your current value. ### Consent banners and GPC [#consent-banners-and-gpc] - **With a consent manager** (OneTrust, Cookiebot, CookieYes, Complianz…), put the pixel in the **marketing** ("sale or share") category. It then loads only for visitors who allow it, and most consent managers also hold it back for browsers that send the Global Privacy Control (GPC) signal. The pixel does not read GPC itself. - **Where to put it in each tool** (never in Essential / Strictly necessary or Functional): - *OneTrust:* the Targeting Cookies group (C0004), or set the tag to `type="text/plain"` with `class="optanon-category-C0004"`. - *Cookiebot:* set the tag to `type="text/plain"` and add `data-cookieconsent="marketing"`. - *CookieYes:* add `data-cookieyes="cookieyes-advertisement"` to the tag. - *Complianz (WordPress):* Integrations → Script Center → add the pixel → Marketing. - *Google Tag Manager with Consent Mode:* the pixel's tag → Advanced Settings → Consent Settings → **Require additional consent for tag to fire** → `ad_storage`. - *Wix:* Settings → Custom Code → the pixel's code → Code type → Marketing. - **Check it:** in a private window accept all cookies, browse two pages, then **Verify** the website. No leads at all afterwards usually means the pixel is blocked for everyone: check the category. - **Without one, on Google Tag Manager:** add a Custom JavaScript variable that returns `navigator.globalPrivacyControl === true` and use it as an exception on the pixel's trigger. - Visitors who decline or ignore the banner are not identified, so expect fewer leads than without a banner. ### Common questions [#common-questions] **Does the pixel slow my website down?** No. The code is marked `defer`, so the browser loads it after your page has shown, and visitors never wait for it. **Do I need it on every page?** Yes. A visitor who only opens a page without the code is never seen. Google Tag Manager and the WordPress plugin cover every page for you; with HTML, use your platform's site-wide code setting. **The pixel is verified but I see no leads.** Give it a little traffic first, and check that your visitors come from [countries we cover](/docs/leads/website-visitors/see-your-leads#which-countries-get-the-exact-person). Then check that nothing stops new leads: an ended trial, no credits left or a paused plan ([what happens when my trial ends](/docs/account/trials-and-codes#when-your-trial-ends), [when your leads run out](/docs/account/billing#when-your-leads-run-out)). Your Qualify rules can also keep leads out on purpose ([Exclude leads](/docs/qualify/exclusions)). **I moved to a new website or domain.** Install the same code on the new site, then change the domain under **Different domain? Change** and verify again. Each website in Platform has its own code: use the one from that website's screen. **Can I turn the pixel off?** Yes. Remove the code (or the plugin, or the Tag Manager tag) and visitors are no longer identified. [Deleting the website](/docs/websites/websites) also stops tracking. ### 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 `trackingScript` (the code to put on every page), `clientId`, `status` and `url`. Once the code is live, `POST /utilities/verify-website` with `{ "id": "", "websiteURL": "acme.example" }` loads that page and looks for the code; it also counts real visits from the site in the last 24 hours. The answer is `{ "verified": true, "verificationMethod": "script" }` (or `"recent-activity"` when visits proved it). On success the website's `status` becomes `verified`; otherwise it stays `unverified` (or becomes `removed` if it was verified before) and the answer says what to check. ### Use case: Switch a tracking option for every website [#use-case-switch-a-tracking-option-for-every-website] `PUT /v3/account/tracking-settings` turns `trackExactVisitors`, `trackCompanyWithSuggestedContacts`, `trackPersonalEmails` or `sessionRecordingEnabled` on or off for all websites of the account at once. For one website only, use `PUT /admin/websites/{id}` ([Websites API](/docs/websites/websites/api)). --- ## 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" } ``` Your assistant finds the `websiteId` with `list_websites` first, hands you the code to put on every page, then runs the check: ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` It loads your website's home page (the `url` saved on the website) and looks for the code. When found, the website is marked **verified**. An empty answer means the code was not on the page, the page could not be loaded, or the website has no `url` yet; your assistant sets it with `update_website` and tries again. > My website is verified but I get no leads. Why? Your assistant calls `get_website_diagnostics` ([Website analytics](/docs/websites/analytics/mcp)): it answers in one line whether new leads are blocked and why (trial ended, no credits left, account paused), how many leads came in the last 48 hours and when the last one was created. > Stop identifying people with personal email addresses on all my websites. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "trackPersonalEmails": false } ``` This applies to every website of the account at once. Your assistant confirms with you first, because it changes which leads are created. # Websites > Add, edit and remove the websites you track, and share your plan's leads between 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/websites/websites A website in Platform is one site you track. Each one gets its own tracking pixel, its own leads, its own Qualify rules and settings. The website you are looking at is shown at the top of the sidebar; the **website switcher** there moves you to another one. 1. **Websites → Add new website.** Give it a name (you can change it later). 2. **Install its pixel** on that site ([Install the tracking pixel](/docs/websites/tracking-pixel)). Until then the website shows as **unverified**. 3. **Quick edit** a website (click its row) to see its plan, credits and pixel, copy its code, add a tag or open **All website settings**. ### The Websites list [#the-websites-list] Every website you have, with its tracking status, plan and credits. Search by domain, sort, or use the filters at the top: **Trial ending**, **Low credits**, **Pixel not installed**. Tags (a client name, a market) group websites; click a tag to filter by it. - **Switch to this website** opens it in the dashboard; the star in the website switcher makes one your default. - **Quick edit** shows and changes the basics without leaving the list. - **Website settings** opens everything: the pixel, visitor tracking, limits, date and time, and the delete section. ### Common questions [#common-questions] **Can I track more than one website?** Yes. Every website gets its own pixel and its own leads. On a trial or a paid plan you add as many websites as you need; a lifetime deal gives one website per code ([Lifetime deal codes](/docs/account/trials-and-codes#lifetime-deal-codes)). **Do my websites share credits?** By default, yes: all websites draw on the account's leads. To ring-fence one (for example a client's site), open its **Website settings → Website Limits** and choose **Give it its own limit**: how many leads it may use per month, or for its trial, and when it refills. **Share account credits** puts it back on the shared pool. **How do I switch between websites?** Click the website name at the top of the sidebar and pick another one, or use **Switch to this website** in the Websites list. Leads, Qualify and settings always show the website you have selected. **How do I rename a website?** Click its row, change the name in Quick edit and **Save changes**. The name is for you only; it does not change the pixel. **What happens when I delete a website?** Tracking stops, its leads are no longer shown and its place on your plan is freed. It cannot be restored, so copy or export what you need first ([Export leads](/docs/leads/csv-export)). Only a teammate with the delete-websites permission can do it ([Team members](/docs/account/team)). **Why is a website unverified?** We have not seen its pixel yet. [Install the tracking pixel](/docs/websites/tracking-pixel#still-unverified) has the checklist. ### 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` (and `domain` if you know it) returns the new website's id. Then `GET /v3/websites/{websiteId}/pixel` gives the code to put on the client's site, and `POST /utilities/verify-website` checks it is live ([tracking pixel API](/docs/websites/tracking-pixel/api)). A new website uses one of your plan's website places; when none are left the call is refused with "You cannot add more websites, please upgrade". ### Use case: One plan, several clients [#use-case-one-plan-several-clients] `PUT /v3/websites/{websiteId}/limits` with `{ "credits": 300, "emailAccounts": 2 }` caps what one website may use of the account's leads and mailboxes each cycle; `"resetCredits": true` refills it to the full allowance now (when a client pays). `PATCH /admin/websites/{id}/tags` labels websites by client or market. --- ## 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 {} ``` Each website comes back with its `_id` (the `websiteId` every other tool needs), name, url, status (`unverified`, `verified`, `removed` or `failed`), credits and tags. > Add a website for our new client, northwind.example, and give me its pixel code. ```json { "name": "Northwind marketing site" } ``` Your assistant confirms with you first, because a new website uses one of your plan's website places. It then sets the address with `update_website` (`url: "https://www.northwind.example"`), fetches the code with `get_tracking_pixel` and, once the code is on the site, checks it with `verify_website` ([Install the tracking pixel](/docs/websites/tracking-pixel/mcp)). > Let the Northwind website use at most 300 leads a month and connect 2 mailboxes. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "credits": 300, "emailAccounts": 2 } ``` For accounts that share one plan between several websites (one per client, for example). The credits cannot go above what the account has left; add `"resetCredits": true` to refill the website to its full allowance now. > Tag the Northwind website "client" and "retail". ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9", "tags": ["client", "retail"] } ``` The list you send replaces the website's tags. > Delete the old staging website. ```json { "websiteId": "64b7f0a1c2d3e4f5a6b7c8d9" } ``` Your assistant names the website and asks you to confirm: tracking stops, its leads are no longer shown and it cannot be restored.