List Team Members
curl --request POST \
--url https://api.example.com/api/public/tools/list_team_members \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"isEmailConnected": null,
"isLinkedinConnected": null,
"isLinkedinReady": null
}
'import requests
url = "https://api.example.com/api/public/tools/list_team_members"
payload = {
"isEmailConnected": None,
"isLinkedinConnected": None,
"isLinkedinReady": None
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({isEmailConnected: null, isLinkedinConnected: null, isLinkedinReady: null})
};
fetch('https://api.example.com/api/public/tools/list_team_members', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/public/tools/list_team_members",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'isEmailConnected' => null,
'isLinkedinConnected' => null,
'isLinkedinReady' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/public/tools/list_team_members"
payload := strings.NewReader("{\n \"isEmailConnected\": null,\n \"isLinkedinConnected\": null,\n \"isLinkedinReady\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/public/tools/list_team_members")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"isEmailConnected\": null,\n \"isLinkedinConnected\": null,\n \"isLinkedinReady\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/public/tools/list_team_members")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"isEmailConnected\": null,\n \"isLinkedinConnected\": null,\n \"isLinkedinReady\": null\n}"
response = http.request(request)
puts response.read_body{
"summary": "<string>",
"items": [
{
"userId": "<string>",
"name": "<string>",
"email": "<string>",
"role": "<string>",
"isOwner": true,
"access": "<string>",
"emailAccounts": [
{
"id": "<string>",
"userId": "<string>",
"teamMembershipId": "<string>",
"sourceAccountId": "<string>",
"email": "<string>",
"source": "gmail",
"isActive": true,
"isDefault": true,
"subStatus": "unknown",
"schedulerId": "<string>",
"sendLimit": 123,
"updated": "2023-11-07T05:31:56Z",
"created": "2023-11-07T05:31:56Z"
}
],
"linkedinAccount": {
"id": "<string>",
"fullName": "<string>",
"unipileAccountId": "<string>",
"status": "alive",
"created": "2023-11-07T05:31:56Z",
"limits": {
"connectionSendLimit": 123,
"messageSendLimit": 123,
"inMailSendLimit": 123,
"profileVisitLimit": 123
},
"planType": "free",
"profilePictureUrl": "<string>",
"isCheckpoint": true,
"checkpointType": "<string>",
"proxyCountryCode": "<string>",
"connectionStartedAt": "2023-11-07T05:31:56Z",
"relationsSyncPending": true,
"relationsSyncAttempts": 123,
"relationsSyncLastAttemptUtc": "2023-11-07T05:31:56Z",
"relationsSyncedAtUtc": "2023-11-07T05:31:56Z",
"relationsPartiallySynced": true,
"relationsSyncDisabled": true,
"manualReplySendMode": "instant",
"instantManualReplySendLimit": 200,
"providerId": null,
"publicIdentifier": null,
"connectionSendPausedUntilUtc": null,
"connectionSendPauseReason": null,
"connectionSendPauseDetails": null,
"isConnectionSendPaused": false,
"senderEntitlementDeleteAfterUtc": null,
"disconnectCleanupAfterUtc": null,
"linSimAccId": null
},
"capabilities": {
"isEmailConnected": true,
"isLinkedinConnected": true,
"isLinkedinReady": true,
"isEmailSendingEnabled": true,
"isLinkedinActionsEnabled": true,
"isCallTasksEnabled": true,
"isManualTasksEnabled": true,
"isApprovalEnabled": true
}
}
],
"uiLinks": [
{
"label": "<string>",
"url": "<string>",
"reason": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}FirstTouch tools
List Team Members
Call get_guide with topic=senders_and_capabilities before selecting flow candidates or Dynamic Action assignees.
Detailed usage guidance
- Lists active members of the current team with their FirstTouch user id, email, role, ownership, user-facing access level (Paid sender or View-only), connected email accounts, LinkedIn account state, and flow-assignment permissions.
- Paid sender seats allow account connections and sender actions.
- Viewers can access the product, but cannot connect accounts, act as senders, or be assigned flow work.
- For reusable flow plans, call this before choosing candidates: email requires isEmailConnected and isEmailSendingEnabled;
LinkedIn requires isLinkedinReady and isLinkedinActionsEnabled;
calls and manual tasks require their matching assignment permission;
every flow needs at least one selected candidate with isApprovalEnabled. - Use exact returned userIds in flow.candidates.
- For dynamic actions, resolve every sender before calling add_dynamic_action: when no sender was requested, find the current user and select that member;
when named, compare the supplied identity with returned names, emails, and user ids;
when any capable sender is requested, select one eligible returned member and report who was chosen. - Pass that userId as action.assignedUserId.
- Email requires isEmailConnected and Email actions permission.
- LinkedIn connect/message/profile requires isLinkedinReady and Social actions permission; InMail also requires an eligible linkedinAccount.plan_type (Premium or Sales Navigator, subject to the team’s Premium setting).
- Calls and manual tasks require their matching permissions.
- Do not use LinkedIn Unibox tools to choose a flow or dynamic-action sender.
- isEmailConnected, isLinkedinConnected, and isLinkedinReady filters use AND semantics when combined.
- LinkedIn ready means the account is alive and its relations sync has completed; dynamic actions validate the remaining capability requirements before creation.
POST
/
api
/
public
/
tools
/
list_team_members
List Team Members
curl --request POST \
--url https://api.example.com/api/public/tools/list_team_members \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"isEmailConnected": null,
"isLinkedinConnected": null,
"isLinkedinReady": null
}
'import requests
url = "https://api.example.com/api/public/tools/list_team_members"
payload = {
"isEmailConnected": None,
"isLinkedinConnected": None,
"isLinkedinReady": None
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({isEmailConnected: null, isLinkedinConnected: null, isLinkedinReady: null})
};
fetch('https://api.example.com/api/public/tools/list_team_members', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/public/tools/list_team_members",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'isEmailConnected' => null,
'isLinkedinConnected' => null,
'isLinkedinReady' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/public/tools/list_team_members"
payload := strings.NewReader("{\n \"isEmailConnected\": null,\n \"isLinkedinConnected\": null,\n \"isLinkedinReady\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/public/tools/list_team_members")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"isEmailConnected\": null,\n \"isLinkedinConnected\": null,\n \"isLinkedinReady\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/public/tools/list_team_members")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"isEmailConnected\": null,\n \"isLinkedinConnected\": null,\n \"isLinkedinReady\": null\n}"
response = http.request(request)
puts response.read_body{
"summary": "<string>",
"items": [
{
"userId": "<string>",
"name": "<string>",
"email": "<string>",
"role": "<string>",
"isOwner": true,
"access": "<string>",
"emailAccounts": [
{
"id": "<string>",
"userId": "<string>",
"teamMembershipId": "<string>",
"sourceAccountId": "<string>",
"email": "<string>",
"source": "gmail",
"isActive": true,
"isDefault": true,
"subStatus": "unknown",
"schedulerId": "<string>",
"sendLimit": 123,
"updated": "2023-11-07T05:31:56Z",
"created": "2023-11-07T05:31:56Z"
}
],
"linkedinAccount": {
"id": "<string>",
"fullName": "<string>",
"unipileAccountId": "<string>",
"status": "alive",
"created": "2023-11-07T05:31:56Z",
"limits": {
"connectionSendLimit": 123,
"messageSendLimit": 123,
"inMailSendLimit": 123,
"profileVisitLimit": 123
},
"planType": "free",
"profilePictureUrl": "<string>",
"isCheckpoint": true,
"checkpointType": "<string>",
"proxyCountryCode": "<string>",
"connectionStartedAt": "2023-11-07T05:31:56Z",
"relationsSyncPending": true,
"relationsSyncAttempts": 123,
"relationsSyncLastAttemptUtc": "2023-11-07T05:31:56Z",
"relationsSyncedAtUtc": "2023-11-07T05:31:56Z",
"relationsPartiallySynced": true,
"relationsSyncDisabled": true,
"manualReplySendMode": "instant",
"instantManualReplySendLimit": 200,
"providerId": null,
"publicIdentifier": null,
"connectionSendPausedUntilUtc": null,
"connectionSendPauseReason": null,
"connectionSendPauseDetails": null,
"isConnectionSendPaused": false,
"senderEntitlementDeleteAfterUtc": null,
"disconnectCleanupAfterUtc": null,
"linSimAccId": null
},
"capabilities": {
"isEmailConnected": true,
"isLinkedinConnected": true,
"isLinkedinReady": true,
"isEmailSendingEnabled": true,
"isLinkedinActionsEnabled": true,
"isCallTasksEnabled": true,
"isManualTasksEnabled": true,
"isApprovalEnabled": true
}
}
],
"uiLinks": [
{
"label": "<string>",
"url": "<string>",
"reason": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}{
"error": "<string>",
"message": "<string>",
"traceId": "<string>"
}Authorizations
Body
application/json
When true, return only members with at least one active connected email account. When false, return only members without one. Omit for both.
When true, return only members with an alive LinkedIn account. When false, return only members without an alive LinkedIn account. Omit for both.
When true, return only members whose alive LinkedIn account has completed relations sync. When false, return only members that are not LinkedIn-ready. Omit for both.

