curl --request GET \
--url https://flowra.dev/api/v1/external-users \
--header 'x-api-key: <api-key>'import requests
url = "https://flowra.dev/api/v1/external-users"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://flowra.dev/api/v1/external-users', 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://flowra.dev/api/v1/external-users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://flowra.dev/api/v1/external-users"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://flowra.dev/api/v1/external-users")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://flowra.dev/api/v1/external-users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Data retrieved successfully",
"data": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Doe",
"projectId": "123e4567-e89b-12d3-a456-426614174000",
"source": "project_default",
"isActive": true,
"channel": "",
"profileSummary": "",
"avatarUrl": "",
"creditsUsed": 0,
"createdAt": "",
"lastSeenAt": "",
"isOnline": true,
"resourceStats": {
"agentCount": 0,
"workflowCount": 0,
"knowledgeStorageKb": 0,
"databaseStorageKb": 0,
"storageUsedKb": 0,
"connectionCount": 0
},
"addedByWorkflowIds": [
""
],
"addedByWorkflowId": "",
"metadata": {
"channel": "telegram",
"toolkitSlug": "telegram",
"toolSlug": "TELEGRAM_SET_WEBHOOK",
"threadKey": "123456789",
"profile": {
"userId": 123456789,
"username": "amin",
"firstName": "Amin"
},
"updatedAt": "2026-07-13T08:00:00.000Z"
},
"verifiedEmail": "",
"verifiedPhone": "",
"identitySources": [
"email",
"host_sub"
]
}
],
"total": 100,
"totalTools": 5000,
"page": 1,
"limit": 20,
"totalPages": 5,
"hasNextPage": true,
"hasPreviousPage": false
}List external users
List end users for your project with optional channel/source filters, pagination, sorting, and credit usage totals.
curl --request GET \
--url https://flowra.dev/api/v1/external-users \
--header 'x-api-key: <api-key>'import requests
url = "https://flowra.dev/api/v1/external-users"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://flowra.dev/api/v1/external-users', 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://flowra.dev/api/v1/external-users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://flowra.dev/api/v1/external-users"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://flowra.dev/api/v1/external-users")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://flowra.dev/api/v1/external-users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Data retrieved successfully",
"data": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Doe",
"projectId": "123e4567-e89b-12d3-a456-426614174000",
"source": "project_default",
"isActive": true,
"channel": "",
"profileSummary": "",
"avatarUrl": "",
"creditsUsed": 0,
"createdAt": "",
"lastSeenAt": "",
"isOnline": true,
"resourceStats": {
"agentCount": 0,
"workflowCount": 0,
"knowledgeStorageKb": 0,
"databaseStorageKb": 0,
"storageUsedKb": 0,
"connectionCount": 0
},
"addedByWorkflowIds": [
""
],
"addedByWorkflowId": "",
"metadata": {
"channel": "telegram",
"toolkitSlug": "telegram",
"toolSlug": "TELEGRAM_SET_WEBHOOK",
"threadKey": "123456789",
"profile": {
"userId": 123456789,
"username": "amin",
"firstName": "Amin"
},
"updatedAt": "2026-07-13T08:00:00.000Z"
},
"verifiedEmail": "",
"verifiedPhone": "",
"identitySources": [
"email",
"host_sub"
]
}
],
"total": 100,
"totalTools": 5000,
"page": 1,
"limit": 20,
"totalPages": 5,
"hasNextPage": true,
"hasPreviousPage": false
}Authorizations
Project API key. Create and manage keys in the dashboard under Project → API Keys. Send as header: x-api-key:
Headers
External user (end user) to act as. Optional — if omitted, Flowra uses the project’s default external user. Send a stable username (e.g. customer_alice) only when you need another end-user context.
Query Parameters
Filter by username (name) with case-insensitive partial match
255"alice"
Filter by messaging channel (metadata.channel, e.g. telegram)
64"telegram"
Filter by source. One value, comma-separated, or repeated query params.
project_default, username, embed_visitor, trigger_thread, project_runtime Filter by active status (omit for all)
true
Pin this external user id to the top of the list (current dashboard selection)
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
Field to sort by (after pin ranking)
name, createdAt, source, creditsUsed, isActive, id, channel, profileSummary, lastSeenAt, agentCount, workflowCount, knowledgeStorageKb, databaseStorageKb, storageUsedKb, connectionCount Sort order
ASC, DESC Credits sum from date (ISO 8601)
"2026-08-01T00:00:00.000Z"
Credits sum to date (ISO 8601)
"2026-09-01T00:00:00.000Z"
Page number (1-based)
x >= 11
Number of items per page (max 100)
1 <= x <= 10020
Response
External users retrieved successfully
Success status
true
Response message
"Data retrieved successfully"
Array of items
Show child attributes
Show child attributes
[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Doe",
"projectId": "123e4567-e89b-12d3-a456-426614174000",
"source": "project_default",
"isActive": true,
"channel": "",
"profileSummary": "",
"avatarUrl": "",
"creditsUsed": 0,
"createdAt": "",
"lastSeenAt": "",
"isOnline": true,
"resourceStats": {
"agentCount": 0,
"workflowCount": 0,
"knowledgeStorageKb": 0,
"databaseStorageKb": 0,
"storageUsedKb": 0,
"connectionCount": 0
},
"addedByWorkflowIds": [""],
"addedByWorkflowId": "",
"metadata": {
"channel": "telegram",
"toolkitSlug": "telegram",
"toolSlug": "TELEGRAM_SET_WEBHOOK",
"threadKey": "123456789",
"profile": {
"userId": 123456789,
"username": "amin",
"firstName": "Amin"
},
"updatedAt": "2026-07-13T08:00:00.000Z"
},
"verifiedEmail": "",
"verifiedPhone": "",
"identitySources": ["email", "host_sub"]
}
]
Total number of items across all pages
100
Optional secondary total (e.g. nested tools across all matching toolkits)
5000
Current page number (1-based)
1
Number of items per page
20
Total number of pages
5
Whether there is a next page
true
Whether there is a previous page
false
Was this page helpful?