> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Unipile

The Unipile connector lets your AI agent act in each user's Unipile account. Each user connects their own Unipile API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 68 tools.

**Authentication:** API Key
**Categories:** Communication, CRM & Sales
**Tools:** 68: 47 read, 16 write, 5 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=UNIPILE)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Unipile connection

   In **AgentKit > Connections**, create an Unipile connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'unipile'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Unipile:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'unipile_list_accounts',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "unipile"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Unipile:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="unipile_list_accounts",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Unipile credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'unipile_get_account',
  toolInput: {
    id: '<id>',
  },
  connector: 'unipile',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="unipile_get_account",
    tool_input={
        "id": "<id>",
    },
    connection_name="unipile",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `unipile_get_account`

Get Account · Read-only

Retrieve one connected account by id.
Returns the account type, name, connection parameters and current sync status.
Use to check the health of a single account. Use List Accounts to browse all accounts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): The id of the account to retrieve. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"id":"<id>"}`

### `unipile_get_attendee`

Get Attendee · Read-only

Retrieve one messaging attendee by id.
Returns the attendee name, provider id, picture and profile url, plus provider-specific details.
Use when you already have an attendee_id. Use List Attendees to search.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): The id of the wanted attendee. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `account_id` (`string`, optional): A filter to target items related to a certain account. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"id":"<id>"}`

### `unipile_get_calendar`

Get Calendar · Read-only

Retrieve one calendar.
Returns the calendar name, description, access role, colors and sync state.
Use when you already have a calendar_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `calendar_id` (`string`, required): The id of the wanted calendar. Example: primary

Example input: `{"account_id":"<account_id>","calendar_id":"<calendar_id>"}`

### `unipile_get_calendar_event`

Get Calendar Event · Read-only

Retrieve one calendar event.
Returns title, body, location, times, attendees and cancellation state.
Use when you already have an event_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `calendar_id` (`string`, required): The id of calendar of the wanted event. Example: primary
- `event_id` (`string`, required): The id of the wanted event. Example: 0e6b0a2f3c4d5e6f7a8b9c0d

Example input: `{"account_id":"<account_id>","calendar_id":"<calendar_id>","event_id":"<event_id>"}`

### `unipile_get_chat`

Get Chat · Read-only

Retrieve the details of one chat.
Returns the chat id, account, provider, name, type, unread count, archive and mute state.
Use when you already have a chat_id. Use List Chats to find chats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `chat_id` (`string`, required): The Unipile or provider ID of the chat. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `account_id` (`string`, optional): Mandatory if the chat ID is a provider ID. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"chat_id":"<chat_id>"}`

### `unipile_get_email`

Get Email · Read-only

Retrieve one email with its full content.
Returns subject, sender, recipients, body, folders, attachments and read state.
Use when you already have an email_id. Use List Emails to find emails.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email_id` (`string`, required): The id of the email to be retrieved. Either the Unipile id or the provider uid. Example: Q2xhdWRlRW1haWwx
- `account_id` (`string`, optional): The id of the account related to the email. Required when using the provider uid. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `include_headers` (`boolean`, optional): Include the email headers in the response. Example: true

Example input: `{"email_id":"<email_id>"}`

### `unipile_get_email_folder`

Get Email Folder · Read-only

Retrieve one email folder.
Returns the folder details.
Use when you already have a folder_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `folder_id` (`string`, required): The id of the wanted folder. Either the Unipile id or the provider uid. Example: INBOX
- `account_id` (`string`, optional): The id of the account related to the folder. Required when using the provider uid. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"folder_id":"<folder_id>"}`

### `unipile_get_hiring_project`

Get Hiring Project · Read-only

Retrieve one LinkedIn Recruiter hiring project.
Returns project name, owner, creation date and linked job posting.
Use when you already have a project id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `id` (`string`, required): The ID of the hiring project. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"account_id":"<account_id>","id":"<id>"}`

### `unipile_get_inmail_balance`

Get InMail Balance · Read-only

Get the InMail credit balance of the LinkedIn account.
Returns the remaining credits for Premium, Recruiter and Sales Navigator.
Use before planning InMail outreach.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"account_id":"<account_id>"}`

### `unipile_get_job_applicant`

Get Job Applicant · Read-only

Retrieve one applicant of a LinkedIn job posting (Classic job postings only).
Returns name, headline, location, contact details, rating and hiring state.
Use with an applicant_id from List Job Applicants.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `applicant_id` (`string`, required): The ID of the applicant. Example: 9f9uuKzhVHGUNo9PzbgUtQ

Example input: `{"account_id":"<account_id>","applicant_id":"<applicant_id>"}`

### `unipile_get_job_posting`

Get Job Posting · Read-only

Retrieve one LinkedIn job posting by id.
Returns state, title, description, company, location, applicant and view counters.
Use when you already have a job_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `job_id` (`string`, required): The ID of the job offer. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `service` (`string`, required): The Linkedin service the job posting depends on. Example: CLASSIC. One of: `CLASSIC`, `RECRUITER`.

Example input: `{"account_id":"<account_id>","job_id":"<job_id>","service":"CLASSIC"}`

### `unipile_get_linkedin_company`

Get LinkedIn Company · Read-only

Retrieve a LinkedIn company profile by name or id.
Returns company name, description, follower count, website details and messaging availability.
Use to enrich a company. Use Search LinkedIn Companies to discover companies.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `identifier` (`string`, required): The identifier of the company: either the public identifier, the ID or the URN. Example: john-doe-12345

Example input: `{"account_id":"<account_id>","identifier":"<identifier>"}`

### `unipile_get_linkedin_search_parameters`

Get LinkedIn Search Parameters · Read-only

Look up the LinkedIn ids (locations, industries, companies, schools and more) that search filters require.
Returns matching parameter ids with titles.
Use before any Search LinkedIn tool, because LinkedIn filters accept ids rather than raw text.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `type` (`string`, required): The type of parameter for the requested search. Example: example. 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`.
- `keywords` (`string`, optional): The keywords to start the search from. Not applicable to the following parameters : EMPLOYMENT_TYPE. Example: product manager
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 25
- `service` (`string`, optional): Select the LinkedIn API to be used to query common parameters. Default is CLASSIC. Example: CLASSIC. One of: `CLASSIC`, `RECRUITER`, `SALES_NAVIGATOR`.

Example input: `{"account_id":"<account_id>","type":"LOCATION"}`

### `unipile_get_message`

Get Message · Read-only

Retrieve one message by id.
Returns the message text, sender, chat, timestamp and attachment metadata.
Use when you already have a message_id. Use List Chat Messages to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `message_id` (`string`, required): The id of the message to retrieve. Example: kLm2Pq8RTu6VwXyZ1aBcDe

Example input: `{"message_id":"<message_id>"}`

### `unipile_get_own_profile`

Get Own Profile · Read-only

