curl --request POST \
--url https://app.letsflow.ai/v1/instructions/resources/resolve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"owningTeamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"knowledgeDocumentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"automationPublicationIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"mode": "strict"
}
'import requests
url = "https://app.letsflow.ai/v1/instructions/resources/resolve"
payload = {
"owningTeamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"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({
owningTeamId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
knowledgeDocumentIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
automationPublicationIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
mode: 'strict'
})
};
fetch('https://app.letsflow.ai/v1/instructions/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/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([
'owningTeamId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'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/resources/resolve"
payload := strings.NewReader("{\n \"owningTeamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\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/resources/resolve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"owningTeamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\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/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 \"owningTeamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\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 or preview resource selections before creating an instruction
Requires builder.write and verified authoring authority for the proposed owningTeamId: guidance.write and enabled guidance capability for a team, or organization administrator authority when null. Both resource ID arrays are required, may be empty and accept at most 20 UUIDs each, unique after case normalization. Results preserve each selection’s 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 reauthorizes each resource and returns inaccessible, missing or foreign resources only as ID, position and availability: unavailable. Nonempty selections require runtime.read even in preview; lacking scope returns 403 insufficient_scope. Neither mode saves an instruction, grants access or executes automations; create, save and publish remain strict. 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. Missing owner authority returns 403, including instruction_authoring_required for organization ownership. Disabled team guidance capability returns 409 capability_disabled; automation resolution on an unsupported catalog surface returns 409 catalog_surface_unsupported.
curl --request POST \
--url https://app.letsflow.ai/v1/instructions/resources/resolve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"owningTeamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"knowledgeDocumentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"automationPublicationIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"mode": "strict"
}
'import requests
url = "https://app.letsflow.ai/v1/instructions/resources/resolve"
payload = {
"owningTeamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"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({
owningTeamId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
knowledgeDocumentIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
automationPublicationIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
mode: 'strict'
})
};
fetch('https://app.letsflow.ai/v1/instructions/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/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([
'owningTeamId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'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/resources/resolve"
payload := strings.NewReader("{\n \"owningTeamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\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/resources/resolve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"owningTeamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\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/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 \"owningTeamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\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.
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