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, ChatGPT, Claude Code, Cursor and n8n can run the same actions for you when you ask in plain words. They connect over MCP, at this address. Open your app below for its steps.

https://api.heyreagent.com/mcp
ClaudeSigns in to your account. No key.
  1. Open Customize, then Connectors.
  2. Click + Add, then Add custom connector.
  3. Type a name, paste the address, and click Continue.
  4. Keep the sign-in settings Claude found, continue, and click Add. Sign in to HeyReagent when Claude asks.
  5. In a chat, press + at the lower left, then Connectors, to switch it on.

Claude’s own guide, with pictures of each screen.

ChatGPTSigns in to your account. No key.
  1. Open Settings, then Security and login, and turn on Developer mode.
  2. Go to ChatGPT Plugins, select the plus button, type a name and a description, enter the address, and create the connection.
  3. Sign in to HeyReagent when ChatGPT asks.
  4. In a chat, choose Developer mode from the plus menu and select it.

ChatGPT’s own guide, which says which accounts have developer mode.

MuseUses your key.
  1. Send Muse the message below, as it is.
  2. Muse answers with a card for the connector. Press Connect on it, then Continue, and paste your key in the form. The key goes there, not in the chat.
  3. Muse asks whether it may share information with api.heyreagent.com. “Always allow this site” stops it asking before every request. “Allow once” allows the next one only.
  4. Muse lists the actions and runs the check. Then ask it for what you want.
Create a custom connector called HeyReagent for my LinkedIn. It is a remote MCP server over streamable HTTP at https://api.heyreagent.com/mcp. Every request needs the header "Authorization: Bearer" followed by my key. Ask me for the key in your secure form, not in this chat. Then list its tools and run get_my_profile to check that it works.

Meta’s own page on connectors, custom ones included.

Claude CodeUses your key.
  1. Run this in a terminal, with your own key where it says YOUR_KEY.
claude mcp add --transport http heyreagent https://api.heyreagent.com/mcp \
  --header "Authorization: Bearer YOUR_KEY"
CursorUses your key.
  1. Put this in .cursor/mcp.json in your project, or in ~/.cursor/mcp.json to have it everywhere, with your own key where it says YOUR_KEY.
{
  "mcpServers": {
    "heyreagent": {
      "url": "https://api.heyreagent.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}
n8nUses your key.
  1. Add an MCP Client Tool node to your agent.
  2. Endpoint: the address above. Server Transport: HTTP Streamable.
  3. Authentication: Bearer Auth, with your key.

Any other MCP client: give it the address, and your key as a bearer token, the header Authorization: Bearer YOUR_KEY.

Hand the docs to an AI app

Paste one of these into ChatGPT or Claude and ask it to write the call or the workflow for you. Every docs page also has a button at its top that copies that page.

Everythingllms-full.txt: the whole of the docs in one Markdown file.
The indexllms.txt: what there is and where, with a Markdown copy of each page.
OpenAPIopenapi.json: the API as an OpenAPI 3.1 file, for ChatGPT's custom actions and anything else that imports one.

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 was switched off.Nothing runs on it until it is switched on again.
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.
weekly_limit_reached
status 422
The invitations of the last 7 days are used up.Wait until the time in resetAt. get_usage shows the count.
note_limit_reached
status 422
A free LinkedIn account has sent its invitations with a note for 30 days.Send the invitation without a note, or wait until the time in resetAt.
note_too_long
status 422
The note is longer than this LinkedIn account can send.Shorten it to the number in limit, or send the invitation without a note.
linkedin_limit_reached
status 422
LinkedIn itself refused: its own limit is reached.Wait. It is usually LinkedIn’s own 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 what is used and what is left. An action past a limit is refused with the time it resets.

WhatA day
Invitations sent (20 on a free LinkedIn account)30
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

Invitations have more limits

Invitations are also limited over a week and, on a free LinkedIn account, in how many can carry a note. How many you can send depends on whether the LinkedIn account is a paid one (Premium, Sales Navigator or Recruiter) or a free one. An account HeyReagent cannot tell apart counts as free.

InvitationsPaid accountFree account
In a day3020
In any 7 days200150
With a note, in any 30 daysno limit of its own5
Characters in a note300200

Past the 7 days' limit an invitation is refused with weekly_limit_reached. Past the notes of a free account it is refused with note_limit_reached: send it without a note. A note that is too long is refused with note_too_long.

What the limits do not do for you

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