Retrieve the profile of the owner of a connected account.
Returns the owner name, identifiers and provider-specific profile fields.
Use to confirm which person an account belongs to. Use Get User Profile for other people.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"account_id":"<account_id>"}`

### `unipile_get_post`

Get Post · Read-only

Retrieve one post by id.
Returns the post text, author, counters and date.
Use when you already have a post_id. Use List User Posts to find posts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `post_id` (`string`, required): The id of the post. <br> `Linkedin`: if the URL contains **activity**, use the numeric id (example: ...-activity-7332661864792854528-... => `7332661864792854528`). <br> If the URL contains **ugcPost**, use `urn:li:ugcPost:ID`. <br> If the URL contains **share**, use `urn:li:share:ID`. <br> `Instagram`: You can use the **provider_id** or the **shortcode** found in the post URL. (***www.instagram.com/reel/SHORTCODE***). Example: 7123456789012345678

Example input: `{"account_id":"<account_id>","post_id":"<post_id>"}`

### `unipile_get_user_profile`

Get User Profile · Read-only

Retrieve the profile of a user (for example a LinkedIn member) by identifier.
Returns name, headline, location, work history and relationship details depending on the provider.
Use to enrich a contact. Use Search LinkedIn People to find candidates first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `identifier` (`string`, required): Can be the provider’s internal id OR the provider’s public id of the requested user. LinkedIn public_id are only supported for Classic profiles. When using linkedin_api=recruiter or linkedin_api=sales_navigator, you must provide the corresponding internal LinkedIn identifier. Example: john-doe-12345
- `linkedin_api` (`string`, optional): The LinkedIn API that should be used to get the profile (relative features must be subscribed), if different from classic. Example: recruiter. One of: `recruiter`, `sales_navigator`.
- `linkedin_sections` (`array`, optional): A list of profile sections to retrieve detailed information on a LinkedIn profile. LinkedIn may throttle heavy use of full data section requests, so pick only the sections you truly need. Select *_preview to fetch all sections with preview data (first entries as displayed in the LinkedIn profile UI), or * to fetch all sections with full data (not recommended if you’re chaining a lot of profile calls in a short period). You can also combine selectors, for example, `["*_preview", "experience", "skills"]` to get all sections in preview plus experience and skills in full. In the response, you may receive empty sections if LinkedIn is throttling your requests. In such case, the `throttled_sections` field lists the concerned sections. To prevent this, you should add random delay between your calls, and/or not request as many sections as you use to. Example: ["example"]
- `notify` (`boolean`, optional): Whether the profile visit should be notified to the viewee or not. Default is false. Example: true

Example input: `{"account_id":"<account_id>","identifier":"<identifier>"}`

### `unipile_list_accounts`

List Accounts · Read-only

List the messaging, email and calendar accounts connected to the Unipile workspace.
Returns account id, type, name, connection status and a status count summary, with a cursor for the next page.
Use first to find the account_id that almost every other Unipile tool requires. Use Get Account for one account.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100

Example input: `{}`

### `unipile_list_attendee_chats`

List Attendee Chats · Read-only

List the 1:1 chats in which a given attendee is involved.
Returns chat id, account, provider and name, with a cursor for the next page.
Use to find the conversation with a specific contact.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `attendee_id` (`string`, required): The Unipile ID OR provider_id of the attendee. Can be a comma-separated list of multiple ids. Example: 9r1V5QnDTqW2nXk7bAc3Yg
- `account_id` (`string`, optional): An Unipile account id or a list of Unipile account ids separated by commas. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `after` (`string`, optional): A filter to target items created after the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `before` (`string`, optional): A filter to target items created before the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100

Example input: `{"attendee_id":"<attendee_id>"}`

### `unipile_list_attendee_messages`

List Attendee Messages · Read-only

List the messages sent by a given attendee.
Returns message id, text, attachments and timestamp, with a cursor for the next page.
Use to review everything one contact has written. Use List Chat Messages for a single chat.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sender_id` (`string`, required): The Unipile ID OR provider_id of the attendee. Example: 9r1V5QnDTqW2nXk7bAc3Yg
- `account_id` (`string`, optional): An Unipile account id or a list of Unipile account ids separated by commas. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `after` (`string`, optional): A filter to target items created after the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `before` (`string`, optional): A filter to target items created before the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100

Example input: `{"sender_id":"<sender_id>"}`

### `unipile_list_attendees`

List Attendees · Read-only

List messaging attendees (contacts) across chats for the connected accounts.
Returns attendee id, provider id, name and profile details, with a cursor for the next page.
Use to find a contact across all chats. Use List Chat Attendees for one chat.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, optional): A filter to target attendees related to a certain linked account. The id of the account targeted. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100

Example input: `{}`

### `unipile_list_calendar_events`

List Calendar Events · Read-only

List the events of a calendar, optionally within a time range.
Returns event id, title, times, attendees and location, with a cursor.
Use to see what is scheduled. Use Get Calendar Event for one event.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `calendar_id` (`string`, required): The id of the calendar related to events. Example: primary
- `attendees` (`string`, optional): Filter events with attendees contained in this list. This parameter accepts a comma-delimited list of email addresses. Example: example
- `busy` (`boolean`, optional): Filter for events with the status `busy` Example: true
- `cursor` (`string`, optional): A cursor used for pagination. If supported by the provider, use `next_cursor` given by the previous page of the list, else use `offset`. Example: eyJwYWdlIjoyfQ
- `description` (`string`, optional): Filter for events matching the specified description. Example: We are hiring a product manager.
- `end` (`string`, optional): Filter events ending before this date. Preferred format: RFC3339 datetime (`2026-02-27T17:07:49Z`). Example: 2025-12-31T23:59:59.999Z
- `event_type` (`string`, optional): Filter events by event type. This parameter accepts a comma-delimited list of event type. Example: example
- `expand_recurring` (`boolean`, optional): Filter events by type (single or occurence). Example: true
- `ical_uid` (`string`, optional): Filter for events matching the specified iCal UID. Example: example
- `is_cancelled` (`boolean`, optional): Indicates if you want to retrieve the cancelled events. Example: true
- `limit` (`number`, optional): The limit of items to be returned. Example: 25
- `location` (`string`, optional): Filter for events matching the specified location. Example: Paris
- `offset` (`number`, optional): An offset used for pagination, if supported by the provider, else use `cursor`. Example: 10
- `start` (`string`, optional): Filter events starting after this date. Preferred format: RFC3339 datetime (`2026-02-27T17:07:49Z`). Example: 2025-01-01T00:00:00.000Z
- `title` (`string`, optional): Filter for events matching the specified title. Example: Product sync
- `updated_after` (`string`, optional): Filter events updated after this date. Preferred format: RFC3339 datetime (`2026-02-27T17:07:49Z`). Example: 2025-01-01T00:00:00.000Z
- `updated_before` (`string`, optional): Filter events updated before this date. Preferred format: RFC3339 datetime (`2026-02-27T17:07:49Z`). Example: 2025-01-01T00:00:00.000Z

Example input: `{"account_id":"<account_id>","calendar_id":"<calendar_id>"}`

### `unipile_list_calendars`

List Calendars · Read-only

