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
- 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.
- 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.
- 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:
| Method | POST |
| URL | https://api.heyreagent.com/v1/actions/list_linkedin_accounts |
| Send Headers | On. Name Authorization, Value Bearer YOUR_KEY |
| Send Body | On. Body Content Type JSON, Specify Body Using JSON, then paste the body below |
{}Every call is made the same way. Only three things change:
| Where | A POST to https://api.heyreagent.com/v1/actions/ followed by the action's name. |
| Who | The header Authorization: Bearer YOUR_KEY, with your own key. |
| What | The 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:
| Error | What it means | What to do |
|---|---|---|
invalid_keystatus 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_actionstatus 404 | There is no action with that name. | Check the spelling against the list below. |
invalid_jsonstatus 400 | The body is not JSON. | Send JSON, such as {} for an action that needs nothing. |
invalid_inputstatus 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_requiredstatus 402 | The account has no plan. | Choose a plan on the thread page. |
upgrade_requiredstatus 402 | The action is part of the Agent plan. | Use a Connect action, or change plan. |
linkedin_disconnectedstatus 409 | On the free plan, LinkedIn is not connected right now. | Run connect_linkedin and open the url it gives. |
free_plan_fullstatus 409 | Every free seat is taken at the moment. | Try again in a little while, or choose a plan. |
free_plan_takenstatus 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_accountstatus 422 | No LinkedIn account is connected. | Run connect_linkedin and open the url it gives. |
daily_limit_reachedstatus 422 | Today’s limit for this kind of action is used up. | Wait until the time in resetAt. |
linkedin_limit_reachedstatus 422 | LinkedIn itself refused: its own limit is reached. | Wait. It is usually LinkedIn’s weekly invitation limit. |
reconnect_neededstatus 422 | LinkedIn signed the account out. | Run update_linkedin_connection and sign in again. |
account_restrictedstatus 422 | LinkedIn does not let this account do that. | Read the message, and check the account on LinkedIn itself. |
not_available_on_this_accountstatus 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_foundstatus 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_failurestatus 422 | LinkedIn did not answer this time. | Try again. The answer says retryable: true. |
temporarily_unavailablestatus 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. |
failedstatus 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:
- The answer is a web page that says
Cannot GET. The request was sent as a GET. It has to be a POST. - An input seems to do nothing. An input name the action does not know is left out without a word. Check its spelling against the action's page.
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:
- Find people and invite them
- Take back an invitation nobody answered
- Read a conversation and reply
- Answer the invitations you received
- Invite the people who reacted to a post
- Search with a LinkedIn filter (for example, a city)
- Comment on someone's latest post
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.
| What | A day |
|---|---|
| Invitations sent | 80 |
| Invitations accepted or declined | 100 |
| Invitations taken back | 100 |
| Messages sent | 100 |
| InMails sent | 40 |
| Messages edited, deleted or reacted to, and conversations deleted | 100 |
| Comments on posts | 40 |
| Reactions to posts | 40 |
| Posts published | 5 |
| Profiles read | 100 |
| Skills endorsed | 20 |
| Leads saved, and Recruiter candidates moved or rejected | 100 |
| Job postings created, edited, published or closed | 20 |
| 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_profile | Get my profile | Connect |
get_profile | Get a profile | Connect |
update_my_profile | Update my profile | Connect |
get_profile_details | Get a profile in depth | Connect |
endorse_skill | Endorse a skill | Connect |
Network
list_connections | List my connections | Connect |
send_invitation | Send an invitation | Connect |
list_sent_invitations | List sent invitations | Connect |
preview_withdraw_invitations | Preview withdrawing invitations | Connect |
withdraw_invitations | Withdraw sent invitations | Connect |
withdraw_invitation | Withdraw one sent invitation, now | Connect |
list_received_invitations | List received invitations | Connect |
respond_to_invitation | Accept or decline an invitation | Connect |
list_followers | List followers | Connect |
Messages
list_conversations | List conversations | Connect |
get_conversation | Get a conversation | Connect |
send_message | Send a message | Connect |
mark_read | Mark a conversation read in this inbox | Connect |
sync_inbox | Refresh the inbox | Connect |
get_send_status | Check how an inbox refresh ended | Connect |
list_chats | List chats | Connect |
get_chat | Get a chat | Connect |
list_chat_messages | List a chat's messages | Connect |
list_chat_participants | List who is in a chat | Connect |
send_chat_message | Send a message with files or a voice note | Connect |
start_conversation | Start a conversation (InMail, group, company) | Connect |
set_chat_status | Mark a chat read or muted on LinkedIn | Connect |
resync_chat | Re-read a chat's history | Connect |
delete_chat | Delete a chat | Connect |
list_messages | List messages across chats | Connect |
get_message | Get a message | Connect |
get_message_attachment | Download a message attachment | Connect |
edit_message | Edit a sent message | Connect |
delete_message | Delete a sent message | Connect |
react_to_message | React to a message | Connect |
list_chat_attendees | List everyone I have chats with | Connect |
get_chat_attendee | Get a chat participant | Connect |
get_chat_attendee_picture | Download a participant's picture | Connect |
list_attendee_chats | List my chats with one person | Connect |
list_attendee_messages | List my messages with one person | Connect |
resync_attendee_chats | Re-read my chats with one person | Connect |
InMail
list_inmail | List InMail conversations | Connect |
get_inmail_conversation | Get an InMail conversation | Connect |
get_inmail_credits | Get InMail credits | Connect |
list_sales_navigator_contracts | List Sales Navigator contracts | Connect |
switch_sales_navigator_contract | Switch Sales Navigator contract | Connect |
Search
search_people | Search people | Connect |
search_posts | Search posts | Connect |
search_linkedin | Search LinkedIn with any filter | Connect |
lookup_search_ids | Look up the id for a search filter | Connect |
search_linkedin_people | Search people, every filter typed | Connect |
search_linkedin_companies | Search companies, every filter typed | Connect |
search_linkedin_posts | Search posts, every filter typed | Connect |
search_linkedin_jobs | Search jobs, every filter typed | Connect |
search_linkedin_sales_navigator_people | Search people in my Sales Navigator, every filter typed | Connect |
search_linkedin_sales_navigator_companies | Search companies in my Sales Navigator, every filter typed | Connect |
search_linkedin_recruiter_people | Search candidates in my Recruiter, every filter typed | Connect |
get_company | Get a company page | Connect |
search_people_sales_navigator | Search people (Sales Navigator) | Agent |
count_people_sales_navigator | Count people (Sales Navigator) | Agent |
search_companies | Search companies | Agent |
find_decision_makers | Find decision-makers at a company | Agent |
list_funding_signals | List recently funded companies | Agent |
Posts
get_recent_posts | Get someone's recent posts | Connect |
get_post_engagers | Get who engaged with a post | Connect |
create_post | Publish a post | Connect |
comment_on_post | Comment on a post | Connect |
react_to_post | React to a post | Connect |
get_post | Get a post | Connect |
list_post_comments | List a post's comments | Connect |
list_post_reactions | List a post's reactions | Connect |
list_posts_by_author | List a person's or company's posts | Connect |
list_comments_by_person | List the comments a person wrote | Connect |
list_reactions_by_person | List what a person reacted to | Connect |
Sales Navigator
save_lead | Save a Sales Navigator lead | Connect |
Recruiter
list_hiring_projects | List Recruiter hiring projects | Connect |
get_hiring_project | Get a Recruiter hiring project | Connect |
move_recruiter_candidate | Add or move a Recruiter candidate | Connect |
reject_recruiter_applicant | Reject a Recruiter applicant | Connect |
Jobs
list_job_postings | List my job postings | Connect |
get_job_posting | Get a job posting | Connect |
list_job_applicants | List a job posting's applicants | Connect |
get_job_applicant | Get an applicant | Connect |
get_job_applicant_resume | Download an applicant's resume | Connect |
create_job_posting | Create a job posting draft | Connect |
edit_job_posting | Edit a job posting | Connect |
publish_job_posting | Publish a job posting | Connect |
solve_job_posting_checkpoint | Finish a job posting verification | Connect |
close_job_posting | Close a job posting | Connect |
Insight
who_is_waiting_on_me | Who is waiting on my reply | Connect |
who_went_cold | Who went cold | Connect |
connections_never_messaged | Connections I never messaged | Connect |
engagers_not_connected | Engagers I am not connected to | Connect |
Account
connect_linkedin | Connect a LinkedIn account | Connect |
update_linkedin_connection | Fix or update a LinkedIn connection | Connect |
list_linkedin_accounts | List connected LinkedIn accounts | Connect |
get_usage | Get today's usage and limits | Connect |