curl --request POST \
--url https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"provider_key": "<string>",
"team_application_binding_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reply_target_id": "<string>"
}
}
'import requests
url = "https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions"
payload = { "data": {
"provider_key": "<string>",
"team_application_binding_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reply_target_id": "<string>"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
provider_key: '<string>',
team_application_binding_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
reply_target_id: '<string>'
}
})
};
fetch('https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions', 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/{key}/remote_support_sessions",
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([
'data' => [
'provider_key' => '<string>',
'team_application_binding_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'reply_target_id' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions"
payload := strings.NewReader("{\n \"data\": {\n \"provider_key\": \"<string>\",\n \"team_application_binding_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reply_target_id\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"provider_key\": \"<string>\",\n \"team_application_binding_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reply_target_id\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"provider_key\": \"<string>\",\n \"team_application_binding_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reply_target_id\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"provider_key": "<string>",
"provider_display_name": "<string>",
"provider_session_id": "<string>",
"requester_join_link": "<string>",
"operator_join_link": "<string>",
"can_end": true,
"status": "created",
"failure_message": "<string>",
"requester_message_id": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"ended_at": "<string>"
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
}
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "demo_data_unavailable",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"recovery": "fix",
"retry_after": 1,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"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>"
}
}
],
"source_files": {}
}Start a remote support session
Start an attended remote support session for the ticket requester through an eligible connected provider. The requester receives only the join link through the normal requester reply channel; operator-only session links stay on the conversation card.
curl --request POST \
--url https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"provider_key": "<string>",
"team_application_binding_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reply_target_id": "<string>"
}
}
'import requests
url = "https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions"
payload = { "data": {
"provider_key": "<string>",
"team_application_binding_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reply_target_id": "<string>"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
provider_key: '<string>',
team_application_binding_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
reply_target_id: '<string>'
}
})
};
fetch('https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions', 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/{key}/remote_support_sessions",
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([
'data' => [
'provider_key' => '<string>',
'team_application_binding_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'reply_target_id' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions"
payload := strings.NewReader("{\n \"data\": {\n \"provider_key\": \"<string>\",\n \"team_application_binding_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reply_target_id\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"provider_key\": \"<string>\",\n \"team_application_binding_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reply_target_id\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/tickets/{key}/remote_support_sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"provider_key\": \"<string>\",\n \"team_application_binding_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reply_target_id\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"provider_key": "<string>",
"provider_display_name": "<string>",
"provider_session_id": "<string>",
"requester_join_link": "<string>",
"operator_join_link": "<string>",
"can_end": true,
"status": "created",
"failure_message": "<string>",
"requester_message_id": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"ended_at": "<string>"
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
}
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "demo_data_unavailable",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"recovery": "fix",
"retry_after": 1,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"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>"
}
}
],
"source_files": {}
}Authorizations
Headers
Optional idempotency key for retry-safe write operations. For implemented representative writes, the same key plus the same request fingerprint replays the accepted result with meta.replayed=true in the response body. Stored HTTP responses for create requests in the customer API retain their original success status, including 201 Created and 202 Accepted. An in-progress key returns 409 idempotency_key_in_progress. A reused key with a different request fingerprint returns 409 idempotency_key_reused. Replay state is not signaled through an X-Idempotent-Replayed header.
255