List the calendars of a connected account.
Returns calendar id, name, access role and primary flag, with a cursor.
Use first to find the calendar_id needed by the event tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor used for pagination. If supported by the provider, use `next_cursor` given by the previous page of the list, else use `offset`. Example: eyJwYWdlIjoyfQ
- `limit` (`number`, optional): The limit of items to be returned. Example: 25
- `offset` (`number`, optional): An offset used for pagination, if supported by the provider, else use `cursor`. Example: 10

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_chat_attendees`

List Chat Attendees · Read-only

List the participants of one chat.
Returns attendee id, provider id, name and whether the attendee is the account owner.
Use to see who is in a chat. Use List Attendees for contacts across all chats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `chat_id` (`string`, required): The id of the chat related to requested attendees. Example: 9f9uuKzhVHGUNo9PzbgUtQ

Example input: `{"chat_id":"<chat_id>"}`

### `unipile_list_chat_messages`

List Chat Messages · Read-only

List the messages of one chat, optionally filtered by date or sender.
Returns message id, sender, text, attachments and timestamp, with a cursor for the next page.
Use to read a conversation. Use List Messages for messages across all chats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `chat_id` (`string`, required): The id of the chat related to requested messages. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `after` (`string`, optional): A filter to target items created after the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `before` (`string`, optional): A filter to target items created before the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100
- `sender_id` (`string`, optional): A filter to target messages received from a certain sender. The id of the sender targeted. Example: 9r1V5QnDTqW2nXk7bAc3Yg

Example input: `{"chat_id":"<chat_id>"}`

### `unipile_list_chats`

List Chats · Read-only

List chats (conversations) across connected messaging accounts, optionally filtered by account, provider, read status or date.
Returns chat id, account id, provider, name, unread count and last activity, with a cursor for the next page.
Use to browse conversations. Use List Chat Messages to read one chat and List Messages for messages across chats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, optional): An Unipile account id or a list of Unipile account ids separated by commas. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `account_type` (`string`, optional): A filter to target items related to a certain provider. Example: WHATSAPP. One of: `WHATSAPP`, `LINKEDIN`, `SLACK`, `TWITTER`, `MESSENGER`, `INSTAGRAM`, `TELEGRAM`.
- `after` (`string`, optional): A filter to target items created after the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `before` (`string`, optional): A filter to target items created before the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100
- `unread` (`boolean`, optional): Whether you want to get either unread chats only, or read chats only. Example: true

Example input: `{}`

### `unipile_list_email_contacts`

List Email Contacts · Read-only

List the contacts of a Gmail or Microsoft Outlook account.
Returns contact names, email addresses and source, with a cursor for the next page.
Use to look up a person in the mailbox owner's address book.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): A filter to target items related to a certain account. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_email_folders`

List Email Folders · Read-only

List the folders of a connected email account.
Returns folder id, name and role.
Use to find the folder ids used by List Emails and Update Email.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, optional): A filter to target items related to a certain account. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{}`

### `unipile_list_emails`

List Emails · Read-only

List emails of a connected email account, optionally filtered by folder, sender, recipient or date.
Returns email id, subject, sender, recipients, date and read state, with a cursor for the next page.
Use to browse a mailbox. Use Get Email to read the full message.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): A filter to target items related to a certain account. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `after` (`string`, optional): A filter to target items created after the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `any_email` (`string`, optional): A filter to target items sent to or received from a comma-separated list of email addresses. Example: jane@example.com
- `before` (`string`, optional): A filter to target items created before the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `exclude_folders` (`string`, optional): A filter to exclude items from a comma-separated list of folder provider_id ( ignored if folder parameter is used ). Example: example
- `folder` (`string`, optional): A filter to target items related to a certain folder provider_id. Example: example
- `from` (`string`, optional): A filter to target items related to a certain sender. Example: example
- `include_headers` (`boolean`, optional): Include the email headers in the response. `meta_only` must be false. Example: true
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100
- `message_id` (`string`, optional): A filter to target items by message_id. Example: kLm2Pq8RTu6VwXyZ1aBcDe
- `meta_only` (`boolean`, optional): Speed up the response by only returning the email metadata, excluding the body and attachments metadata. Example: true
- `search` (`string`, optional): Free-text search applied to subject and body at the same time. Microsoft: requests combining search with from, to, any_email, before, after, thread_id, message_id or exclude_folders are rejected with invalid_request. IMAP: can be slow, only available within one folder, specified with folder or role, before and after are evaluated at day granularity, support depends on the IMAP server. IMAP requests combining search with any_email, exclude_folders, thread_id, multiple from values or multiple to values are rejected with invalid_request. Example: example
- `thread_id` (`string`, optional): A filter to target items by thread identifier. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `to` (`string`, optional): A filter to target items related to a certain recipient, either in the to, cc or bcc field. Example: example

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_followers`

List Followers · Read-only

List the followers of the account owner.
Returns each follower name, headline and profile url, with a cursor for the next page.
Use to review who follows the account. Use List Following for the opposite direction.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The account to get the followers from. (if user_id is not provided). Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100
- `user_id` (`string`, optional): `Instagram` The user to get the followers from (provider_id or username).<br/>`Linkedin` The user or company to get the followers from (provider_id only). Example: ACoAAAcDMMQBODyLwZrRcgYhrkCafURGqva0U4E

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_following`

List Following · Read-only

List the accounts followed by the account owner.
Returns each followed account name, headline and profile url, with a cursor for the next page.
Use to review who the account follows. Use List Followers for the opposite direction.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The account to get the followed accounts from. (if user_id is not provided). Example: mZ9tTq1xRkWJb3dLq8aXyA
- `user_id` (`string`, required): `Instagram only` The user to get the followed accounts from (provider_id or username). Example: ACoAAAcDMMQBODyLwZrRcgYhrkCafURGqva0U4E
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 1000. Example: 100

Example input: `{"account_id":"<account_id>","user_id":"<user_id>"}`

### `unipile_list_hiring_projects`

List Hiring Projects · Read-only

List LinkedIn Recruiter hiring projects.
Returns project id, name, owner and archive state, with a cursor and total count.
Use to find the hiring_project_id for pipeline tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 25
- `sort_by` (`string`, optional): The sorting method for the hiring projects. Default is ACCESSED_TIME. Example: NAME. One of: `NAME`, `FAVORITE`, `CREATED_TIME`, `ACCESSED_TIME`, `ENGAGED_TIME`, `ENGAGEMENT_COUNT`.
- `sort_order` (`string`, optional): The sorting order for the hiring projects. Default is DESCENDING. Example: ASCENDING. One of: `ASCENDING`, `DESCENDING`.
- `state` (`array`, optional): The states of the hiring projects to retrieve. Default is ACTIVE. Example: ["example"]

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_invitations_received`

List Received Invitations · Read-only

List connection invitations the account owner has received.
Returns invitation id, inviting user and date, with a cursor for the next page.
Use before Handle Received Invitation to find the invitation_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 25

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_invitations_sent`

List Sent Invitations · Read-only

List connection invitations the account owner has sent that are still pending.
Returns invitation id, invited user and sent date, with a cursor for the next page.
Use before Cancel Invitation to find the invitation_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 25

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_job_applicants`

List Job Applicants · Read-only

