curl --request GET \
--url https://app.letsflow.ai/v1/tickets \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.letsflow.ai/v1/tickets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.letsflow.ai/v1/tickets', 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://app.letsflow.ai/v1/tickets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.letsflow.ai/v1/tickets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.letsflow.ai/v1/tickets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/tickets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"resource": "ticket",
"org_id": "<string>",
"team_id": "<string>",
"key": "<string>",
"type": "<string>",
"title": "<string>",
"description": "<string>",
"status": "<string>",
"priority_kind": "<string>",
"pending_prompt_summary": {},
"source_channel_kind": "<string>",
"requester": {
"id": "<string>",
"actor_type": "<string>",
"principal_id": "<string>",
"internal_key": "<string>",
"display_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
},
"opened_by": {
"id": "<string>",
"actor_type": "<string>",
"principal_id": "<string>",
"internal_key": "<string>",
"display_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
},
"assignee": {
"id": "<string>",
"actor_type": "<string>",
"principal_id": "<string>",
"internal_key": "<string>",
"display_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
},
"assignment_team_id": "<string>",
"ownership": {
"assignee": {
"kind": "flow",
"display_name": "<string>",
"avatar_url": "<string>"
},
"assignment_team": {
"display_name": "<string>"
}
},
"linked": {
"access_request": {
"id": "<string>",
"status": "<string>",
"entitlement_id": "<string>",
"entitlement_display_name": "<string>"
},
"approval_request": {
"id": "<string>",
"status": "<string>",
"current_stage": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "<string>",
"order": 2,
"status": "<string>",
"decision_policy": "any_one",
"approvals_required": 2,
"eligible_approvers": [
{
"principal_id": "<string>",
"display_name": "<string>"
}
],
"viewer_can_decide": true,
"expires_at": "2023-11-07T05:31:56Z",
"approval_count": 1,
"denial_count": 1,
"approvals_received": 1
},
"expires_at": "<string>"
},
"workflow_run": {
"id": "<string>",
"status": "requested",
"wait_reason_kind": "pre_admission_approval",
"error_summary": {
"phase": "validate",
"failure_class": "validation",
"code": "<string>",
"status_hint": "waiting",
"retry_disposition": "retry_same_operation",
"retryable": true,
"summary": "<string>",
"detail": "<string>",
"surfaces": {
"builder_message": "<string>",
"operator_message": "<string>"
},
"canonical_refs": {},
"provider_context": {},
"cause_chain": [
{
"code": "<string>",
"name": "<string>",
"summary": "<string>",
"detail": "<string>",
"retryable": true,
"source": "<string>"
}
],
"support_handoff": {},
"captured_at": "<string>"
},
"workflow_id": "<string>",
"workflow_publication_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_revision_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_revision_build_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"request_id": "<string>",
"correlation_id": "<string>",
"details_access": "allowed"
}
},
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>",
"closed_at": "<string>",
"canceled_at": "<string>",
"duration_ms": 123,
"duration_ended_at": "<string>",
"externally_synced": true,
"channel_thread_captured": true,
"links": {},
"requester_automation": {
"fulfillment": "unconfirmed",
"label": "<string>",
"reason": "<string>",
"acceptedAt": "2023-11-07T05:31:56Z",
"nextAction": {
"actor": "none",
"requiredByViewer": true,
"message": "<string>"
}
},
"sync_provider_system_kind": "jira_service_management"
}
],
"page": {
"cursor": "<string>",
"next_cursor": "<string>",
"has_more": true,
"limit": 123
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
},
"groups": [
{
"key": "<string>",
"value": "<string>",
"label": "<string>",
"count": 1
}
]
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "access_grant_admin_extension_required",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"re_auth_required": true,
"violations": [
{
"field": "<string>",
"message": "<string>",
"capability": "<string>",
"details": {}
}
],
"diagnostics": [
{
"code": "<string>",
"severity": "info",
"message": "<string>",
"fixHint": "<string>",
"location": {
"file": "<string>",
"line": 2,
"column": 2,
"stepId": "<string>"
}
}
]
}List Tickets
List canonical ticket summaries with linked access, approval, and workflow observations.
curl --request GET \
--url https://app.letsflow.ai/v1/tickets \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.letsflow.ai/v1/tickets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.letsflow.ai/v1/tickets', 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://app.letsflow.ai/v1/tickets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.letsflow.ai/v1/tickets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.letsflow.ai/v1/tickets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/tickets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"resource": "ticket",
"org_id": "<string>",
"team_id": "<string>",
"key": "<string>",
"type": "<string>",
"title": "<string>",
"description": "<string>",
"status": "<string>",
"priority_kind": "<string>",
"pending_prompt_summary": {},
"source_channel_kind": "<string>",
"requester": {
"id": "<string>",
"actor_type": "<string>",
"principal_id": "<string>",
"internal_key": "<string>",
"display_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
},
"opened_by": {
"id": "<string>",
"actor_type": "<string>",
"principal_id": "<string>",
"internal_key": "<string>",
"display_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
},
"assignee": {
"id": "<string>",
"actor_type": "<string>",
"principal_id": "<string>",
"internal_key": "<string>",
"display_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
},
"assignment_team_id": "<string>",
"ownership": {
"assignee": {
"kind": "flow",
"display_name": "<string>",
"avatar_url": "<string>"
},
"assignment_team": {
"display_name": "<string>"
}
},
"linked": {
"access_request": {
"id": "<string>",
"status": "<string>",
"entitlement_id": "<string>",
"entitlement_display_name": "<string>"
},
"approval_request": {
"id": "<string>",
"status": "<string>",
"current_stage": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "<string>",
"order": 2,
"status": "<string>",
"decision_policy": "any_one",
"approvals_required": 2,
"eligible_approvers": [
{
"principal_id": "<string>",
"display_name": "<string>"
}
],
"viewer_can_decide": true,
"expires_at": "2023-11-07T05:31:56Z",
"approval_count": 1,
"denial_count": 1,
"approvals_received": 1
},
"expires_at": "<string>"
},
"workflow_run": {
"id": "<string>",
"status": "requested",
"wait_reason_kind": "pre_admission_approval",
"error_summary": {
"phase": "validate",
"failure_class": "validation",
"code": "<string>",
"status_hint": "waiting",
"retry_disposition": "retry_same_operation",
"retryable": true,
"summary": "<string>",
"detail": "<string>",
"surfaces": {
"builder_message": "<string>",
"operator_message": "<string>"
},
"canonical_refs": {},
"provider_context": {},
"cause_chain": [
{
"code": "<string>",
"name": "<string>",
"summary": "<string>",
"detail": "<string>",
"retryable": true,
"source": "<string>"
}
],
"support_handoff": {},
"captured_at": "<string>"
},
"workflow_id": "<string>",
"workflow_publication_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_revision_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_revision_build_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"request_id": "<string>",
"correlation_id": "<string>",
"details_access": "allowed"
}
},
"created_at": "<string>",
"updated_at": "<string>",
"resolved_at": "<string>",
"closed_at": "<string>",
"canceled_at": "<string>",
"duration_ms": 123,
"duration_ended_at": "<string>",
"externally_synced": true,
"channel_thread_captured": true,
"links": {},
"requester_automation": {
"fulfillment": "unconfirmed",
"label": "<string>",
"reason": "<string>",
"acceptedAt": "2023-11-07T05:31:56Z",
"nextAction": {
"actor": "none",
"requiredByViewer": true,
"message": "<string>"
}
},
"sync_provider_system_kind": "jira_service_management"
}
],
"page": {
"cursor": "<string>",
"next_cursor": "<string>",
"has_more": true,
"limit": 123
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
},
"groups": [
{
"key": "<string>",
"value": "<string>",
"label": "<string>",
"count": 1
}
]
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "access_grant_admin_extension_required",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"re_auth_required": true,
"violations": [
{
"field": "<string>",
"message": "<string>",
"capability": "<string>",
"details": {}
}
],
"diagnostics": [
{
"code": "<string>",
"severity": "info",
"message": "<string>",
"fixHint": "<string>",
"location": {
"file": "<string>",
"line": 2,
"column": 2,
"stepId": "<string>"
}
}
]
}Authorizations
OAuth Bearer access tokens or Flow API keys with the required Flow scope families for the route.
Query Parameters
Opaque cursor for list pagination.
Requested page size for list operations.
1 <= x <= 100Optional conversation search text. Matches ticket key, title, and description as a case-insensitive substring. Matches requester display names as a case-insensitive word prefix. Matches active external provider ticket numbers as a case-insensitive substring.
Filter tickets by team scope.
Filter tickets by one or more owning-team IDs.
Filter tickets by one or more ticket status kinds.
open, pending, on_hold, resolved, closed, canceled Filter tickets by one or more ticket priority kinds.
low, normal, high, urgent Filter tickets by one or more requester principal IDs.
Filter tickets by one or more assignee principal IDs.
When true, includes tickets with no assignee. Tickets assigned to Flow are not included. Can be combined with assignee_principal_ids and assignee_flow.
When true, includes tickets assigned to the canonical Flow actor in the assignee facet filter. Can be combined with assignee_principal_ids and assignee_unassigned.
Filter tickets by displayed primary sync provider (oldest qualifying active sync link). Combined with sync_provider_flow_native as an OR.
jira_service_management, servicenow When true, includes tickets with no qualifying sync link (Flow-native conversations). Can be combined with sync_provider_system_kinds.
Filter tickets by assignment queue relative to the authenticated operator: 'mine' (assigned to you), 'unassigned' (no assignee), or 'team' (assigned to another human). Combined with org-wide visibility scoping. When this parameter is set and both sort_field and sort_desc are omitted, results are ordered highest priority first, then newest updated_at.
mine, unassigned, team When true, excludes terminal-status tickets (resolved, closed, canceled) from the result set.
Server-side ticket list sort field. Omit both this and sort_desc to use the endpoint default: with assignment_scope, highest priority then newest updated_at; otherwise newest updated_at. The assignment-scope default is not a sort_field enum value.
key, updated_at, status_kind, priority_kind When true, sorts the selected ticket list field descending. Defaults to true for the endpoint default ordering and false when sort_field is explicitly provided without sort_desc. Sending sort_desc without sort_field selects updated_at order and opts out of the assignment-scope priority-first default.
Return group summaries with full counts. Set group_key to return rows in one group.
status_kind, priority_kind, assignee, sync_provider_system_kind Canonical JSON string or null from a group summary key. Requires group_field.
Opaque next cursor for group summaries. Cannot be combined with group_key or cursor.