Documentation

POST /api/intent

Ask the engine what it would change on a surface, and why.

RequestPOST /api/intent
AuthenticationSession cookie required
Handlerbackend/server.py

What it does

The proposal half of the guided-edit loop. The engine answers with what it would do and the dated row that justifies it; nothing is applied. `POST /api/intent/apply` then echoes that proposal back to commit it, which is what makes a stale proposal detectable.

Authentication

Session cookie required. Send the ff_session cookie. Without one the engine treats the caller as a new visitor with no holds and no claims, and returns a new cookie to use from then on.

Parameters

ParameterInTypeRequiredDescription
ff_sessioncookiestringOptionalThe session identifier. Omit it on the first call and store the value the response sets; every later call must send the same one or the engine treats the caller as a new visitor with no holds and no claims.
surfacebodystringRequiredThe surface to propose against — the store area being edited.
requestedbodystringRequiredWhat the founder asked for, in their own words.

Request

The cookie jar carries the session between calls. Angle-bracketed values are the parameter types from the table above.

curl -s -b cookies.txt -c cookies.txt \
  -X POST -H 'Content-Type: application/json' \
  -d '{"surface":"<string>","requested":"<string>"}' \
  "https://flowfinds.ai/api/intent"
const res = await fetch("https://flowfinds.ai/api/intent", {
  method: "POST",
  credentials: "include",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "surface": "<string>",
    "requested": "<string>"
  }),
});
const data = await res.json();
import requests

s = requests.Session()
r = s.post("https://flowfinds.ai/api/intent", json={
    "surface": "<string>",
    "requested": "<string>"
  })
data = r.json()

Recorded example

curl -s -b cookies.txt -c cookies.txt \
  -X POST -H 'Content-Type: application/json' \
  -d '{"surface":"…","requested":"…"}' \
  "$FLOWFINDS_ORIGIN/api/intent"

Responses

200A proposal was produced. It carries `because` and `source_row`: no intent is proposed without a dated row that justifies it.

200Refused.

FieldTypeDescription
statusstring`refused`.
reasonstring`no_product`, `not_an_intent`, `no_row_justifies_this`, `unknown_section` or `unknown_surface`.

Errors

This endpoint has no failure path of its own. An uncaught exception anywhere in the engine is still returned as structured JSON by the shared guard.

Related

Back to the API reference index, or read the cookbook for recipes that compose this endpoint with others.