List the users who applied to a LinkedIn job posting.
Returns applicant id, name, headline and application date, with a cursor and paging information.
Use to review applicants. Use Get Job Applicant for one applicant.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `id` (`string`, required): The ID of the job offer. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `exclude_degree` (`array`, optional): Linkedin Recruiter native filter : DEGREES (excluded). Example: ["example"]
- `include_archived` (`boolean`, optional): Whether the results should include archived applicants. Recruiter only. Example: true
- `include_degree` (`array`, optional): Linkedin Recruiter native filter : DEGREES (included). Example: ["example"]
- `keywords` (`string`, optional): Filter results with keywords. Example: product manager
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 25
- `max_years_in_company` (`number`, optional): Linkedin Recruiter native filter : YEARS IN CURRENT COMPANY. Example: 10
- `max_years_in_position` (`number`, optional): Linkedin Recruiter native filter : YEARS IN CURRENT POSITION. Example: 10
- `max_years_of_experience` (`number`, optional): Linkedin Recruiter native filter : YEARS OF EXPERIENCE. Example: 10
- `min_years_in_company` (`number`, optional): Linkedin Recruiter native filter : YEARS IN CURRENT COMPANY. Example: 10
- `min_years_in_position` (`number`, optional): Linkedin Recruiter native filter : YEARS IN CURRENT POSITION. Example: 10
- `min_years_of_experience` (`number`, optional): Linkedin Recruiter native filter : YEARS OF EXPERIENCE. Example: 10
- `ratings` (`string`, optional): One or more ratings (UNRATED, GOOD_FIT, MAYBE, NOT_A_FIT) separated by commas. Classic only. Example: example
- `service` (`string`, optional): The Linkedin service the job posting depends on. Default is classic. Example: CLASSIC. One of: `CLASSIC`, `RECRUITER`.
- `sort_by` (`string`, optional): The sorting rule for applicants. Recruiter only. Example: relevance. One of: `relevance`, `alphabetical`, `newest_first`, `screening_requirements`.

Example input: `{"account_id":"<account_id>","id":"<id>"}`

### `unipile_list_job_postings`

List Job Postings · Read-only

