Docs

HeyReagent lets your own tools do things on your LinkedIn account: send a message, search for people, read a post. Each thing it can do is called an action. You ask for one action at a time.

Start in three steps

  1. Sign in and connect LinkedIn. Sign in with your email: we send you a link, and there is no password. The page you land on, your thread page, shows a LinkedIn card. Press Connect on it and sign in to LinkedIn there. You do that once.
  2. Get your key. On the thread page open Menu, then Developers, and press Create a key. Copy it straight away: it is shown only once. The key is your password here, so keep it to yourself.
  3. Call an action. The next part shows how.

Your first call

Try this one first. It only reads: it lists the LinkedIn accounts you connected.

curl -X POST https://api.heyreagent.com/v1/actions/list_linkedin_accounts \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{}'
The same call in JavaScript
const response = await fetch("https://api.heyreagent.com/v1/actions/list_linkedin_accounts", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_KEY",
    "content-type": "application/json",
  },
  body: JSON.stringify({}),
});
const answer = await response.json();
console.log(answer);
The same call in Python
import requests

response = requests.post(
    "https://api.heyreagent.com/v1/actions/list_linkedin_accounts",
    headers={"Authorization": "Bearer YOUR_KEY"},
    json={},
)
print(response.json())
The same call in n8n

Add an HTTP Request node and fill it in like this:

MethodPOST
URLhttps://api.heyreagent.com/v1/actions/list_linkedin_accounts
Send HeadersOn. Name Authorization, Value Bearer YOUR_KEY
Send BodyOn. Body Content Type JSON, Specify Body Using JSON, then paste the body below
{}

Every call is made the same way. Only three things change:

WhereA POST to https://api.heyreagent.com/v1/actions/ followed by the action's name.
WhoThe header Authorization: Bearer YOUR_KEY, with your own key.
WhatThe action's inputs, as JSON, in the body. Send {} when it needs none.

The answer says whether it worked:

It worked{ "ok": true, "result": { … } }
What you asked for is in result.
It did not{ "ok": false, "error": "…", "message": "…" }
message says why, in plain English.

Anything that can send a request like this can call an action: a script, your own app, or a workflow tool such as n8n. Each action's page shows the call in curl, JavaScript, Python and n8n, with what to put in and what comes back.

GET https://api.heyreagent.com/v1/actions, with the same header, lists every action your plan includes and its inputs.

Use it from Claude or ChatGPT

Claude and ChatGPT can run the same actions for you when you ask in plain words. They connect over MCP, at this address:

https://api.heyreagent.com/mcp

Claude. Open Customize, then Connectors. Click + Add, then Add custom connector. Type a name, paste the address above, and click Continue. Keep the sign-in settings Claude found, continue, and click Add. Sign in to HeyReagent when Claude asks. In a chat, press + at the lower left, then Connectors, to switch it on. Claude's own guide has pictures of each screen.

ChatGPT. Open Settings, then Security and login, and turn on Developer mode. Go to ChatGPT Plugins, select the plus button, type a name and a description, enter the address above, and create the connection. Sign in to HeyReagent when ChatGPT asks. In a chat, choose Developer mode from the plus menu and select it. ChatGPT's own guide says which accounts have developer mode.

n8n, Cursor and other MCP clients. Give them the address above, and your key as a bearer token: the header Authorization: Bearer YOUR_KEY. In n8n's MCP Client Tool node that is Endpoint: the address, Server Transport: HTTP Streamable, Authentication: Bearer Auth.

When it says no

A call that did not work answers with "ok": false, an error word and a message in plain English. These are the ones you will meet:

ErrorWhat it meansWhat to do
invalid_key
status 401
The key is missing or wrong.Send it as the header Authorization: Bearer YOUR_KEY. Create a new key if you lost it.
unknown_action
status 404
There is no action with that name.Check the spelling against the list below.
invalid_json
status 400
The body is not JSON.Send JSON, such as {} for an action that needs nothing.
invalid_input
status 422
An input is missing, or is not the kind of value the action takes.The message names each input and what is wrong with it. The action’s page lists its inputs.
plan_required
status 402
The account has no plan.Choose a plan on the thread page.
upgrade_required
status 402
The action is part of the Agent plan.Use a Connect action, or change plan.
linkedin_disconnected
status 409
On the free plan, LinkedIn is not connected right now.Run connect_linkedin and open the url it gives.
free_plan_full
status 409
Every free seat is taken at the moment.Try again in a little while, or choose a plan.
free_plan_taken
status 409
This LinkedIn account already has a free plan under another email.Sign in with that email, or choose a plan for this one.
no_live_account
status 422
No LinkedIn account is connected.Run connect_linkedin and open the url it gives.
daily_limit_reached
status 422
Today’s limit for this kind of action is used up.Wait until the time in resetAt.
linkedin_limit_reached
status 422
LinkedIn itself refused: its own limit is reached.Wait. It is usually LinkedIn’s weekly invitation limit.
reconnect_needed
status 422
LinkedIn signed the account out.Run update_linkedin_connection and sign in again.
account_restricted
status 422
LinkedIn does not let this account do that.Read the message, and check the account on LinkedIn itself.
not_available_on_this_account
status 422
The LinkedIn account does not have the product the action needs, such as Sales Navigator or Recruiter.Use an action for ordinary LinkedIn, or an account that has the product.
not_found
status 422
Nothing with that id is on your account.Check where the id came from: each action’s page says where to get it.
temporary_failure
status 422
LinkedIn did not answer this time.Try again. The answer says retryable: true.
temporarily_unavailable
status 422
The action could not be run right now, or you made more than 300 calls in a minute.Wait a minute and try again.
failed
status 422
It was refused for another reason.The message says why.

An action can also refuse for a reason of its own, with an error word of its own. The message says what to change.

Two things that go wrong without an error word:

Do more than one thing

One action does one thing. To get something done you run a few in a row, and the answer of one gives you what the next one needs. Recipes shows the common ones step by step:

What actions hand to each other are ids and links. Ids and links says what each one is, which action gives it, and which action takes it.

Limits

Each LinkedIn account has a daily limit per kind of action, to keep the account safe. Reading your conversations is not limited. get_usage shows today's counts. An action past its limit is refused with the time it resets.

WhatA day
Invitations sent80
Invitations accepted or declined100
Invitations taken back100
Messages sent100
InMails sent40
Messages edited, deleted or reacted to, and conversations deleted100
Comments on posts40
Reactions to posts40
Posts published5
Profiles read100
Skills endorsed20
Leads saved, and Recruiter candidates moved or rejected100
Job postings created, edited, published or closed20
Search results (rows)1,000
Search results on Sales Navigator or Recruiter (rows)2,500

Sales Navigator, Recruiter and job-posting actions run on your own LinkedIn account and need that product on it. An action that downloads a file returns it as file: { contentType, base64 } on the API, and as a file over MCP.

Plans

Every account starts on the free plan, which has every action marked Connect below. What it does not have is a connection that lasts: LinkedIn is disconnected after an hour without use, and 12 hours after connecting at the latest. An action then answers linkedin_disconnected, and connect_linkedin gives the link to connect it again. Only so many free accounts can be connected at once. The Connect plan keeps LinkedIn connected, so scheduled workflows run. The actions marked Agent need the Agent plan.

Actions

Click an action to see what to give it, how to call it, and what comes back.

Profile

get_my_profileGet my profileConnect
get_profileGet a profileConnect
update_my_profileUpdate my profileConnect
get_profile_detailsGet a profile in depthConnect
endorse_skillEndorse a skillConnect

Network

list_connectionsList my connectionsConnect
send_invitationSend an invitationConnect
list_sent_invitationsList sent invitationsConnect
preview_withdraw_invitationsPreview withdrawing invitationsConnect
withdraw_invitationsWithdraw sent invitationsConnect
withdraw_invitationWithdraw one sent invitation, nowConnect
list_received_invitationsList received invitationsConnect
respond_to_invitationAccept or decline an invitationConnect
list_followersList followersConnect

Messages

