curl --request POST \
--url https://app.letsflow.ai/v1/guidance_rules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"content": "<string>",
"expected_active_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"expected_draft_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.letsflow.ai/v1/guidance_rules"
payload = {
"content": "<string>",
"expected_active_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"expected_draft_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
content: '<string>',
expected_active_version_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
title: '<string>',
expected_draft_version_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.letsflow.ai/v1/guidance_rules', 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/guidance_rules",
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([
'content' => '<string>',
'expected_active_version_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'title' => '<string>',
'expected_draft_version_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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/guidance_rules"
payload := strings.NewReader("{\n \"content\": \"<string>\",\n \"expected_active_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\",\n \"expected_draft_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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/guidance_rules")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"content\": \"<string>\",\n \"expected_active_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\",\n \"expected_draft_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/guidance_rules")
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 \"content\": \"<string>\",\n \"expected_active_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\",\n \"expected_draft_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"rule_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"draft_version": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 123,
"title": "<string>",
"content": "<string>",
"token_estimate": 123
}
},
"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": "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>"
}
}
]
}Create Flow instruction draft
Create or reuse the default team-scoped Flow instruction rule and save unpublished instruction content as an immutable guidance version draft.
curl --request POST \
--url https://app.letsflow.ai/v1/guidance_rules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"content": "<string>",
"expected_active_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"expected_draft_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.letsflow.ai/v1/guidance_rules"
payload = {
"content": "<string>",
"expected_active_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"expected_draft_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
content: '<string>',
expected_active_version_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
title: '<string>',
expected_draft_version_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.letsflow.ai/v1/guidance_rules', 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/guidance_rules",
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([
'content' => '<string>',
'expected_active_version_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'title' => '<string>',
'expected_draft_version_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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/guidance_rules"
payload := strings.NewReader("{\n \"content\": \"<string>\",\n \"expected_active_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\",\n \"expected_draft_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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/guidance_rules")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"content\": \"<string>\",\n \"expected_active_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\",\n \"expected_draft_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/guidance_rules")
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 \"content\": \"<string>\",\n \"expected_active_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\",\n \"expected_draft_version_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"rule_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"draft_version": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 123,
"title": "<string>",
"content": "<string>",
"token_estimate": 123
}
},
"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": "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
Team authoring scope for the guidance rule.
Body
Team instruction body. Must be non-empty after trimming and at most 7,968 characters. That limit keeps the customer-prompt budget (2,000 of the shared 4,000 guidance tokens via ceil((length + 32) / 4)) from consuming room needed for organization instructions.
7968Published instruction version the client last read. Send null when no version is published. A stale publication returns a conflict before a draft is created.
Draft version the client last read. Omit to skip the draft-specific concurrency check; the active-version check still applies. Send null when asserting no unpublished draft exists yet.