List the job offers the LinkedIn account has posted, whether open, closed or draft.
Returns job id, state, title, company and counters, with a cursor for the next page.
Use to browse your own postings. Use Search LinkedIn Jobs for other companies' jobs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `category` (`string`, optional): The state of the requested job postings. Default is active. Example: active. One of: `active`, `draft`, `closed`.
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_messages`

List Messages · Read-only

List messages across all chats of the connected accounts, optionally filtered by account, sender or date.
Returns message id, sender, text, attachments and timestamp, with a cursor for the next page.
Use for cross-chat message search by account or date. Use List Chat Messages to read a single chat.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, optional): A filter to target messages received in a certain linked account. The id of the account targeted. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `after` (`string`, optional): A filter to target items created after the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `before` (`string`, optional): A filter to target items created before the datetime (exclusive). Must be an ISO 8601 UTC datetime (YYYY-MM-DDTHH:MM:SS.sssZ). Example: 2025-12-31T23:59:59.999Z
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 250. Example: 100
- `sender_id` (`string`, optional): A filter to target messages received from a certain sender. The id of the sender targeted. Example: 9r1V5QnDTqW2nXk7bAc3Yg

Example input: `{}`

### `unipile_list_post_comments`

List Post Comments · Read-only

List the comments on a post, or the replies to one comment.
Returns each comment with author, text and date, with a cursor for the next page.
Use to read the discussion under a post.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `post_id` (`string`, required): The ID of the associated post. <br> `Linkedin`: use the `social_id` from the post object (GET post or list posts). The post id visible in url will not work in all case, you can refer here for more details : https://developer.unipile.com/docs/posts-and-comments <br> `Instagram`: Need to use the **provider_id**. Short code cannot be used here (***www.instagram.com/p/SHORTCODE***). Example: 7123456789012345678
- `comment_id` (`string`, optional): The id of the comment to get replies from. <br> `Linkedin`: use the comment `id` returned by the comments list. Example: 7123456789012345679
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 100
- `sort_by` (`string`, optional): The sort method for the post comments. Default is MOST_RECENT. Example: MOST_RECENT. One of: `MOST_RECENT`, `MOST_RELEVANT`.

Example input: `{"account_id":"<account_id>","post_id":"<post_id>"}`

### `unipile_list_post_reactions`

List Post Reactions · Read-only

List the reactions to a post or comment.
Returns each reaction value with its author, with paging information.
Use to see who reacted to a post.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `post_id` (`string`, required): The ID of the associated post. <br> `Linkedin`: use the `social_id` from the post object (GET post or list posts). The post id visible in url will not work in all case, you can refer here for more details : https://developer.unipile.com/docs/posts-and-comments. Example: 7123456789012345678
- `comment_id` (`string`, optional): The id of the comment to get reactions from. <br> `Linkedin`: use the comment `id` returned by the comments list. Example: 7123456789012345679
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 100

Example input: `{"account_id":"<account_id>","post_id":"<post_id>"}`

### `unipile_list_relations`

List Relations · Read-only

List the connections (relations) of a connected account.
Returns each relation name, headline and profile url, with a cursor for the next page.
Use to browse the account owner's network. Provider rate limits apply.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The account to get the relations from. (if user_id is not provided). Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `filter` (`string`, optional): Filter out results by user name. Example: example
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 1000. Example: 100

Example input: `{"account_id":"<account_id>"}`

### `unipile_list_user_comments`

List User Comments · Read-only

List the comments written by a user.
Returns each comment with text, post reference and date, with a cursor for the next page.
Use to review a person's comment activity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `identifier` (`string`, required): The user's provider internal id. Example: john-doe-12345
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 100

Example input: `{"account_id":"<account_id>","identifier":"<identifier>"}`

### `unipile_list_user_posts`

List User Posts · Read-only

List the posts written by a user or company.
Returns each post with id, text, counters and date, with a cursor for the next page.
Use to review a person's or company's content. Use Get Post for one post.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `identifier` (`string`, required): The entity's provider internal id. <br> `Linkedin`: starts with ACo/ADo for users, while for companies it's a series of numbers. <br> `Instagram`: use the provider_id or the username of the user. Example: john-doe-12345
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `is_company` (`boolean`, optional): `Linkedin only` Set it to **"true"** if the posts are from a company. Example: true
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 100

Example input: `{"account_id":"<account_id>","identifier":"<identifier>"}`

### `unipile_list_user_reactions`

List User Reactions · Read-only

List the reactions a user has made to posts or comments.
Returns each reaction value with its post and comment reference, with a cursor for the next page.
Use to review a person's reaction activity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `identifier` (`string`, required): The user's provider internal id. Example: john-doe-12345
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `limit` (`integer`, optional): A limit for the number of items returned in the response. The value can be set between 1 and 100. Example: 100

Example input: `{"account_id":"<account_id>","identifier":"<identifier>"}`

### `unipile_search_linkedin_companies`

Search LinkedIn Companies · Read-only

Search companies with the LinkedIn Classic search, using keywords and filter ids.
Returns matching companies with name, industry, location and profile url, plus paging and a cursor.
Use to find target accounts. Get filter ids from Get LinkedIn Search Parameters. Read-only despite using POST.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `has_job_offers` (`boolean`, optional): Linkedin native filter : JOB LISTINGS ON LINKEDIN. Example: true
- `headcount` (`array`, optional): Linkedin native filter : COMPANY SIZE. Example: ["example"]
- `industry` (`array`, optional): The ID of the parameter. Use type INDUSTRY on the List search parameters route to find out the right ID. Linkedin native filter : INDUSTRY. Example: ["example"]
- `keywords` (`string`, optional): Linkedin native filter : KEYWORDS. Example: product manager
- `limit` (`integer`, optional): The maximum number of items to return. Sales Navigator and Recruiter support up to 100 results. For Classic searches, People and Companies are limited to 10 results per page, while Jobs are limited to 50. Post searches default to 3 results, matching LinkedIn's UI, but the limit can technically be increased up to 49. Example: 25
- `location` (`array`, optional): The ID of the parameter. Use type LOCATION on the List search parameters route to find out the right ID. Linkedin native filter : LOCATIONS. Example: Paris
- `network_distance` (`array`, optional): First, second or third+ degree. Linkedin native filter : CONNECTIONS. Example: ["example"]

Example input: `{"account_id":"<account_id>"}`

### `unipile_search_linkedin_jobs`

Search LinkedIn Jobs · Read-only

Search job offers with the LinkedIn Classic search, using keywords and filter ids.
Returns matching job offers with title, company and location, plus paging and a cursor.
Use to find open roles. Read-only despite using POST.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `benefits` (`array`, optional): Linkedin native filter : BENEFITS. Example: ["example"]
- `commitments` (`array`, optional): Linkedin native filter : COMMITMENTS. Example: ["example"]
- `company` (`array`, optional): The ID of the parameter. Use type COMPANY on the List search parameters route to find out the right ID. Linkedin native filter : COMPANY. Example: ["example"]
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `date_posted` (`number`, optional): The timespan in days since today for the filter to be applied. Linkedin native filter : DATE POSTED. Example: 10
- `easy_apply` (`boolean`, optional): Linkedin native filter : EASY APPLY. Example: true
- `fair_chance_employer` (`boolean`, optional): Linkedin native filter : FAIR CHANCE EMPLOYER. Example: true
- `function` (`array`, optional): The ID of the parameter. Use type JOB_FUNCTION on the List search parameters route to find out the right ID. Linkedin native filter : JOB FUNCTION. Example: ["example"]
- `has_verifications` (`boolean`, optional): Linkedin native filter : HAS VERIFICATIONS. Example: true
- `in_your_network` (`boolean`, optional): Linkedin native filter : IN YOUR NETWORK. Example: true
- `industry` (`array`, optional): The ID of the parameter. Use type INDUSTRY on the List search parameters route to find out the right ID. Linkedin native filter : INDUSTRY. Example: ["example"]
- `job_type` (`array`, optional): Linkedin native filter : JOB TYPE. Example: ["example"]
- `keywords` (`string`, optional): Linkedin native filter : KEYWORDS. Example: product manager
- `limit` (`integer`, optional): The maximum number of items to return. Sales Navigator and Recruiter support up to 100 results. For Classic searches, People and Companies are limited to 10 results per page, while Jobs are limited to 50. Post searches default to 3 results, matching LinkedIn's UI, but the limit can technically be increased up to 49. Example: 25
- `location` (`array`, optional): The ID of the parameter. Use type LOCATION on the List search parameters route to find out the right ID. Linkedin native filter : LOCATION. Example: Paris
- `location_within_area` (`number`, optional): The search zone around the location in miles. Linkedin native filter : DISTANCE. Example: 10
- `minimum_salary` (`object`, optional): Linkedin native filter : SALARY. Example: {"key": "value"}
- `presence` (`array`, optional): Presence for this request. Example: ["example"]
- `region` (`string`, optional): The ID of the parameter. Use type LOCATION on the List search parameters route to find out the right ID. Linkedin native filter : GLOBAL LOCATION. Example: example
- `role` (`array`, optional): The ID of the parameter. Use type JOB_TITLE on the List search parameters route to find out the right ID. Linkedin native filter : TITLE. Example: ["example"]
- `seniority` (`array`, optional): Linkedin native filter : EXPERIENCE LEVEL. Example: ["example"]
- `sort_by` (`string`, optional): Default value is relevance. Linkedin native filter : SORT BY. Example: relevance. One of: `relevance`, `date`.
- `under_10_applicants` (`boolean`, optional): Linkedin native filter : UNDER 10 APPLICANTS. Example: true

Example input: `{"account_id":"<account_id>"}`

### `unipile_search_linkedin_people`

Search LinkedIn People · Read-only

Search people with the LinkedIn Classic search, using keywords and filter ids.
Returns matching profiles with name, headline, location and profile url, plus paging and a cursor.
Use to find prospects or candidates. Get filter ids from Get LinkedIn Search Parameters. Read-only despite using POST.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `advanced_keywords` (`object`, optional): Advanced Keywords for this request. Example: {"key": "value"}
- `company` (`array`, optional): The ID of the parameter. Use type COMPANY on the List search parameters route to find out the right ID. Linkedin native filter : CURRENT COMPANY. Example: ["example"]
- `connections_of` (`array`, optional): The ID of the parameter. Use type CONNECTIONS on the List search parameters route to find out the right ID. Linkedin native filter : CONNECTIONS OF. Example: ["example"]
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `followers_of` (`array`, optional): The ID of the parameter. Use type PEOPLE on the List search parameters route to find out the right ID. Linkedin native filter : FOLLOWERS OF. Example: ["example"]
- `industry` (`array`, optional): The ID of the parameter. Use type INDUSTRY on the List search parameters route to find out the right ID. Linkedin native filter : INDUSTRY. Example: ["example"]
- `keywords` (`string`, optional): Linkedin native filter : KEYWORDS. Example: product manager
- `limit` (`integer`, optional): The maximum number of items to return. Sales Navigator and Recruiter support up to 100 results. For Classic searches, People and Companies are limited to 10 results per page, while Jobs are limited to 50. Post searches default to 3 results, matching LinkedIn's UI, but the limit can technically be increased up to 49. Example: 25
- `location` (`array`, optional): The ID of the parameter. Use type LOCATION on the List search parameters route to find out the right ID. Linkedin native filter : LOCATIONS. Example: Paris
- `network_distance` (`array`, optional): First, second or third+ degree. Linkedin native filter : CONNECTIONS. Example: ["example"]
- `open_to` (`array`, optional): Linkedin native filter : OPEN TO. Example: ["example"]
- `past_company` (`array`, optional): The ID of the parameter. Use type COMPANY on the List search parameters route to find out the right ID. Linkedin native filter : PAST COMPANY. Example: ["example"]
- `profile_language` (`array`, optional): ISO 639-1 language code. Linkedin native filter : PROFILE LANGUAGE. Example: ["example"]
- `school` (`array`, optional): The ID of the parameter. Use type SCHOOL on the List search parameters route to find out the right ID. Linkedin native filter : SCHOOL. Example: ["example"]
- `service` (`array`, optional): The ID of the parameter. Use type SERVICE on the List search parameters route to find out the right ID. Linkedin native filter : SERVICE CATEGORIES. Example: ["example"]

Example input: `{"account_id":"<account_id>"}`

### `unipile_search_linkedin_posts`

Search LinkedIn Posts · Read-only

Search posts with the LinkedIn Classic search, using keywords and filters.
Returns matching posts with author, text and date, plus paging and a cursor.
Use to find content or conversations to engage with. Read-only despite using POST.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `author` (`object`, optional): Author for this request. Example: {"key": "value"}
- `content_type` (`string`, optional): Linkedin native filter : CONTENT TYPE. Example: videos. One of: `videos`, `images`, `live_videos`, `collaborative_articles`, `documents`, `jobs`.
- `cursor` (`string`, optional): A cursor for pagination purposes. To get the next page of entries, you need to make a new request and fulfill this field with the cursor received in the preceding request. This process should be repeated until all entries have been retrieved. Example: eyJwYWdlIjoyfQ
- `date_posted` (`string`, optional): Linkedin native filter : DATE POSTED. Example: past_day. One of: `past_day`, `past_week`, `past_month`.
- `keywords` (`string`, optional): Linkedin native filter : KEYWORDS. Example: product manager
- `limit` (`integer`, optional): The maximum number of items to return. Sales Navigator and Recruiter support up to 100 results. For Classic searches, People and Companies are limited to 10 results per page, while Jobs are limited to 50. Post searches default to 3 results, matching LinkedIn's UI, but the limit can technically be increased up to 49. Example: 25
- `mentioning` (`object`, optional): Mentioning for this request. Example: {"key": "value"}
- `posted_by` (`object`, optional): Posted By for this request. Example: {"key": "value"}
- `sort_by` (`string`, optional): Default value is relevance. Linkedin native filter : SORT BY. Example: relevance. One of: `relevance`, `date`.

Example input: `{"account_id":"<account_id>"}`

### `unipile_add_candidate_to_recruiter_pipeline`

Add Candidate To Recruiter Pipeline · Write

Add a LinkedIn member to a Recruiter hiring project pipeline, or move an applicant or candidate between stages.
Returns a success flag.
Use to manage a Recruiter pipeline. Requires a LinkedIn Recruiter subscription.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): A unique identifier. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `action` (`string`, required): Action for this request. Example: addCandidateToPipeline. One of: `addCandidateToPipeline`, `addApplicantToPipeline`, `changeCandidatePipeline`.
- `hiring_project_id` (`string`, required): Hiring Project ID for this request. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `user_id` (`string`, required): The ID of the user. Example: ACoAAAcDMMQBODyLwZrRcgYhrkCafURGqva0U4E
- `stage` (`string`, optional): The default value for the stage will be uncontacted. Example: UNCONTACTED. One of: `UNCONTACTED`, `CONTACTED`, `REPLIED`.

Example input: `{"account_id":"<account_id>","action":"addCandidateToPipeline","hiring_project_id":"<hiring_project_id>","user_id":"<user_id>"}`

### `unipile_add_message_reaction`

Add Message Reaction · Write

Add an emoji reaction to a message (WhatsApp, LinkedIn, Telegram, Instagram).
Returns a success flag.
Use to react to an existing message.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `message_id` (`string`, required): The id of the message to react to. Example: kLm2Pq8RTu6VwXyZ1aBcDe
- `reaction` (`string`, required): The emoji to react with (native emoji, e.g. 👍). Example: 👍

Example input: `{"message_id":"<message_id>","reaction":"<reaction>"}`

### `unipile_add_post_reaction`

Add Post Reaction · Write

React to a post or a post comment.
Returns a confirmation object.
Use to like or react to content on behalf of the connected account.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `post_id` (`string`, required): The id of the post to send a reaction to. <br> `Linkedin`: use the `social_id` from the post object (GET post or list posts). The post id visible in url will not work in all case, you can refer here for more details : https://developer.unipile.com/docs/posts-and-comments <br> `Instagram` Please use the provider_id. Example: 7123456789012345678
- `as_organization` (`string`, optional): `Linkedin only` Provide the ID of an organization over which you have control to perform the action on its behalf. Example: example
- `comment_id` (`string`, optional): The id of the comment to send a reaction to. `Linkedin`: use the comment id returned by the comments list. Example: 7123456789012345679
- `reaction_type` (`string`, optional): The type of reaction to send. If not provided, it defaults to 'like'. <br> `Instagram`: The only supported reaction type is 'like'. Example: like. One of: `like`, `celebrate`, `support`, `love`, `insightful`, `funny`.

Example input: `{"account_id":"<account_id>","post_id":"<post_id>"}`

### `unipile_close_job_posting`

Close Job Posting · Write

Close a LinkedIn job posting.
Returns the closed job id.
Use when a role is filled or withdrawn.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The ID of the account to trigger the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `id` (`string`, required): The ID of the job offer. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `service` (`string`, optional): The Linkedin service the job posting depends on. Example: CLASSIC. One of: `CLASSIC`, `RECRUITER`.

Example input: `{"account_id":"<account_id>","id":"<id>"}`

### `unipile_create_calendar_event`

Create Calendar Event · Write

Create an event in a calendar.
Returns the new event id.
Use to schedule a meeting. Use Edit Calendar Event to change one later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `attendees` (`array`, required): Attendees for this request. Example: ["example"]
- `calendar_id` (`string`, required): The id of calendar receiving the event. Example: primary
- `end` (`object`, required): The end date and time of the event. Example: 2025-12-31T23:59:59.999Z
- `start` (`object`, required): The start date and time of the event. Example: 2025-01-01T00:00:00.000Z
- `title` (`string`, required): The title of the event. Example: Product sync
- `body` (`string`, optional): The body of the event. Example: example
- `color` (`string`, optional): The color of the event. <br> `Google Calendar`: `#7986CB`, `#33B679`, `#8E24AA`, `#E67C73`, `#F6BF26`, `#F4511E`, `#039BE5`, `#616161`, `#3F51B5`, `#0B8043`, `#D50000` Example: example
- `conference` (`object`, optional): Conference for this request. Example: {"key": "value"}
- `guests_can_modify` (`boolean`, optional): If true, allow guests to modify the event. <br> `Outlook Calendar`: Not supported, this parameter will always be false. Example: true
- `is_attendees_list_hidden` (`boolean`, optional): Is the attendees list hidden for attendees. Example: true
- `location` (`string`, optional): The location of the event. Example: Paris
- `notify` (`boolean`, optional): If true, send notifications about the event to invited attendees. <br> `Outlook Calendar`: Not supported, this parameter will always be true. Example: true
- `recurrence` (`array`, optional): List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as specified in RFC5545. Example: ["example"]
- `transparency` (`string`, optional): The transparency of the event. `opaque` does block time on the calendar and is equivalent to setting Show me as to Busy in the Calendar UI. `transparent` does not block time on the calendar and is equivalent to setting Show me as to Available in the Calendar UI. Example: example. One of: `opaque`, `transparent`.
- `visibility` (`string`, optional): The visibility of the event. Example: example. One of: `public`, `private`.

