- Brand
- Expandi
- Category
- Sales & CRM
- Primary Subcategory
- Sales Engagement & Outreach Automation
Integration details
Description
Expandi is the go-to-market platform sales teams use to turn buying signals into relevant conversations, on LinkedIn and email. This connector lets the AI you already use work inside your own Expandi account: describe an audience and it builds the lead list; give it a goal and it drafts the whole campaign, steps, timing and copy; enrich leads, move them across campaigns, and ask why a campaign stalled and get the reason. You stay in control. Campaigns build as drafts you activate, replies draft for your approval, and the connector never sends a message or activates a campaign on its own. It works within the limits, warm-up and permissions you've already set in Expandi.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Sales Engagement & Outreach Automation
- Secondary Subcategories
- None listed
- Brand
- Expandi
- Access
- Account required
- First tracked
- 2026-10-30
- Tool count
- 73
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Expandi
Get updates when Expandi’s Discoverability Score or category rank changes.
Competing in ChatGPT Sales Engagement & Outreach Automation
View Category73 tools agents can invoke
Add leads to a campaign inside the user's outreach account by LinkedIn profile_link, each with optional placeholder key/values. Same-account duplicates are skipped. Enforces the 5000-lead campaign limit and returns per-lead added/skipped results. Sending happens later under the user's limits in the outreach platform. Input: leads = [{profile_link, placeholders?}]. To resolve inputs from names: find_campaign (campaign_instance_id), find_lead (profile_link).
campaign_add_leads
Add leads to a custom lead list inside the user's outreach account by LinkedIn profile_link, each with optional placeholder key/values (enrichment on add). Existing messengers are reused (dedup via profile_link); no duplicates. Enforces the 5000-lead list limit. If the list is auto-assigned to campaigns, new leads flow into them automatically. Sending happens later under the user's limits in the outreach platform. Input: leads = [{profile_link, placeholders?}]. To resolve inputs from names: find_custom_list (list_id), find_lead (profile_link).
audience_add_leads
Assign one or more existing tags (by name) to a lead's contact by profile_link. Tags are matched against the account company's existing tags and are NEVER created -- names that do not exist are returned under 'rejected'. Idempotent: names already on the contact are returned under 'already_present'. To discover valid names: list_contact_tags. To resolve inputs from names: find_linkedin_account (li_account_id), find_lead (profile_link).
leads_add_tags
Rank an account's campaigns by a metric (acceptance_rate, reply_rate, or conversion_rate), best first. Rates are derived from cached stats. To resolve inputs from names: find_linkedin_account (li_account_id).
analytics_compare_campaigns
Configure auto-assign on a lead list of any type: link it to a campaign so leads added to the list are automatically assigned to that campaign. The campaign must be on the same LinkedIn account. Multiple lists can feed the same campaign. To resolve inputs from names: find_custom_list (list_id), find_campaign (campaign_instance_id).
audience_configure_autoassign
Create a Builder (advanced flow) campaign draft (inactive) for a LinkedIn account. Optionally start from an advanced template (template_id -- call find_campaign_template to resolve it from a name) and/or set a campaign goal ({target, value_proposition, goal}). The draft is created inactive; a human must review and activate it; nothing is sent until activation. To resolve inputs from names: find_linkedin_account (li_account_id).
builder_create
Create a custom lead list (MCP-managed) for a LinkedIn account. The list can later be assigned to campaigns like any other lead list. Optionally record the selection `criteria` the list represents (e.g. {"title": "QA Lead", "city": "Lviv"}) so later audits can see why the list exists; the criteria are stored on the list and returned by the audience read tools. To resolve inputs from names: find_linkedin_account (li_account_id).
audience_create_list
Creates a draft reply and saves it in the user's own outreach platfrom inbox for human review. This tools does not send, publish or transmit any message, and does not contact the recipient or any external service. It only stores draft text inside the user's outreach account. Sending is a separate, manual action the user performs later in the outreach platform. Use it to prepare a suggested response the user will review, edit, and approve.You can only create draft messages to new contacts or contacts. Draft messages are flagged as API-sent and are subject to LinkedIn safety limits + queueing. To pick a valid contact_status filter value: list_contact_statuses. To resolve inputs from names: find_linkedin_account (li_account_id), find_lead (profile_link).
inbox_draft_reply
Create an outbound webhook on a LinkedIn account to automate actions. Required: name, event, target (URL). Optional: campaign_instance_id (omit to apply to any campaign), schedule_hours (omit for instant delivery, or 1/4/8/12/24 for scheduled bulk delivery), active (defaults false, matching the dashboard -- enable it explicitly to start firing). Event-specific requirements: the 'Contact tagged' event requires tags=[...] (existing tag names), and the 'Contact interest status changed' event requires interest_status; the 'Contact added to campaign' event returns a high-volume warning. After creating, use webhook_preview_payload / webhook_test to verify. Webhooks cannot be deleted via the agent -- only from the dashboard. To resolve inputs from names: find_linkedin_account (li_account_id), find_campaign (campaign_instance_id). To pick an event: list_webhook_events; interest_status: list_webhook_interest_statuses; tags: list_contact_tags.
webhook_create
Delete a custom lead list. Only custom (MCP-managed) lead lists can be deleted. To resolve inputs from names: find_custom_list (list_id).
audience_delete_list
Delete (remove) a single lead from a campaign by profile_link. This is destructive: it removes the lead from the campaign and cancels its queued/future actions. Always confirm with the user before calling. To undo an accidental removal, call campaign_add_leads with the same profile_link to re-add the lead to the campaign. To transfer a lead between campaigns, combine the two tools: campaign_delete_lead on the source campaign, then campaign_add_leads on the destination campaign. To resolve inputs from names: find_campaign (campaign_instance_id), find_lead (profile_link).
campaign_delete_lead
Diagnose why a campaign may not be executing as expected. Returns an attributed picture: account status, whether disconnected/restricted, whether a daily limit is reached, how many leads are available, and a failure breakdown by reason (each reason includes the count and the affected leads). To resolve inputs from names: find_campaign (campaign_instance_id).
reliability_diagnose_gap
Recovery: raise a structured 'human action required' escalation (e.g. reconnect account, clear restriction). This does not change anything -- it surfaces the one thing the AI cannot fix itself for human review and action. To resolve inputs from names: find_linkedin_account (li_account_id).
reliability_escalate
Find LinkedIn accounts you can access by name or login email (partial match). If no query is provided, returns all accessible LinkedIn accounts.Use this to resolve an li_account_id when you only have a name/email; feed the returned li_account_id into the other tools. Each result also includes the workspace_id and workspace_name of the workspace the account belongs to (both null when the account is not in a workspace), so you can tell which workspace a LinkedIn account lives under.
find_linkedin_account
Find campaigns by name (partial match). Optionally narrow to a single li_account_id, active status, and/or campaign_type. If no query is provided, returns all accessible campaigns. Use this to resolve a campaign_instance_id from a campaign name. To resolve the optional li_account_id from a name: find_linkedin_account. To resolve the optional campaign_type code: list_campaign_types.
find_campaign
Find campaign templates you can access by name (partial match). This includes your own templates, templates in workspaces or companies you can access, templates of any reseller you own, published marketplace templates of the reseller you belong to, and templates shared with you. If no query is provided, returns all accessible templates. Use this to resolve a template_id for builder_create. advanced_only defaults to true so only Builder-compatible (advanced flow) templates -- the ones builder_create accepts -- are returned; set it false to see all.
find_campaign_template
Find leads on a LinkedIn account by name, email, company, job title, or profile URL (partial match for text, exact for email/profile URL). Ensure a query is always present. Returns lightweight rows with the profile_link to feed into leads_get, inbox_get_messages, campaign_add_leads, etc. To resolve the li_account_id from a name: find_linkedin_account.
find_lead
Find lead lists by name (partial match) across all list types. Optionally narrow to a single li_account_id. If no query is provided, returns all accessible lead lists. Each result includes its search_type. Use this to resolve a list_id from a list name. To resolve the optional li_account_id from a name: find_linkedin_account.
find_custom_list
Find webhooks by name (partial match) across accessible accounts. Optionally narrow to a single li_account_id. If no query is provided, returns all accessible webhooks. Use this to resolve a webhook_id from a webhook name before calling webhook_update / webhook_test / webhook_preview_payload / webhook_history. To resolve the optional li_account_id from a name: find_linkedin_account.
find_webhook
Find workspaces you can access by name (partial match). If no query is provided, returns all accessible workspaces. Each result includes li_account_count (how many LinkedIn accounts you can access in that workspace). Use this to resolve a workspace_id for the shared-signal tools (signals_list, signals_for_lead, signals_related_accounts).
find_workspace
Get the account KPI trend timeseries for a metric type over an optional date range (start_date/end_date as YYYY-MM-DD). Data comes from the daily KPI rollup. To resolve inputs from names: find_linkedin_account (li_account_id). To pick a valid metric_type: analytics_list_kpi_metrics.
analytics_kpi_trend
Get account health for a LinkedIn account: connection/sync status, session validity, last successful sync timestamps, and active-campaign count. To resolve inputs from names: find_linkedin_account (li_account_id).
reliability_account_health
Get a Builder (advanced flow) campaign's current flow: campaign goal, entry node, all nodes with their wiring and copy, plus validation (entry set, node-count limits). If you only have a campaign name, call find_campaign first to resolve the campaign_instance_id. RETURNS an object: {campaign_instance_id, name, active, li_account_id, campaign_goal ({target, value_proposition, goal}, or null if unset), first_action_id (the entry node's id), nodes (the step list), validation ({valid, issues, node_count})}. HOW TO READ EACH NODE: 'id' is the node's handle used in the wiring fields. 'action_type' is the human label and 'action_type_code' is the raw int (matches builder_action_types), e.g. 1 = Message, 9 = Condition. 'task_type' + 'task_type_label' are the resolved runtime queue task (matches builder_task_types), which disambiguates a Message into its concrete step (e.g. 'cr' = Connection Request, 'oi' = Open InMail, 'im' = Paid InMail, 'mr' = Mobile Connection Request, 'm' = Follow-Up Message); null for Signal nodes. 'condition_type_code' + 'condition_type_label' are set ONLY on Condition nodes (action_type_code 9) and tell you which branch check it performs (matches builder_condition_types, e.g. 1 = Condition connected, 8 = Condition email exists); both are null on non-condition nodes. A Message node (action_type_code 1) is further specialised by its boolean flags: 'flag_connector' = Connection Request, 'flag_mobile' = Mobile Connection Request, 'flag_open_inmail' = Open InMail, 'flag_inmail' = Paid InMail; a Message with none of these set is a Follow-Up Message. 'message_subtype' gives that specific name directly (null on non-message nodes). 'config' holds the node's type-specific configuration (null when a node has none, e.g. Visit/Follow): Condition -> {condition_type, condition_type_label, check_time_delta, check_time_delta_label} (the branch check plus how long it polls before the not-met branch; see builder_time_deltas). Signal (action_type_code 21) -> {rule, company_url, post_urls, post_engagement_criteria, keywords}: 'rule' is a boolean expression over signal-type codes (1 profile-visited, 2 company-visited, 3 post-engagement) joined by and/or/not; company_url applies to company signals, post_urls/post_engagement_criteria/keywords to post-engagement signals. Custom Condition (10) -> {branches:[{position, rules, following_action_id}]}: each branch's 'rules' maps checks to 0/1 (checks within a branch are ANDed), branches are evaluated in 'position' order, and 'following_action_id' is that branch's destination. ICP Filter (19) -> {branches:[{position, criteria, no_path, following_action_id}]}: 'criteria' filters on company/role attributes (location/industry/company_size/job_title and excl_* variants), 'no_path' marks the catch-all branch, 'following_action_id' the destination. Webhook (13) -> {url} (destination; credentials and the query string are redacted). Integration (18) -> {integration_type, integration_type_label, integration_source} (the selected tool and its destination, e.g. the Smartlead campaign). Transfer (20) -> {campaign_instance_id, campaign_instance_name} (the target campaign). Add Tags (17) -> {tags:[{id, name}]}. Event Invite (12) -> {event:{id, name, entity_urn, url}} (or {event:null} if unset). Company Follow Invite (15) -> {company_url} (the target company page). 'time_delta' is the raw delay code and 'time_delta_label' its human label (matches builder_time_deltas), e.g. 'c_a01' immediately, 'd01' 1 day. 'body' is the message copy ('subject' the email/InMail subject line); when 'is_using_ai' is true the body/subject are AI-generated per lead at send time from 'ai_prompt'. WIRING: 'following_action_id' is the id of the next step; on a Condition node it is the condition-met (true) branch, while 'no_following_action_id' is the not-met (false) branch. Either may be null where a branch ends. For the full step semantics and sequencing rules, read the MCP resource guide://builder/actions.
builder_get
Get details for a single campaign (name, type, status, lead count, assigned lead lists). If you only have a campaign name, call find_campaign first to resolve the campaign_instance_id.
campaign_get
Get a campaign's per-step funnel (lead counts per node) to see drop-off. May be empty where step counts have not been computed. To resolve inputs from names: find_campaign (campaign_instance_id).
analytics_funnel
Get a campaign's performance: raw volume counts plus derived acceptance, reply, and conversion rates, with the stats_datetime freshness timestamp. Rates are computed from the cached stats (which can lag live state). To resolve inputs from names: find_campaign (campaign_instance_id).
analytics_campaign_performance
Get a campaign's runway: leads remaining, leads stuck on a failure, recent daily pace, and a projected time-to-empty (pace and runway are computed, not stored). To resolve inputs from names: find_campaign (campaign_instance_id).
reliability_campaign_runway
Get full context for a conversation: the lead (contact + messenger + placeholders, same shape as the lead-read tools), current campaign, and recent thread history. To resolve inputs from names: find_linkedin_account (li_account_id), find_lead (profile_link).
inbox_get_context
Get recent messages in a conversation (by profile_link), most recent first, excluding queued/failed messages. Also reports the lead's current active campaign. To resolve inputs from names: find_linkedin_account (li_account_id), find_lead (profile_link).
inbox_get_messages
Get details of a custom lead list (name, lead count, created date, assigned campaigns). If you only have a list name, call find_custom_list first to resolve the list_id.
audience_get_list
Get a single lead by LinkedIn profile_link for a LinkedIn account. Returns the contact (LinkedIn-sourced), messenger relationship state, and dynamic placeholders. To resolve inputs from names: find_linkedin_account (li_account_id), find_lead (profile_link).
leads_get
Get a lead's status in a campaign (current status, last action executed, whether a next action is scheduled, and the failure reason if any). To resolve inputs from names: find_campaign (campaign_instance_id), find_lead (profile_link).
campaign_get_lead_status
Get per-action daily-limit headroom for a LinkedIn account: consumed vs cap and remaining for each action type, plus the warmup ramp bounds. To resolve inputs from names: find_linkedin_account (li_account_id).
reliability_limit_headroom
Get restriction/cooldown state for a LinkedIn account (temporary restriction, fuse limit, cooldown/warmup). To resolve inputs from names: find_linkedin_account (li_account_id).
reliability_restriction_state
List the LinkedIn accounts linked to one lead via shared signals in a workspace -- i.e. which of your accounts in that workspace have a signal with this lead. Identify the lead by profile_link or contact_id and resolve the workspace_id with find_workspace. Returns distinct accounts (li_account_id + name). Paginated with limit (max 100) + offset; `next_offset` is null when exhausted. To resolve inputs: find_workspace (workspace_id), find_lead (profile_link).
signals_related_accounts
Get the shared-signal timeline for one lead across a workspace (every account you can access in it), newest first. Identify the lead by profile_link or contact_id and resolve the workspace_id with find_workspace. Each timeline row carries sent_or_received_at (date & hour), the li_account that produced it, the signal type, status (Sent/Received), the lead_name, and the company_name. Paginated with limit (max 100) + offset; `next_offset` is null when exhausted. To resolve inputs: find_workspace (workspace_id), find_lead (profile_link).
signals_for_lead
List every KPI metric_type accepted by analytics_kpi_trend, with its human label and category (connection_metrics, messaging_metrics, or engagement_metrics). Call this to pick a valid metric_type before requesting a trend.
analytics_list_kpi_metrics
List the action_type codes the builder supports, each with its human label (e.g. 1 = Message, 9 = Condition). Call this to pick a valid action_type for builder_add_node.
builder_action_types
List the condition_type codes with their human labels (e.g. 1 = Condition connected, 6 = Condition open inmail, 8 = Condition email exists). A condition_type qualifies a Condition node (action_type 9); it selects which branch check the node performs. Call this to pick a valid condition_type when adding a Condition node with builder_add_node.
builder_condition_types
List the required-upstream prerequisites per builder node. For each node you can add (an action keyed by its queue task_type, or a condition keyed by its condition_type), 'requires_upstream' is the ordered list of conditions/actions that must already exist above it on the flow -- the builder auto-prepends any that are missing. Condition prerequisites carry an 'expected' branch (true = condition-met/following_action branch, false = no_following_action branch); action prerequisites have no branch. 'satisfied_by' lists alternative upstream nodes that also satisfy the prerequisite. When an action node carries a 'flag', that boolean MUST be set to true on the node: for MESSAGE steps the flag also produces the task_type (e.g. flag_connector -> 'cr', flag_open_inmail -> 'oi', flag_inmail -> 'im'), while a Mobile Connection Request (task 'mr') requires 'flag_mobile' to be set so the step is treated as a mobile connection request. Conditions use task_type 'c' + condition_type. Use this to order builder_add_node calls into a valid flow. Nodes absent from this list have no upstream prerequisite. See builder_task_types and builder_condition_types for the full code lists.
builder_prerequisites
List the valid time_delta codes with their human labels (e.g. 'c_a01' immediately, 'd01' 1 day, 'f01' 1 week). Call this to pick a valid time_delta for builder_add_node or builder_set_delay.
builder_time_deltas
List the campaign_type codes with their human labels (e.g. 1 = connector campaign, 2 = messenger campaign, 3 = advanced campaign). Call this to pick a valid campaign_type to filter find_campaign.
list_campaign_types
List the campaigns for a LinkedIn account (name, type, active status, lead count). To resolve inputs from names: find_linkedin_account (li_account_id).
campaign_list
List the contact_status codes with their human labels (e.g. 11 = Searched, 1 = Contact, 2 = New Contact, 3 = Connect Requested, 4 = Disconnected, 21 = Imported, 34 = Revoked). Call this to pick a valid contact_status value before passing it to another tool (e.g. the contact_status filter of leads_list).
list_contact_statuses
List the existing contact tags available on a LinkedIn account (scoped to the account's company). Returns each tag's id, name, and colors. Use this to pick a valid tag name before calling leads_add_tags / leads_remove_tags -- those tools only accept tags that already exist and never create new ones. To resolve inputs from names: find_linkedin_account (li_account_id).
list_contact_tags
List the influencer profiles attached to a LinkedIn account for content scraping, with the last time each was reloaded (null if never scraped yet). To resolve the li_account_id from a name: find_linkedin_account.
content_list_influencers
List the keywords attached to a LinkedIn account for content scraping, with the last time each was reloaded (null if never scraped yet). To resolve the li_account_id from a name: find_linkedin_account.
content_list_keywords
List inbox conversations for a LinkedIn account, most recent first. Set unread_only=true to surface only conversations with new messages. Set retrieve_also_not_in_campaign=true to also include leads that are not part of a campaign; note the results are then not ordered (defaults to false). To resolve inputs from names: find_linkedin_account (li_account_id).
inbox_list_conversations
List a campaign's lead failures grouped by attributed failure reason. Each reason includes the failure count and the affected leads (contact + messenger + placeholder data, same shape as webhooks). To resolve inputs from names: find_campaign (campaign_instance_id).
reliability_list_failures
List the leads in a lead list of any type (custom, LinkedIn search, Sales Nav, CSV import, etc.). Returns the same contact + messenger + placeholder payload as the lead-read tools. To resolve inputs from names: find_custom_list (list_id).
audience_list_leads
Expandi ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Expandi's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Expandi alternatives on ChatGPT?
As of 2026-10-30, Expandi competes with Outreach, ACA, Amplemarket, BoothIQ, Business Follow-up Assistant, Crono, FirstTouch, Hobbes and 24 more in ChatGPT Sales Engagement & Outreach Automation, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.