curl --request POST \
--url https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"knowledgeDocumentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"automationPublicationIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"mode": "strict"
}
'import requests
url = "https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve"
payload = {
"knowledgeDocumentIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"automationPublicationIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"mode": "strict"
}
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({
knowledgeDocumentIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
automationPublicationIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
mode: 'strict'
})
};
fetch('https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve', 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/instructions/{instructionId}/resources/resolve",
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([
'knowledgeDocumentIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'automationPublicationIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'mode' => 'strict'
]),
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/instructions/{instructionId}/resources/resolve"
payload := strings.NewReader("{\n \"knowledgeDocumentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"automationPublicationIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"mode\": \"strict\"\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/instructions/{instructionId}/resources/resolve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"knowledgeDocumentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"automationPublicationIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"mode\": \"strict\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve")
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 \"knowledgeDocumentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"automationPublicationIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"mode\": \"strict\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"knowledge": [
{
"knowledgeDocumentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 123,
"availability": "unavailable"
}
],
"automations": [
{
"automationPublicationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 123,
"availability": "unavailable"
}
]
},
"meta": {}
}{
"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>"
}
}
]
}Resolve a strict selection or explicitly preview per-resource availability
Requires stored instruction-owner read access and independently reauthorizes every selected resource. Both resource ID arrays are required, may be empty and accept at most 20 UUIDs each, unique after case normalization. Results preserve selection order with zero-based positions. Omitted mode is strict: unavailable knowledge or automation selections return 422 instruction_knowledge_unavailable or instruction_automation_unavailable. Explicit preview returns inaccessible, missing or foreign resources only as ID, position and availability: unavailable; it does not bypass instruction authorization. Nonempty selections require runtime.read even in preview; lacking scope returns 403 insufficient_scope. Neither mode saves or executes anything; create, save and publish remain strict. A missing or invisible instruction returns 404 instruction_not_found. Invalid JSON or a non-object body returns 400 invalid_json or invalid_request_body; a body over 2 MiB returns 413 request_body_too_large; invalid request fields return 422 instruction_request_invalid. Automation resolution on an unsupported catalog surface returns 409 catalog_surface_unsupported.
curl --request POST \
--url https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"knowledgeDocumentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"automationPublicationIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"mode": "strict"
}
'import requests
url = "https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve"
payload = {
"knowledgeDocumentIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"automationPublicationIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"mode": "strict"
}
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({
knowledgeDocumentIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
automationPublicationIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
mode: 'strict'
})
};
fetch('https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve', 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/instructions/{instructionId}/resources/resolve",
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([
'knowledgeDocumentIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'automationPublicationIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'mode' => 'strict'
]),
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/instructions/{instructionId}/resources/resolve"
payload := strings.NewReader("{\n \"knowledgeDocumentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"automationPublicationIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"mode\": \"strict\"\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/instructions/{instructionId}/resources/resolve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"knowledgeDocumentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"automationPublicationIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"mode\": \"strict\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/instructions/{instructionId}/resources/resolve")
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 \"knowledgeDocumentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"automationPublicationIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"mode\": \"strict\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"knowledge": [
{
"knowledgeDocumentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 123,
"availability": "unavailable"
}
],
"automations": [
{
"automationPublicationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 123,
"availability": "unavailable"
}
]
},
"meta": {}
}{
"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.
Path Parameters
Body
2020Strict rejects unavailable selections. Preview returns authorized resources and opaque unavailable identities without changing authoring authority. Create, save and publish still validate selections strictly.
strict, preview