Example input: `{"account_id":"<account_id>","attendees":["example"],"calendar_id":"<calendar_id>","end":{},"start":{},"title":"<title>"}`

### `unipile_create_job_posting`

Create Job Posting · Write

Create a LinkedIn job posting as a draft.
Returns the job id, project id and the available publish options.
Use first, then Publish Job Posting to make it live.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): An Unipile account id. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `company` (`object`, required): Company for this request. Example: {"key": "value"}
- `description` (`string`, required): You can use HTML tags to structure your description. Example: We are hiring a product manager.
- `job_title` (`object`, required): Job Title for this request. Example: {"key": "value"}
- `location` (`string`, required): The ID of the parameter. Use type LOCATION on the List search parameters route to find out the right ID. Example: Paris
- `workplace` (`string`, required): Workplace for this request. Example: ON_SITE. One of: `ON_SITE`, `HYBRID`, `REMOTE`.
- `apply_method` (`object`, optional): Apply Method for this request. Example: {"key": "value"}
- `auto_rejection_template` (`string`, optional): You can define a rejection message template to be automatically sent to applicants that don't pass screening questions. Example: example
- `employment_status` (`string`, optional): Employment Status for this request. Example: FULL_TIME. One of: `FULL_TIME`, `PART_TIME`, `CONTRACT`, `TEMPORARY`, `OTHER`, `VOLUNTEER`, `INTERNSHIP`.
- `recruiter` (`object`, optional): Recruiter for this request. Example: {"key": "value"}
- `screening_questions` (`array`, optional): Screening Questions for this request. Example: ["example"]

