Docs · Integration

Connect HubSpot to LinkedIn outreach

Two outbound events, a read API and roughly forty lines of glue on your side. This page documents what actually ships, so you can decide before you build.

Updated 2026-09-10 · REST v1 · 65 MCP tools

What this integration is

It is a webhook-and-API integration, not a marketplace app. TopClozer pushes two events as they happen and answers questions about leads, campaigns, senders and the inbox over HTTP; you own the handler that turns those into HubSpot records. If you were expecting a Connect button and an OAuth screen, stop here — there isn't one, and the rest of this page explains what to build instead.

Read this before you scope the work

Nothing moves between TopClozer and HubSpot without code you write or an automation platform you configure. Budget an afternoon, not a click. What you get for it is a loop nobody has to maintain by hand: a reply on LinkedIn lands on the HubSpot contact within seconds of arriving.

The two events

These are the only events the engine emits today. Both fire from the inbound sync that reconciles real LinkedIn activity — an accept or an inbound message — back into the workspace, so an event means the thing happened, not that the product predicted it.

EventFires whenTypical HubSpot write
connection.acceptedA lead we invited became a 1st-degree connectionAdvance a lifecycle stage, or log a timeline event on the contact
message.receivedA lead sent an inbound message; the reply text is in the payloadWrite the reply onto the contact timeline and create a task for the owner

The reply payload — the one worth building against first:

message.received
{
  "event": "message.received",
  "at": 1789084800000,
  "data": {
    "lead":   { "id": "led_88b1", "name": "Dana Whitfield" },
    "text":   "Happy to chat Thursday.",
    "sender": "Ambassador · sender 02"
  }
}

And the accept, which carries no text:

connection.accepted
{
  "event": "connection.accepted",
  "at": 1789081200000,
  "data": {
    "lead":   { "id": "led_88b1", "name": "Dana Whitfield" },
    "sender": "Ambassador · sender 02"
  }
}

Wire it up

Four steps. The first two are in the app; the third is yours; the fourth is the part people forget.

  1. 01

    Mint a workspace key

    Developer → Create a key. The same tcz_live_ key authenticates the REST API and the MCP endpoint. It is shown once and stored as a hash.

  2. 02

    Register your endpoint

    Settings → Webhooks → Add endpoint. Both events are attached to the URL you add, and every delivery is recorded in the workspace log so you can see failures.

  3. 03

    Write the handler

    Receive the POST, resolve the lead over the REST API, then create or update the HubSpot contact and write a timeline event. Zapier, Make or n8n will hold this shape too if you would rather not host it.

  4. 04

    Make it idempotent

    A delivery is one best-effort POST with no retry, and workspace state is persisted at the end of a sync pass — so a pass that dies midway can re-emit an event you have already handled. Key your HubSpot writes on the lead id plus the event timestamp.

endpoint
# Settings → Webhooks → Add endpoint
# Both events are registered on the endpoint you add.

POST https://hooks.your-service.example/topclozer
x-topclozer-event: message.received
Content-Type: application/json

Reading context back

The payload is deliberately thin. Everything else you need for a good HubSpot record is one authenticated GET away, using the same key.

rest
# Resolve the lead the webhook named — profile URL, company,
# headline, status — then match it to a HubSpot contact on your side.
curl -s https://topclozer.com/api/v1/leads \
  -H "Authorization: Bearer tcz_live_YOUR_KEY"

# Campaign attribution: name, status and the funnel counters.
curl -s https://topclozer.com/api/v1/campaigns \
  -H "Authorization: Bearer tcz_live_YOUR_KEY"

/api/v1/accounts and /api/v1/inbox round out the surface — senders, and the full conversation thread if you want the whole exchange on the timeline rather than the latest message. The same objects are described from the protocol side in the tool reference.

Doing it from an agent

If the thing consuming this is a model rather than a cron job, skip the REST client: the same workspace is exposed over MCP, and an agent that already has HubSpot tools can read one side and write the other without you hosting anything.

mcp
curl -s https://topclozer.com/api/mcp \
  -H "Authorization: Bearer tcz_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"get_inbox","arguments":{}}}'

The agent cannot send on its own

Of the 65 tools, 46 read and 19 write (the 15 propose_* tools, which queue an action for a person to approve, and connect_linkedin_account, add_do_not_contact, pause_campaign and install_product, which change only this workspace). An agent can summarise the inbox, attribute a reply to a campaign and stop a sequence that is going badly. It cannot send a LinkedIn message on its own — it can propose one, and a person approves it — and it cannot create a campaign or import leads.

What it does not do