list_conversationsList conversationsConnect
get_conversationGet a conversationConnect
send_messageSend a messageConnect
mark_readMark a conversation read in this inboxConnect
sync_inboxRefresh the inboxConnect
get_send_statusCheck how an inbox refresh endedConnect
list_chatsList chatsConnect
get_chatGet a chatConnect
list_chat_messagesList a chat's messagesConnect
list_chat_participantsList who is in a chatConnect
send_chat_messageSend a message with files or a voice noteConnect
start_conversationStart a conversation (InMail, group, company)Connect
set_chat_statusMark a chat read or muted on LinkedInConnect
resync_chatRe-read a chat's historyConnect
delete_chatDelete a chatConnect
list_messagesList messages across chatsConnect
get_messageGet a messageConnect
get_message_attachmentDownload a message attachmentConnect
edit_messageEdit a sent messageConnect
delete_messageDelete a sent messageConnect
react_to_messageReact to a messageConnect
list_chat_attendeesList everyone I have chats withConnect
get_chat_attendeeGet a chat participantConnect
get_chat_attendee_pictureDownload a participant's pictureConnect
list_attendee_chatsList my chats with one personConnect
list_attendee_messagesList my messages with one personConnect
resync_attendee_chatsRe-read my chats with one personConnect

InMail

list_inmailList InMail conversationsConnect
get_inmail_conversationGet an InMail conversationConnect
get_inmail_creditsGet InMail creditsConnect
list_sales_navigator_contractsList Sales Navigator contractsConnect
switch_sales_navigator_contractSwitch Sales Navigator contractConnect

Search

search_peopleSearch peopleConnect
search_postsSearch postsConnect
search_linkedinSearch LinkedIn with any filterConnect
lookup_search_idsLook up the id for a search filterConnect
search_linkedin_peopleSearch people, every filter typedConnect
search_linkedin_companiesSearch companies, every filter typedConnect
search_linkedin_postsSearch posts, every filter typedConnect
search_linkedin_jobsSearch jobs, every filter typedConnect
search_linkedin_sales_navigator_peopleSearch people in my Sales Navigator, every filter typedConnect
search_linkedin_sales_navigator_companiesSearch companies in my Sales Navigator, every filter typedConnect
search_linkedin_recruiter_peopleSearch candidates in my Recruiter, every filter typedConnect
get_companyGet a company pageConnect
search_people_sales_navigatorSearch people (Sales Navigator)Agent
count_people_sales_navigatorCount people (Sales Navigator)Agent
search_companiesSearch companiesAgent
find_decision_makersFind decision-makers at a companyAgent
list_funding_signalsList recently funded companiesAgent

Posts

get_recent_postsGet someone's recent postsConnect
get_post_engagersGet who engaged with a postConnect
create_postPublish a postConnect
comment_on_postComment on a postConnect
react_to_postReact to a postConnect
get_postGet a postConnect
list_post_commentsList a post's commentsConnect
list_post_reactionsList a post's reactionsConnect
list_posts_by_authorList a person's or company's postsConnect
list_comments_by_personList the comments a person wroteConnect
list_reactions_by_personList what a person reacted toConnect

Sales Navigator

save_leadSave a Sales Navigator leadConnect

Recruiter

list_hiring_projectsList Recruiter hiring projectsConnect
get_hiring_projectGet a Recruiter hiring projectConnect
move_recruiter_candidateAdd or move a Recruiter candidateConnect
reject_recruiter_applicantReject a Recruiter applicantConnect

Jobs

list_job_postingsList my job postingsConnect
get_job_postingGet a job postingConnect
list_job_applicantsList a job posting's applicantsConnect
get_job_applicantGet an applicantConnect
get_job_applicant_resumeDownload an applicant's resumeConnect
create_job_postingCreate a job posting draftConnect
edit_job_postingEdit a job postingConnect
publish_job_postingPublish a job postingConnect
solve_job_posting_checkpointFinish a job posting verificationConnect
close_job_postingClose a job postingConnect

Insight

who_is_waiting_on_meWho is waiting on my replyConnect
who_went_coldWho went coldConnect
connections_never_messagedConnections I never messagedConnect
engagers_not_connectedEngagers I am not connected toConnect

Account

connect_linkedinConnect a LinkedIn accountConnect
update_linkedin_connectionFix or update a LinkedIn connectionConnect
list_linkedin_accountsList connected LinkedIn accountsConnect
get_usageGet today's usage and limitsConnect