Example input: `{"account_id":"<account_id>","company":{"key":"value"},"description":"<description>","job_title":{"key":"value"},"location":"<location>","workplace":"ON_SITE"}`

### `unipile_edit_calendar_event`

Edit Calendar Event · Write

Edit an existing calendar event.
Returns a confirmation object.
Use to reschedule or change an event.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `calendar_id` (`string`, required): The id of calendar receiving the event. Example: primary
- `event_id` (`string`, required): The id of the event to edit. Example: 0e6b0a2f3c4d5e6f7a8b9c0d
- `attendees` (`array`, optional): Attendees for this request. Example: ["example"]
- `body` (`string`, optional): The body of the event. Example: example
- `color` (`string`, optional): The color of the event. <br> `Google Calendar`: `#7986CB`, `#33B679`, `#8E24AA`, `#E67C73`, `#F6BF26`, `#F4511E`, `#039BE5`, `#616161`, `#3F51B5`, `#0B8043`, `#D50000` Example: example
- `conference` (`object`, optional): Conference for this request. Example: {"key": "value"}
- `end` (`object`, optional): The end date and time of the event. Example: 2025-12-31T23:59:59.999Z
- `guests_can_modify` (`boolean`, optional): If true, allow guests to modify the event. <br> `Outlook Calendar`: Not supported, this parameter will always be false. Example: true
- `is_attendees_list_hidden` (`boolean`, optional): Is the attendees list hidden for attendees. Example: true
- `location` (`string`, optional): The location of the event. Example: Paris
- `notify` (`boolean`, optional): If true, send notifications about the event update to invited attendees. Example: true
- `recurrence` (`array`, optional): List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as specified in RFC5545. Example: ["example"]
- `start` (`object`, optional): The start date and time of the event. Example: 2025-01-01T00:00:00.000Z
- `title` (`string`, optional): The title of the event. Example: Product sync
- `transparency` (`string`, optional): The transparency of the event. `opaque` does block time on the calendar and is equivalent to setting Show me as to Busy in the Calendar UI. `transparent` does not block time on the calendar and is equivalent to setting Show me as to Available in the Calendar UI. Example: example. One of: `opaque`, `transparent`.
- `visibility` (`string`, optional): The visibility of the event. Example: example. One of: `public`, `private`.

Example input: `{"account_id":"<account_id>","calendar_id":"<calendar_id>","event_id":"<event_id>"}`

### `unipile_edit_job_posting`

Edit Job Posting · Write

Edit an existing LinkedIn job posting.
Returns the job id.
Use to change a draft or open posting.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): An Unipile account id. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `job_id` (`string`, required): The id of the job to edit. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `apply_method` (`object`, optional): Apply Method for this request. Example: {"key": "value"}
- `auto_rejection_template` (`string`, optional): You can define a rejection message template to be automatically sent to applicants that don't pass screening questions. Example: example
- `company` (`object`, optional): Company for this request. Example: {"key": "value"}
- `description` (`string`, optional): You can use HTML tags to structure your description. Example: We are hiring a product manager.
- `employment_status` (`string`, optional): Employment Status for this request. Example: FULL_TIME. One of: `FULL_TIME`, `PART_TIME`, `CONTRACT`, `TEMPORARY`, `OTHER`, `VOLUNTEER`, `INTERNSHIP`.
- `job_title` (`object`, optional): Job Title for this request. Example: {"key": "value"}
- `location` (`string`, optional): The ID of the parameter. Use type LOCATION on the List search parameters route to find out the right ID. Example: Paris
- `recruiter` (`object`, optional): Recruiter for this request. Example: {"key": "value"}
- `screening_questions` (`array`, optional): Screening Questions for this request. Example: ["example"]
- `workplace` (`string`, optional): Workplace for this request. Example: ON_SITE. One of: `ON_SITE`, `HYBRID`, `REMOTE`.

Example input: `{"account_id":"<account_id>","job_id":"<job_id>"}`

### `unipile_edit_message`

Edit Message · Write

Edit the text of a sent message. Supported for WhatsApp and LinkedIn Classic only.
Returns a confirmation object.
Use to correct a message you sent. Providers may reject edits after a short time window.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `message_id` (`string`, required): The id of the message to edit. Example: kLm2Pq8RTu6VwXyZ1aBcDe
- `text` (`string`, required): The updated text of the message. For media messages, this is used as the updated caption when supported by the provider. On WhatsApp, edits may be rejected after an indicative 15-minute window following the original send time. On LinkedIn Classic, edits are only possible within the first 60 minutes after the message is sent. Example: Thanks, see you then!

Example input: `{"message_id":"<message_id>","text":"<text>"}`

### `unipile_forward_message`

Forward Message · Write

Forward a message to another chat. WhatsApp only.
Returns the id of the forwarded message.
Use to share an existing WhatsApp message into a different chat.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `chat_id` (`string`, required): The id of the chat to forward the message to. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `message_id` (`string`, required): The id of the message to forward. Example: kLm2Pq8RTu6VwXyZ1aBcDe

Example input: `{"chat_id":"<chat_id>","message_id":"<message_id>"}`

### `unipile_handle_received_invitation`

Handle Received Invitation · Write

Accept or decline a received connection invitation (LinkedIn or Instagram).
Returns the resulting invitation status.
Use after List Received Invitations. LinkedIn also needs the shared_secret from the listed invitation.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): A unique identifier. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `action` (`string`, required): Action for this request. Example: accept. One of: `accept`, `decline`.
- `invitation_id` (`string`, required): The invitation ID. Example: 7234567890123456789
- `provider` (`string`, required): Provider for this request. Example: LINKEDIN. One of: `LINKEDIN`.
- `shared_secret` (`string`, optional): This token provided by Linkedin is mandatory to handle received invitations. It can be retrieved along with each invitation using the List all invitations received route. Example: example

Example input: `{"account_id":"<account_id>","action":"accept","invitation_id":"<invitation_id>","provider":"LINKEDIN"}`

### `unipile_publish_job_posting`

Publish Job Posting · Write

Publish a LinkedIn job posting draft as a free posting.
Returns the resulting job state and job id.
Use after Create Job Posting. Promoted (paid) publishing is not offered by this tool.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): An Unipile account id. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `draft_id` (`string`, required): The id of the draft to publish. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `bypass_email_verification` (`boolean`, optional): Whether or not to verify if you're allowed to post a job on behalf on the current company. Example: true
- `hiring_photo_frame` (`boolean`, optional): Whether or not to add the hiring photo frame to you profile picture. Example: true
- `service` (`string`, optional): The Linkedin service the job posting depends on. Default is classic. Example: CLASSIC. One of: `CLASSIC`, `RECRUITER`.

Example input: `{"account_id":"<account_id>","draft_id":"<draft_id>"}`

### `unipile_save_sales_navigator_lead`

Save Sales Navigator Lead · Write