Four limits, stated here rather than discovered in week two.

No OAuth app, no field mapper
There is nothing to authorize in HubSpot and no mapping UI in TopClozer. The HubSpot toggle under Settings → Integrations records a portal ID against your workspace; it does not move data. The handler in the middle is yours.
No enrollment from a HubSpot list
You cannot point a HubSpot active list at a sequence. Leads are imported into TopClozer, and campaign membership is set there. A HubSpot list can be exported and imported like any other source.
The REST API is read-only
POST /api/v1/* authenticates, checks the key's scope and then answers 501 Not Implemented — there is no write endpoint, and answering 202 would have implied your payload was stored. Treat v1 as a read API and drive changes from the app.
Webhook payloads are not signed
Deliveries carry an x-topclozer-event header and no signature. Treat the endpoint URL as a secret, and confirm anything important by reading it back over the REST API before you write it into HubSpot.

FAQ

Does TopClozer write LinkedIn replies into HubSpot for me?+

Not on its own. TopClozer emits connection.accepted and message.received to a webhook endpoint you register, and exposes leads, campaigns, senders and the inbox over a read API. The write into HubSpot — a timeline event, a property update, a task — is made by your handler, or by an automation platform such as Zapier, Make or n8n sitting between the two.

Can I trigger LinkedIn outreach from a HubSpot list?+

No. There is no list-enrollment hook in either direction. Export the segment from HubSpot and import it as a lead list, then enroll it in a sequence inside TopClozer.

Which fields identify the contact?+

The webhook payload carries a TopClozer lead id and the lead's name. Everything else — LinkedIn profile URL, company, headline, current status — comes from GET /api/v1/leads. Most implementations match on the LinkedIn profile URL and fall back to name plus company.

How much of this is included in the plan?+

All of it. The REST API, webhooks and the MCP endpoint are part of the software plan on the pricing page — there is no integration tier, no per-call charge and no add-on to buy for this.

Is this safe for my LinkedIn account?+

No LinkedIn tool is risk-free and we will not claim otherwise — LinkedIn can restrict any account, and nothing here is endorsed or sanctioned by LinkedIn. What we do: the MCP tools that reach LinkedIn are read-only and rate limited, the outreach engine paces every action and keeps anything irreversible behind a human approval, and every product states its automation method and risk level on its own page. Running this on a dedicated account rather than your personal profile is the single biggest thing you can do about the rest, and it is a decision you make — see /mcp/accounts-for-agents for where those accounts come from.

What can an AI assistant actually do through the MCP server?+

The server exposes 65 tools, 46 of them read-only. 43 reach LinkedIn through a connected sender account (search_linkedin_people, get_linkedin_profile, get_linkedin_posts, list_linkedin_connections, get_account_seat, get_my_profile, get_profile_viewers, get_ssi, get_profile_sections, check_reachability, get_company, get_post, list_post_comments, list_post_reactions, get_profile_activity, list_sent_invitations, list_received_invitations, list_followers, list_following, list_conversations, get_conversation, list_recent_messages, search_linkedin_companies, search_linkedin_posts, search_linkedin_jobs, search_linkedin_url, find_company_people, lookup_search_filter, propose_connection_request, propose_message, propose_profile_visit, propose_inmail, propose_reply, propose_withdraw_invitation, propose_accept_invitation, propose_ignore_invitation, propose_follow, propose_unfollow, propose_endorsement, propose_post_reaction, propose_comment, propose_post, propose_message_reaction); the rest read this workspace — campaigns, leads, the inbox, the approval queue, the product catalogue, your library and your projects. Only 19 write anything, both to us rather than to LinkedIn: connect_linkedin_account and propose_connection_request and propose_message and propose_profile_visit and propose_inmail and propose_reply and propose_withdraw_invitation and propose_accept_invitation and propose_ignore_invitation and propose_follow and propose_unfollow and propose_endorsement and propose_post_reaction and propose_comment and propose_post and propose_message_reaction and add_do_not_contact and pause_campaign and install_product. So Claude, ChatGPT, n8n or Make can inspect your funnel, read replies across every sender, see which drafts are waiting for approval and stop a campaign that is going badly — they cannot create a campaign, import leads or send a message. Outbound actions are released by the product under the workspace sending policy, which by default waits for a person to approve them. The full reference, with request and response envelopes, is at https://topclozer.com/mcp/tools.

Next

The MCP server · Tool reference · REST API & webhooks · Unified inbox · Pricing

Not looking to build anything? Outzeach runs LinkedIn outreach for agencies and sales teams on managed accounts, with no integration work on your side.