# HeyReagent docs > HeyReagent lets your own tools do things on your own LinkedIn account: send a message, search for people, read a post. Each thing it can do is an action, and you ask for one action at a time. MCP and API for LinkedIn. Not affiliated with LinkedIn. ## How every call is made - Where: a POST to `https://api.heyreagent.com/v1/actions/`. - Who: the header `Authorization: Bearer YOUR_KEY`. A key is made on the thread page, under Menu, then Developers, and is shown once. - What: the action's inputs as JSON in the body. Send `{}` when it needs none. - It worked: `{ "ok": true, "result": { … } }`. - It did not: `{ "ok": false, "error": "…", "message": "…" }`. The message says why, in plain English. - `GET https://api.heyreagent.com/v1/actions`, with the same header, lists every action the plan includes and its inputs. - The whole API as an OpenAPI 3.1 file: https://heyreagent.com/openapi.json ## Use it from an AI app (MCP) The MCP address is `https://api.heyreagent.com/mcp`. ### Claude Signs 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. ### ChatGPT Signs 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. ### Claude Code Uses 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" ``` ### Cursor Uses 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" } } } } ``` ### n8n Uses 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. ## When it says no | Error | Status | What it means | What to do | |---|---|---|---| | `invalid_key` | 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` | 404 | There is no action with that name. | Check the spelling against the list below. | | `invalid_json` | 400 | The body is not JSON. | Send JSON, such as {} for an action that needs nothing. | | `invalid_input` | 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` | 402 | The account has no plan. | Choose a plan on the thread page. | | `upgrade_required` | 402 | The action is part of the Agent plan. | Use a Connect action, or change plan. | | `linkedin_disconnected` | 409 | On the free plan, LinkedIn is not connected right now. | Run connect_linkedin and open the url it gives. | | `free_plan_full` | 409 | Every free seat is taken at the moment. | Try again in a little while, or choose a plan. | | `free_plan_taken` | 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` | 422 | No LinkedIn account is connected. | Run connect_linkedin and open the url it gives. | | `daily_limit_reached` | 422 | Today’s limit for this kind of action is used up. | Wait until the time in resetAt. | | `linkedin_limit_reached` | 422 | LinkedIn itself refused: its own limit is reached. | Wait. It is usually LinkedIn’s weekly invitation limit. | | `reconnect_needed` | 422 | LinkedIn signed the account out. | Run update_linkedin_connection and sign in again. | | `account_restricted` | 422 | LinkedIn does not let this account do that. | Read the message, and check the account on LinkedIn itself. | | `not_available_on_this_account` | 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` | 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` | 422 | LinkedIn did not answer this time. | Try again. The answer says retryable: true. | | `temporarily_unavailable` | 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` | 422 | It was refused for another reason. | The message says why. | A request sent as a GET answers with a web page that says `Cannot GET`: it has to be a POST. An input name the action does not know is left out without a word. ## 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. | 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 | ## Plans Every account starts on the free plan, which has every action marked Free and Connect. On the free plan LinkedIn is disconnected after a while without use; an action then answers `linkedin_disconnected`, and `connect_linkedin` gives the link to connect it again. The Connect plan keeps LinkedIn connected, so scheduled workflows run. The actions marked Agent need the Agent plan. Sales Navigator, Recruiter and job-posting actions run on your own LinkedIn account and need that product on it. ## Actions ### Profile - `get_my_profile`: Get my profile - `get_profile`: Get a profile - `update_my_profile`: Update my profile - `get_profile_details`: Get a profile in depth - `endorse_skill`: Endorse a skill ### Network - `list_connections`: List my connections - `send_invitation`: Send an invitation - `list_sent_invitations`: List sent invitations - `preview_withdraw_invitations`: Preview withdrawing invitations - `withdraw_invitations`: Withdraw sent invitations - `withdraw_invitation`: Withdraw one sent invitation, now - `list_received_invitations`: List received invitations - `respond_to_invitation`: Accept or decline an invitation - `list_followers`: List followers ### Messages - `list_conversations`: List conversations - `get_conversation`: Get a conversation - `send_message`: Send a message - `mark_read`: Mark a conversation read in this inbox - `sync_inbox`: Refresh the inbox - `get_send_status`: Check how an inbox refresh ended - `list_chats`: List chats - `get_chat`: Get a chat - `list_chat_messages`: List a chat's messages - `list_chat_participants`: List who is in a chat - `send_chat_message`: Send a message with files or a voice note - `start_conversation`: Start a conversation (InMail, group, company) - `set_chat_status`: Mark a chat read or muted on LinkedIn - `resync_chat`: Re-read a chat's history - `delete_chat`: Delete a chat - `list_messages`: List messages across chats - `get_message`: Get a message - `get_message_attachment`: Download a message attachment - `edit_message`: Edit a sent message - `delete_message`: Delete a sent message - `react_to_message`: React to a message - `list_chat_attendees`: List everyone I have chats with - `get_chat_attendee`: Get a chat participant - `get_chat_attendee_picture`: Download a participant's picture - `list_attendee_chats`: List my chats with one person - `list_attendee_messages`: List my messages with one person - `resync_attendee_chats`: Re-read my chats with one person ### InMail - `list_inmail`: List InMail conversations - `get_inmail_conversation`: Get an InMail conversation - `get_inmail_credits`: Get InMail credits - `list_sales_navigator_contracts`: List Sales Navigator contracts - `switch_sales_navigator_contract`: Switch Sales Navigator contract ### Search - `search_people`: Search people - `search_posts`: Search posts - `search_linkedin`: Search LinkedIn with any filter - `lookup_search_ids`: Look up the id for a search filter - `search_linkedin_people`: Search people, every filter typed - `search_linkedin_companies`: Search companies, every filter typed - `search_linkedin_posts`: Search posts, every filter typed - `search_linkedin_jobs`: Search jobs, every filter typed - `search_linkedin_sales_navigator_people`: Search people in my Sales Navigator, every filter typed - `search_linkedin_sales_navigator_companies`: Search companies in my Sales Navigator, every filter typed - `search_linkedin_recruiter_people`: Search candidates in my Recruiter, every filter typed - `get_company`: Get a company page - `search_people_sales_navigator`: Search people (Sales Navigator) (Agent plan) - `count_people_sales_navigator`: Count people (Sales Navigator) (Agent plan) - `search_companies`: Search companies (Agent plan) - `find_decision_makers`: Find decision-makers at a company (Agent plan) - `list_funding_signals`: List recently funded companies (Agent plan) ### Posts - `get_recent_posts`: Get someone's recent posts - `get_post_engagers`: Get who engaged with a post - `create_post`: Publish a post - `comment_on_post`: Comment on a post - `react_to_post`: React to a post - `get_post`: Get a post - `list_post_comments`: List a post's comments - `list_post_reactions`: List a post's reactions - `list_posts_by_author`: List a person's or company's posts - `list_comments_by_person`: List the comments a person wrote - `list_reactions_by_person`: List what a person reacted to ### Sales Navigator - `save_lead`: Save a Sales Navigator lead ### Recruiter - `list_hiring_projects`: List Recruiter hiring projects - `get_hiring_project`: Get a Recruiter hiring project - `move_recruiter_candidate`: Add or move a Recruiter candidate - `reject_recruiter_applicant`: Reject a Recruiter applicant ### Jobs - `list_job_postings`: List my job postings - `get_job_posting`: Get a job posting - `list_job_applicants`: List a job posting's applicants - `get_job_applicant`: Get an applicant - `get_job_applicant_resume`: Download an applicant's resume - `create_job_posting`: Create a job posting draft - `edit_job_posting`: Edit a job posting - `publish_job_posting`: Publish a job posting - `solve_job_posting_checkpoint`: Finish a job posting verification - `close_job_posting`: Close a job posting ### Insight - `who_is_waiting_on_me`: Who is waiting on my reply - `who_went_cold`: Who went cold - `connections_never_messaged`: Connections I never messaged - `engagers_not_connected`: Engagers I am not connected to ### Account - `connect_linkedin`: Connect a LinkedIn account - `update_linkedin_connection`: Fix or update a LinkedIn connection - `list_linkedin_accounts`: List connected LinkedIn accounts - `get_usage`: Get today's usage and limits # Recipes > One action does one thing. To get something done you run a few, one after the other: the answer of one gives you what the next one needs. ## Find people and invite them Search for the kind of person you want to meet, then send each one an invitation. 1. Search. Each person in the answer has a profileUrl. ``` POST https://api.heyreagent.com/v1/actions/search_people { "keywords": "head of sales", "location": "Berlin" } ``` 2. Send one invitation per person. Keep the invitationId from the answer if you may want to take it back. ``` POST https://api.heyreagent.com/v1/actions/send_invitation { "note": "Hello, I would like to connect.", "profileUrl": "FROM_STEP_1" } ``` `FROM_STEP_1` is `people[].profileUrl` from the answer of step 1. It goes in `profileUrl`. ## Take back an invitation nobody answered See which invitations are still waiting, and withdraw one. 1. List the invitations you sent that are still unanswered. ``` POST https://api.heyreagent.com/v1/actions/list_sent_invitations {} ``` 2. Withdraw one. This cannot be undone. ``` POST https://api.heyreagent.com/v1/actions/withdraw_invitation { "invitationId": "FROM_STEP_1" } ``` `FROM_STEP_1` is `pendingInvitations[].invitationId` from the answer of step 1. It goes in `invitationId`. ## Read a conversation and reply Open your inbox, read one conversation, and answer in it. 1. List your unread conversations. Each one has an id. ``` POST https://api.heyreagent.com/v1/actions/list_chats { "unread": true } ``` 2. Read the messages of one conversation. ``` POST https://api.heyreagent.com/v1/actions/list_chat_messages { "chatId": "FROM_STEP_1" } ``` `FROM_STEP_1` is `chats[].id` from the answer of step 1. It goes in `chatId`. 3. Reply in that same conversation. ``` POST https://api.heyreagent.com/v1/actions/send_chat_message { "text": "Thanks for your message!", "chatId": "FROM_STEP_1" } ``` `FROM_STEP_1` is `chats[].id` from the answer of step 1. It goes in `chatId`. ## Answer the invitations you received See who wants to connect with you, and accept or decline. 1. List the invitations waiting for your answer. ``` POST https://api.heyreagent.com/v1/actions/list_received_invitations {} ``` 2. Accept (or use "decline"). ``` POST https://api.heyreagent.com/v1/actions/respond_to_invitation { "action": "accept", "invitationId": "FROM_STEP_1" } ``` `FROM_STEP_1` is `invitations[].invitationId` from the answer of step 1. It goes in `invitationId`. ## Invite the people who reacted to a post Turn the people who liked a post into new connections. 1. Paste the link of the post. The answer lists who reacted and who commented. ``` POST https://api.heyreagent.com/v1/actions/get_post_engagers { "postUrl": "PASTE_POST_LINK_HERE" } ``` 2. Send one invitation per person. ``` POST https://api.heyreagent.com/v1/actions/send_invitation { "profileUrl": "FROM_STEP_1" } ``` `FROM_STEP_1` is `reactors[].linkedinUrl` from the answer of step 1. It goes in `profileUrl`. ## Search with a LinkedIn filter (for example, a city) LinkedIn filters take its own ids, not names. First look the id up, then search with it. 1. Look up the id of the place. ``` POST https://api.heyreagent.com/v1/actions/lookup_search_ids { "type": "LOCATION", "keywords": "Berlin" } ``` 2. Search with that id as the location filter. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_people { "keywords": "head of sales", "location": [ "FROM_STEP_1" ] } ``` `FROM_STEP_1` is `matches[].id` from the answer of step 1. It goes in `location`. 3. Read one person from the results in full. ``` POST https://api.heyreagent.com/v1/actions/get_profile_details { "person": "FROM_STEP_2" } ``` `FROM_STEP_2` is `results[].publicProfileUrl` from the answer of step 2. It goes in `person`. ## Comment on someone's latest post Find what a person posted, and leave a comment. 1. List the person's posts, newest first. ``` POST https://api.heyreagent.com/v1/actions/list_posts_by_author { "author": "PASTE_PROFILE_LINK_HERE" } ``` 2. Comment on one of them. ``` POST https://api.heyreagent.com/v1/actions/comment_on_post { "text": "Great post!", "postUrl": "FROM_STEP_1" } ``` `FROM_STEP_1` is `posts[].socialId` from the answer of step 1. It goes in `postUrl`. # Ids and links > Actions hand things to each other: one action gives you an id, and you give that id to the next. There are different kinds, and they are not interchangeable. - A post has two ids. The one in its link only works for reading the post. To comment or react, use the post's link or its `socialId`. - A person has three ids: one on ordinary LinkedIn, another in Sales Navigator, another in Recruiter. Each only works in its own product. A profile link works wherever a profile link is asked for. ## connection id One of your connected LinkedIn accounts. Optional everywhere it appears: left out, your first live account is used. You get one from: `list_linkedin_accounts` (`accounts[].id`), `get_my_profile` (`accounts[].connectionId`), `list_connections` (`connections[].connectionId`), `list_connections` (`summary.accounts[].connectionId`), `list_sent_invitations` (`pendingInvitations[].connectionId`), `preview_withdraw_invitations` (`breakdown[].linkedinConnectionId`), `list_conversations` (`inbox[].linkedinConnectionId`), `get_conversation` (`connectionId`), `list_inmail` (`inmail[].connectionId`), `get_inmail_conversation` (`connectionId`), `get_inmail_credits` (`accounts[].connectionId`), `list_sales_navigator_contracts` (`accounts[].connectionId`), `who_is_waiting_on_me` (`waitingOnYou[].connectionId`), `who_went_cold` (`coldConversations[].connectionId`), `connections_never_messaged` (`summary.accounts[].connectionId`), `get_usage` (`connectionId`). You give it to: `get_my_profile` (`connectionId`), `get_profile` (`connectionId`), `update_my_profile` (`connectionId`), `get_profile_details` (`connectionId`), `endorse_skill` (`connectionId`), `list_connections` (`connectionId`), `list_sent_invitations` (`connectionId`), `preview_withdraw_invitations` (`linkedinConnectionId`), `withdraw_invitations` (`linkedinConnectionId`), `send_invitation` (`connectionId`), `withdraw_invitation` (`connectionId`), `list_received_invitations` (`connectionId`), `respond_to_invitation` (`connectionId`), `list_followers` (`connectionId`), `get_conversation` (`connectionId`), `sync_inbox` (`linkedinConnectionId`), `send_message` (`connectionId`), `list_chats` (`connectionId`), `get_chat` (`connectionId`), `list_chat_messages` (`connectionId`), `list_chat_participants` (`connectionId`), `send_chat_message` (`connectionId`), `start_conversation` (`connectionId`), `set_chat_status` (`connectionId`), `resync_chat` (`connectionId`), `delete_chat` (`connectionId`), `list_messages` (`connectionId`), `get_message` (`connectionId`), `get_message_attachment` (`connectionId`), `edit_message` (`connectionId`), `delete_message` (`connectionId`), `react_to_message` (`connectionId`), `list_chat_attendees` (`connectionId`), `get_chat_attendee` (`connectionId`), `get_chat_attendee_picture` (`connectionId`), `list_attendee_chats` (`connectionId`), `list_attendee_messages` (`connectionId`), `resync_attendee_chats` (`connectionId`), `list_inmail` (`connectionId`), `get_inmail_conversation` (`connectionId`), `get_inmail_credits` (`connectionId`), `list_sales_navigator_contracts` (`connectionId`), `switch_sales_navigator_contract` (`connectionId`), `search_people` (`connectionId`), `search_linkedin` (`connectionId`), `lookup_search_ids` (`connectionId`), `get_company` (`connectionId`), `search_posts` (`connectionId`), `search_linkedin_people` (`connectionId`), `search_linkedin_companies` (`connectionId`), `search_linkedin_posts` (`connectionId`), `search_linkedin_jobs` (`connectionId`), `search_linkedin_sales_navigator_people` (`connectionId`), `search_linkedin_sales_navigator_companies` (`connectionId`), `search_linkedin_recruiter_people` (`connectionId`), `get_post_engagers` (`connectionId`), `create_post` (`connectionId`), `comment_on_post` (`connectionId`), `react_to_post` (`connectionId`), `get_post` (`connectionId`), `list_post_comments` (`connectionId`), `list_post_reactions` (`connectionId`), `list_posts_by_author` (`connectionId`), `list_comments_by_person` (`connectionId`), `list_reactions_by_person` (`connectionId`), `save_lead` (`connectionId`), `list_hiring_projects` (`connectionId`), `get_hiring_project` (`connectionId`), `move_recruiter_candidate` (`connectionId`), `reject_recruiter_applicant` (`connectionId`), `list_job_postings` (`connectionId`), `get_job_posting` (`connectionId`), `list_job_applicants` (`connectionId`), `get_job_applicant` (`connectionId`), `get_job_applicant_resume` (`connectionId`), `create_job_posting` (`connectionId`), `edit_job_posting` (`connectionId`), `publish_job_posting` (`connectionId`), `solve_job_posting_checkpoint` (`connectionId`), `close_job_posting` (`connectionId`), `who_is_waiting_on_me` (`connectionId`), `who_went_cold` (`connectionId`), `connections_never_messaged` (`connectionId`), `engagers_not_connected` (`connectionId`), `update_linkedin_connection` (`connectionId`), `get_usage` (`connectionId`). ## profile link A link to a person: linkedin.com/in/, linkedin.com/in/, or a Sales Navigator lead link. You can copy it yourself. Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name You get one from: `search_people` (`people[].profileUrl`), `get_my_profile` (`accounts[].profileUrl`), `get_profile_details` (`publicProfileUrl`), `list_connections` (`connections[].profileUrl`), `list_sent_invitations` (`pendingInvitations[].profileUrl`), `list_received_invitations` (`invitations[].profileUrl`), `list_followers` (`followers[].profileUrl`), `list_conversations` (`inbox[].participantProfileUrl`), `get_conversation` (`participant.profileUrl`), `list_chat_participants` (`participants[].profileUrl`), `list_chat_attendees` (`attendees[].profileUrl`), `get_chat_attendee` (`profileUrl`), `list_inmail` (`inmail[].participant.profileUrl`), `get_inmail_conversation` (`participant.profileUrl`), `search_posts` (`posts[].author.profileUrl`), `search_people_sales_navigator` (`leads[].linkedinUrl`), `find_decision_makers` (`leads[].linkedinUrl`), `search_linkedin_people` (`results[].publicProfileUrl`), `search_linkedin_people` (`results[].profileUrl`), `search_linkedin_sales_navigator_people` (`results[].publicProfileUrl`), `get_post_engagers` (`reactors[].linkedinUrl`), `get_post_engagers` (`commenters[].linkedinUrl`), `list_post_comments` (`comments[].authorDetails.profileUrl`), `list_post_reactions` (`reactions[].author.profileUrl`), `list_job_applicants` (`applicants[].publicProfileUrl`), `get_job_applicant` (`publicProfileUrl`), `who_is_waiting_on_me` (`waitingOnYou[].profileUrl`), `who_went_cold` (`coldConversations[].profileUrl`), `connections_never_messaged` (`leads[].profileUrl`), `engagers_not_connected` (`leads[].profileUrl`). You give it to: `get_profile` (`profileUrl`), `get_profile_details` (`person`), `send_invitation` (`profileUrl`), `get_conversation` (`conversationUrl`), `sync_inbox` (`conversationUrl`), `send_message` (`profileUrl`), `start_conversation` (`to`), `list_inmail` (`profileUrl`), `get_recent_posts` (`profileUrl`), `list_posts_by_author` (`author`), `list_comments_by_person` (`person`), `list_reactions_by_person` (`person`). ## public identifier The name at the end of a person's public profile link (linkedin.com/in/). You can copy it yourself. It is the last part of the person's profile link: in https://www.linkedin.com/in/their-name it is their-name. You get one from: `search_linkedin_people` (`results[].publicIdentifier`), `get_my_profile` (`accounts[].publicIdentifier`), `get_profile_details` (`publicIdentifier`), `list_sent_invitations` (`pendingInvitations[].publicIdentifier`), `search_people_sales_navigator` (`leads[].publicIdentifier`), `find_decision_makers` (`leads[].publicIdentifier`), `get_post` (`author.publicIdentifier`), `list_job_applicants` (`applicants[].publicIdentifier`). You give it to: `get_profile` (`profileUrl`), `get_recent_posts` (`profileUrl`). ## member id LinkedIn's internal id of a person on ordinary LinkedIn: starts with ACo or ADo. Sales Navigator and Recruiter use a different id for the same person. You get one from: `get_profile_details` (`providerId`), `get_my_profile` (`accounts[].providerId`), `list_sent_invitations` (`pendingInvitations[].providerId`), `get_conversation` (`participant.providerId`), `list_chats` (`chats[].attendeeProviderId`), `get_chat` (`attendeeProviderId`), `list_chat_messages` (`messages[].senderId`), `list_chat_participants` (`participants[].providerId`), `list_messages` (`messages[].senderId`), `get_message` (`senderId`), `list_chat_attendees` (`attendees[].providerId`), `get_chat_attendee` (`providerId`), `list_attendee_chats` (`chats[].attendeeProviderId`), `list_attendee_messages` (`messages[].senderId`), `search_people` (`people[].providerId`), `search_posts` (`posts[].author.providerId`), `search_linkedin_people` (`results[].id`), `get_post_engagers` (`reactors[].providerId`), `get_post_engagers` (`commenters[].providerId`), `list_post_reactions` (`reactions[].author.id`). You give it to: `get_profile_details` (`person`), `endorse_skill` (`profileId`), `list_followers` (`of`), `start_conversation` (`to`), `get_recent_posts` (`providerId`), `create_post` (`mentions.profileId`), `comment_on_post` (`mentions.profileId`), `list_posts_by_author` (`author`), `list_comments_by_person` (`person`), `list_reactions_by_person` (`person`). ## Sales Navigator id A person's id in Sales Navigator: starts with ACw. Not accepted where a member id is asked for. You get one from: `search_linkedin_sales_navigator_people` (`results[].id`), `search_people_sales_navigator` (`leads[].providerId`), `find_decision_makers` (`leads[].providerId`). You give it to: `get_profile_details` (`person`), `start_conversation` (`to`), `get_recent_posts` (`providerId`), `save_lead` (`lead`). ## Sales Navigator lead link A Sales Navigator lead link, linkedin.com/sales/lead/,…. You can copy it yourself. Open the lead in Sales Navigator and copy the address from your browser. It starts with https://www.linkedin.com/sales/lead/ You get one from: `search_people_sales_navigator` (`leads[].salesNavLeadUrl`), `find_decision_makers` (`leads[].salesNavLeadUrl`). You give it to: `list_inmail` (`profileUrl`), `save_lead` (`lead`). ## Recruiter id A person's id in Recruiter: starts with AE. Not accepted where a member id is asked for. You get one from: `search_linkedin_recruiter_people` (`results[].id`). You give it to: `get_profile_details` (`person`), `start_conversation` (`to`), `move_recruiter_candidate` (`candidateId`), `reject_recruiter_applicant` (`applicantId`). ## company id LinkedIn's id of a company page: digits only. You get one from: `search_linkedin_companies` (`results[].id`), `get_profile_details` (`workExperience[].companyId`), `get_company` (`id`), `search_companies` (`companies[].companyId`), `list_funding_signals` (`companies[].companyId`), `search_linkedin_sales_navigator_companies` (`results[].id`). You give it to: `update_my_profile` (`experience.companyId`), `list_followers` (`of`), `get_company` (`company`), `search_people_sales_navigator` (`companyIds`), `count_people_sales_navigator` (`companyIds`), `create_post` (`mentions.profileId`), `comment_on_post` (`mentions.profileId`), `list_posts_by_author` (`author`). ## company link A link to a company page (linkedin.com/company/). You can copy it yourself. Open the company's page on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/company/their-name You get one from: `search_linkedin_companies` (`results[].profileUrl`), `get_company` (`profileUrl`). You give it to: `get_company` (`company`). ## company messaging id The id a company page is written to at. Different from its company id. You get one from: `get_company` (`messaging.id`). You give it to: `start_conversation` (`to`). ## organization id The id of a company page you administer, to act as that page. You give it to: `create_post` (`asOrganization`), `comment_on_post` (`asOrganization`), `react_to_post` (`asOrganization`). ## post link A link to a post. You can copy it yourself. On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". You get one from: `search_posts` (`posts[].url`), `get_profile` (`recentPosts[].url`), `search_linkedin_posts` (`results[].shareUrl`), `get_recent_posts` (`posts[].url`), `get_post` (`shareUrl`), `list_posts_by_author` (`posts[].shareUrl`). You give it to: `get_post_engagers` (`postUrl`), `create_post` (`repostOf`), `comment_on_post` (`postUrl`), `react_to_post` (`postUrl`), `get_post` (`post`), `list_post_comments` (`post`), `list_post_reactions` (`post`), `engagers_not_connected` (`postUrl`). ## post id The id of a post as it appears in its link. Reading the post takes it; commenting and reacting need the post social id. You get one from: `search_linkedin_posts` (`results[].id`), `create_post` (`postId`), `get_post` (`id`), `list_posts_by_author` (`posts[].id`). You give it to: `get_post` (`post`), `list_post_comments` (`post`), `list_post_reactions` (`post`). ## post social id The id LinkedIn files a post's comments and reactions under: urn:li:activity:, urn:li:ugcPost: or urn:li:share:. You get one from: `search_posts` (`posts[].socialId`), `search_linkedin_posts` (`results[].socialId`), `get_post` (`socialId`), `list_posts_by_author` (`posts[].socialId`). You give it to: `get_post_engagers` (`postUrl`), `create_post` (`repostOf`), `comment_on_post` (`postUrl`), `react_to_post` (`postUrl`), `get_post` (`post`), `list_post_comments` (`post`), `list_post_reactions` (`post`), `engagers_not_connected` (`postUrl`). ## comment id One comment on a post. You get one from: `list_post_comments` (`comments[].id`), `comment_on_post` (`commentId`), `list_comments_by_person` (`comments[].id`). You give it to: `comment_on_post` (`replyToCommentId`), `react_to_post` (`commentId`), `list_post_comments` (`commentId`), `list_post_reactions` (`commentId`). ## chat id One conversation. You get one from: `list_chats` (`chats[].id`), `get_conversation` (`chatId`), `send_message` (`conversationId`), `get_chat` (`id`), `list_chat_messages` (`messages[].chatId`), `send_chat_message` (`chatId`), `start_conversation` (`chatId`), `list_messages` (`messages[].chatId`), `get_message` (`chatId`), `list_attendee_chats` (`chats[].id`), `list_attendee_messages` (`messages[].chatId`), `list_inmail` (`inmail[].chatId`), `get_inmail_conversation` (`chatId`). You give it to: `send_message` (`conversationId`), `get_chat` (`chatId`), `list_chat_messages` (`chatId`), `list_chat_participants` (`chatId`), `send_chat_message` (`chatId`), `set_chat_status` (`chatId`), `resync_chat` (`chatId`), `delete_chat` (`chatId`), `get_inmail_conversation` (`chatId`). ## message id One message. You get one from: `list_chat_messages` (`messages[].id`), `send_message` (`messageId`), `get_chat` (`lastMessage.id`), `send_chat_message` (`messageId`), `start_conversation` (`messageId`), `list_messages` (`messages[].id`), `get_message` (`id`), `list_attendee_messages` (`messages[].id`). You give it to: `send_chat_message` (`replyToMessageId`), `get_message` (`messageId`), `get_message_attachment` (`messageId`), `edit_message` (`messageId`), `delete_message` (`messageId`), `react_to_message` (`messageId`). ## attendee id One participant of your conversations, as the inbox knows them. Not their member id. You get one from: `list_chat_attendees` (`attendees[].id`), `list_chat_messages` (`messages[].senderAttendeeId`), `list_chat_participants` (`participants[].id`), `list_messages` (`messages[].senderAttendeeId`), `get_message` (`senderAttendeeId`), `get_chat_attendee` (`id`), `list_attendee_messages` (`messages[].senderAttendeeId`). You give it to: `list_chat_messages` (`senderId`), `list_messages` (`senderId`), `get_chat_attendee` (`attendeeId`), `get_chat_attendee_picture` (`attendeeId`), `list_attendee_chats` (`attendeeId`), `list_attendee_messages` (`attendeeId`), `resync_attendee_chats` (`attendeeId`). ## attachment id One file attached to a message. You get one from: `list_chat_messages` (`messages[].attachments[].id`), `list_messages` (`messages[].attachments[].id`), `get_message` (`attachments[].id`), `list_attendee_messages` (`messages[].attachments[].id`). You give it to: `get_message_attachment` (`attachmentId`). ## invitation id One invitation you received and have not answered. You get one from: `list_received_invitations` (`invitations[].invitationId`). You give it to: `respond_to_invitation` (`invitationId`), `start_conversation` (`invitationId`). ## sent invitation id One invitation you sent that is still unanswered. Not accepted where an invitation id is asked for. You get one from: `list_sent_invitations` (`pendingInvitations[].invitationId`), `send_invitation` (`invitationId`). You give it to: `withdraw_invitation` (`invitationId`). ## search filter id LinkedIn's id for a place, company, school, industry and the like. Search filters take these, never the name. Each kind comes from lookup_search_ids with a different `type`. You get one from: `lookup_search_ids` (`matches[].id`), `update_my_profile` (`locationOptions[].id`). You give it to: `update_my_profile` (`locationId`), `search_linkedin_people` (`industry`), `search_linkedin_people` (`location`), `search_linkedin_people` (`company`), `search_linkedin_people` (`pastCompany`), `search_linkedin_people` (`school`), `search_linkedin_people` (`service`), `search_linkedin_people` (`connectionsOf`), `search_linkedin_people` (`followersOf`), `search_linkedin_companies` (`industry`), `search_linkedin_companies` (`location`), `search_linkedin_posts` (`postedBy`), `search_linkedin_posts` (`mentioning`), `search_linkedin_posts` (`author`), `search_linkedin_jobs` (`region`), `search_linkedin_jobs` (`location`), `search_linkedin_jobs` (`industry`), `search_linkedin_jobs` (`function`), `search_linkedin_jobs` (`role`), `search_linkedin_jobs` (`company`), `search_linkedin_sales_navigator_people` (`savedSearchId`), `search_linkedin_sales_navigator_people` (`recentSearchId`), `search_linkedin_sales_navigator_people` (`location`), `search_linkedin_sales_navigator_people` (`locationByPostalCode`), `search_linkedin_sales_navigator_people` (`industry`), `search_linkedin_sales_navigator_people` (`groups`), `search_linkedin_sales_navigator_people` (`school`), `search_linkedin_sales_navigator_people` (`company`), `search_linkedin_sales_navigator_people` (`companyLocation`), `search_linkedin_sales_navigator_people` (`pastCompany`), `search_linkedin_sales_navigator_people` (`function`), `search_linkedin_sales_navigator_people` (`role`), `search_linkedin_sales_navigator_people` (`pastRole`), `search_linkedin_sales_navigator_people` (`connectionsOf`), `search_linkedin_sales_navigator_people` (`persona`), `search_linkedin_sales_navigator_people` (`accountLists`), `search_linkedin_sales_navigator_people` (`leadLists`), `search_linkedin_sales_navigator_companies` (`savedSearchId`), `search_linkedin_sales_navigator_companies` (`recentSearchId`), `search_linkedin_sales_navigator_companies` (`industry`), `search_linkedin_sales_navigator_companies` (`location`), `search_linkedin_sales_navigator_companies` (`locationByPostalCode`), `search_linkedin_sales_navigator_companies` (`departmentHeadcount`), `search_linkedin_sales_navigator_companies` (`departmentHeadcountGrowth`), `search_linkedin_sales_navigator_companies` (`technologies`), `search_linkedin_sales_navigator_companies` (`savedAccounts`), `search_linkedin_sales_navigator_companies` (`accountLists`), `search_linkedin_recruiter_people` (`savedSearch`), `search_linkedin_recruiter_people` (`savedFilter`), `search_linkedin_recruiter_people` (`location`), `search_linkedin_recruiter_people` (`industry`), `search_linkedin_recruiter_people` (`role`), `search_linkedin_recruiter_people` (`skills`), `search_linkedin_recruiter_people` (`company`), `search_linkedin_recruiter_people` (`currentCompany`), `search_linkedin_recruiter_people` (`pastCompany`), `search_linkedin_recruiter_people` (`school`), `search_linkedin_recruiter_people` (`degree`), `search_linkedin_recruiter_people` (`groups`), `search_linkedin_recruiter_people` (`function`), `search_linkedin_recruiter_people` (`hiringProjects`), `create_post` (`audience`), `save_lead` (`listId`), `list_job_applicants` (`includeDegree`), `list_job_applicants` (`excludeDegree`), `create_job_posting` (`jobTitle.id`), `create_job_posting` (`company.id`), `create_job_posting` (`location`), `create_job_posting` (`recruiter.functions`), `create_job_posting` (`recruiter.industries`), `create_job_posting` (`recruiter.skills`), `edit_job_posting` (`jobTitle.id`), `edit_job_posting` (`company.id`), `edit_job_posting` (`location`), `edit_job_posting` (`recruiter.functions`), `edit_job_posting` (`recruiter.industries`), `edit_job_posting` (`recruiter.skills`). ## skill endorsement id One skill on one person's profile. A number, not text. You get one from: `get_profile_details` (`skills[].endorsementId`). You give it to: `endorse_skill` (`skillEndorsementId`). ## job id One of your job postings. A draft has one too. You get one from: `list_job_postings` (`jobPostings[].id`), `list_hiring_projects` (`projects[].jobPosting.id`), `get_hiring_project` (`jobPosting.id`), `get_job_posting` (`id`), `create_job_posting` (`jobId`), `edit_job_posting` (`jobId`), `publish_job_posting` (`jobId`), `solve_job_posting_checkpoint` (`jobId`). You give it to: `start_conversation` (`recruiter.jobPostingId`), `create_post` (`jobPostingId`), `get_job_posting` (`jobId`), `list_job_applicants` (`jobId`), `edit_job_posting` (`jobId`), `publish_job_posting` (`draftId`), `solve_job_posting_checkpoint` (`draftId`), `close_job_posting` (`jobId`). ## applicant id One applicant to one of your job postings. You get one from: `list_job_applicants` (`applicants[].id`), `get_job_applicant` (`id`). You give it to: `start_conversation` (`applicantId`), `get_job_applicant` (`applicantId`), `get_job_applicant_resume` (`applicantId`). ## hiring project id One Recruiter hiring project. You get one from: `list_hiring_projects` (`projects[].id`), `get_hiring_project` (`id`), `create_job_posting` (`projectId`). You give it to: `start_conversation` (`recruiter.hiringProjectId`), `get_hiring_project` (`projectId`), `move_recruiter_candidate` (`hiringProjectId`), `reject_recruiter_applicant` (`hiringProjectId`). ## contract id One Sales Navigator contract your account can use. You get one from: `list_sales_navigator_contracts` (`accounts[].contracts[].id`), `list_inmail` (`inmail[].sentFromContract`), `get_inmail_conversation` (`sentFromContract`), `get_inmail_credits` (`accounts[].salesNavigatorContracts.contracts[].id`), `list_sales_navigator_contracts` (`accounts[].activeContractId`). You give it to: `switch_sales_navigator_contract` (`contractId`). ## conversation link What the inbox tools address a conversation by: the other person's profile link, or a linkedin.com/messaging/thread/… link. You get one from: `list_conversations` (`inbox[].conversationUrl`). You give it to: `get_conversation` (`conversationUrl`), `sync_inbox` (`conversationUrl`). ## read key What marks one inbox conversation read. You get one from: `list_conversations` (`inbox[].readKey`). You give it to: `mark_read` (`readKey`). ## task id An inbox refresh that runs in the background. You get one from: `sync_inbox` (`taskIds[]`), `sync_inbox` (`taskId`). You give it to: `get_send_status` (`taskId`). ## campaign id One outreach campaign. You get one from: `preview_withdraw_invitations` (`breakdown[].campaignId`). You give it to: `preview_withdraw_invitations` (`campaignId`), `withdraw_invitations` (`campaignId`). ## profile entry id One experience or education entry on your own profile. You get one from: `update_my_profile` (`experience[].id`), `update_my_profile` (`education[].id`). You give it to: `update_my_profile` (`experience.id`), `update_my_profile` (`education.id`). ## cursor Where the next page starts. Pass it back to the SAME action with the same other inputs; null means there is no next page. # Every action ## get_my_profile: Get my profile Read who each of your connected LinkedIn accounts is. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_my_profile Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Restrict to one LinkedIn sender. Omit to report every live sender in this setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `accounts` ### Good to know - One row per live account. An account that could not be read has error in place of the profile fields. Page: https://heyreagent.com/docs/actions/get_my_profile ## get_profile: Get a profile Read one person's profile in short, with their recent posts and their company. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_profile Authorization: Bearer YOUR_KEY content-type: application/json { "profileUrl": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `profileUrl` (needed): a profile link or a public identifier. The person's LinkedIn profile URL (https://linkedin.com/in/…) or public identifier. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `connectionId` (optional): a connection id. Which sender to read through. Omit to use the first live sender. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `profile` - `readVia` - `recentPosts` - `company` - `note` ### Good to know - The answer holds no id and no link for the person. For their member id use get_profile_details. - A connectionId that matches no live account is not refused: the profile is read through a shared account and readVia says "house". Page: https://heyreagent.com/docs/actions/get_profile ## update_my_profile: Update my profile Read, preview a change to, or change your own profile. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/update_my_profile Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Whose profile to edit: the LinkedIn account id from list_linkedin_accounts. May be omitted only when the setup has exactly one live sender. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `headline` (optional): text, up to 220 characters. New headline — the line under the name (max 220 characters). - `about` (optional): text, up to 2600 characters. New About section (max 2600 characters). Replaces the whole section. - `location` (optional): text, up to 120 characters. New profile location as a place name, e.g. "Austin, Texas". Matched to a LinkedIn place — the preview shows the match. - `locationId` (optional): a search filter id. An exact LinkedIn place id, taken from locationOptions in a preview. Overrides location. Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `postalCode` (optional): text. 5-digit postal code to go with the location (optional). - `websiteLink` (optional): a group of fields. The link shown near the top of the profile. - `type` (needed): one of: WEBSITE, PORTFOLIO, BLOG, NEWSLETTER, STORE. What the link is. - `url` (needed): a link. The full https:// URL. - `displayOn` (optional): one of: EVERYWHERE, PROFILE_ONLY. Where LinkedIn shows it (default EVERYWHERE). - `experience` (optional): a group of fields. Add or edit ONE experience entry. - `id` (optional): a profile entry id. Id of the experience to EDIT (from the preview's current.experience). Omit to ADD a new one. Where to get it: An earlier answer of this same action has it, in `experience[].id`. - `role` (optional): text, up to 100 characters. Job title. Required when adding. - `company` (optional): text, up to 100 characters. Company name. Required when adding. - `companyId` (optional): a company id. LinkedIn company id, to link the entry to that company page (e.g. a companyId from search_companies). Where to get it: Run `search_linkedin_companies` and use `results[].id`. - `location` (optional): text, up to 120 characters. Where the job is / was, as free text. - `presence` (optional): one of: ON_SITE, HYBRID, REMOTE. - `startDate` (optional): a group of fields. - `endDate` (optional): a group of fields. Omit for a current position. - `description` (optional): text, up to 2000 characters. - `notifyNetwork` (optional): true or false. true = let LinkedIn announce it to the network. Default false (no announcement). - `education` (optional): a group of fields. Add or edit ONE education entry. - `id` (optional): a profile entry id. Id of the education entry to EDIT (from the preview's current.education). Omit to ADD a new one. Where to get it: An earlier answer of this same action has it, in `experience[].id`. - `school` (optional): text, up to 150 characters. School name. Required when adding. - `degree` (optional): text, up to 100 characters. - `fieldOfStudy` (optional): text, up to 100 characters. - `grade` (optional): text, up to 80 characters. - `activities` (optional): text, up to 500 characters. - `description` (optional): text, up to 2000 characters. - `startDate` (optional): a group of fields. - `endDate` (optional): a group of fields. - `notifyNetwork` (optional): true or false. true = let LinkedIn announce it to the network. Default false (no announcement). - `addSkills` (optional): a list (text, up to 80 characters), up to 20. Skills to ADD to the profile, by name (up to 20 per call). Skills already on the profile are kept; removing a skill is not possible here. - `pictureUrl` (optional): a link. New PROFILE picture: a public https:// link straight to a JPEG or PNG file (max 8MB). LinkedIn applies its default crop. - `coverPictureUrl` (optional): a link. New COVER (banner) picture: a public https:// link straight to a JPEG or PNG file (max 8MB). LinkedIn's banner is 1584×396. - `openToWork` (optional): a group of fields. Set the "open to work" job preferences. It cannot be turned off from here. - `jobTitles` (needed): a list (text, up to 100 characters), up to 5. Job titles the person is open to (1–5), by name — each is matched to LinkedIn's own title list. - `workplaces` (needed): a list (one of: ON_SITE, HYBRID, REMOTE). Which workplace types: ON_SITE, HYBRID, REMOTE. - `onSiteLocations` (optional): a list (text), up to 5. Places for on-site / hybrid work, by name. Required when workplaces has ON_SITE or HYBRID. - `remoteLocations` (optional): a list (text), up to 5. Places (usually countries) for remote work, by name. Required when workplaces has REMOTE. - `startDate` (optional): one of: IMMEDIATELY, FLEXIBLE. - `employmentTypes` (optional): a list (one of: FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP, TEMPORARY). - `visibility` (needed): one of: RECRUITERS_ONLY, ALL. RECRUITERS_ONLY = only people using LinkedIn Recruiter see it. ALL = everyone sees it, with the green #OpenToWork frame on the profile photo — ask the user which, never assume. - `confirm` (optional): true or false. false (default) = preview only, nothing changes. true = change the profile now (only after the user said yes). ### What you get back - `action` - `account` - `message` - `profileUrl` - `experience` - `education` - `locationOptions` - `changes` ### Good to know - What comes back depends on action. Called with no field: "current_profile", with profileUrl, experience[].id and education[].id. With a field and confirm false: "preview", with changes, and locationOptions when the place name matched more than one place. With confirm true: "updated". - To edit an existing experience or education entry pass its id; without one a new entry is added. - location is a place name the action looks up itself; locationId overrides it. Page: https://heyreagent.com/docs/actions/update_my_profile ## get_profile_details: Get a profile in depth Read one person's profile in depth, live, with the sections you ask for. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_profile_details Authorization: Bearer YOUR_KEY content-type: application/json { "person": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `person` (needed): a profile link or a member id or a Sales Navigator id or a Recruiter id. The person: a LinkedIn profile URL or member id. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `sections` (optional): a list (one of: *, about, experience, education, languages, skills, certifications, volunteering_experience, projects, recommendations_received, recommendations_given, recruiting_activity), up to 11. Which sections to include in full. Omit for the basic profile. - `via` (optional): one of: sales_navigator, recruiter. Read through this product instead of ordinary LinkedIn. - `notify` (optional): true or false. Whether the person is told you viewed their profile (default false). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `providerId`: a member id - `publicIdentifier`: a public identifier - `firstName`: string or null - `lastName`: string or null - `pronoun`: string - `headline`: string - `summary`: string - `contactInfo.emails`: string[] - `contactInfo.phones`: string[] - `contactInfo.adresses`: string[] - `birthdate.month`: number - `birthdate.day`: number - `primaryLocale.country`: string - `primaryLocale.language`: string - `location`: string - `websites`: string[] - `creatorWebsite.url`: string - `creatorWebsite.description`: string - `profilePictureUrl`: string - `profilePictureUrlLarge`: string - `backgroundPictureUrl`: string - `hashtags`: string[] - `canSendInmail`: boolean - `connectedAt`: number - `isOpenProfile`: boolean - `isPremium`: boolean - `isInfluencer`: boolean - `isCreator`: boolean - `isHiring`: boolean - `isOpenToWork`: boolean - `isSavedLead`: boolean - `isCrmImported`: boolean - `isRelationship`: boolean - `isSelf`: boolean - `invitation.type`: SENT | RECEIVED - `invitation.status`: PENDING | IGNORED | WITHDRAWN - `workExperience[].id`: string - `workExperience[].position`: string - `workExperience[].companyId`: a company id - `workExperience[].companyUrl`: string - `workExperience[].companyPictureUrl`: string - `workExperience[].industry`: string[] - `workExperience[].company`: string - `workExperience[].location`: string - `workExperience[].description`: string - `workExperience[].skills`: string[] - `workExperience[].current`: boolean - `workExperience[].status`: string - `workExperience[].start`: string or null - `workExperience[].end`: string or null - `workExperienceTotalCount`: number - `volunteeringExperience[].company`: string - `volunteeringExperience[].description`: string - `volunteeringExperience[].role`: string - `volunteeringExperience[].cause`: string - `volunteeringExperience[].start`: string or null - `volunteeringExperience[].end`: string or null - `volunteeringExperienceTotalCount`: number - `education[].id`: string - `education[].degree`: string - `education[].grade`: string - `education[].description`: string - `education[].activities`: string - `education[].school`: string - `education[].schoolId`: string - `education[].schoolUrl`: string - `education[].schoolPictureUrl`: string - `education[].skills`: string[] - `education[].fieldOfStudy`: string - `education[].start`: string or null - `education[].end`: string or null - `educationTotalCount`: number - `skills[].name`: string - `skills[].endorsementCount`: number - `skills[].endorsementId`: a skill endorsement id - `skills[].insights`: string[] - `skills[].endorsed`: boolean - `skillsTotalCount`: number - `languages[].name`: string - `languages[].proficiency`: string - `languagesTotalCount`: number - `certifications[].name`: string - `certifications[].organization`: string - `certifications[].url`: string - `certificationsTotalCount`: number - `projects[].name`: string - `projects[].description`: string - `projects[].skills`: string[] - `projects[].start`: string or null - `projects[].end`: string or null - `projectsTotalCount`: number - `recommendations.receivedTotalCount`: number - `recommendations.givenTotalCount`: number - `tags[].id`: string - `tags[].name`: string - `notes[].projectId`: string - `notes[].content`: string - `notes[].createdAt`: number - `candidateId`: string - `recruitingActivity[].createdAt`: string - `recruitingActivity[].updatedAt`: string - `recruitingActivity[].event`: UNHANDLED_EVENT - `recruitingActivity[].content`: string - `recruitingActivity[].status`: PENDING | ACCEPTED | DECLINED | AWAITING_REPLY - `recruitingActivity[].projectId`: string - `recruitingActivity[].projectName`: string - `recruitingActivity[].state`: string - `throttledSections`: experience | education | languages | skills | certifications | volunteering_experience | projects | recommendations_received | recommendations_given[] - `followerCount`: number - `connectionsCount`: number - `sharedConnectionsCount`: number - `networkDistance`: FIRST_DEGREE | SECOND_DEGREE | THIRD_DEGREE | OUT_OF_NETWORK - `publicProfileUrl`: a profile link - `locked`: boolean - `unlockCredit`: number ### Good to know - skills[].endorsementId is present only when sections includes "skills". - With via "sales_navigator" or "recruiter", person must be that product's id (a public link is not accepted there), and providerId is then that product's id, not a member id. - LinkedIn counts this as a profile view, and throttles heavy use: a section it held back is named in throttledSections and comes back empty. - networkDistance is FIRST_DEGREE / SECOND_DEGREE / THIRD_DEGREE / OUT_OF_NETWORK. Page: https://heyreagent.com/docs/actions/get_profile_details ## endorse_skill: Endorse a skill Endorse one skill on someone's profile. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/endorse_skill Authorization: Bearer YOUR_KEY content-type: application/json { "profileId": "PASTE_MEMBER_ID_HERE", "skillEndorsementId": 123 } ``` ### What you give it - `profileId` (needed): a member id. The person's LinkedIn member id (from get_profile_details). Where to get it: Run `get_profile_details` and use `providerId`. - `skillEndorsementId` (needed): a skill endorsement id. The skill's endorsement id (from the skills section of get_profile_details). Where to get it: Run `get_profile_details` and use `skills[].endorsementId`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `endorsed` - `profileId` - `skillEndorsementId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - Both ids come from one get_profile_details call with sections ["skills"]: providerId and skills[].endorsementId. Page: https://heyreagent.com/docs/actions/endorse_skill ## list_connections: List my connections List your 1st-degree connections. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_connections Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Restrict to one LinkedIn sender (its linkedinConnections _id from list_linkedin_accounts). Omit to merge across all your live senders in this setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `since` (optional): text. ISO date (e.g. "2026-01-01"). Only return connections made on/after this date. - `search` (optional): text. Case-insensitive substring matched against each person's name and headline. - `limit` (optional): a number, 1 to 500. Max people to return (1–500, default 200). The total match count is always reported even when truncated. - `refresh` (optional): true or false. true = pull the latest connections live from LinkedIn and refresh the cache (slower). false (default) = serve from cache, refreshing live only when the cache is empty or stale. ### What you get back - `summary` - `connections` - `note` ### Good to know - connections[].connectionId is YOUR account the person is connected to, not the person. - No member id comes back. Pass profileUrl on; a action that needs the id resolves it, or get_profile_details returns it. - Served from a stored copy up to 24 hours old; refresh true reads LinkedIn again. Page: https://heyreagent.com/docs/actions/list_connections ## send_invitation: Send an invitation Send one connection invitation, now. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/send_invitation Authorization: Bearer YOUR_KEY content-type: application/json { "profileUrl": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `profileUrl` (needed): a profile link. The person's LinkedIn profile URL (linkedin.com/in/…). Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `note` (optional): text, up to 300 characters. Optional note sent with the invitation (max 300 characters). - `email` (optional): an email address. The person's email address — only for someone whose LinkedIn settings ask for it before they can be invited. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `sent` - `profileUrl` - `invitationId`: a sent invitation id - `withNote` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - A link or an id that is not an ordinary member id (ACo…) is first looked up, which LinkedIn counts as a profile view. - LinkedIn's own weekly invitation limit can refuse it: the error is linkedin_limit_reached. - When the person already has an unanswered invitation from you, LinkedIn answers as if it sent one and hands back that older invitation's id. Page: https://heyreagent.com/docs/actions/send_invitation ## list_sent_invitations: List sent invitations List the invitations you sent that are still unanswered. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_sent_invitations Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Restrict to one LinkedIn sender. Omit to span all live senders. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `limit` (optional): a number, 1 to 300. Max invitations to return (1–300, default 100). ### What you get back - `summary` - `pendingInvitations` - `note` ### Good to know - pendingInvitations[].invitationId is a SENT invitation: withdraw_invitation takes it. respond_to_invitation takes only received ones. - withdraw_invitations takes no invitationId: it takes back many at once, by campaign or by account (pass pendingInvitations[].connectionId as linkedinConnectionId). Page: https://heyreagent.com/docs/actions/list_sent_invitations ## preview_withdraw_invitations: Preview withdrawing invitations Count the sent invitations a withdrawal would take back, per campaign. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/preview_withdraw_invitations Authorization: Bearer YOUR_KEY content-type: application/json { "linkedinConnectionId": "PASTE_CONNECTION_ID_HERE" } ``` ### What you give it - `campaignId` (optional): a campaign id. ID of a specific campaign to withdraw invites for. Provide either campaignId OR linkedinConnectionId, not both. Where to get it: An earlier answer of this same action has it, in `breakdown[].campaignId`. - `linkedinConnectionId` (optional): a connection id. LinkedIn sender account ID. When provided (without campaignId), withdraws eligible invites across ALL campaigns using this account. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `daysThreshold` (optional): a number, 1 to 90. Only withdraw invites that have been pending for at least this many days (default: 7). - `withdrawLimit` (optional): a number, 1 to 500. Max number of profiles to withdraw per campaign run. Omit for no limit. ### What you get back - `summary` - `breakdown` ### Good to know - Pass campaignId or linkedinConnectionId, exactly one. - Only invitations a campaign sent are counted, and only those pending at least daysThreshold days and at most 42. - When nothing qualifies the answer is a plain sentence, not an object. Page: https://heyreagent.com/docs/actions/preview_withdraw_invitations ## withdraw_invitations: Withdraw sent invitations Take back sent invitations that are still unanswered, in the background. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/withdraw_invitations Authorization: Bearer YOUR_KEY content-type: application/json { "linkedinConnectionId": "PASTE_CONNECTION_ID_HERE" } ``` ### What you give it - `campaignId` (optional): a campaign id. ID of a specific campaign to withdraw invites for. Provide either campaignId OR linkedinConnectionId, not both. Where to get it: Run `preview_withdraw_invitations` and use `breakdown[].campaignId`. - `linkedinConnectionId` (optional): a connection id. LinkedIn sender account ID. When provided (without campaignId), withdraws eligible invites across ALL campaigns using this account. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `daysThreshold` (optional): a number, 1 to 90. Only withdraw invites that have been pending for at least this many days (default: 7). - `withdrawLimit` (optional): a number, 1 to 500. Max number of profiles to withdraw per campaign run. Omit for no limit. ### What you get back - `success` - `summary` - `tasks` ### Good to know - Same inputs and rules as preview_withdraw_invitations; run that first. To take back ONE invitation now, whoever sent it, use withdraw_invitation. - It queues the work and answers at once. tasks[].taskId is not a task id that get_send_status takes. - Calling it twice queues the same withdrawal twice. Page: https://heyreagent.com/docs/actions/withdraw_invitations ## withdraw_invitation: Withdraw one sent invitation, now Take back one invitation you sent that is still unanswered, now. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/withdraw_invitation Authorization: Bearer YOUR_KEY content-type: application/json { "invitationId": "PASTE_SENT_INVITATION_ID_HERE" } ``` ### What you give it - `invitationId` (needed): a sent invitation id. The sent invitation to take back (from list_sent_invitations, or returned by send_invitation). Where to get it: Run `list_sent_invitations` and use `pendingInvitations[].invitationId`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `withdrawn` - `invitationId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - It cannot be undone. - An invitation LinkedIn no longer has (accepted, declined or already withdrawn) answers invitation_not_found. Page: https://heyreagent.com/docs/actions/withdraw_invitation ## list_received_invitations: List received invitations List the invitations you received and have not answered. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_received_invitations Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `limit` (optional): a number, 1 to 50. Max invitations to return (1–50, default 20). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_received_invitations`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned` - `nextCursor`: a cursor - `invitations` - `note` ### Good to know - profileUrl is null when LinkedIn gives no public name for the sender. Page: https://heyreagent.com/docs/actions/list_received_invitations ## respond_to_invitation: Accept or decline an invitation Accept or decline one invitation you received. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/respond_to_invitation Authorization: Bearer YOUR_KEY content-type: application/json { "invitationId": "PASTE_INVITATION_ID_HERE", "action": "accept" } ``` ### What you give it - `invitationId` (needed): a invitation id. The invitation to answer (from list_received_invitations). Where to get it: Run `list_received_invitations` and use `invitations[].invitationId`. - `action` (needed): one of: accept, decline. accept or decline. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `invitationId` - `status` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - LinkedIn also needs a per-invitation token to answer one; this action finds it itself by reading your received invitations again. Page: https://heyreagent.com/docs/actions/respond_to_invitation ## list_followers: List followers List who follows you, or who follows another person or a company page. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_followers Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `of` (optional): a member id or a company id. A member id or a company's numeric id. Omit for your own followers. Where to get it: Run `get_profile_details` and use `providerId`. - `limit` (optional): a number, 1 to 100. How many to return (1–100 for your own followers, 1–50 for someone else's; default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_followers`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `followers[].id`: string - `followers[].urn`: string - `followers[].name`: string - `followers[].headline`: string - `followers[].profileUrl`: a profile link - `followers[].profilePictureUrl`: string or null - `followers[].profilePictureUrlLarge`: string or null ### Good to know - This operation's own published definition documents it for LinkedIn (100 a page for your own followers, 50 for someone else's), although the provider's feature summary lists followers under Instagram only. - of takes an id only, never a link. Page: https://heyreagent.com/docs/actions/list_followers ## list_conversations: List conversations List the conversations in the stored copy of your inbox, across your accounts. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_conversations Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `search` (optional): text. Search by participant, headline, message, or connection label. - `unreadOnly` (optional): true or false. Only return unread conversations. - `includeThreads` (optional): true or false. Attach the full message history (oldest→newest) to each conversation row under `thread`, resolved server-side — not just the latest message. Use this to read a specific conversation by searching the lead name. - `limit` (optional): a number, 1 to 200. Max conversations to return (default 50, max 200). - `page` (optional): a number. Page number (default 1). ### What you get back - `total` - `page` - `limit` - `totalPages` - `hasMore` - `lastFetchedAt` - `syncInProgress` - `inbox` ### Good to know - It reads what sync_inbox last stored, not LinkedIn itself; lastFetchedAt says how old that is. list_chats reads LinkedIn live. - To read or re-sync a row, pass its conversationUrl. To reply, pass its participantProfileUrl to send_message; that reaches a 1st-degree connection. For an InMail conversation, take the chatId from list_inmail and use send_chat_message. - readKey changes whenever the conversation's latest message changes: take it from a fresh call. - inbox[].headline comes back empty for the rows an inbox sync writes; the headline is in inbox[].raw.participantHeadline. - Pages are by page number, not by cursor. Page: https://heyreagent.com/docs/actions/list_conversations ## get_conversation: Get a conversation Read your whole conversation with one person. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_conversation Authorization: Bearer YOUR_KEY content-type: application/json { "conversationUrl": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `conversationUrl` (needed): a conversation link or a profile link. The other person's LinkedIn profile URL (https://linkedin.com/in/…) — preferred — or a /messaging/thread/ URL. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `connectionId` (optional): a connection id. Which of your senders owns this conversation (its linkedinConnections _id). Omit to search your live senders; for a live fetch the first live sender is used. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `refresh` (optional): true or false. true = fetch live from LinkedIn even if cached. false (default) = return the cached thread when available, else fetch live. ### What you get back - `source` - `connectionId`: a connection id - `exists` - `participant` - `chatId`: a chat id - `inbox` - `messageCount` - `messages` - `note` ### Good to know - chatId and participant come back only when source is "live". An answer from the stored copy (source "cache") has neither; refresh true forces a live read. - A linkedin.com/messaging/thread/… link works only for a stored conversation. For a live read pass the person's profile link. - For an InMail, Sales Navigator or Recruiter conversation the answer adds replyWith with the chatId: reply there with send_chat_message. send_message by profile link would start an ordinary conversation instead. - exists false with uncertain true means it could not be checked, not that there is no conversation. Page: https://heyreagent.com/docs/actions/get_conversation ## send_message: Send a message Send one message to a 1st-degree connection, or into an existing conversation, now. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/send_message Authorization: Bearer YOUR_KEY content-type: application/json { "profileUrl": "PASTE_PROFILE_LINK_HERE", "text": "Hello!" } ``` ### What you give it - `text` (needed): text, up to 8000 characters. The message text. - `profileUrl` (optional): a profile link. LinkedIn profile URL of the 1st-degree connection to message. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `conversationId` (optional): a chat id. Id of an existing conversation to send into, instead of a profile URL. Where to get it: Run `list_chats` and use `chats[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `sent` - `conversationId`: a chat id - `messageId`: a message id - `text` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - Pass profileUrl or conversationId, one of them. - LinkedIn delivers an ordinary message only to a 1st-degree connection. For anyone else: send_invitation first, or start_conversation with inmail. Page: https://heyreagent.com/docs/actions/send_message ## mark_read: Mark a conversation read in this inbox Mark one conversation read in the stored inbox. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/mark_read Authorization: Bearer YOUR_KEY content-type: application/json { "readKey": "PASTE_READ_KEY_HERE" } ``` ### What you give it - `readKey` (needed): a read key. readKey returned by list_conversations Where to get it: Run `list_conversations` and use `inbox[].readKey`. ### What you get back - `success` ### Good to know - It changes this app's copy only; LinkedIn is not told. set_chat_status marks a conversation read on LinkedIn itself. - Any text is accepted as readKey and answered with success, so a stale key fails silently. Page: https://heyreagent.com/docs/actions/mark_read ## sync_inbox: Refresh the inbox Refresh the stored inbox from LinkedIn, or one conversation of it, in the background. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/sync_inbox Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `conversationUrl` (optional): a conversation link or a profile link. LinkedIn conversation/thread URL, or the person's profile URL. Required when threadOnly=true to fetch just that one conversation. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `linkedinConnectionId` (optional): a connection id. LinkedIn account to sync from. Omit to use all active accounts for the setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `threadOnly` (optional): true or false. When true (with conversationUrl set), fetch only that one conversation thread instead of syncing the whole inbox. ### What you get back - `success` - `taskId`: a task id - `taskIds` - `alreadyInProgress` - `expiredConnections` ### Good to know - One conversation: threadOnly true AND conversationUrl; the answer has taskId. Whole inbox: neither; the answer has taskIds, one per account, and no taskId. - threadOnly true without conversationUrl runs a whole-inbox sync. - A whole-inbox sync ignores linkedinConnectionId and refreshes every account. - When a sync is already running the answer says alreadyInProgress and may carry no task id. Page: https://heyreagent.com/docs/actions/sync_inbox ## get_send_status: Check how an inbox refresh ended Check how a background inbox refresh ended. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_send_status Authorization: Bearer YOUR_KEY content-type: application/json { "taskId": "PASTE_TASK_ID_HERE" } ``` ### What you give it - `taskId` (needed): a task id. Task ID returned by sync_inbox, or by a queued reply. Where to get it: Run `sync_inbox` and use `taskIds[]`. ### What you get back - `taskId` - `taskType` - `status` - `error` - `result` - `createdAt` - `updatedAt` - `completedAt` ### Good to know - status is pending, processing, retrying, completed, failed or cancelled. Page: https://heyreagent.com/docs/actions/get_send_status ## list_chats: List chats List your conversations, newest first. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_chats Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `unread` (optional): true or false. true: only unread conversations. false: only read ones. Omit for both. - `before` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created before this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `after` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created after this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `limit` (optional): a number, 1 to 250. How many to return (1–250, default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_chats`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `chats[].id`: a chat id - `chats[].accountType`: WHATSAPP | LINKEDIN | SLACK | TWITTER | MESSENGER | INSTAGRAM | TELEGRAM - `chats[].providerId`: string - `chats[].attendeeProviderId`: a member id - `chats[].name`: string or null - `chats[].type`: 0 | 1 | 2 - `chats[].timestamp`: string or null - `chats[].unreadCount`: number - `chats[].archived`: 0 | 1 - `chats[].mutedUntil`: -1 | string or null - `chats[].readOnly`: 0 | 1 | 2 - `chats[].disabledFeatures`: reactions | reply[] - `chats[].subject`: string - `chats[].organizationId`: string - `chats[].mailboxId`: string - `chats[].contentType`: inmail | sponsored | linkedin_offer - `chats[].folder`: INBOX | INBOX_LINKEDIN_CLASSIC | INBOX_LINKEDIN_RECRUITER | INBOX_LINKEDIN_SALES_NAVIGATOR | INBOX_LINKEDIN_ORGANIZATION | INBOX_INSTAGRAM_GENERAL | PENDING | OTHER | SPAM | ARCHIVED | HIDDEN | UNKNOWN | string[] - `chats[].pinned`: 0 | 1 ### Good to know - A one-to-one conversation has no name: read who it is with from list_chat_participants. - attendeeProviderId is optional: a conversation can come without it. - One person has a different id in each LinkedIn product, and no published text says which one a Sales Navigator or Recruiter conversation carries. Treat these ids as member ids only for a conversation in the ordinary inbox (folder says which inbox it is in). Page: https://heyreagent.com/docs/actions/list_chats ## get_chat: Get a chat Read one conversation. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_chat Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE" } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a chat id - `accountType`: WHATSAPP | LINKEDIN | SLACK | TWITTER | MESSENGER | INSTAGRAM | TELEGRAM - `providerId`: string - `attendeeProviderId`: a member id - `name`: string or null - `type`: 0 | 1 | 2 - `timestamp`: string or null - `unreadCount`: number - `archived`: 0 | 1 - `mutedUntil`: -1 | string or null - `readOnly`: 0 | 1 | 2 - `disabledFeatures`: reactions | reply[] - `subject`: string - `organizationId`: string - `mailboxId`: string - `contentType`: inmail | sponsored | linkedin_offer - `folder`: INBOX | INBOX_LINKEDIN_CLASSIC | INBOX_LINKEDIN_RECRUITER | INBOX_LINKEDIN_SALES_NAVIGATOR | INBOX_LINKEDIN_ORGANIZATION | INBOX_INSTAGRAM_GENERAL | PENDING | OTHER | SPAM | ARCHIVED | HIDDEN | UNKNOWN | string[] - `pinned`: 0 | 1 - `lastMessage.messageId`: string - `lastMessage.providerId`: string - `lastMessage.senderId`: string - `lastMessage.text`: string or null - `lastMessage.id`: a message id - `lastMessage.chatId`: string - `lastMessage.chatProviderId`: string - `lastMessage.timestamp`: string - `lastMessage.isSender`: 0 | 1 - `lastMessage.isForwarded`: boolean - `lastMessage.isViewOnce`: boolean - `lastMessage.seen`: 0 | 1 - `lastMessage.hidden`: 0 | 1 - `lastMessage.deleted`: 0 | 1 - `lastMessage.edited`: 0 | 1 - `lastMessage.isEvent`: 0 | 1 - `lastMessage.delivered`: 0 | 1 - `lastMessage.behavior`: 0 or null - `lastMessage.eventType`: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 - `lastMessage.original`: string - `lastMessage.replies`: number - `lastMessage.replyBy`: string[] - `lastMessage.parent`: string - `lastMessage.senderAttendeeId`: string - `lastMessage.subject`: string or null - `lastMessage.messageType`: MESSAGE | INVITATION | INMAIL | INMAIL_DECLINE | INMAIL_REPLY | INMAIL_ACCEPT | STORY_MENTION | STORY_REPLY | CONTACT - `lastMessage.attendeeType`: MEMBER | ORGANIZATION | OTHER - `lastMessage.attendeeDistance`: 1 | 2 | 3 | 4 | -1 - `lastMessage.senderUrn`: string Page: https://heyreagent.com/docs/actions/get_chat ## list_chat_messages: List a chat's messages List the messages of one conversation, newest first. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_chat_messages Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE" } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `senderId` (optional): a attendee id. Only messages from this participant id. The published definition calls this "the id of the sender" without saying which id; "participant id" is this tool's own wording. Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `before` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created before this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `after` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created after this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `limit` (optional): a number, 1 to 250. How many to return (1–250, default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_chat_messages`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `messages[].messageId`: string - `messages[].providerId`: string - `messages[].senderId`: a member id - `messages[].text`: string or null - `messages[].attachments[].id`: a attachment id - `messages[].id`: a message id - `messages[].chatId`: a chat id - `messages[].chatProviderId`: string - `messages[].timestamp`: string - `messages[].isSender`: 0 | 1 - `messages[].isForwarded`: boolean - `messages[].isViewOnce`: boolean - `messages[].seen`: 0 | 1 - `messages[].hidden`: 0 | 1 - `messages[].deleted`: 0 | 1 - `messages[].edited`: 0 | 1 - `messages[].isEvent`: 0 | 1 - `messages[].delivered`: 0 | 1 - `messages[].behavior`: 0 or null - `messages[].eventType`: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 - `messages[].original`: string - `messages[].replies`: number - `messages[].replyBy`: string[] - `messages[].parent`: string - `messages[].senderAttendeeId`: a attendee id - `messages[].subject`: string or null - `messages[].messageType`: MESSAGE | INVITATION | INMAIL | INMAIL_DECLINE | INMAIL_REPLY | INMAIL_ACCEPT | STORY_MENTION | STORY_REPLY | CONTACT - `messages[].attendeeType`: MEMBER | ORGANIZATION | OTHER - `messages[].attendeeDistance`: 1 | 2 | 3 | 4 | -1 - `messages[].senderUrn`: string ### Good to know - isSender is 1 for your own messages and 0 for the other person's. Page: https://heyreagent.com/docs/actions/list_chat_messages ## list_chat_participants: List who is in a chat List who is in one conversation. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_chat_participants Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE" } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: Cursor or null - `participants[].id`: a attendee id - `participants[].providerId`: a member id - `participants[].name`: string - `participants[].isSelf`: 1 | 0 - `participants[].hidden`: 1 | 0 - `participants[].pictureUrl`: string - `participants[].profileUrl`: a profile link ### Good to know - isSelf is 1 on your own row. Page: https://heyreagent.com/docs/actions/list_chat_participants ## send_chat_message: Send a message with files or a voice note Send a message into one conversation, with files, a voice note or a video note, or as an answer to one message. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/send_chat_message Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE", "text": "Hello!" } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `text` (optional): text, up to 8000 characters. The message text. Optional when a file or note is sent. - `attachmentUrls` (optional): a list (a link), up to 9. Files or images to attach. Public https links; each file up to 10 MB, 20 MB in total. - `voiceMessageUrl` (optional): a link. An audio file to send as a voice note (.m4a preferred). A public https link, up to 10 MB. - `videoMessageUrl` (optional): a link. A video file to send as a video note. A public https link, up to 10 MB. - `replyToMessageId` (optional): a message id. Quote and answer this message of the conversation. Where to get it: Run `list_chat_messages` and use `messages[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `sent` - `chatId`: a chat id - `messageId`: a message id - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - Pass text, a file, a voice note or a video note: at least one. - It sends into any conversation of yours, an InMail one too (chatId from list_inmail). It does not check whether the conversation takes replies, nor that the account is on the Sales Navigator contract the conversation was started on. Page: https://heyreagent.com/docs/actions/send_chat_message ## start_conversation: Start a conversation (InMail, group, company) Start a new conversation: an InMail, a message through Sales Navigator or Recruiter, a group, a company page, a job applicant. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/start_conversation Authorization: Bearer YOUR_KEY content-type: application/json { "to": [ "PASTE_PROFILE_LINK_HERE" ], "text": "Hello!" } ``` ### What you give it - `to` (needed): a profile link or a member id or a Sales Navigator id or a Recruiter id or a company messaging id. Who to write to: LinkedIn profile URLs or member ids. One person, or several for a group conversation. For a company page pass its messaging id. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `text` (needed): text, up to 8000 characters. The first message. - `subject` (optional): text, up to 200 characters. Subject line (InMail). - `via` (optional): one of: classic, sales_navigator, recruiter. Which LinkedIn product sends it. sales_navigator and recruiter need that seat on your account. - `inmail` (optional): true or false. classic only: send as an InMail (to someone you are not connected to). - `companyTopic` (optional): one of: service_request, request_demo, support, careers, other. Required when writing to a company page. - `applicantId` (optional): a applicant id. Required when writing to an applicant of your job posting (from list_job_applicants). Where to get it: Run `list_job_applicants` and use `applicants[].id`. - `invitationId` (optional): a invitation id. Required when writing to someone whose invitation you have neither accepted nor declined (from list_received_invitations). Where to get it: Run `list_received_invitations` and use `invitations[].invitationId`. - `groupId` (optional): text. Required when writing to someone through a LinkedIn group you share. A LinkedIn group you share with the person. No action here lists your groups. - `recruiter` (optional): a group of fields. via recruiter only: signature, hiringProjectId (the project to start the conversation in), jobPostingId, sourcingChannel, emailAddress (send by email instead of InMail), visibility (default PRIVATE), inmailIntent, and followUp { subject, text, days 3–28 or weeks 1–4, timezone } to schedule a follow-up (Recruiter PRO). - `signature` (optional): text. - `hiringProjectId` (optional): a hiring project id. Where to get it: Run `list_hiring_projects` and use `projects[].id`. - `jobPostingId` (optional): a job id. Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `sourcingChannel` (optional): one of: JOB_POSTING_RECOMMENDED_MATCHES, JOB_POSTING, REFERRAL, INTERNAL_CANDIDATES, AUTOMATED_SOURCING, RECRUITER_SEARCH, CAREER_SITE. - `emailAddress` (optional): an email address. - `visibility` (optional): one of: PUBLIC, PRIVATE, PROJECT. - `inmailIntent` (optional): one of: HIRE_FOR_CLIENT, HIRE_FOR_OWN_COMPANY. - `followUp` (optional): a group of fields. - `attachmentUrls` (optional): a list (a link), up to 9. Files or images to attach. Public https links; each file up to 10 MB, 20 MB in total. - `voiceMessageUrl` (optional): a link. An audio file to send as a voice note (.m4a preferred). A public https link, up to 10 MB. - `videoMessageUrl` (optional): a link. A video file to send as a video note. A public https link, up to 10 MB. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `sent` - `chatId`: a chat id - `messageId`: a message id - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - The id must match the product in via: a member id or a profile link for "classic", a Sales Navigator id for "sales_navigator", a Recruiter id for "recruiter". - A company page is written to at its company messaging id (get_company → messaging.id), with companyTopic set; its company id does not work here. - An InMail spends one credit unless the person has an open profile: check get_inmail_credits, and isOpenProfile on get_profile_details. - inmail true is added to the answer when the send was an InMail. Page: https://heyreagent.com/docs/actions/start_conversation ## set_chat_status: Mark a chat read or muted on LinkedIn Mark one conversation read or unread, and mute or unmute it. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/set_chat_status Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE", "read": true } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `read` (optional): true or false. true marks it read, false marks it unread. - `muted` (optional): true or false. true mutes its notifications, false unmutes. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `chatId` ### Good to know - The answer repeats what was changed: read and / or muted. Page: https://heyreagent.com/docs/actions/set_chat_status ## resync_chat: Re-read a chat's history Read one conversation's history from LinkedIn again, from its beginning. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/resync_chat Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE" } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `chatId`: string - `status`: SYNC_STARTED | CHAT_DELETED | SYNC_RUNNING | SYNC_DONE | SYNC_ERROR ### Good to know - status is SYNC_STARTED, SYNC_RUNNING, SYNC_DONE, SYNC_ERROR or CHAT_DELETED. Call again to follow it. Page: https://heyreagent.com/docs/actions/resync_chat ## delete_chat: Delete a chat Delete one conversation. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/delete_chat Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE" } ``` ### What you give it - `chatId` (needed): a chat id. The conversation id (from list_chats). Where to get it: Run `list_chats` and use `chats[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `deleted` - `chatId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number Page: https://heyreagent.com/docs/actions/delete_chat ## list_messages: List messages across chats List messages across all your conversations, newest first. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_messages Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `senderId` (optional): a attendee id. Only messages from this participant id. The published definition calls this "the id of the sender" without saying which id; "participant id" is this tool's own wording. Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `before` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created before this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `after` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created after this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `limit` (optional): a number, 1 to 250. How many to return (1–250, default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_messages`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `messages[].messageId`: string - `messages[].providerId`: string - `messages[].senderId`: a member id - `messages[].text`: string or null - `messages[].attachments[].id`: a attachment id - `messages[].id`: a message id - `messages[].chatId`: a chat id - `messages[].chatProviderId`: string - `messages[].timestamp`: string - `messages[].isSender`: 0 | 1 - `messages[].isForwarded`: boolean - `messages[].isViewOnce`: boolean - `messages[].seen`: 0 | 1 - `messages[].hidden`: 0 | 1 - `messages[].deleted`: 0 | 1 - `messages[].edited`: 0 | 1 - `messages[].isEvent`: 0 | 1 - `messages[].delivered`: 0 | 1 - `messages[].behavior`: 0 or null - `messages[].eventType`: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 - `messages[].original`: string - `messages[].replies`: number - `messages[].replyBy`: string[] - `messages[].parent`: string - `messages[].senderAttendeeId`: a attendee id - `messages[].subject`: string or null - `messages[].messageType`: MESSAGE | INVITATION | INMAIL | INMAIL_DECLINE | INMAIL_REPLY | INMAIL_ACCEPT | STORY_MENTION | STORY_REPLY | CONTACT - `messages[].attendeeType`: MEMBER | ORGANIZATION | OTHER - `messages[].attendeeDistance`: 1 | 2 | 3 | 4 | -1 - `messages[].senderUrn`: string Page: https://heyreagent.com/docs/actions/list_messages ## get_message: Get a message Read one message. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_message Authorization: Bearer YOUR_KEY content-type: application/json { "messageId": "PASTE_MESSAGE_ID_HERE" } ``` ### What you give it - `messageId` (needed): a message id. The message id (from list_chat_messages). Where to get it: Run `list_chat_messages` and use `messages[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `messageId`: string - `providerId`: string - `senderId`: a member id - `text`: string or null - `attachments[].id`: a attachment id - `attachments[].fileSize`: number - `attachments[].unavailable`: boolean - `attachments[].mimetype`: string - `attachments[].url`: string - `attachments[].urlExpiresAt`: number - `attachments[].type`: poll - `attachments[].sticker`: boolean - `attachments[].gif`: boolean - `attachments[].duration`: number - `attachments[].voiceNote`: boolean - `attachments[].fileName`: string - `attachments[].startsAt`: number or null - `attachments[].expiresAt`: number or null - `attachments[].timeRange`: number or null - `attachments[].displayName`: string or null - `attachments[].organization`: string or null - `id`: a message id - `chatId`: a chat id - `chatProviderId`: string - `timestamp`: string - `isSender`: 0 | 1 - `quoted.messageId`: string - `quoted.providerId`: string - `quoted.senderId`: string - `quoted.text`: string or null - `isForwarded`: boolean - `isViewOnce`: boolean - `reactions[].value`: string - `reactions[].senderId`: string - `reactions[].isSender`: boolean - `seen`: 0 | 1 - `hidden`: 0 | 1 - `deleted`: 0 | 1 - `edited`: 0 | 1 - `isEvent`: 0 | 1 - `delivered`: 0 | 1 - `behavior`: 0 or null - `eventType`: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 - `original`: string - `replies`: number - `replyBy`: string[] - `parent`: string - `senderAttendeeId`: a attendee id - `subject`: string or null - `messageType`: MESSAGE | INVITATION | INMAIL | INMAIL_DECLINE | INMAIL_REPLY | INMAIL_ACCEPT | STORY_MENTION | STORY_REPLY | CONTACT - `attendeeType`: MEMBER | ORGANIZATION | OTHER - `attendeeDistance`: 1 | 2 | 3 | 4 | -1 - `senderUrn`: string - `replyTo.id`: string - `replyTo.providerId`: string - `replyTo.timestamp`: string - `replyTo.senderAttendeeId`: string - `replyTo.senderId`: string - `replyTo.text`: string or null Page: https://heyreagent.com/docs/actions/get_message ## get_message_attachment: Download a message attachment Download one file attached to a message. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_message_attachment Authorization: Bearer YOUR_KEY content-type: application/json { "messageId": "PASTE_MESSAGE_ID_HERE", "attachmentId": "PASTE_ATTACHMENT_ID_HERE" } ``` ### What you give it - `messageId` (needed): a message id. The message id (from list_chat_messages). Where to get it: Run `list_chat_messages` and use `messages[].id`. - `attachmentId` (needed): a attachment id. The attachment id (from the message's attachments). Where to get it: Run `list_chat_messages` and use `messages[].attachments[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back The file is in `result.file`, as `{ contentType, base64 }`. ### Good to know - Files over 5 MB are not returned. Page: https://heyreagent.com/docs/actions/get_message_attachment ## edit_message: Edit a sent message Change the text of a message you sent. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/edit_message Authorization: Bearer YOUR_KEY content-type: application/json { "messageId": "PASTE_MESSAGE_ID_HERE", "text": "Hello!" } ``` ### What you give it - `messageId` (needed): a message id. The message id (from list_chat_messages). Where to get it: Run `list_chat_messages` and use `messages[].id`. - `text` (needed): text, up to 8000 characters. The new text. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `edited` - `messageId` - `text` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - LinkedIn allows it only within 60 minutes of sending, and only on ordinary LinkedIn messages. Page: https://heyreagent.com/docs/actions/edit_message ## delete_message: Delete a sent message Delete a message you sent. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/delete_message Authorization: Bearer YOUR_KEY content-type: application/json { "messageId": "PASTE_MESSAGE_ID_HERE" } ``` ### What you give it - `messageId` (needed): a message id. The message id (from list_chat_messages). Where to get it: Run `list_chat_messages` and use `messages[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `deleted` - `messageId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - LinkedIn allows it only within 60 minutes of sending. Page: https://heyreagent.com/docs/actions/delete_message ## react_to_message: React to a message React to one message with an emoji. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/react_to_message Authorization: Bearer YOUR_KEY content-type: application/json { "messageId": "PASTE_MESSAGE_ID_HERE", "reaction": "👍" } ``` ### What you give it - `messageId` (needed): a message id. The message id (from list_chat_messages). Where to get it: Run `list_chat_messages` and use `messages[].id`. - `reaction` (needed): text, up to 16 characters. The emoji to react with, e.g. 👍. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `reacted` - `messageId` - `reaction` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number Page: https://heyreagent.com/docs/actions/react_to_message ## list_chat_attendees: List everyone I have chats with List everyone you have conversations with. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_chat_attendees Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `limit` (optional): a number, 1 to 250. How many to return (1–250, default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_chat_attendees`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `attendees[].id`: a attendee id - `attendees[].providerId`: a member id - `attendees[].name`: string - `attendees[].isSelf`: 1 | 0 - `attendees[].hidden`: 1 | 0 - `attendees[].pictureUrl`: string - `attendees[].profileUrl`: a profile link ### Good to know - Only people you already have a conversation with or are connected to are listed. - One person has a different id in each LinkedIn product: a participant met in Sales Navigator or Recruiter may carry that product's id in providerId rather than a member id. Page: https://heyreagent.com/docs/actions/list_chat_attendees ## get_chat_attendee: Get a chat participant Read one participant of your conversations. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_chat_attendee Authorization: Bearer YOUR_KEY content-type: application/json { "attendeeId": "PASTE_ATTENDEE_ID_HERE" } ``` ### What you give it - `attendeeId` (needed): a attendee id. The participant id (from list_chat_attendees or list_chat_participants). Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a attendee id - `providerId`: a member id - `name`: string - `isSelf`: 1 | 0 - `hidden`: 1 | 0 - `pictureUrl`: string - `profileUrl`: a profile link - `specifics.memberUrn`: string - `specifics.occupation`: string - `specifics.networkDistance`: SELF | DISTANCE_1 | DISTANCE_2 | DISTANCE_3 | OUT_OF_NETWORK - `specifics.pendingInvitation`: boolean - `specifics.location`: string - `specifics.headline`: string ### Good to know - It carries no public name for a profile link; get_profile_details with providerId gives one. Page: https://heyreagent.com/docs/actions/get_chat_attendee ## get_chat_attendee_picture: Download a participant's picture Download one participant's picture. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_chat_attendee_picture Authorization: Bearer YOUR_KEY content-type: application/json { "attendeeId": "PASTE_ATTENDEE_ID_HERE" } ``` ### What you give it - `attendeeId` (needed): a attendee id. The participant id (from list_chat_attendees or list_chat_participants). Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back The file is in `result.file`, as `{ contentType, base64 }`. Page: https://heyreagent.com/docs/actions/get_chat_attendee_picture ## list_attendee_chats: List my chats with one person List your one-to-one conversations with one person. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_attendee_chats Authorization: Bearer YOUR_KEY content-type: application/json { "attendeeId": "PASTE_ATTENDEE_ID_HERE" } ``` ### What you give it - `attendeeId` (needed): a attendee id. The participant id (from list_chat_attendees or list_chat_participants). Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `before` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created before this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `after` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created after this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `limit` (optional): a number, 1 to 250. How many to return (1–250, default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_attendee_chats`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `chats[].id`: a chat id - `chats[].accountType`: WHATSAPP | LINKEDIN | SLACK | TWITTER | MESSENGER | INSTAGRAM | TELEGRAM - `chats[].providerId`: string - `chats[].attendeeProviderId`: a member id - `chats[].name`: string or null - `chats[].type`: 0 | 1 | 2 - `chats[].timestamp`: string or null - `chats[].unreadCount`: number - `chats[].archived`: 0 | 1 - `chats[].mutedUntil`: -1 | string or null - `chats[].readOnly`: 0 | 1 | 2 - `chats[].disabledFeatures`: reactions | reply[] - `chats[].subject`: string - `chats[].organizationId`: string - `chats[].mailboxId`: string - `chats[].contentType`: inmail | sponsored | linkedin_offer - `chats[].folder`: INBOX | INBOX_LINKEDIN_CLASSIC | INBOX_LINKEDIN_RECRUITER | INBOX_LINKEDIN_SALES_NAVIGATOR | INBOX_LINKEDIN_ORGANIZATION | INBOX_INSTAGRAM_GENERAL | PENDING | OTHER | SPAM | ARCHIVED | HIDDEN | UNKNOWN | string[] - `chats[].pinned`: 0 | 1 ### Good to know - When you have no conversation with the person LinkedIn's API answers "not found" instead of an empty list. Page: https://heyreagent.com/docs/actions/list_attendee_chats ## list_attendee_messages: List my messages with one person List the messages between you and one person. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_attendee_messages Authorization: Bearer YOUR_KEY content-type: application/json { "attendeeId": "PASTE_ATTENDEE_ID_HERE" } ``` ### What you give it - `attendeeId` (needed): a attendee id. The participant id (from list_chat_attendees or list_chat_participants). Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `before` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created before this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `after` (optional): a date and time, like 2026-10-01T00:00:00.000Z. Only items created after this moment (ISO 8601 UTC, e.g. 2026-10-01T00:00:00.000Z). - `limit` (optional): a number, 1 to 250. How many to return (1–250, default 50). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_attendee_messages`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `messages[].messageId`: string - `messages[].providerId`: string - `messages[].senderId`: a member id - `messages[].text`: string or null - `messages[].attachments[].id`: a attachment id - `messages[].id`: a message id - `messages[].chatId`: a chat id - `messages[].chatProviderId`: string - `messages[].timestamp`: string - `messages[].isSender`: 0 | 1 - `messages[].isForwarded`: boolean - `messages[].isViewOnce`: boolean - `messages[].seen`: 0 | 1 - `messages[].hidden`: 0 | 1 - `messages[].deleted`: 0 | 1 - `messages[].edited`: 0 | 1 - `messages[].isEvent`: 0 | 1 - `messages[].delivered`: 0 | 1 - `messages[].behavior`: 0 or null - `messages[].eventType`: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 - `messages[].original`: string - `messages[].replies`: number - `messages[].replyBy`: string[] - `messages[].parent`: string - `messages[].senderAttendeeId`: a attendee id - `messages[].subject`: string or null - `messages[].messageType`: MESSAGE | INVITATION | INMAIL | INMAIL_DECLINE | INMAIL_REPLY | INMAIL_ACCEPT | STORY_MENTION | STORY_REPLY | CONTACT - `messages[].attendeeType`: MEMBER | ORGANIZATION | OTHER - `messages[].attendeeDistance`: 1 | 2 | 3 | 4 | -1 - `messages[].senderUrn`: string Page: https://heyreagent.com/docs/actions/list_attendee_messages ## resync_attendee_chats: Re-read my chats with one person Read your conversations with one person from LinkedIn again. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/resync_attendee_chats Authorization: Bearer YOUR_KEY content-type: application/json { "attendeeId": "PASTE_ATTENDEE_ID_HERE" } ``` ### What you give it - `attendeeId` (needed): a attendee id. The participant id (from list_chat_attendees or list_chat_participants). Where to get it: Run `list_chat_attendees` and use `attendees[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `attendeeId`: string - `status`: SYNC_STARTED | CHAT_DELETED | SYNC_RUNNING | SYNC_DONE | SYNC_ERROR | CHUNK_DONE ### Good to know - status is SYNC_STARTED, SYNC_RUNNING, CHUNK_DONE, SYNC_DONE, SYNC_ERROR or CHAT_DELETED. Call again to follow it. Page: https://heyreagent.com/docs/actions/resync_attendee_chats ## list_inmail: List InMail conversations List your InMail conversations, or every conversation with one person. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_inmail Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Only this sender account (its linkedinConnections _id). Omit to read every live sender on the active setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `profileUrl` (optional): a profile link or a Sales Navigator lead link. The person's LinkedIn profile URL (linkedin.com/in/…) or Sales Navigator lead URL. Returns every conversation with that one person — InMail and classic, each tagged by inbox — instead of scanning the inbox. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `unreadOnly` (optional): true or false. Only threads with unread messages. - `awaitingReplyOnly` (optional): true or false. Only threads where the other person wrote last (they are waiting on you). - `search` (optional): text. Filter by participant name, headline or latest message text. Ranked: name/headline matches first, then latest-message matches, each newest first; every row says matchedBy. To find one known person, prefer profileUrl. - `limit` (optional): a number, 1 to 100. Max threads to return (default 25, max 100). - `syncInbox` (optional): true or false. true = first pull the ACTIVE Sales Navigator contract's InMail inbox from LinkedIn (after a contract switch, or when threads seem missing), then read. Slower (~25s). ### What you get back - `total` - `inmail` - `note` ### Good to know - With profileUrl it returns every conversation with that person, InMail or not, each tagged by inbox. - Sales Navigator shows only the active contract's inbox. After switch_sales_navigator_contract, or when conversations seem missing, pass syncInbox true. - canReply false means LinkedIn will not accept a reply in that conversation. - Reply with send_chat_message and the row's chatId. It does not check the Sales Navigator contract: when sentFromContract is not the account's active contract (list_sales_navigator_contracts), switch to it first with switch_sales_navigator_contract, or the reply may not reach the conversation. Page: https://heyreagent.com/docs/actions/list_inmail ## get_inmail_conversation: Get an InMail conversation Read one InMail conversation. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_inmail_conversation Authorization: Bearer YOUR_KEY content-type: application/json { "chatId": "PASTE_CHAT_ID_HERE" } ``` ### What you give it - `chatId` (needed): a chat id. The chatId from list_inmail. Where to get it: Run `list_chats` and use `chats[].id`. - `connectionId` (optional): a connection id. The sender account that owns this thread (optional). Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `refresh` (optional): true or false. true = first re-sync this conversation from LinkedIn, then read (slower, up to ~25s). Use when messages you know were sent — e.g. from the LinkedIn or Sales Navigator UI — are missing. The result's refresh field reports how the re-sync went. ### What you get back - `chatId`: a chat id - `connectionId`: a connection id - `connectionLabel` - `inbox` - `isInMail` - `subject` - `participant` - `canReply` - `awaitingYourReply` - `sentFromContract`: a contract id - `messageCount` - `messages` ### Good to know - sentFromContract is present only on a Sales Navigator conversation this app started. - Reply with send_chat_message and this chatId; canReply false means LinkedIn will not take it. Page: https://heyreagent.com/docs/actions/get_inmail_conversation ## get_inmail_credits: Get InMail credits Read how many InMail credits each of your accounts has left. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_inmail_credits Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. One LinkedIn account id (list_linkedin_accounts). Omit for all accounts on the active setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `includeAllSetups` (optional): true or false. With no connectionId: read accounts across every setup, not just the active one. ### What you get back - `accounts` - `salesNavigatorCreditsTotal` - `hint` ### Good to know - credits is null, with a reason, for an account that could not be read. Page: https://heyreagent.com/docs/actions/get_inmail_credits ## list_sales_navigator_contracts: List Sales Navigator contracts List the Sales Navigator contracts each of your accounts can use, and which is active. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_sales_navigator_contracts Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. One LinkedIn account id (list_linkedin_accounts). Omit for all accounts on the active setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `includeAllSetups` (optional): true or false. With no connectionId: accounts across every setup, not just the active one. ### What you get back - `accounts` - `note` Page: https://heyreagent.com/docs/actions/list_sales_navigator_contracts ## switch_sales_navigator_contract: Switch Sales Navigator contract Make another Sales Navigator contract the active one on an account. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/switch_sales_navigator_contract Authorization: Bearer YOUR_KEY content-type: application/json { "connectionId": "PASTE_CONNECTION_ID_HERE", "contractId": "PASTE_CONTRACT_ID_HERE" } ``` ### What you give it - `connectionId` (needed): a connection id. The LinkedIn account id (list_linkedin_accounts / list_sales_navigator_contracts). Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `contractId` (needed): a contract id. The Sales Navigator contract id to make active (from list_sales_navigator_contracts), e.g. "SALES_2062952500". Where to get it: Run `list_sales_navigator_contracts` and use `accounts[].contracts[].id`. - `confirm` (optional): true or false. false (default) = preview only, nothing changes. true = switch now (only after the user said yes). ### What you get back - `action` - `outcome` - `message` ### Good to know - connectionId is required here. - confirm false (the default) only previews. confirm true switches now. - For 10 to 20 seconds after a switch every call on that account can fail; wait before the next one. - The answer's outcome is switched, already_active, not_found, refused, timeout, busy or transient. Page: https://heyreagent.com/docs/actions/switch_sales_navigator_contract ## search_people: Search people Search people on ordinary LinkedIn by plain words, a place name and connection degree. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_people Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "head of sales" } ``` ### What you give it - `keywords` (optional): text, up to 300 characters. Words to search for, e.g. "head of sales fintech". - `location` (optional): text, up to 100 characters. A place name, e.g. "Berlin" or "United Kingdom". - `network` (optional): a list (one of: first, second, third), up to 3. Limit to these connection degrees from you: first, second, third. - `limit` (optional): a number, 1 to 10. Max people to return (1–10, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_people`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned` - `total` - `hasMore` - `nextCursor`: a cursor - `applied` - `people` - `note` ### Good to know - location is a place NAME here; the action looks its id up itself. Every other LinkedIn filter is on search_linkedin_people. - At most 10 rows per call: LinkedIn's page size for this search. Page: https://heyreagent.com/docs/actions/search_people ## search_posts: Search posts Search posts by words, date and who wrote or is mentioned in them, by name. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_posts Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "outbound sales" } ``` ### What you give it - `keywords` (optional): text, up to 300 characters. Words to search for in posts, e.g. "cold email deliverability". LinkedIn search operators work ("exact phrase", AND, OR, NOT). - `sortBy` (optional): one of: relevance, date. "relevance" (LinkedIn's default) or "date" (newest first). - `datePosted` (optional): one of: past_day, past_week, past_month. Only posts from the past day, week or month. - `contentType` (optional): one of: videos, images, live_videos, collaborative_articles, documents, jobs. Only posts with this kind of content. - `authorKeywords` (optional): text, up to 100 characters. Words in the AUTHOR's headline / title, e.g. "founder" or "head of sales". - `authorIndustries` (optional): a list (text), up to 10. Industry names the author works in, e.g. ["Software Development"]. - `authorCompanies` (optional): a list (text), up to 10. Company names — posts written by PEOPLE who work at these companies. - `fromCompanies` (optional): a list (text), up to 10. Company names — posts published by these COMPANY PAGES themselves. - `mentioningCompanies` (optional): a list (text), up to 10. Company names — posts that @mention these companies (e.g. a competitor). - `postedBy` (optional): one of: me, first_connections, people_you_follow. Only posts by you ("me"), by your 1st-degree connections, or by people you follow. Runs on your own LinkedIn sender, so one must be connected. - `limit` (optional): a number, 1 to 50. Max posts to return (1–50, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep every other argument the same. Where to get it: The `nextCursor` from the last answer of `search_posts`. - `connectionId` (optional): a connection id. Which of your LinkedIn senders to search through (its id from list_linkedin_accounts). Omit to use your first live sender, or the shared account when you have none. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned` - `hasMore` - `nextCursor`: a cursor - `applied` - `posts` - `note` ### Good to know - Company and industry filters are NAMES here; the action looks the ids up itself and takes the top match. search_linkedin_posts takes the ids. - When author.isCompany is true, author.profileUrl is a company link, which actions asking for a profile link do not take. - nextCursor names the account that ran the search: it is refused by any other action, and by this one once that account is gone. Page: https://heyreagent.com/docs/actions/search_posts ## search_linkedin: Search LinkedIn with any filter Run a search from a results link copied out of LinkedIn, Sales Navigator or Recruiter. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin Authorization: Bearer YOUR_KEY content-type: application/json { "url": "https://www.linkedin.com/search/results/people/?keywords=head%20of%20sales" } ``` ### What you give it - `kind` (optional): one of: classic/people, classic/companies, classic/posts, classic/jobs, sales_navigator/people, sales_navigator/companies, recruiter/people. What to search. Required unless url is given. - `filters` (optional): a group of fields. The search filters for that kind, e.g. { keywords: "head of sales", network_distance: [2], location: ["106967730"] }. - `url` (optional): a link. A LinkedIn / Sales Navigator / Recruiter search URL to run instead of kind + filters. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: JOB - `results[].id`: string - `results[].publicIdentifier`: string or null - `results[].publicProfileUrl`: string or null - `results[].profileUrl`: string - `results[].profilePictureUrl`: string or null - `results[].profilePictureUrlLarge`: string or null - `results[].memberUrn`: string or null - `results[].name`: string - `results[].firstName`: string - `results[].lastName`: string - `results[].networkDistance`: SELF | DISTANCE_1 | DISTANCE_2 | DISTANCE_3 | OUT_OF_NETWORK - `results[].location`: string or null - `results[].industry`: string - `results[].keywordsMatch`: string - `results[].headline`: string - `results[].connectionsCount`: number - `results[].followersCount`: number - `results[].pendingInvitation`: boolean - `results[].canSendInmail`: boolean - `results[].hiddenCandidate`: boolean - `results[].interestLikelihood`: string - `results[].recruiterCandidateId`: string - `results[].recruiterPipelineCategory`: string - `results[].premium`: boolean - `results[].verified`: boolean - `results[].sharedConnectionsCount`: number - `results[].recentPostsCount`: number - `results[].recentlyHired`: boolean - `results[].mentionedInTheNews`: boolean - `results[].interests`: string - `results[].summary`: string or null - `results[].jobOffersCount`: number - `results[].headcount`: string - `results[].socialId`: string - `results[].shareUrl`: string - `results[].title`: string - `results[].text`: string - `results[].date`: string - `results[].parsedDatetime`: string - `results[].reactionCounter`: number - `results[].commentCounter`: number - `results[].repostCounter`: number - `results[].impressionsCounter`: number - `results[].userReacted`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT - `results[].isRepost`: boolean - `results[].repostId`: string - `results[].repostParsedDatetime`: string - `results[].referenceId`: string - `results[].postedAt`: any or null - `results[].reposted`: boolean - `results[].url`: string - `results[].promoted`: boolean - `results[].benefits`: string[] - `results[].easyApply`: boolean ### Good to know - Use it for url. For filters use the typed actions (search_linkedin_people, …_companies, …_posts, …_jobs, …_sales_navigator_people, …_sales_navigator_companies, …_recruiter_people): this one takes them as a free-form object in LinkedIn's own snake_case names, unchecked. - Rows are of the kind searched; their fields are those of the typed action for that kind. - A limit above LinkedIn's page size for the kind searched is brought down to it: 10 for ordinary people and companies, 49 for posts, 50 for jobs, 100 on Sales Navigator and Recruiter. A pasted ordinary link does not say its kind and is held to 50. Page: https://heyreagent.com/docs/actions/search_linkedin ## lookup_search_ids: Look up the id for a search filter Find LinkedIn's id for a place, company, school, industry, job title and the like, by name. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/lookup_search_ids Authorization: Bearer YOUR_KEY content-type: application/json { "type": "LOCATION", "keywords": "Berlin" } ``` ### What you give it - `type` (needed): one of: LOCATION, REGION, PEOPLE, CONNECTIONS, COMPANY, SCHOOL, INDUSTRY, SERVICE, JOB_FUNCTION, JOB_TITLE, EMPLOYMENT_TYPE, SKILL, LANGUAGE, POST_JOB_FUNCTION, SENIORITY, GROUPS, SALES_INDUSTRY, DEPARTMENT, PERSONA, ACCOUNT_LISTS, LEAD_LISTS, TECHNOLOGIES, SAVED_ACCOUNTS, SAVED_SEARCHES, RECENT_SEARCHES, POSTAL_CODE, HIRING_PROJECTS, SAVED_FILTERS, DEGREE. What kind of thing to look up. - `keywords` (optional): text, up to 200 characters. The name to look for, e.g. "Berlin" or "Software". Not used for EMPLOYMENT_TYPE. - `service` (optional): one of: CLASSIC, SALES_NAVIGATOR, RECRUITER. Whose list to search (default CLASSIC). - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: Cursor or null - `matches[].id`: a search filter id - `matches[].title`: string - `matches[].pictureUrl`: string ### Good to know - An id is good only for filters that ask for the same type: a LOCATION id is not a REGION id. - service selects which product's list is searched. Some types exist only for Sales Navigator (SALES_INDUSTRY, POSTAL_CODE, PERSONA, ACCOUNT_LISTS, LEAD_LISTS, TECHNOLOGIES, SAVED_ACCOUNTS, RECENT_SEARCHES), only for Recruiter (HIRING_PROJECTS, SAVED_FILTERS, DEGREE), or for those two and not ordinary LinkedIn (GROUPS, DEPARTMENT, SAVED_SEARCHES). - It has no cursor: narrow the keywords instead. Page: https://heyreagent.com/docs/actions/lookup_search_ids ## search_linkedin_people: Search people, every filter typed Search people on ordinary LinkedIn, with each LinkedIn filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_people Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "head of sales" } ``` ### What you give it - `keywords` (optional): text. Name, title, company or any words. - `industry` (optional): a search filter id. Industries: ids from lookup_search_ids type INDUSTRY. Where to get it: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. - `location` (optional): a search filter id. Places: ids from lookup_search_ids type LOCATION. Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `profileLanguage` (optional): a list (text, up to 2 characters). Profile languages, as two-letter codes such as "en". - `networkDistance` (optional): a list (one of: 1, 2, 3). Connection degrees from you: 1, 2, 3. - `company` (optional): a search filter id. Current companies: ids from lookup_search_ids type COMPANY. Where to get it: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `pastCompany` (optional): a search filter id. Past companies: ids from lookup_search_ids type COMPANY. Where to get it: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `school` (optional): a search filter id. Schools: ids from lookup_search_ids type SCHOOL. Where to get it: run `lookup_search_ids` with type `SCHOOL` and use `matches[].id`. - `service` (optional): a search filter id. Service categories they offer: ids from lookup_search_ids type SERVICE. Where to get it: run `lookup_search_ids` with type `SERVICE` and use `matches[].id`. - `connectionsOf` (optional): a search filter id. People whose connections to search: ids from lookup_search_ids type CONNECTIONS. Where to get it: run `lookup_search_ids` with type `CONNECTIONS` and use `matches[].id`. - `followersOf` (optional): a search filter id. People whose followers to search: ids from lookup_search_ids type PEOPLE. Where to get it: run `lookup_search_ids` with type `PEOPLE` and use `matches[].id`. - `openTo` (optional): a list (one of: proBono, boardMember). Open to pro bono work or to a board seat. - `advancedKeywords` (optional): a group of fields. Words that must appear in one part of the profile: first name, last name, title, company or school. - `firstName` (optional): text. - `lastName` (optional): text. - `title` (optional): text. - `company` (optional): text. - `school` (optional): text. - `limit` (optional): a number, 1 to 10. How many to return (1–10, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_people`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: PEOPLE - `results[].id`: a member id - `results[].publicIdentifier`: a public identifier - `results[].publicProfileUrl`: a profile link - `results[].profileUrl`: a profile link - `results[].profilePictureUrl`: string or null - `results[].profilePictureUrlLarge`: string or null - `results[].memberUrn`: string or null - `results[].name`: string or null - `results[].firstName`: string - `results[].lastName`: string - `results[].networkDistance`: SELF | DISTANCE_1 | DISTANCE_2 | DISTANCE_3 | OUT_OF_NETWORK - `results[].location`: string or null - `results[].industry`: string or null - `results[].keywordsMatch`: string - `results[].headline`: string - `results[].connectionsCount`: number - `results[].followersCount`: number - `results[].pendingInvitation`: boolean - `results[].canSendInmail`: boolean - `results[].hiddenCandidate`: boolean - `results[].interestLikelihood`: string - `results[].recruiterCandidateId`: string - `results[].recruiterPipelineCategory`: string - `results[].premium`: boolean - `results[].verified`: boolean - `results[].sharedConnectionsCount`: number - `results[].recentPostsCount`: number - `results[].recentlyHired`: boolean - `results[].mentionedInTheNews`: boolean - `results[].interests`: string ### Good to know - At most 10 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 1,000 rows for one search; narrow the filters to reach the rest. - networkDistance in a row is defined as DISTANCE_1 / DISTANCE_2 / DISTANCE_3 (a published sample row also shows OUT_OF_NETWORK), while a profile reports FIRST_DEGREE / SECOND_DEGREE / THIRD_DEGREE for the same thing: do not compare the two as text. Page: https://heyreagent.com/docs/actions/search_linkedin_people ## search_linkedin_companies: Search companies, every filter typed Search company pages on ordinary LinkedIn, with each LinkedIn filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_companies Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "software" } ``` ### What you give it - `keywords` (optional): text. Words to search for. - `industry` (optional): a search filter id. Industries: ids from lookup_search_ids type INDUSTRY. Where to get it: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. - `location` (optional): a search filter id. Places: ids from lookup_search_ids type LOCATION. Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `hasJobOffers` (optional): true or false. Only companies with job listings on LinkedIn. - `headcount` (optional): a list (a group of fields). Company sizes, as LinkedIn's own bands, e.g. { min: 51, max: 200 }. - `min` (optional): one of: 1, 11, 51, 201, 501, 1001, 5001, 10001. - `max` (optional): one of: 1, 10, 50, 200, 500, 1000, 5000, 10000. - `networkDistance` (optional): a list (one of: 1, 2, 3). Connection degrees from you: 1, 2, 3. - `limit` (optional): a number, 1 to 10. How many to return (1–10, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_companies`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: COMPANY - `results[].id`: a company id - `results[].name`: string - `results[].location`: string or null - `results[].profileUrl`: a company link - `results[].industry`: string - `results[].summary`: string or null - `results[].followersCount`: number - `results[].jobOffersCount`: number - `results[].headcount`: string ### Good to know - At most 10 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 1,000 rows for one search; narrow the filters to reach the rest. Page: https://heyreagent.com/docs/actions/search_linkedin_companies ## search_linkedin_posts: Search posts, every filter typed Search posts on LinkedIn, with each LinkedIn filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_posts Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "outbound sales" } ``` ### What you give it - `keywords` (optional): text. Words to search for. - `sortBy` (optional): one of: relevance, date. Order (default relevance). - `datePosted` (optional): one of: past_day, past_week, past_month. How recent. - `contentType` (optional): one of: videos, images, live_videos, collaborative_articles, documents, jobs. Only posts with this kind of content. - `postedBy` (optional): a search filter id. Who posted it: given people, given company pages, you, your 1st-degree connections, or people you follow. Where to get it: `member`: run `lookup_search_ids` with type `PEOPLE` and use `matches[].id`. `company`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `member` (optional): a list (text). People: ids from lookup_search_ids type PEOPLE. - `company` (optional): a list (text). Company pages: ids from lookup_search_ids type COMPANY. - `me` (optional): true or false. - `firstConnections` (optional): true or false. - `peopleYouFollow` (optional): true or false. - `mentioning` (optional): a search filter id. Posts that mention these people or company pages. Where to get it: `member`: run `lookup_search_ids` with type `PEOPLE` and use `matches[].id`. `company`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `member` (optional): a list (text). People: ids from lookup_search_ids type PEOPLE. - `company` (optional): a list (text). Company pages: ids from lookup_search_ids type COMPANY. - `author` (optional): a search filter id. Who the author is: their industry, their company, or words in their headline. Where to get it: `industry`: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. `company`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `industry` (optional): a list (text). Ids from lookup_search_ids type INDUSTRY. - `company` (optional): a list (text). Ids from lookup_search_ids type COMPANY. - `keywords` (optional): text. Words in the author's headline. - `limit` (optional): a number, 1 to 49. How many to return (1–49, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_posts`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: POST - `results[].id`: a post id - `results[].socialId`: a post social id - `results[].shareUrl`: a post link - `results[].title`: string - `results[].text`: string - `results[].date`: string - `results[].parsedDatetime`: string - `results[].reactionCounter`: number - `results[].commentCounter`: number - `results[].repostCounter`: number - `results[].impressionsCounter`: number - `results[].userReacted`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT - `results[].isRepost`: boolean - `results[].repostId`: string - `results[].repostParsedDatetime`: string ### Good to know - At most 49 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 1,000 rows for one search; narrow the filters to reach the rest. Page: https://heyreagent.com/docs/actions/search_linkedin_posts ## search_linkedin_jobs: Search jobs, every filter typed Search job listings on LinkedIn, with each LinkedIn filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_jobs Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "software engineer" } ``` ### What you give it - `keywords` (optional): text. Words to search for. - `sortBy` (optional): one of: relevance, date. Order (default relevance). - `datePosted` (optional): a number. Posted within this many days. - `region` (optional): a search filter id. A country or region: an id from lookup_search_ids type LOCATION. Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `location` (optional): a search filter id. Places: ids from lookup_search_ids type LOCATION. Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `locationWithinArea` (optional): a number. Miles around the location. - `industry` (optional): a search filter id. Industries: ids from lookup_search_ids type INDUSTRY. Where to get it: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. - `seniority` (optional): a list (one of: executive, director, mid_senior, associate, entry, intern). Experience levels. - `function` (optional): a search filter id. Job functions: ids from lookup_search_ids type JOB_FUNCTION. Where to get it: run `lookup_search_ids` with type `JOB_FUNCTION` and use `matches[].id`. - `role` (optional): a search filter id. Job titles: ids from lookup_search_ids type JOB_TITLE. Where to get it: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. - `jobType` (optional): a list (one of: full_time, part_time, contract, temporary, volunteer, internship, other). Job types. - `company` (optional): a search filter id. Companies: ids from lookup_search_ids type COMPANY. Where to get it: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `presence` (optional): a list (one of: on_site, hybrid, remote). On site, hybrid or remote. - `easyApply` (optional): true or false. Only Easy Apply jobs. - `hasVerifications` (optional): true or false. Only jobs with verifications. - `under10Applicants` (optional): true or false. Only jobs with fewer than 10 applicants. - `inYourNetwork` (optional): true or false. Only jobs at companies where you know someone. - `fairChanceEmployer` (optional): true or false. Only fair-chance employers. - `benefits` (optional): a list (one of: medical_insurance, vision_insurance, dental_insurance, disability_insurance, 401(k), pension_plan, paid_maternity_leave, paid_paternity_leave, commuter_benefits, student_loan_assistance, tuition_assistance). Benefits offered. - `commitments` (optional): a list (one of: career_growth_and_learning, diversity_equity_and_inclusion, environmental_sustainability, social_impact, work_life_balance). Company commitments. - `minimumSalary` (optional): a group of fields. Lowest yearly salary, in thousands: one of LinkedIn's own steps for that currency. - `currency` (needed): one of: USD, AUD, CAD. - `value` (needed): one of: 40, 60, 80, 100, 120, 140, 160, 180, 200. - `limit` (optional): a number, 1 to 50. How many to return (1–50, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_jobs`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: JOB - `results[].id`: string - `results[].referenceId`: string - `results[].title`: string - `results[].location`: string or null - `results[].postedAt`: any or null - `results[].reposted`: boolean - `results[].url`: string - `results[].promoted`: boolean - `results[].benefits`: string[] - `results[].easyApply`: boolean ### Good to know - At most 50 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 1,000 rows for one search; narrow the filters to reach the rest. - A row's id is a public job listing. The job-posting actions here act on your OWN postings and are not documented to take it. Page: https://heyreagent.com/docs/actions/search_linkedin_jobs ## search_linkedin_sales_navigator_people: Search people in my Sales Navigator, every filter typed Search people in Sales Navigator on your own seat, with each Sales Navigator filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_sales_navigator_people Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "head of sales" } ``` ### What you give it - `keywords` (optional): text. Words to search for. - `lastViewedAt` (optional): a number. With savedSearchId: only results newer than this moment (Unix time). - `savedSearchId` (optional): a search filter id. Run one of your saved searches; it replaces every other filter: an id from lookup_search_ids type SAVED_SEARCHES, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `SAVED_SEARCHES` and use `matches[].id`. - `recentSearchId` (optional): a search filter id. Run one of your recent searches again; it replaces every other filter: an id from lookup_search_ids type RECENT_SEARCHES, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `RECENT_SEARCHES` and use `matches[].id`. - `location` (optional): a search filter id. Places to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `REGION` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `REGION` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type REGION, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type REGION, service SALES_NAVIGATOR. - `locationByPostalCode` (optional): a search filter id. Postal codes to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `POSTAL_CODE` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `POSTAL_CODE` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type POSTAL_CODE, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type POSTAL_CODE, service SALES_NAVIGATOR. - `withinArea` (optional): a number. Miles around the postal code. - `industry` (optional): a search filter id. Industries to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `SALES_INDUSTRY` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `SALES_INDUSTRY` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type SALES_INDUSTRY, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type SALES_INDUSTRY, service SALES_NAVIGATOR. - `firstName` (optional): text. First name. - `lastName` (optional): text. Last name. - `tenure` (optional): a list (a group of fields). Years of experience, as LinkedIn's own bands, e.g. { min: 3, max: 5 }. - `min` (optional): one of: 0, 1, 3, 6, 10. - `max` (optional): one of: 1, 2, 5, 10. - `groups` (optional): a search filter id. LinkedIn groups: ids from lookup_search_ids type GROUPS, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `GROUPS` and use `matches[].id`. - `school` (optional): a search filter id. Schools to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `SCHOOL` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `SCHOOL` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type SCHOOL, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type SCHOOL, service SALES_NAVIGATOR. - `profileLanguage` (optional): a list (text, up to 2 characters). Profile languages, as two-letter codes such as "en". - `company` (optional): a search filter id. Current companies to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type COMPANY, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type COMPANY, service SALES_NAVIGATOR. - `companyHeadcount` (optional): a list (a group of fields). Company sizes, as LinkedIn's own bands, e.g. { min: 51, max: 200 }. - `min` (optional): one of: 1, 11, 51, 201, 501, 1001, 5001, 10001. - `max` (optional): one of: 1, 10, 50, 200, 500, 1000, 5000, 10000. - `companyType` (optional): a list (one of: public_company, privately_held, non_profit, educational_institution, partnership, self_employed, self_owned, government_agency). Company types. - `companyLocation` (optional): a search filter id. Company headquarters places to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `REGION` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `REGION` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type REGION, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type REGION, service SALES_NAVIGATOR. - `tenureAtCompany` (optional): a list (a group of fields). Years in the current company, as LinkedIn's own bands. - `min` (optional): one of: 0, 1, 3, 6, 10. - `max` (optional): one of: 1, 2, 5, 10. - `pastCompany` (optional): a search filter id. Past companies to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type COMPANY, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type COMPANY, service SALES_NAVIGATOR. - `function` (optional): a search filter id. Job functions to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `DEPARTMENT` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `DEPARTMENT` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type DEPARTMENT, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type DEPARTMENT, service SALES_NAVIGATOR. - `role` (optional): a search filter id. Current job titles to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type JOB_TITLE, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type JOB_TITLE, service SALES_NAVIGATOR. - `tenureAtRole` (optional): a list (a group of fields). Years in the current position, as LinkedIn's own bands. - `min` (optional): one of: 0, 1, 3, 6, 10. - `max` (optional): one of: 1, 2, 5, 10. - `seniority` (optional): a group of fields. Seniority levels to include and to leave out. - `include` (optional): a list (one of: owner/partner, cxo, vice_president, director, experienced_manager, entry_level_manager, strategic, senior, entry_level, in_training). - `exclude` (optional): a list (one of: owner/partner, cxo, vice_president, director, experienced_manager, entry_level_manager, strategic, senior, entry_level, in_training). - `pastRole` (optional): a search filter id. Past job titles to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type JOB_TITLE, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type JOB_TITLE, service SALES_NAVIGATOR. - `followingYourCompany` (optional): true or false. Only people who follow your company. - `viewedYourProfileRecently` (optional): true or false. Only people who viewed your profile recently. - `networkDistance` (optional): a list (one of: 1, 2, 3, or exactly: GROUP). Connection degrees from you (1, 2, 3) or "GROUP" for people in your groups. - `connectionsOf` (optional): a search filter id. People whose connections to search: ids from lookup_search_ids type PEOPLE, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `PEOPLE` and use `matches[].id`. - `pastColleague` (optional): true or false. Only past colleagues. - `sharedExperiences` (optional): true or false. Only people you share experiences with. - `changedJobs` (optional): true or false. Only people who changed jobs recently. - `postedOnLinkedin` (optional): true or false. Only people who posted on LinkedIn recently. - `mentionnedInNews` (optional): true or false. Only people mentioned in the news recently. - `persona` (optional): a search filter id. Your Sales Navigator personas: ids from lookup_search_ids type PERSONA, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `PERSONA` and use `matches[].id`. - `accountLists` (optional): a search filter id. Your account lists (an id, or "ALL") to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `ACCOUNT_LISTS` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `ACCOUNT_LISTS` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type ACCOUNT_LISTS, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type ACCOUNT_LISTS, service SALES_NAVIGATOR. - `leadLists` (optional): a search filter id. Your lead lists (an id, or "ALL") to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `LEAD_LISTS` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `LEAD_LISTS` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type LEAD_LISTS, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type LEAD_LISTS, service SALES_NAVIGATOR. - `viewedProfileRecently` (optional): true or false. Only people whose profile you viewed recently. - `messagedRecently` (optional): true or false. Only people you messaged recently. - `includeSavedLeads` (optional): true or false. Include your saved leads. - `includeSavedAccounts` (optional): true or false. Include people at your saved accounts. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_sales_navigator_people`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: PEOPLE - `results[].id`: a Sales Navigator id - `results[].publicIdentifier`: string or null - `results[].publicProfileUrl`: a profile link - `results[].profileUrl`: string or null - `results[].profilePictureUrl`: string or null - `results[].profilePictureUrlLarge`: string or null - `results[].memberUrn`: string or null - `results[].name`: string or null - `results[].firstName`: string - `results[].lastName`: string - `results[].networkDistance`: SELF | DISTANCE_1 | DISTANCE_2 | DISTANCE_3 | OUT_OF_NETWORK - `results[].location`: string or null - `results[].industry`: string or null - `results[].keywordsMatch`: string - `results[].headline`: string - `results[].connectionsCount`: number - `results[].followersCount`: number - `results[].pendingInvitation`: boolean - `results[].canSendInmail`: boolean - `results[].hiddenCandidate`: boolean - `results[].interestLikelihood`: string - `results[].recruiterCandidateId`: string - `results[].recruiterPipelineCategory`: string - `results[].premium`: boolean - `results[].verified`: boolean - `results[].sharedConnectionsCount`: number - `results[].recentPostsCount`: number - `results[].recentlyHired`: boolean - `results[].mentionedInTheNews`: boolean - `results[].interests`: string ### Good to know - At most 100 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 2,500 rows for one search; narrow the filters to reach the rest. - Needs a Sales Navigator seat on your own LinkedIn account. - Look filter ids up with lookup_search_ids service SALES_NAVIGATOR: that input selects which product's list is searched. - networkDistance in a row is defined as DISTANCE_1 / DISTANCE_2 / DISTANCE_3 (a published sample row also shows OUT_OF_NETWORK), while a profile reports FIRST_DEGREE / SECOND_DEGREE / THIRD_DEGREE for the same thing: do not compare the two as text. Page: https://heyreagent.com/docs/actions/search_linkedin_sales_navigator_people ## search_linkedin_sales_navigator_companies: Search companies in my Sales Navigator, every filter typed Search companies in Sales Navigator on your own seat, with each Sales Navigator filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_sales_navigator_companies Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "software" } ``` ### What you give it - `keywords` (optional): text. Words to search for. - `lastViewedAt` (optional): a number. With savedSearchId: only results newer than this moment (Unix time). - `savedSearchId` (optional): a search filter id. Run one of your saved searches; it replaces every other filter: an id from lookup_search_ids type SAVED_SEARCHES, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `SAVED_SEARCHES` and use `matches[].id`. - `recentSearchId` (optional): a search filter id. Run one of your recent searches again; it replaces every other filter: an id from lookup_search_ids type RECENT_SEARCHES, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `RECENT_SEARCHES` and use `matches[].id`. - `industry` (optional): a search filter id. Industries to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `SALES_INDUSTRY` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `SALES_INDUSTRY` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type SALES_INDUSTRY, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type SALES_INDUSTRY, service SALES_NAVIGATOR. - `location` (optional): a search filter id. Headquarters places to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type LOCATION, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type LOCATION, service SALES_NAVIGATOR. - `locationByPostalCode` (optional): a search filter id. Postal codes to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `POSTAL_CODE` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `POSTAL_CODE` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type POSTAL_CODE, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type POSTAL_CODE, service SALES_NAVIGATOR. - `withinArea` (optional): a number. Miles around the postal code. - `hasJobOffers` (optional): true or false. Only companies hiring on LinkedIn. - `headcount` (optional): a list (a group of fields). Company sizes, as LinkedIn's own bands, e.g. { min: 51, max: 200 }. - `min` (optional): one of: 1, 11, 51, 201, 501, 1001, 5001, 10001. - `max` (optional): one of: 1, 10, 50, 200, 500, 1000, 5000, 10000. - `headcountGrowth` (optional): a group of fields. Headcount growth, in percent. - `min` (optional): a number. - `max` (optional): a number. - `departmentHeadcount` (optional): a search filter id. How many people work in given departments. Where to get it: `department`: run `lookup_search_ids` with type `DEPARTMENT` and use `matches[].id`. - `department` (needed): a list (text). Ids from lookup_search_ids type DEPARTMENT, service SALES_NAVIGATOR. - `min` (optional): a number. - `max` (optional): a number. - `departmentHeadcountGrowth` (optional): a search filter id. How fast given departments are growing, in percent. Where to get it: `department`: run `lookup_search_ids` with type `DEPARTMENT` and use `matches[].id`. - `department` (needed): a list (text). Ids from lookup_search_ids type DEPARTMENT, service SALES_NAVIGATOR. - `min` (optional): a number. - `max` (optional): a number. - `networkDistance` (optional): a list (one of: 1, 2, 3). Connection degrees from you: 1, 2, 3. - `annualRevenue` (optional): a group of fields. Yearly revenue in millions, as LinkedIn's own steps. For "1000+" set max to 1001. - `currency` (needed): text, up to 3 characters. Three-letter currency code, e.g. "USD". - `min` (needed): one of: 0, 0.2, 1, 2.5, 5, 10, 20, 50, 100, 500, 1000, 1001. - `max` (needed): one of: 0, 0.2, 1, 2.5, 5, 10, 20, 50, 100, 500, 1000, 1001. - `followersCount` (optional): a list (a group of fields). Number of followers, as LinkedIn's own bands. - `min` (optional): one of: 1, 51, 101, 1001, 5001. - `max` (optional): one of: 50, 100, 1000, 5000. - `fortune` (optional): a list (a group of fields). Fortune ranking, as LinkedIn's own bands. - `min` (optional): one of: 0, 51, 101, 251. - `max` (optional): one of: 50, 100, 250, 500. - `technologies` (optional): a search filter id. Technologies the company uses: ids from lookup_search_ids type TECHNOLOGIES, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `TECHNOLOGIES` and use `matches[].id`. - `recentActivities` (optional): a list (one of: senior_leadership_changes, funding_events). Only companies with these recent events. - `savedAccounts` (optional): a search filter id. Your saved accounts: ids from lookup_search_ids type SAVED_ACCOUNTS, service SALES_NAVIGATOR. Where to get it: run `lookup_search_ids` with type `SAVED_ACCOUNTS` and use `matches[].id`. - `accountLists` (optional): a search filter id. Your account lists (an id, or "ALL") to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `ACCOUNT_LISTS` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `ACCOUNT_LISTS` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type ACCOUNT_LISTS, service SALES_NAVIGATOR. - `exclude` (optional): a list (text). Ids from lookup_search_ids type ACCOUNT_LISTS, service SALES_NAVIGATOR. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_sales_navigator_companies`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: COMPANY - `results[].id`: a company id - `results[].name`: string - `results[].location`: string or null - `results[].profileUrl`: string - `results[].industry`: string - `results[].summary`: string or null - `results[].followersCount`: number - `results[].jobOffersCount`: number - `results[].headcount`: string ### Good to know - At most 100 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 1,000 rows for one search; narrow the filters to reach the rest. - Needs a Sales Navigator seat on your own LinkedIn account. - Look filter ids up with lookup_search_ids service SALES_NAVIGATOR: that input selects which product's list is searched. Page: https://heyreagent.com/docs/actions/search_linkedin_sales_navigator_companies ## search_linkedin_recruiter_people: Search candidates in my Recruiter, every filter typed Search candidates in Recruiter on your own seat, with each Recruiter filter as its own typed input. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/search_linkedin_recruiter_people Authorization: Bearer YOUR_KEY content-type: application/json { "keywords": "software engineer" } ``` ### What you give it - `keywords` (optional): text. Words to search for. AND, OR and NOT may be used, e.g. developers AND product owners NOT managers. - `locale` (optional): one of: arabic, bangla, czech, danish, german, greek, english, spanish, persian, finnish, french, hindi, hungarian, indonesian, italian, hebrew, japanese, korean, marathi, malay, dutch, norwegian, punjabi, polish, portuguese, romanian, russian, swedish, telugu, thai, tagalog, turkish, ukrainian, vietnamese, chinese_simplified, chinese_traditional. The language your Recruiter is set to, when results look inconsistent. - `savedSearch` (optional): a search filter id. Run one of your saved searches; it replaces every other filter. Where to get it: `id`: run `lookup_search_ids` with type `SAVED_SEARCHES` and use `matches[].id`. `projectId`: run `lookup_search_ids` with type `SAVED_SEARCHES` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type SAVED_SEARCHES, service RECRUITER. - `projectId` (needed): text. The project that saved search belongs to, from lookup_search_ids type SAVED_SEARCHES, service RECRUITER. - `newestResultsOnly` (optional): true or false. - `savedFilter` (optional): a search filter id. One of your saved filters: an id from lookup_search_ids type SAVED_FILTERS, service RECRUITER. Where to get it: run `lookup_search_ids` with type `SAVED_FILTERS` and use `matches[].id`. - `location` (optional): a search filter id. Places. DOESNT_HAVE cannot be combined with locationWithinArea. Where to get it: `id`: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type LOCATION, service RECRUITER. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `scope` (optional): one of: CURRENT, OPEN_TO_RELOCATE_ONLY, CURRENT_OR_OPEN_TO_RELOCATE. - `title` (optional): text. The title that came with the id in lookup_search_ids. - `locationWithinArea` (optional): a number. Miles around the location. - `industry` (optional): a search filter id. Industries to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type INDUSTRY, service RECRUITER. - `exclude` (optional): a list (text). Ids from lookup_search_ids type INDUSTRY, service RECRUITER. - `role` (optional): a search filter id. Job titles: each one by id or by keywords. Where to get it: `id`: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type JOB_TITLE, service RECRUITER. - `isSelection` (needed): true or false. true: only people with exactly this title. false: also similar titles. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `scope` (optional): one of: CURRENT_OR_PAST, CURRENT, PAST, PAST_NOT_CURRENT, OPEN_TO_WORK. - `keywords` (needed): text. - `skills` (optional): a search filter id. Skills: each one by id or by keywords. Where to get it: `id`: run `lookup_search_ids` with type `SKILL` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type SKILL, service RECRUITER. - `title` (optional): text. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `keywords` (needed): text. - `company` (optional): a search filter id. Companies: each one by id or by keywords. Where to get it: `id`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type COMPANY, service RECRUITER. - `name` (optional): text. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `scope` (optional): one of: CURRENT_OR_PAST, CURRENT, PAST, PAST_NOT_CURRENT. - `keywords` (needed): text. - `companyHeadcount` (optional): a list (a group of fields). Company sizes, as LinkedIn's own bands, e.g. { min: 51, max: 200 }. - `min` (optional): one of: 1, 11, 51, 201, 501, 1001, 5001, 10001. - `max` (optional): one of: 1, 10, 50, 200, 500, 1000, 5000, 10000. - `currentCompany` (optional): a search filter id. Current companies. Where to get it: `id`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type COMPANY, service RECRUITER. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `pastCompany` (optional): a search filter id. Past companies. Where to get it: `id`: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type COMPANY, service RECRUITER. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `school` (optional): a search filter id. Schools. Where to get it: `id`: run `lookup_search_ids` with type `SCHOOL` and use `matches[].id`. - `id` (needed): text. An id from lookup_search_ids type SCHOOL, service RECRUITER. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `degree` (optional): a search filter id. Degrees to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `DEGREE` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `DEGREE` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type DEGREE, service RECRUITER. - `exclude` (optional): a list (text). Ids from lookup_search_ids type DEGREE, service RECRUITER. - `employmentType` (optional): a list (one of: FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP). Employment types. Recruiter PRO contracts only. - `groups` (optional): a search filter id. LinkedIn groups: ids from lookup_search_ids type GROUPS, service RECRUITER. Where to get it: run `lookup_search_ids` with type `GROUPS` and use `matches[].id`. - `graduationYear` (optional): a group of fields. Graduation years, from and to. - `min` (optional): a number, 1000 to 9999. - `max` (optional): a number, 1000 to 9999. - `tenure` (optional): a group of fields. Years of experience, from and to. - `min` (optional): a number. - `max` (optional): a number. - `tenureInCompany` (optional): a group of fields. Years in the current company, from and to. - `min` (optional): a number. - `max` (optional): a number. - `tenureInPosition` (optional): a group of fields. Years in the current position, from and to. - `min` (optional): a number. - `max` (optional): a number. - `seniority` (optional): a group of fields. Seniority levels to include and to leave out. - `include` (optional): a list (one of: owner, partner, cxo, vp, director, manager, senior, entry, training, unpaid). - `exclude` (optional): a list (one of: owner, partner, cxo, vp, director, manager, senior, entry, training, unpaid). - `function` (optional): a search filter id. Job functions: ids from lookup_search_ids type DEPARTMENT, service RECRUITER. Where to get it: run `lookup_search_ids` with type `DEPARTMENT` and use `matches[].id`. - `networkDistance` (optional): a list (one of: 1, 2, 3, or exactly: GROUP). Connection degrees from you (1, 2, 3) or "GROUP" for people in your groups. - `spokenLanguages` (optional): a list (a group of fields). Spoken languages and how well. Recruiter PRO contracts only. - `language` (needed): text. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `scope` (optional): one of: ELEMENTARY, LIMITED_WORKING, PROFESSIONAL_WORKING, FULL_PROFESSIONAL, NATIVE_OR_BILINGUAL. - `hidePreviouslyViewed` (optional): a group of fields. Leave out people you viewed within this many days. - `timespan` (needed): a number. Days back. - `profileLanguage` (optional): a list (text, up to 2 characters). Profile languages, as two-letter codes such as "en". - `recentlyJoined` (optional): a list (a group of fields). Joined LinkedIn this many days ago, as LinkedIn's own bands. - `min` (optional): one of: 2, 8, 15, 31. - `max` (optional): one of: 1, 7, 14, 30, 90. - `spotlights` (optional): a list (one of: OPEN_TO_WORK, ACTIVE_TALENT, REDISCOVERED_CANDIDATES, INTERNAL_CANDIDATES, INTERESTED_IN_YOUR_COMPANY, HAVE_COMPANY_CONNECTIONS). Spotlights. Advanced Recruiter subscriptions only. - `firstName` (optional): a list (text). First names. - `lastName` (optional): a list (text). Last names. - `hasMilitaryBackground` (optional): true or false. Only people with a US military background. - `pastApplicants` (optional): true or false. Only past applicants. - `hiringProjects` (optional): a search filter id. Your hiring projects to include and to leave out. Where to get it: `include`: run `lookup_search_ids` with type `HIRING_PROJECTS` and use `matches[].id`. `exclude`: run `lookup_search_ids` with type `HIRING_PROJECTS` and use `matches[].id`. - `include` (optional): a list (text). Ids from lookup_search_ids type HIRING_PROJECTS, service RECRUITER. - `exclude` (optional): a list (text). Ids from lookup_search_ids type HIRING_PROJECTS, service RECRUITER. - `recruitingActivity` (optional): a list (a group of fields). People with, or without, this kind of activity from your team. - `id` (needed): one of: messages, tags, notes, projects, resumes, reviews. - `priority` (optional): one of: CAN_HAVE, MUST_HAVE, DOESNT_HAVE. - `timespan` (optional): a number. Days back. - `notes` (optional): a list (text). Words in your team's notes on the person. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `search_linkedin_recruiter_people`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `results[].type`: PEOPLE - `results[].id`: a Recruiter id - `results[].publicIdentifier`: string or null - `results[].publicProfileUrl`: string or null - `results[].profileUrl`: string or null - `results[].profilePictureUrl`: string or null - `results[].profilePictureUrlLarge`: string or null - `results[].memberUrn`: string or null - `results[].name`: string or null - `results[].firstName`: string - `results[].lastName`: string - `results[].networkDistance`: SELF | DISTANCE_1 | DISTANCE_2 | DISTANCE_3 | OUT_OF_NETWORK - `results[].location`: string or null - `results[].industry`: string or null - `results[].keywordsMatch`: string - `results[].headline`: string - `results[].connectionsCount`: number - `results[].followersCount`: number - `results[].pendingInvitation`: boolean - `results[].canSendInmail`: boolean - `results[].hiddenCandidate`: boolean - `results[].interestLikelihood`: string - `results[].recruiterCandidateId`: string - `results[].recruiterPipelineCategory`: string - `results[].premium`: boolean - `results[].verified`: boolean - `results[].sharedConnectionsCount`: number - `results[].recentPostsCount`: number - `results[].recentlyHired`: boolean - `results[].mentionedInTheNews`: boolean - `results[].interests`: string ### Good to know - At most 100 rows per call: LinkedIn's page size for this search. - LinkedIn returns at most 2,500 rows for one search; narrow the filters to reach the rest. - Needs a Recruiter seat on your own LinkedIn account. - Look filter ids up with lookup_search_ids service RECRUITER: that input selects which product's list is searched. - networkDistance in a row is defined as DISTANCE_1 / DISTANCE_2 / DISTANCE_3 (a published sample row also shows OUT_OF_NETWORK), while a profile reports FIRST_DEGREE / SECOND_DEGREE / THIRD_DEGREE for the same thing: do not compare the two as text. - A Recruiter row often has no publicIdentifier and no profile link: its id is the only handle, and only Recruiter actions take it. Page: https://heyreagent.com/docs/actions/search_linkedin_recruiter_people ## get_company: Get a company page Read one company page. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_company Authorization: Bearer YOUR_KEY content-type: application/json { "company": "PASTE_COMPANY_LINK_HERE" } ``` ### What you give it - `company` (needed): a company link or a company id. The company: its LinkedIn page URL, its name as it appears in that URL, or its numeric id. Where to get it: Open the company's page on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/company/their-name Or: Run `search_linkedin_companies` and use `results[].profileUrl`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a company id - `name`: string - `description`: string - `entityUrn`: string - `publicIdentifier`: string - `profileUrl`: a company link - `tagline`: string - `followersCount`: number - `isFollowing`: boolean - `isEmployee`: boolean - `hashtags[].title`: string - `messaging.isEnabled`: boolean - `messaging.id`: a company messaging id - `messaging.entityUrn`: string - `claimed`: boolean - `viewerPermissions.canMembersInviteToFollow`: boolean - `viewerPermissions.canReadContentSuggestions`: boolean - `viewerPermissions.canReadMessages`: boolean - `viewerPermissions.canUpdateOrganizationProfile`: boolean - `viewerPermissions.canCreateOrganicShare`: boolean - `viewerPermissions.canReadAdminDashboard`: boolean - `viewerPermissions.canReadOrganizationActivity`: boolean - `viewerPermissions.canEditCurators`: boolean - `viewerPermissions.canManageOrganizationalPageFollow`: boolean - `viewerPermissions.canReadOrganizationFollowerAnalytics`: boolean - `viewerPermissions.canInviteMemberToFollow`: boolean - `viewerPermissions.canReadOrganizationLeadsAnalytics`: boolean - `viewerPermissions.canEditPendingAdministrators`: boolean - `viewerPermissions.canManageMessagingAccess`: boolean - `viewerPermissions.canSeeEmployeeExperienceAsMember`: boolean - `viewerPermissions.canEmployeesInviteToFollow`: boolean - `viewerPermissions.canSeeOrganizationAdministrativePage`: boolean - `viewerPermissions.canManageAdminRoles`: boolean - `viewerPermissions.canEditOrganizationDetails`: boolean - `viewerPermissions.canApproveContent`: boolean - `viewerPermissions.canViewTeamPerformance`: boolean - `viewerPermissions.canManageOrganizationSettings`: boolean - `viewerPermissions.canAccessAdvancedAnalytics`: boolean - `viewerPermissions.canModerateComments`: boolean - `viewerPermissions.canCreateAds`: boolean - `viewerPermissions.canManageAdBudgets`: boolean - `viewerPermissions.canEditPageTheme`: boolean - `viewerPermissions.canPublishNewsletters`: boolean - `viewerPermissions.canEditCustomTabs`: boolean - `viewerPermissions.canManageIntegrations`: boolean - `viewerPermissions.canAssignRoles`: boolean - `viewerPermissions.canApprovePendingMembers`: boolean - `viewerPermissions.canEditCareerPageSettings`: boolean - `viewerPermissions.canViewBillingInformation`: boolean - `organizationType`: PUBLIC_COMPANY | EDUCATIONAL | SELF_EMPLOYED | GOVERNMENT_AGENCY | NON_PROFIT | SELF_OWNED | PRIVATELY_HELD | PARTNERSHIP or null - `locations[].isHeadquarter`: boolean - `locations[].country`: string - `locations[].city`: string - `locations[].postalCode`: string - `locations[].street`: string[] - `locations[].description`: string - `locations[].area`: string - `logo`: string - `industry`: string[] - `activities`: string[] - `employeeCount`: number - `employeeCountRange.from`: number - `employeeCountRange.to`: number - `website`: string - `foundationDate`: string - `phone`: string - `acquiredBy.id`: string - `acquiredBy.name`: string - `acquiredBy.publicIdentifier`: string - `acquiredBy.profileUrl`: string - `crunchbaseFunding.lastUpdatedAt`: string - `crunchbaseFunding.companyUrl`: string ### Good to know - company also takes the page's name as it appears in its link (linkedin.com/company/). Page: https://heyreagent.com/docs/actions/get_company ## search_people_sales_navigator: Search people (Sales Navigator) Search people in Sales Navigator through a shared seat, by names of titles, places, industries and companies. This action can change or spend something, and it happens right away. Plan: Agent. ``` POST https://api.heyreagent.com/v1/actions/search_people_sales_navigator Authorization: Bearer YOUR_KEY content-type: application/json { "titles": [ "Head of Sales" ] } ``` ### What you give it - `keywords` (optional): text. Free-text keywords searched across all profile fields (title, headline, about, company). - `titles` (optional): a list (text). Job titles, e.g. ["Chief Technology Officer","VP of Engineering"]. Matched as OR'd keywords — pass variants to go broad. - `locations` (optional): a list (text). Person locations in plain English, e.g. ["United States","London"]. Resolved to LinkedIn regions automatically. - `industries` (optional): a list (text). Company industries in plain English, e.g. ["Software","Financial Services"]. - `companies` (optional): a list (text). Current companies by name, e.g. ["Google","Stripe"]. Each name is looked up and the top match used — when you already have LinkedIn company ids (search_companies / list_funding_signals return companyId), pass companyIds instead. - `companyIds` (optional): a company id. Current companies by LinkedIn company id — the companyId values search_companies / list_funding_signals return (up to 100). Exact: no name lookup, so no same-name mix-ups. Combine with seniorities and changedJobs / postedOnLinkedIn to get the decision-makers at signal companies who just moved / are posting. Where to get it: Run `search_linkedin_companies` and use `results[].id`. - `functions` (optional): a list (text). Job functions/departments, e.g. ["Engineering","Sales","Marketing"]. - `seniorities` (optional): a list (text). Seniority levels, e.g. ["CXO","VP","Director","Manager"] (owner/partner, cxo, vice_president, director, experienced_manager, entry_level_manager, strategic, senior, entry_level, in_training). - `companyHeadcounts` (optional): a list (text). Company size bands. Valid: self-employed, 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. - `changedJobs` (optional): true or false. Only people who recently changed jobs (buying signal). - `postedOnLinkedIn` (optional): true or false. Only people who recently posted on LinkedIn (active/reachable signal). - `companyMinRevenueMillions` (optional): a number. Only people at companies with at least this annual revenue, in millions (e.g. 10 = $10M+) — use it to target companies that can afford the user's price. LinkedIn uses fixed brackets (0, 0.2, 1, 2.5, 5, 10, 20, 50, 100, 500, 1000); other values widen to the nearest one. The companies are matched on the same industries / companyHeadcounts / locations (as HQ location). Revenue is LinkedIn's estimate — companies without one are left out. - `companyMaxRevenueMillions` (optional): a number. Only people at companies with at most this annual revenue, in millions (e.g. 100 = up to $100M). Same brackets as companyMinRevenueMillions. - `revenueCurrency` (optional): text. ISO currency of the revenue band, e.g. "USD" (default), "EUR", "GBP". - `limit` (optional): a number, 1 to 100. Max people to return THIS call (1–100, default 25). To exceed 100 total, page with cursor. - `cursor` (optional): a cursor. Pagination cursor from a previous search_people_sales_navigator call's nextCursor — pass it back exactly as returned (it lasts 24 hours). Pass it with confirm:true to pull the NEXT batch — this is how you build a list larger than the 100/call cap. The cursor carries its search's filters, so pass the SAME filters or none. Omit for the first page. Where to get it: The `nextCursor` from the last answer of `search_people_sales_navigator`. - `format` (optional): one of: table, csv. table (default) = structured rows to render as a table. csv = also return an export-ready CSV string (columns: Name, Title, Company, Location, Industry, Shared Connections, Tenure in Role, LinkedIn URL) — use for large lists the user wants to save/hand off. - `confirm` (optional): true or false. false (default) = return the credit-cost estimate only (nothing charged). true = pull the people and charge credits after the user agreed. Continuation pages (with cursor) should pass confirm:true. ### What you get back - `action` - `matchCount` - `estimatedCredits` - `creditsCharged` - `yourBalance` - `returned` - `hasMore` - `nextCursor`: a cursor - `leads` ### Good to know - confirm false (the default) only previews: how many match and what it costs, no people. confirm true returns them and charges 0.02 credits a person. - action is "preview", "blocked" or "results". leads, returned, creditsCharged and nextCursor are present only on "results"; estimatedCredits only on "preview". - leads[].providerId is a Sales Navigator id (ACw…), not a member id. leads[].linkedinUrl is what the actions asking for a profile link take. - A cursor lasts 24 hours and works only with the filters it was made with, or with none. - Filters are names; companyIds is the one that takes ids. Page: https://heyreagent.com/docs/actions/search_people_sales_navigator ## count_people_sales_navigator: Count people (Sales Navigator) Count how many people match a Sales Navigator search, without returning them. This action only reads; it changes nothing. Plan: Agent. ``` POST https://api.heyreagent.com/v1/actions/count_people_sales_navigator Authorization: Bearer YOUR_KEY content-type: application/json { "titles": [ "Head of Sales" ] } ``` ### What you give it - `keywords` (optional): text. Free-text keywords searched across all profile fields (title, headline, about, company). - `titles` (optional): a list (text). Job titles, e.g. ["Chief Technology Officer","VP of Engineering"]. Matched as OR'd keywords — pass variants to go broad. - `locations` (optional): a list (text). Person locations in plain English, e.g. ["United States","London"]. Resolved to LinkedIn regions automatically. - `industries` (optional): a list (text). Company industries in plain English, e.g. ["Software","Financial Services"]. - `companies` (optional): a list (text). Current companies by name, e.g. ["Google","Stripe"]. Each name is looked up and the top match used — when you already have LinkedIn company ids (search_companies / list_funding_signals return companyId), pass companyIds instead. - `companyIds` (optional): a company id. Current companies by LinkedIn company id — the companyId values search_companies / list_funding_signals return (up to 100). Exact: no name lookup, so no same-name mix-ups. Combine with seniorities and changedJobs / postedOnLinkedIn to get the decision-makers at signal companies who just moved / are posting. Where to get it: Run `search_linkedin_companies` and use `results[].id`. - `functions` (optional): a list (text). Job functions/departments, e.g. ["Engineering","Sales","Marketing"]. - `seniorities` (optional): a list (text). Seniority levels, e.g. ["CXO","VP","Director","Manager"] (owner/partner, cxo, vice_president, director, experienced_manager, entry_level_manager, strategic, senior, entry_level, in_training). - `companyHeadcounts` (optional): a list (text). Company size bands. Valid: self-employed, 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. - `changedJobs` (optional): true or false. Only people who recently changed jobs (buying signal). - `postedOnLinkedIn` (optional): true or false. Only people who recently posted on LinkedIn (active/reachable signal). - `companyMinRevenueMillions` (optional): a number. Only people at companies with at least this annual revenue, in millions (e.g. 10 = $10M+) — use it to target companies that can afford the user's price. LinkedIn uses fixed brackets (0, 0.2, 1, 2.5, 5, 10, 20, 50, 100, 500, 1000); other values widen to the nearest one. The companies are matched on the same industries / companyHeadcounts / locations (as HQ location). Revenue is LinkedIn's estimate — companies without one are left out. - `companyMaxRevenueMillions` (optional): a number. Only people at companies with at most this annual revenue, in millions (e.g. 100 = up to $100M). Same brackets as companyMinRevenueMillions. - `revenueCurrency` (optional): text. ISO currency of the revenue band, e.g. "USD" (default), "EUR", "GBP". ### What you get back - `total` - `source` - `note` ### Good to know - Free, and the same filters as search_people_sales_navigator: use it to size a search before paying for one. Page: https://heyreagent.com/docs/actions/count_people_sales_navigator ## search_companies: Search companies Find companies in Sales Navigator through a shared seat, by industry, place, size and recent signals. This action only reads; it changes nothing. Plan: Agent. ``` POST https://api.heyreagent.com/v1/actions/search_companies Authorization: Bearer YOUR_KEY content-type: application/json { "industries": [ "Software Development" ] } ``` ### What you give it - `industries` (optional): a list (text). Company industries, e.g. ["Software","Financial Services"]. - `locations` (optional): a list (text). Company HQ locations, e.g. ["United States"]. - `headcounts` (optional): a list (text). Company size bands. Valid: self-employed, 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. - `hiring` (optional): true or false. Only companies with open job posts right now (hiring signal). - `growingTeamMinPct` (optional): a number. Minimum headcount-growth percent, e.g. 20 = teams that grew ≥20%. - `minRevenueMillions` (optional): a number. Minimum annual revenue in millions (e.g. 10 = $10M+). LinkedIn uses fixed brackets (0, 0.2, 1, 2.5, 5, 10, 20, 50, 100, 500, 1000); other values widen to the nearest one. Revenue is LinkedIn's estimate — companies without one are left out. - `maxRevenueMillions` (optional): a number. Maximum annual revenue in millions (same brackets). - `revenueCurrency` (optional): text. Currency for the revenue band (default USD). - `recentLeadershipChange` (optional): true or false. Only companies with a recent senior-leadership change (new-boss signal). - `recentFunding` (optional): true or false. Only companies with a recent funding event (same as list_funding_signals). - `limit` (optional): a number, 1 to 100. Max companies to return (1–100, default 20). Use 100 to feed the most companies to search_people_sales_navigator via companyIds. ### What you get back - `returned` - `source` - `filtersApplied` - `warnings` - `companies` - `note` ### Good to know - The total is totalCompanies; with recentFunding and recentLeadershipChange both true it is totalBySignal and withBothSignals instead. - There is no next page: narrow the filters. Page: https://heyreagent.com/docs/actions/search_companies ## find_decision_makers: Find decision-makers at a company Find the people at one company by title, seniority and function, through a shared Sales Navigator seat. This action can change or spend something, and it happens right away. Plan: Agent. ``` POST https://api.heyreagent.com/v1/actions/find_decision_makers Authorization: Bearer YOUR_KEY content-type: application/json { "company": "Stripe" } ``` ### What you give it - `company` (needed): text. Company name, e.g. "Stripe". Resolved to the LinkedIn company automatically. - `titles` (optional): a list (text). Specific senior roles to target, e.g. ["VP of Sales","Head of Growth"]. Omit for the full decision-maker set (C-level/VP/Director/Founder). - `seniorities` (optional): a list (text). Narrow by seniority level, e.g. ["CXO","VP","Director"] (owner/partner, cxo, vice_president, director, experienced_manager, entry_level_manager, strategic, senior, entry_level, in_training). - `functions` (optional): a list (text). Narrow by job function/department, e.g. ["Sales","Marketing","Engineering"]. - `locations` (optional): a list (text). Optional person locations to narrow to, e.g. ["United States"]. - `limit` (optional): a number, 1 to 100. Max people to return (1–100, default 15). - `format` (optional): one of: table, csv. table (default) = rows for a table. csv = also return an export-ready CSV string. - `confirm` (optional): true or false. false (default) = cost estimate only. true = pull and charge after the user agreed. ### What you get back - `action` - `matchCount` - `estimatedCredits` - `creditsCharged` - `yourBalance` - `returned` - `leads` ### Good to know - confirm false (the default) only previews: how many match and what it costs, no people. confirm true returns them and charges 0.02 credits a person. - company is a NAME. A company id passed there is searched as words; to search by id use search_people_sales_navigator with companyIds. - action is "preview", "blocked" or "results". leads, returned and creditsCharged are present only on "results". There is no next page. Page: https://heyreagent.com/docs/actions/find_decision_makers ## list_funding_signals: List recently funded companies List companies that recently raised funding, through a shared Sales Navigator seat. This action only reads; it changes nothing. Plan: Agent. ``` POST https://api.heyreagent.com/v1/actions/list_funding_signals Authorization: Bearer YOUR_KEY content-type: application/json { "industries": [ "Software Development" ] } ``` ### What you give it - `industries` (optional): a list (text). Company industries in plain English, e.g. ["Software","Financial Services"]. - `locations` (optional): a list (text). Company HQ locations, e.g. ["United States","Europe"]. - `headcounts` (optional): a list (text). Company size bands. Valid: self-employed, 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. - `minRevenueMillions` (optional): a number. Minimum annual revenue in millions (e.g. 10 = $10M+). LinkedIn uses fixed brackets (0, 0.2, 1, 2.5, 5, 10, 20, 50, 100, 500, 1000); other values widen to the nearest one. Revenue is LinkedIn's estimate — companies without one are left out. - `maxRevenueMillions` (optional): a number. Maximum annual revenue in millions (same brackets). - `revenueCurrency` (optional): text. Currency for the revenue band (default USD). - `limit` (optional): a number, 1 to 100. Max companies to return (1–100, default 20). ### What you get back - `totalFundedCompanies` - `returned` - `source` - `filtersApplied` - `warnings` - `companies` - `note` ### Good to know - There is no next page: narrow the filters. Page: https://heyreagent.com/docs/actions/list_funding_signals ## get_recent_posts: Get someone's recent posts Read one person's latest posts, through a shared account. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_recent_posts Authorization: Bearer YOUR_KEY content-type: application/json { "profileUrl": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `profileUrl` (optional): a profile link or a public identifier. LinkedIn profile URL of the person, e.g. a linkedinUrl from search_people_sales_navigator ("https://linkedin.com/in/…"). Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `providerId` (optional): a member id or a Sales Navigator id. The person's providerId from search_people_sales_navigator (an ACwAA… id). Faster than profileUrl — skips the profile-resolution lookup. Where to get it: Run `get_profile_details` and use `providerId`. - `limit` (optional): a number, 1 to 20. Max recent posts to return (1–20, default 2: the newest plus a backup is usually all a personalized opener needs). ### What you get back - `returned` - `source` - `posts` - `note` ### Good to know - Pass profileUrl or providerId, one of them. providerId is faster: a link is first resolved to an id. - People only. For a company page use list_posts_by_author with isCompany true. - A post here has no socialId: pass its url to get_post, or straight to comment_on_post and react_to_post. Page: https://heyreagent.com/docs/actions/get_recent_posts ## get_post_engagers: Get who engaged with a post List who reacted to and who commented on one post, together. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_post_engagers Authorization: Bearer YOUR_KEY content-type: application/json { "postUrl": "PASTE_POST_LINK_HERE" } ``` ### What you give it - `postUrl` (needed): a post link or a post social id. The LinkedIn post URL (activity/share/ugcPost URL). Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `connectionId` (optional): a connection id. Which sender to read through. Omit to use the first live sender. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `maxReactions` (optional): a number, 1 to 100. Max reactors (likers) to return (1–100, default 100). - `maxComments` (optional): a number, 1 to 100. Max commenters to return (1–100, default 100). ### What you get back - `summary` - `reactors` - `commenters` - `note` ### Good to know - At most 100 of each, with no next page. list_post_reactions and list_post_comments page through all of them. - postUrl takes the post's link or its socialId. A bare post id is refused. - The code that reads commenters says its field names were inferred and not checked against a real answer. Page: https://heyreagent.com/docs/actions/get_post_engagers ## create_post: Publish a post Publish one post, or repost one. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/create_post Authorization: Bearer YOUR_KEY content-type: application/json { "text": "Hello LinkedIn!" } ``` ### What you give it - `text` (optional): text, up to 3000 characters. The post text, exactly as it should appear. May be empty only for a plain repost. - `attachmentUrls` (optional): a list (a link), up to 9. Images, one video or one document to attach. Public https links; each file up to 10 MB, 20 MB in total. - `videoThumbnailUrl` (optional): a link. Cover image for an attached video (a public https link). - `repostOf` (optional): a post link or a post social id. URL of an existing LinkedIn post to repost. With empty text it is a plain repost; with text, a repost with your thoughts. Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `mentions` (optional): a list (a group of fields), up to 20. People or companies to mention. Put {{0}}, {{1}}, … in the text where each one goes (its position in this list). - `name` (needed): text. The name as it should appear in the text. - `profileId` (needed): a member id or a company id. The LinkedIn member id of the person (starts with ACo or ADo), or the numeric id of a company. Where to get it: Run `get_profile_details` and use `providerId`. - `isCompany` (optional): true or false. True when the mention is a company. - `link` (optional): a link. A link to show as a preview card. It should also appear in the text; otherwise LinkedIn adds it at the end. - `jobPostingId` (optional): a job id. Id of one of your job postings to show as a card (from list_job_postings). Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `asOrganization` (optional): a organization id. Act as a company page you administer instead of yourself: that page's numeric id. No action here lists the pages you administer. - `audience` (optional): a search filter id. Limit who sees the post (company-page posts). Each list holds LinkedIn ids from lookup_search_ids (types LANGUAGE, POST_JOB_FUNCTION, SCHOOL, SENIORITY, INDUSTRY, REGION, LOCATION); headcount is company-size ranges such as { min: 51, max: 200 }. Where to get it: `language`: run `lookup_search_ids` with type `LANGUAGE` and use `matches[].id`. `jobFunction`: run `lookup_search_ids` with type `POST_JOB_FUNCTION` and use `matches[].id`. `school`: run `lookup_search_ids` with type `SCHOOL` and use `matches[].id`. `seniority`: run `lookup_search_ids` with type `SENIORITY` and use `matches[].id`. `industry`: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. `region`: run `lookup_search_ids` with type `REGION` and use `matches[].id`. `location`: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `language` (optional): a list (text). - `jobFunction` (optional): a list (text). - `school` (optional): a list (text). - `seniority` (optional): a list (text). - `industry` (optional): a list (text). - `region` (optional): a list (text). - `location` (optional): a list (text). - `headcount` (optional): a list (a group of fields). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `published` - `postId`: a post id - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - No published text says which form of id postId is. Pass it to get_post and use the socialId that comes back. - A mention is written {{0}}, {{1}}, … in the text, by its position in mentions. - repost true and attachments (a count) are added to the answer when they apply. Page: https://heyreagent.com/docs/actions/create_post ## comment_on_post: Comment on a post Comment on one post, or answer one comment on it. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/comment_on_post Authorization: Bearer YOUR_KEY content-type: application/json { "postUrl": "PASTE_POST_LINK_HERE", "text": "Hello!" } ``` ### What you give it - `postUrl` (needed): a post link or a post social id. The LinkedIn post URL. Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `text` (needed): text, up to 1250 characters. The comment text. - `replyToCommentId` (optional): a comment id. Id of a comment on that post to reply to (from list_post_comments). Where to get it: Run `list_post_comments` and use `comments[].id`. - `mentions` (optional): a list (a group of fields), up to 20. People or companies to mention. Put {{0}}, {{1}}, … in the text where each one goes (its position in this list). - `name` (needed): text. The name as it should appear in the text. - `profileId` (needed): a member id or a company id. The LinkedIn member id of the person (starts with ACo or ADo), or the numeric id of a company. Where to get it: Run `get_profile_details` and use `providerId`. - `isCompany` (optional): true or false. True when the mention is a company. - `link` (optional): a link. A link to show as a preview card. It should also appear in the text; otherwise LinkedIn adds it at the end. - `imageUrl` (optional): a link. One image to attach (a public https link, up to 10 MB). - `asOrganization` (optional): a organization id. Act as a company page you administer instead of yourself: that page's numeric id. No action here lists the pages you administer. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `sent` - `postUrl` - `asReply` - `commentId`: a comment id - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - postUrl takes the post's link or its socialId; the action resolves a link to the socialId itself. A bare post id is refused. Page: https://heyreagent.com/docs/actions/comment_on_post ## react_to_post: React to a post React to one post, or to one comment on it. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/react_to_post Authorization: Bearer YOUR_KEY content-type: application/json { "postUrl": "PASTE_POST_LINK_HERE" } ``` ### What you give it - `postUrl` (needed): a post link or a post social id. The LinkedIn post URL. Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `reaction` (optional): one of: like, celebrate, support, love, insightful, funny. Which reaction to add (default like). - `commentId` (optional): a comment id. React to this comment on the post instead of the post itself (its id from list_post_comments). Where to get it: Run `list_post_comments` and use `comments[].id`. - `asOrganization` (optional): a organization id. Act as a company page you administer instead of yourself: that page's numeric id. No action here lists the pages you administer. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `sent` - `postUrl` - `reaction` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - postUrl takes the post's link or its socialId. A bare post id is refused. - You send like / celebrate / support / love / insightful / funny; reading reactions back, LinkedIn names them LIKE / PRAISE / APPRECIATION / EMPATHY / INTEREST / ENTERTAINMENT. Page: https://heyreagent.com/docs/actions/react_to_post ## get_post: Get a post Read one post. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_post Authorization: Bearer YOUR_KEY content-type: application/json { "post": "PASTE_POST_LINK_HERE" } ``` ### What you give it - `post` (needed): a post link or a post social id or a post id. The LinkedIn post: its URL, or its id (socialId) from an earlier result. Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a post id - `socialId`: a post social id - `shareUrl`: a post link - `title`: string - `text`: string - `date`: string - `parsedDatetime`: string - `reactionCounter`: number - `commentCounter`: number - `repostCounter`: number - `impressionsCounter`: number - `userReacted`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT - `author.publicIdentifier`: a public identifier - `author.id`: string or null - `author.name`: string or null - `author.isCompany`: boolean - `author.headline`: string - `author.profilePictureUrl`: string - `writtenBy.id`: string - `writtenBy.publicIdentifier`: string - `writtenBy.name`: string - `permissions.canReact`: boolean - `permissions.canShare`: boolean - `permissions.canPostComments`: boolean - `isRepost`: boolean - `repostId`: string - `repostParsedDatetime`: string - `repostedBy.publicIdentifier`: string or null - `repostedBy.id`: string or null - `repostedBy.name`: string or null - `repostedBy.isCompany`: boolean - `repostedBy.headline`: string - `repostedBy.profilePictureUrl`: string - `repostContent.id`: string - `repostContent.date`: string - `repostContent.parsedDatetime`: string - `repostContent.text`: string - `mentions[].url`: string - `mentions[].start`: number - `mentions[].length`: number - `attachments[].id`: string - `attachments[].fileSize`: number - `attachments[].unavailable`: boolean - `attachments[].mimetype`: string - `attachments[].url`: string - `attachments[].urlExpiresAt`: number - `attachments[].type`: poll - `attachments[].sticker`: boolean - `attachments[].gif`: boolean - `attachments[].duration`: number - `attachments[].voiceNote`: boolean - `attachments[].fileName`: string - `attachments[].startsAt`: number or null - `attachments[].expiresAt`: number or null - `attachments[].timeRange`: number or null - `attachments[].displayName`: string or null - `attachments[].organization`: string or null - `poll.id`: string - `poll.totalVotesCount`: number - `poll.question`: string - `poll.isOpen`: boolean - `group.id`: string - `group.name`: string - `group.private`: boolean - `jobPosting.id`: string or null - `jobPosting.title`: string - `jobPosting.location`: string - `article.id`: string or null - `article.title`: string - `article.url`: string - `article.author`: string - `article.publishedAt`: string - `article.excerpt`: string - `article.pictureUrl`: string - `analytics.impressions`: number - `analytics.engagements`: number - `analytics.engagementRate`: number - `analytics.clicks`: number - `analytics.clickthroughRate`: number - `analytics.pageViewersFromThisPost`: number - `analytics.followersGainedFromThisPost`: number - `analytics.membersReached`: number ### Good to know - This is how a post link becomes a socialId. - author.id is null for some authors (the published sample shows it for a company page). - permissions.canPostComments and permissions.canReact say whether a comment or a reaction will be accepted. Page: https://heyreagent.com/docs/actions/get_post ## list_post_comments: List a post's comments List the comments on one post, or the replies to one comment. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_post_comments Authorization: Bearer YOUR_KEY content-type: application/json { "post": "PASTE_POST_LINK_HERE" } ``` ### What you give it - `post` (needed): a post link or a post social id or a post id. The LinkedIn post: its URL, or its id (socialId) from an earlier result. Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `commentId` (optional): a comment id. List the replies to this comment instead of the post's top-level comments. Where to get it: Run `list_comments_by_person` and use `comments[].id`. - `sortBy` (optional): one of: MOST_RECENT, MOST_RELEVANT. Order (default MOST_RECENT). - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 25). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_post_comments`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `comments[].id`: a comment id - `comments[].postId`: string - `comments[].postUrn`: string - `comments[].threadId`: string - `comments[].author`: string or null - `comments[].authorDetails.profileUrl`: a profile link - `comments[].date`: string - `comments[].text`: string - `comments[].pictureUrl`: string - `comments[].reactionCounter`: number - `comments[].replyCounter`: number - `comments[].impressionsCounter`: number - `comments[].userReacted`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT ### Good to know - authorDetails.id is not documented as any kind of id; use authorDetails.profileUrl to reach the person. Page: https://heyreagent.com/docs/actions/list_post_comments ## list_post_reactions: List a post's reactions List who reacted to one post, or to one comment on it. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_post_reactions Authorization: Bearer YOUR_KEY content-type: application/json { "post": "PASTE_POST_LINK_HERE" } ``` ### What you give it - `post` (needed): a post link or a post social id or a post id. The LinkedIn post: its URL, or its id (socialId) from an earlier result. Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `commentId` (optional): a comment id. List the reactions to this comment instead of the post. Where to get it: Run `list_post_comments` and use `comments[].id`. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 25). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_post_reactions`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `reactions[].value`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT - `reactions[].postId`: string - `reactions[].commentId`: string - `reactions[].author.id`: a member id - `reactions[].author.profileUrl`: a profile link ### Good to know - value is LIKE / PRAISE / APPRECIATION / EMPATHY / INTEREST / ENTERTAINMENT. - author.type is INDIVIDUAL or COMPANY. For a COMPANY, author.id and author.profileUrl are the page's, not a person's. Page: https://heyreagent.com/docs/actions/list_post_reactions ## list_posts_by_author: List a person's or company's posts List the posts one person or one company page published, newest first. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_posts_by_author Authorization: Bearer YOUR_KEY content-type: application/json { "author": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `author` (needed): a profile link or a member id or a company id. A LinkedIn profile URL or member id — or a company's numeric id. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `isCompany` (optional): true or false. True when author is a company id. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_posts_by_author`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `posts[].id`: a post id - `posts[].socialId`: a post social id - `posts[].shareUrl`: a post link - `posts[].title`: string - `posts[].text`: string - `posts[].date`: string - `posts[].parsedDatetime`: string - `posts[].reactionCounter`: number - `posts[].commentCounter`: number - `posts[].repostCounter`: number - `posts[].impressionsCounter`: number - `posts[].userReacted`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT - `posts[].isRepost`: boolean - `posts[].repostId`: string - `posts[].repostParsedDatetime`: string ### Good to know - For a company page pass its company id with isCompany true; a company link is not accepted. - A profile link is first resolved to a member id, which LinkedIn counts as a profile view. Page: https://heyreagent.com/docs/actions/list_posts_by_author ## list_comments_by_person: List the comments a person wrote List the comments one person wrote, newest first. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_comments_by_person Authorization: Bearer YOUR_KEY content-type: application/json { "person": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `person` (needed): a profile link or a member id. The person: a LinkedIn profile URL or member id. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_comments_by_person`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `comments[].id`: a comment id - `comments[].postId`: string - `comments[].postUrn`: string - `comments[].threadId`: string - `comments[].author`: string or null - `comments[].date`: string - `comments[].text`: string - `comments[].pictureUrl`: string - `comments[].reactionCounter`: number - `comments[].replyCounter`: number - `comments[].impressionsCounter`: number - `comments[].userReacted`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT ### Good to know - No published text says which form of post id a comment's postId is. Page: https://heyreagent.com/docs/actions/list_comments_by_person ## list_reactions_by_person: List what a person reacted to List the posts and comments one person reacted to, newest first. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_reactions_by_person Authorization: Bearer YOUR_KEY content-type: application/json { "person": "PASTE_PROFILE_LINK_HERE" } ``` ### What you give it - `person` (needed): a profile link or a member id. The person: a LinkedIn profile URL or member id. Where to get it: Open the person's profile on LinkedIn and copy the address from your browser. It looks like https://www.linkedin.com/in/their-name Or: Run `search_people` and use `people[].profileUrl`. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 10). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_reactions_by_person`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `reactions[].value`: LIKE | PRAISE | APPRECIATION | EMPATHY | INTEREST | ENTERTAINMENT - `reactions[].postId`: string - `reactions[].commentId`: string ### Good to know - No published text says which form of post id a reaction's postId is. Page: https://heyreagent.com/docs/actions/list_reactions_by_person ## save_lead: Save a Sales Navigator lead Save one person as a lead in your Sales Navigator. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/save_lead Authorization: Bearer YOUR_KEY content-type: application/json { "lead": "PASTE_SALES_NAVIGATOR_LEAD_LINK_HERE" } ``` ### What you give it - `lead` (needed): a Sales Navigator id or a Sales Navigator lead link. The person's Sales Navigator lead URL, or their Sales Navigator id (ACw…). Where to get it: Open the lead in Sales Navigator and copy the address from your browser. It starts with https://www.linkedin.com/sales/lead/ Or: Run `search_linkedin_sales_navigator_people` and use `results[].id`. - `listId` (optional): a search filter id. Save into this lead list (lookup_search_ids type LEAD_LISTS, service SALES_NAVIGATOR). Omit to save without a list. Where to get it: run `lookup_search_ids` with type `LEAD_LISTS` and use `matches[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `saved` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - An ordinary profile link or member id is refused: it does not carry the Sales Navigator id. - Look listId up with lookup_search_ids type LEAD_LISTS, service SALES_NAVIGATOR. Page: https://heyreagent.com/docs/actions/save_lead ## list_hiring_projects: List Recruiter hiring projects List your Recruiter hiring projects. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_hiring_projects Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `state` (optional): a list (one of: ACTIVE, ARCHIVED), up to 2. Which projects (default ACTIVE). - `sortBy` (optional): one of: NAME, FAVORITE, CREATED_TIME, ACCESSED_TIME, ENGAGED_TIME, ENGAGEMENT_COUNT. Order by (default ACCESSED_TIME). - `sortOrder` (optional): one of: ASCENDING, DESCENDING. Default DESCENDING. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 25). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_hiring_projects`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `projects[].id`: a hiring project id - `projects[].name`: string - `projects[].archived`: boolean - `projects[].ownerName`: string - `projects[].ownerId`: string - `projects[].createdAt`: string - `projects[].jobPosting.id`: a job id Page: https://heyreagent.com/docs/actions/list_hiring_projects ## get_hiring_project: Get a Recruiter hiring project Read one Recruiter hiring project. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_hiring_project Authorization: Bearer YOUR_KEY content-type: application/json { "projectId": "PASTE_HIRING_PROJECT_ID_HERE" } ``` ### What you give it - `projectId` (needed): a hiring project id. The hiring project id (from list_hiring_projects). Where to get it: Run `list_hiring_projects` and use `projects[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a hiring project id - `name`: string - `archived`: boolean - `ownerName`: string - `ownerId`: string - `createdAt`: string - `jobPosting.id`: a job id - `jobPosting.state`: active | draft | review | closed | paused - `jobPosting.title`: string - `jobPosting.description`: string - `jobPosting.company`: string - `jobPosting.companyId`: string - `jobPosting.location`: string - `jobPosting.applicantsCounter`: number - `jobPosting.viewsCounter`: number - `jobPosting.cost`: number - `jobPosting.createdAt`: number - `jobPosting.publishedAt`: number - `jobPosting.closedAt`: number - `jobPosting.applyUrl`: string - `jobPosting.salary`: string - `jobPosting.workplace`: string - `jobPosting.seniority`: string - `jobPosting.skills`: string[] - `jobPosting.functions`: string[] - `jobPosting.industries`: string[] Page: https://heyreagent.com/docs/actions/get_hiring_project ## move_recruiter_candidate: Add or move a Recruiter candidate Put one person into a hiring project's pipeline, or move them to another stage. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/move_recruiter_candidate Authorization: Bearer YOUR_KEY content-type: application/json { "candidateId": "PASTE_RECRUITER_ID_HERE", "action": "add_candidate", "hiringProjectId": "PASTE_HIRING_PROJECT_ID_HERE" } ``` ### What you give it - `candidateId` (needed): a Recruiter id. The person's Recruiter id (AE…). Where to get it: Run `search_linkedin_recruiter_people` and use `results[].id`. - `action` (needed): one of: add_candidate, add_applicant, change_stage. add_candidate: add someone you sourced. add_applicant: add someone who applied. change_stage: move someone already in the pipeline. - `hiringProjectId` (needed): a hiring project id. The hiring project (from list_hiring_projects). Where to get it: Run `list_hiring_projects` and use `projects[].id`. - `stage` (optional): one of: UNCONTACTED, CONTACTED, REPLIED. The pipeline stage (default UNCONTACTED). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `done` - `candidateId` - `action` - `hiringProjectId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - The published definition calls the person's id only "the ID of the user"; that it is the Recruiter id is this tool's own wording. Page: https://heyreagent.com/docs/actions/move_recruiter_candidate ## reject_recruiter_applicant: Reject a Recruiter applicant Reject one applicant in a hiring project, with a reason. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/reject_recruiter_applicant Authorization: Bearer YOUR_KEY content-type: application/json { "applicantId": "PASTE_RECRUITER_ID_HERE", "hiringProjectId": "PASTE_HIRING_PROJECT_ID_HERE", "reason": "NOT_MEET_BASIC_QUALIFICATIONS" } ``` ### What you give it - `applicantId` (needed): a Recruiter id. The applicant's Recruiter id (AE…). Where to get it: Run `search_linkedin_recruiter_people` and use `results[].id`. - `hiringProjectId` (needed): a hiring project id. The hiring project (from list_hiring_projects). Where to get it: Run `list_hiring_projects` and use `projects[].id`. - `reason` (needed): one of: NOT_MEET_BASIC_QUALIFICATIONS, NOT_IN_DESIRED_LOCATION, MORE_QUALIFIED_CANDIDATES, WITHDREW_APPLICATION, NOT_CONSIDERED_OR_REASON_NOT_SPECIFIED. - `notifyMessage` (optional): text, up to 4000 characters. Text of the rejection notice to send the applicant. Omit to reject without telling them. - `notifyAt` (optional): a date and time, like 2026-10-01T00:00:00.000Z. When to send the notice (ISO 8601 UTC). Default: now. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `rejected` - `applicantId` - `hiringProjectId` - `reason` - `notified` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number ### Good to know - applicantId is the person's Recruiter id, not the applicant id that list_job_applicants returns. Page: https://heyreagent.com/docs/actions/reject_recruiter_applicant ## list_job_postings: List my job postings List your job postings: open, drafts or closed. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_job_postings Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `category` (optional): one of: active, draft, closed. Which postings (default active). - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 25). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_job_postings`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `jobPostings[].id`: a job id - `jobPostings[].state`: active | draft | review | closed | paused - `jobPostings[].title`: string - `jobPostings[].description`: string - `jobPostings[].company`: string - `jobPostings[].companyId`: string - `jobPostings[].location`: string - `jobPostings[].applicantsCounter`: number - `jobPostings[].viewsCounter`: number - `jobPostings[].cost`: number - `jobPostings[].createdAt`: number - `jobPostings[].publishedAt`: number - `jobPostings[].closedAt`: number - `jobPostings[].applyUrl`: string - `jobPostings[].salary`: string - `jobPostings[].workplace`: string - `jobPostings[].seniority`: string - `jobPostings[].skills`: string[] - `jobPostings[].functions`: string[] - `jobPostings[].industries`: string[] ### Good to know - Drafts are listed only with category "draft". Page: https://heyreagent.com/docs/actions/list_job_postings ## get_job_posting: Get a job posting Read one of your job postings. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_job_posting Authorization: Bearer YOUR_KEY content-type: application/json { "jobId": "PASTE_JOB_ID_HERE" } ``` ### What you give it - `jobId` (needed): a job id. The job posting id (from list_job_postings). Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `service` (optional): one of: CLASSIC, RECRUITER. Which LinkedIn product the job posting belongs to (default CLASSIC). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a job id - `state`: active | draft | review | closed | paused - `title`: string - `description`: string - `company`: string - `companyId`: string - `location`: string - `applicantsCounter`: number - `viewsCounter`: number - `cost`: number - `createdAt`: number - `publishedAt`: number - `closedAt`: number - `applyUrl`: string - `screeningQuestions[].question`: string - `screeningQuestions[].favorableAnswers`: string[] - `hiringTeam[].name`: string - `hiringTeam[].providerId`: string or null - `hiringTeam[].publicIdentifier`: string or null - `hiringTeam[].profileUrl`: string - `hiringTeam[].canSendFreeInmail`: boolean - `salary`: string - `workplace`: string - `seniority`: string - `skills`: string[] - `functions`: string[] - `industries`: string[] ### Good to know - service must match where the posting lives: CLASSIC or RECRUITER. Page: https://heyreagent.com/docs/actions/get_job_posting ## list_job_applicants: List a job posting's applicants List who applied to one of your job postings. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_job_applicants Authorization: Bearer YOUR_KEY content-type: application/json { "jobId": "PASTE_JOB_ID_HERE" } ``` ### What you give it - `jobId` (needed): a job id. The job posting id (from list_job_postings). Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `service` (optional): one of: CLASSIC, RECRUITER. Which LinkedIn product the job posting belongs to (default CLASSIC). - `keywords` (optional): text, up to 200 characters. Only applicants matching these words. - `ratings` (optional): a list (one of: UNRATED, GOOD_FIT, MAYBE, NOT_A_FIT), up to 4. CLASSIC only: only these ratings. - `sortBy` (optional): one of: relevance, alphabetical, newest_first, screening_requirements. RECRUITER only. - `includeArchived` (optional): true or false. RECRUITER only: include archived applicants. - `yearsOfExperience` (optional): a group of fields. RECRUITER only. - `min` (optional): a number. - `max` (optional): a number. - `yearsInCompany` (optional): a group of fields. RECRUITER only: years in current company. - `min` (optional): a number. - `max` (optional): a number. - `yearsInPosition` (optional): a group of fields. RECRUITER only: years in current position. - `min` (optional): a number. - `max` (optional): a number. - `includeDegree` (optional): a search filter id. RECRUITER only: degree ids to include (lookup_search_ids type DEGREE). Where to get it: run `lookup_search_ids` with type `DEGREE` and use `matches[].id`. - `excludeDegree` (optional): a search filter id. RECRUITER only: degree ids to exclude. Where to get it: run `lookup_search_ids` with type `DEGREE` and use `matches[].id`. - `limit` (optional): a number, 1 to 100. How many to return (1–100, default 25). - `cursor` (optional): a cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. Where to get it: The `nextCursor` from the last answer of `list_job_applicants`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `returned`: number - `nextCursor`: a cursor - `applicants[].id`: a applicant id - `applicants[].profileId`: string - `applicants[].publicIdentifier`: a public identifier - `applicants[].publicProfileUrl`: a profile link - `applicants[].name`: string - `applicants[].location`: string - `applicants[].headline`: string - `applicants[].profilePictureUrl`: string - `applicants[].appliedAt`: number - `applicants[].rating`: UNRATED | GOOD_FIT | MAYBE | NOT_A_FIT - `applicants[].hiringState`: string - `applicants[].emailAddress`: string - `applicants[].phoneNumber`: string ### Good to know - The degree filters work on Recruiter postings only. That their ids come from lookup_search_ids type DEGREE is this tool's own wording; the published definition does not name the source. - An applicant's profileId is not documented as any kind of id; use publicProfileUrl to reach the person. Page: https://heyreagent.com/docs/actions/list_job_applicants ## get_job_applicant: Get an applicant Read one applicant, with their answers to the screening questions. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_job_applicant Authorization: Bearer YOUR_KEY content-type: application/json { "applicantId": "PASTE_APPLICANT_ID_HERE" } ``` ### What you give it - `applicantId` (needed): a applicant id. The applicant id (from list_job_applicants). Where to get it: Run `list_job_applicants` and use `applicants[].id`. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `id`: a applicant id - `profileId`: string - `publicIdentifier`: string - `publicProfileUrl`: a profile link - `name`: string - `location`: string - `headline`: string - `profilePictureUrl`: string - `appliedAt`: number - `rating`: UNRATED | GOOD_FIT | MAYBE | NOT_A_FIT - `hiringState`: string - `emailAddress`: string - `phoneNumber`: string - `contactInfo.emailAddresses`: string[] - `contactInfo.phoneNumbers`: string[] - `workExperience[].company`: string or null - `workExperience[].companyId`: string - `workExperience[].position`: string or null - `workExperience[].location`: string - `workExperience[].description`: string - `workExperience[].pictureUrl`: string - `education[].school`: string or null - `education[].schoolId`: string - `education[].degree`: string - `education[].description`: string - `education[].fieldOfStudy`: string - `education[].pictureUrl`: string - `screeningQuestions[].question`: string - `screeningQuestions[].answers`: string[] - `screeningQuestions[].success`: boolean ### Good to know - Ordinary (CLASSIC) job postings only. Page: https://heyreagent.com/docs/actions/get_job_applicant ## get_job_applicant_resume: Download an applicant's resume Download one applicant's resume. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_job_applicant_resume Authorization: Bearer YOUR_KEY content-type: application/json { "applicantId": "PASTE_APPLICANT_ID_HERE" } ``` ### What you give it - `applicantId` (needed): a applicant id. The applicant id (from list_job_applicants). Where to get it: Run `list_job_applicants` and use `applicants[].id`. - `service` (optional): one of: CLASSIC, RECRUITER. Which LinkedIn product the job posting belongs to (default CLASSIC). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back The file is in `result.file`, as `{ contentType, base64 }`. Page: https://heyreagent.com/docs/actions/get_job_applicant_resume ## create_job_posting: Create a job posting draft Create a job posting as a draft. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/create_job_posting Authorization: Bearer YOUR_KEY content-type: application/json { "jobTitle": { "text": "Software Engineer" }, "company": { "text": "Your company" }, "workplace": "ON_SITE", "location": "PASTE_LOCATION_ID_HERE", "description": "What the job is about." } ``` ### What you give it - `jobTitle` (needed): a group of fields. - `id` (optional): a search filter id. LinkedIn's id for the job title (lookup_search_ids type JOB_TITLE). Where to get it: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. - `text` (optional): text. The job title as free text, when LinkedIn has no id for it. - `company` (needed): a group of fields. - `id` (optional): a search filter id. LinkedIn's id for the company (lookup_search_ids type COMPANY). Where to get it: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `text` (optional): text. The company as free text, when LinkedIn has no id for it. - `workplace` (needed): one of: ON_SITE, HYBRID, REMOTE. - `location` (needed): a search filter id. LinkedIn's id for the place (lookup_search_ids type LOCATION). Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `description` (needed): text, up to 25000 characters. The job description. HTML tags may be used to structure it. - `employmentStatus` (optional): one of: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, OTHER, VOLUNTEER, INTERNSHIP. - `autoRejectionTemplate` (optional): text. Message sent automatically to applicants who do not pass the screening questions. - `screeningQuestions` (optional): a list (a group of fields). Questions applicants must answer. - `question` (needed): text. - `answerType` (needed): text. The kind of answer, e.g. numeric or multiple_choices. - `position` (optional): a number. - `mustMatch` (optional): true or false. - `minExpectation` (optional): a number. - `maxExpectation` (optional): a number. - `choices` (optional): a list (text). - `expectedChoices` (optional): a list (text). - `applyMethod` (optional): a group of fields. How people apply: on LinkedIn (applications are emailed to notificationEmail) or on an external site. - `type` (needed): exactly: linkedin. - `notificationEmail` (needed): an email address. - `url` (needed): a link. - `recruiter` (optional): a group of fields. Recruiter job postings only. To create one LinkedIn requires project, functions, industries, seniority and applyMethod. - `project` (optional): a group of fields. create: the hiring project — { id } of an existing one or { name } for a new one. - `projectId` (optional): text. edit: the hiring project the posting belongs to. - `functions` (optional): a search filter id. Job function ids (lookup_search_ids type JOB_FUNCTION). Where to get it: run `lookup_search_ids` with type `JOB_FUNCTION` and use `matches[].id`. - `industries` (optional): a search filter id. Industry ids (lookup_search_ids type INDUSTRY). Where to get it: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. - `skills` (optional): a search filter id. Skill ids (lookup_search_ids type SKILL). Where to get it: run `lookup_search_ids` with type `SKILL` and use `matches[].id`. - `seniority` (optional): one of: INTERNSHIP, ENTRY_LEVEL, ASSOCIATE, MID_SENIOR_LEVEL, DIRECTOR, EXECUTIVE, NOT_APPLICABLE. - `includePosterInfo` (optional): true or false. - `trackingPixelUrl` (optional): a link. - `companyJobId` (optional): text. - `applyMethod` (optional): a group of fields. - `salary` (optional): a group of fields. - `additionalCompensation` (optional): a group of fields. - `autoArchiveApplicants` (optional): a group of fields. - `sendRejectionNotification` (optional): true or false. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `created` - `draft` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number - `jobId`: a job id - `projectId`: a hiring project id ### Good to know - jobTitle and company each take an id from lookup_search_ids, or free text. - Nothing is public yet: publish_job_posting takes the jobId. - projectId comes back for Recruiter postings only. Page: https://heyreagent.com/docs/actions/create_job_posting ## edit_job_posting: Edit a job posting Change one of your job postings. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/edit_job_posting Authorization: Bearer YOUR_KEY content-type: application/json { "jobId": "PASTE_JOB_ID_HERE", "description": "What the job is about." } ``` ### What you give it - `jobId` (needed): a job id. The job posting id (from list_job_postings). Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `jobTitle` (optional): a group of fields. - `id` (optional): a search filter id. LinkedIn's id for the job title (lookup_search_ids type JOB_TITLE). Where to get it: run `lookup_search_ids` with type `JOB_TITLE` and use `matches[].id`. - `text` (optional): text. The job title as free text, when LinkedIn has no id for it. - `company` (optional): a group of fields. - `id` (optional): a search filter id. LinkedIn's id for the company (lookup_search_ids type COMPANY). Where to get it: run `lookup_search_ids` with type `COMPANY` and use `matches[].id`. - `text` (optional): text. The company as free text, when LinkedIn has no id for it. - `workplace` (optional): one of: ON_SITE, HYBRID, REMOTE. - `location` (optional): a search filter id. LinkedIn's id for the place (lookup_search_ids type LOCATION). Where to get it: run `lookup_search_ids` with type `LOCATION` and use `matches[].id`. - `description` (optional): text, up to 25000 characters. The job description. HTML tags may be used to structure it. - `employmentStatus` (optional): one of: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, OTHER, VOLUNTEER, INTERNSHIP. - `autoRejectionTemplate` (optional): text. Message sent automatically to applicants who do not pass the screening questions. - `screeningQuestions` (optional): a list (a group of fields). Questions applicants must answer. - `question` (needed): text. - `answerType` (needed): text. The kind of answer, e.g. numeric or multiple_choices. - `position` (optional): a number. - `mustMatch` (optional): true or false. - `minExpectation` (optional): a number. - `maxExpectation` (optional): a number. - `choices` (optional): a list (text). - `expectedChoices` (optional): a list (text). - `applyMethod` (optional): a group of fields. How people apply: on LinkedIn (applications are emailed to notificationEmail) or on an external site. - `type` (needed): exactly: linkedin. - `notificationEmail` (needed): an email address. - `url` (needed): a link. - `recruiter` (optional): a group of fields. Recruiter job postings only. To create one LinkedIn requires project, functions, industries, seniority and applyMethod. - `project` (optional): a group of fields. create: the hiring project — { id } of an existing one or { name } for a new one. - `projectId` (optional): text. edit: the hiring project the posting belongs to. - `functions` (optional): a search filter id. Job function ids (lookup_search_ids type JOB_FUNCTION). Where to get it: run `lookup_search_ids` with type `JOB_FUNCTION` and use `matches[].id`. - `industries` (optional): a search filter id. Industry ids (lookup_search_ids type INDUSTRY). Where to get it: run `lookup_search_ids` with type `INDUSTRY` and use `matches[].id`. - `skills` (optional): a search filter id. Skill ids (lookup_search_ids type SKILL). Where to get it: run `lookup_search_ids` with type `SKILL` and use `matches[].id`. - `seniority` (optional): one of: INTERNSHIP, ENTRY_LEVEL, ASSOCIATE, MID_SENIOR_LEVEL, DIRECTOR, EXECUTIVE, NOT_APPLICABLE. - `includePosterInfo` (optional): true or false. - `trackingPixelUrl` (optional): a link. - `companyJobId` (optional): text. - `applyMethod` (optional): a group of fields. - `salary` (optional): a group of fields. - `additionalCompensation` (optional): a group of fields. - `autoArchiveApplicants` (optional): a group of fields. - `sendRejectionNotification` (optional): true or false. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `edited` - `jobId`: a job id - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number Page: https://heyreagent.com/docs/actions/edit_job_posting ## publish_job_posting: Publish a job posting Publish a job posting draft, free or promoted. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/publish_job_posting Authorization: Bearer YOUR_KEY content-type: application/json { "draftId": "PASTE_JOB_ID_HERE", "mode": "FREE" } ``` ### What you give it - `draftId` (needed): a job id. The draft id (from create_job_posting, or list_job_postings category draft). Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `mode` (needed): one of: FREE, PROMOTED, PROMOTED_PLUS. FREE costs nothing. PROMOTED and PROMOTED_PLUS (ordinary postings only) are paid. - `budget` (optional): a group of fields. Paid modes only: the most to spend per day or per month. - `period` (needed): one of: daily, monthly. - `currency` (needed): text, up to 3 characters. - `amount` (needed): a number. - `service` (optional): one of: CLASSIC, RECRUITER. Which LinkedIn product the job posting belongs to (default CLASSIC). - `hiringPhotoFrame` (optional): true or false. Add the #Hiring frame to your profile picture. - `bypassEmailVerification` (optional): true or false. Skip LinkedIn's check that you may post for this company. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `draftId` - `mode` - `paid` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number - `jobState`: active | draft | review | closed | paused - `jobId`: a job id - `type`: EMAIL_VERIFICATION | OTP ### Good to know - draftId is the job id of a draft: from create_job_posting, or list_job_postings with category "draft". - Two answers are possible. Published: jobState and jobId. Not yet: type EMAIL_VERIFICATION or OTP, and LinkedIn has sent a code — pass it to solve_job_posting_checkpoint. Page: https://heyreagent.com/docs/actions/publish_job_posting ## solve_job_posting_checkpoint: Finish a job posting verification Finish publishing a job posting with the code LinkedIn sent. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/solve_job_posting_checkpoint Authorization: Bearer YOUR_KEY content-type: application/json { "draftId": "PASTE_JOB_ID_HERE", "code": "123456" } ``` ### What you give it - `draftId` (needed): a job id. The draft id whose publishing is waiting. Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `code` (needed): text, up to 64 characters. The verification code LinkedIn sent. - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `draftId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number - `jobState`: active | draft | review | closed | paused - `jobId`: a job id - `type`: EMAIL_VERIFICATION | OTP ### Good to know - Only after publish_job_posting answered with a type instead of a jobState. Page: https://heyreagent.com/docs/actions/solve_job_posting_checkpoint ## close_job_posting: Close a job posting Close one of your job postings for good. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/close_job_posting Authorization: Bearer YOUR_KEY content-type: application/json { "jobId": "PASTE_JOB_ID_HERE" } ``` ### What you give it - `jobId` (needed): a job id. The job posting id (from list_job_postings). Where to get it: Run `list_job_postings` and use `jobPostings[].id`. - `service` (optional): one of: CLASSIC, RECRUITER. Which LinkedIn product the job posting belongs to (default CLASSIC). - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `closed` - `jobId` - `from`: the account it ran on - `usedToday`: number - `dailyLimit`: number Page: https://heyreagent.com/docs/actions/close_job_posting ## who_is_waiting_on_me: Who is waiting on my reply List the people whose last message you have not answered. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/who_is_waiting_on_me Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Restrict to one LinkedIn sender. Omit to span all live senders in this setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `limit` (optional): a number, 1 to 200. Max people to return (1–200, default 100). ### What you get back - `summary` - `waitingOnYou` - `nextAction` - `note` ### Good to know - It reads the stored inbox. needsInboxSync names the accounts whose copy is missing or over 7 days old: run sync_inbox first. - To answer someone, pass the row's profileUrl to send_message. profileUrl can be null on a row. Page: https://heyreagent.com/docs/actions/who_is_waiting_on_me ## who_went_cold: Who went cold List the conversations that went quiet. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/who_went_cold Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Restrict to one LinkedIn sender. Omit to span all live senders. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `days` (optional): a number, 1 to 365. Consider a conversation cold when there's been no message for at least this many days (default 14). - `onlyWithReply` (optional): true or false. true = only threads where the other person replied at least once (skips pure no-response outreach). Requires the full thread to be synced. - `limit` (optional): a number, 1 to 200. Max threads to return (1–200, default 100). ### What you get back - `summary` - `coldConversations` - `nextAction` - `note` ### Good to know - It reads the stored inbox; see needsInboxSync. - hasInboundReply is null when the whole conversation is not stored. Page: https://heyreagent.com/docs/actions/who_went_cold ## connections_never_messaged: Connections I never messaged List your connections you never exchanged a message with. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/connections_never_messaged Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Restrict to one LinkedIn sender. Omit to span all live senders in this setup. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `since` (optional): text. ISO date. Only consider connections made on/after this date (e.g. focus on recent connects you haven't reached out to). - `limit` (optional): a number, 1 to 200. Max leads to return (1–200, default 100). The full never-messaged count is always reported. - `refresh` (optional): true or false. true = pull the latest connections live before the join. false (default) = use the cached connection list. ### What you get back - `summary` - `leads` - `nextAction` - `note` ### Good to know - It compares stored connections with the stored inbox, so it is only as fresh as both. Page: https://heyreagent.com/docs/actions/connections_never_messaged ## engagers_not_connected: Engagers I am not connected to List the people who reacted to or commented on a post and are not your connections. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/engagers_not_connected Authorization: Bearer YOUR_KEY content-type: application/json { "postUrl": "PASTE_POST_LINK_HERE" } ``` ### What you give it - `postUrl` (needed): a post link or a post social id. The LinkedIn post URL (activity/share/ugcPost URL). Where to get it: On LinkedIn, click the More icon (the three dots) at the top right of the post, then "Copy link to post". Or: Run `search_posts` and use `posts[].url`. - `connectionId` (optional): a connection id. Which sender to read through. Omit to use the first live sender. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. - `maxReactions` (optional): a number, 1 to 100. Max reactors to scan (1–100, default 100). - `maxComments` (optional): a number, 1 to 100. Max commenters to scan (1–100, default 100). - `limit` (optional): a number, 1 to 200. Max leads to return (1–200, default 100). ### What you get back - `summary` - `leads` - `nextAction` - `note` ### Good to know - A commenter's comment text is in leads[].note. - postUrl takes the post's link or its socialId. A bare post id is refused. Page: https://heyreagent.com/docs/actions/engagers_not_connected ## connect_linkedin: Connect a LinkedIn account Get a private link where you sign a LinkedIn account in. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/connect_linkedin Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `label` (optional): text. Optional friendly name to pre-fill for this sender. - `country` (optional): text. Optional country to pre-select — a name token (e.g. "UNITED_STATES", "UNITED_KINGDOM") or a 2-letter ISO code (e.g. "us", "gb"); the user can change it on the form. ### What you get back - `url` - `expiresInHours` - `instructions` ### Good to know - No account exists until the person finishes the form behind url. Then list_linkedin_accounts lists it. - The link works for 2 hours. Page: https://heyreagent.com/docs/actions/connect_linkedin ## update_linkedin_connection: Fix or update a LinkedIn connection Get a private link where you sign an existing account in again. This action can change or spend something, and it happens right away. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/update_linkedin_connection Authorization: Bearer YOUR_KEY content-type: application/json { "connectionId": "PASTE_CONNECTION_ID_HERE" } ``` ### What you give it - `connectionId` (needed): a connection id. The id of the existing LinkedIn sender to update (from list_linkedin_accounts). Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `url` - `expiresInHours` - `updates` - `instructions` ### Good to know - connectionId is required here. Page: https://heyreagent.com/docs/actions/update_linkedin_connection ## list_linkedin_accounts: List connected LinkedIn accounts List your connected LinkedIn accounts and whether each one works. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/list_linkedin_accounts Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `includeAllSetups` (optional): true or false. If true, return every LinkedIn account. Default returns accounts scoped to active setup. ### What you get back - `total` - `alwaysOnReadyCount` - `needsAttentionCount` - `maxAllowed` - `accounts` ### Good to know - accounts[].id is the connectionId every other action takes. - Accounts that do not work are listed too. A action refuses the id of one whose connectionStatus is not "connected". Page: https://heyreagent.com/docs/actions/list_linkedin_accounts ## get_usage: Get today's usage and limits Read how many of each LinkedIn action your account used today, and each daily limit. This action only reads; it changes nothing. Plan: Free and Connect. ``` POST https://api.heyreagent.com/v1/actions/get_usage Authorization: Bearer YOUR_KEY content-type: application/json {} ``` ### What you give it - `connectionId` (optional): a connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. Where to get it: Run `list_linkedin_accounts` and use `accounts[].id`. ### What you get back - `account` - `connectionId`: a connection id - `resetAt` - `actions` Page: https://heyreagent.com/docs/actions/get_usage