Save a LinkedIn member as a lead in Sales Navigator, optionally into a lead list.
Returns a success flag.
Use to add a prospect to Sales Navigator. Requires a Sales Navigator subscription.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): A unique identifier. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `user_id` (`string`, required): The ID of the user. Example: ACoAAAcDMMQBODyLwZrRcgYhrkCafURGqva0U4E
- `list_id` (`string`, optional): List ID for this request. Example: 9f9uuKzhVHGUNo9PzbgUtQ

Example input: `{"account_id":"<account_id>","user_id":"<user_id>"}`

### `unipile_send_invitation`

Send Invitation · Write

Send a connection invitation to a user, optionally with a short message.
Returns the invitation id and the remaining invitation usage.
Use to connect with a person. Respect provider invitation limits.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_id` (`string`, required): The id of the account where the user will be added. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `provider_id` (`string`, required): The id of the user to add. It has to be the provider’s id. LinkedIn Classic: inviting the connected account's own profile returns HTTP 422 (errors/cannot_invite_attendee). <br> `Instagram`: You can use the provider_id or the username of the user. The provider_messaging_id dont work on this route ! Example: ACoAAAcDMMQBODyLwZrRcgYhrkCafURGqva0U4E
- `message` (`string`, optional): An optional message to go with the invitation (max 300 chars). Example: Hi, I would love to connect.
- `user_email` (`string`, optional): The email address of the user when it's required (Linkedin specific). Example: jane@example.com

Example input: `{"account_id":"<account_id>","provider_id":"<provider_id>"}`

### `unipile_update_chat`

Update Chat · Write

Perform an action on a chat: set read, mute, archive or pinned status, add or remove a group participant, set a label, or get a group invite link.
Returns a confirmation object, plus invite_link when the action is getInviteLink.
Use to change chat state. Support depends on the provider (for example archive and pin are WhatsApp only).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `action` (`string`, required): The action to perform on the chat: - `setReadStatus`: (WhatsApp & LinkedIn only) Set the read status of the chat. - `setMuteStatus`: (WhatsApp & LinkedIn only) Set the mute status of the chat. - `setArchiveStatus`: (WhatsApp only) Set the archive status of the chat. - `setPinnedStatus`: (WhatsApp only) Set the pinned status of the chat. - `addParticipant`: (WhatsApp & Telegram only) Add a participant to the group chat. The account owner must have the Add other members permission in the group. Provide the provider ID as value, for example 334455667788@s.whatsapp.net for WhatsApp, or a Telegram user ID, username, or phone number for Telegram. - `removeParticipant`: (WhatsApp & Telegram only) Remove a participant from the group chat. Provide the provider ID as value, for example 334455667788@s.whatsapp.net for WhatsApp, or a Telegram user ID, username, or phone number for Telegram. - `setLabel`: (WhatsApp only) Add a label to the chat. If the label does not exist, it will be created and then assigned. - `getInviteLink`: (WhatsApp & Telegram only) Generate or retrieve the full group invite link. The account owner must have the required invite permissions in the group. Example: setReadStatus. One of: `setReadStatus`, `setMuteStatus`, `setArchiveStatus`, `setPinnedStatus`, `addParticipant`, `removeParticipant`, `setLabel`, `getInviteLink`.
- `chat_id` (`string`, required): The id of the chat to be patched. Example: 9f9uuKzhVHGUNo9PzbgUtQ
- `value` (`string`, optional): Required for every action except `getInviteLink`. Use a boolean for status actions and a string for participant or label actions. Example: example

Example input: `{"action":"setReadStatus","chat_id":"<chat_id>"}`

### `unipile_update_email`

Update Email · Write

Update an email: mark it read or unread, move it to folders, or set categories.
Returns a confirmation object.
Use to triage mail. Use Delete Email to move it to Trash.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email_id` (`string`, required): The id of the email to be updated. Either the Unipile id or the provider uid. Example: Q2xhdWRlRW1haWwx
- `account_id` (`string`, optional): The id of the account related to the email. Required when using the provider uid. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `categories` (`array`, optional): `Outlook only`: The categories to assign to the email. Example: ["example"]
- `folders` (`array`, optional): The names of the folders to which the email should be moved. Outlook and IMAP accounts accept only one folder. If you provide a label value that does not already exist, a new label will be created with that value. Updates the entire thread if the targeted email is part of a conversation. Example: ["example"]
- `unread` (`boolean`, optional): Indicates whether the email should be marked as unread. Updates only the targeted email. If unread is supplied, all other parameters are ignored. Example: true

Example input: `{"email_id":"<email_id>"}`

### `unipile_cancel_invitation`

Cancel Invitation · Destructive

Cancel a pending invitation the account owner sent.
Returns a confirmation object.
Use with an invitation_id from List Sent Invitations.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to perform the request from. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `invitation_id` (`string`, required): The id of the invitation to cancel. <br>`Instagram`: Use the 'provider_id' retrieved in user profile (not 'provider_messaging_id'). Example: 7234567890123456789

Example input: `{"account_id":"<account_id>","invitation_id":"<invitation_id>"}`

### `unipile_delete_calendar_event`

Delete Calendar Event · Destructive

Delete a calendar event.
Returns a confirmation object.
Use only when the user asks to cancel or remove an event.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `account_id` (`string`, required): The id of the account to use. Example: mZ9tTq1xRkWJb3dLq8aXyA
- `calendar_id` (`string`, required): The id of calendar receiving the event. Example: primary
- `event_id` (`string`, required): The id of the event to edit. Example: 0e6b0a2f3c4d5e6f7a8b9c0d

Example input: `{"account_id":"<account_id>","calendar_id":"<calendar_id>","event_id":"<event_id>"}`

### `unipile_delete_chat`

Delete Chat · Destructive

Delete a chat. Supported for WhatsApp and LinkedIn only.
Returns a confirmation object.
Use only when the user asks to remove a conversation. This cannot be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `chat_id` (`string`, required): The id of the chat to delete. Example: 9f9uuKzhVHGUNo9PzbgUtQ

Example input: `{"chat_id":"<chat_id>"}`

### `unipile_delete_email`

Delete Email · Destructive

Delete an email by moving it to the Trash folder.
Returns a confirmation object.
Use only when the user asks to remove an email.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `email_id` (`string`, required): The id of the email to be deleted. Either the Unipile id or the provider uid. Example: Q2xhdWRlRW1haWwx
- `account_id` (`string`, optional): The id of the account related to the email. Required when using the provider uid. Example: mZ9tTq1xRkWJb3dLq8aXyA

Example input: `{"email_id":"<email_id>"}`

### `unipile_delete_message`

Delete Message · Destructive

Delete a message. Supported for WhatsApp and LinkedIn only; LinkedIn allows it only within 60 minutes of sending.
Returns a confirmation object.
Use only when the user asks to remove a sent message. This cannot be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `message_id` (`string`, required): The id of the message to delete. Example: kLm2Pq8RTu6VwXyZ1aBcDe

Example input: `{"message_id":"<message_id>"}`

## Related

Other Communication connectors ([all 73](/agentkit/connectors/?category=communication)):

- [Crisp](/agentkit/connectors/crisp/): Scalekit connector, API key, 50 tools
- [Gmail](/agentkit/connectors/gmail/): Scalekit connector, OAuth, 48 tools
- [Google Calendar](/agentkit/connectors/googlecalendar/): Scalekit connector, OAuth, 30 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
