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, 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/mcpClaudeSigns in to your account. No key.
- Open Customize, then Connectors.
- Click + Add, then Add custom connector.
- Type a name, paste the address, 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.
ChatGPTSigns in to your account. No key.
- 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, 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, which says which accounts have developer mode.
MuseUses your key.
- Send Muse the message below, as it is.
- 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.
- 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.
- 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.
Claude CodeUses your key.
- 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.
- 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.
- Add an MCP Client Tool node to your agent.
- Endpoint: the address above. Server Transport: HTTP Streamable.
- 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.
| Everything | llms-full.txt: the whole of the docs in one Markdown file. |
| The index | llms.txt: what there is and where, with a Markdown copy of each page. |
| OpenAPI | openapi.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:
| 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 was switched off. | Nothing runs on it until it is switched on again. |
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. |
weekly_limit_reachedstatus 422 | The invitations of the last 7 days are used up. | Wait until the time in resetAt. get_usage shows the count. |
note_limit_reachedstatus 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_longstatus 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_reachedstatus 422 | LinkedIn itself refused: its own limit is reached. | Wait. It is usually LinkedIn’s own 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 what is used and what is left. An action past a limit is refused with the time it resets.
| What | A day |
|---|---|
| Invitations sent (20 on a free LinkedIn account) | 30 |
| 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 |
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.
| Invitations | Paid account | Free account |
|---|---|---|
| In a day | 30 | 20 |
| In any 7 days | 200 | 150 |
| With a note, in any 30 days | no limit of its own | 5 |
| Characters in a note | 300 | 200 |
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
- Spread your calls over the day. Calls made at the same minute every day can be flagged as automation.
- A LinkedIn account that is new, has few connections, or was not used for a long time should start well below these numbers and go up gradually.
- LinkedIn can refuse sooner than these numbers. The answer is then
linkedin_limit_reached.
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 |