Documentation
POST /api/organic/approve
Approve a researched campaign for a platform and scope.
| Request | POST /api/organic/approve |
|---|---|
| Authentication | Session cookie required |
| Handler | backend/organic.py |
What it does
Records an approval with its scopes. This writes the approval log; it does not post to any platform. Approval and execution are separate rows, and the log shows whether anything was ever executed against an approval.
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
ff_session | cookie | string | Optional | The 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. |
platform | body | string | Required | The platform being approved for. |
query | body | string | Required | The researched query being approved. |
scopes | body | string[] | Required | What the approval covers. |
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 '{"platform":"<string>","query":"<string>","scopes":"<string[]>"}' \
"https://flowfinds.ai/api/organic/approve"const res = await fetch("https://flowfinds.ai/api/organic/approve", {
method: "POST",
credentials: "include",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"platform": "<string>",
"query": "<string>",
"scopes": "<string[]>"
}),
});
const data = await res.json();import requests
s = requests.Session()
r = s.post("https://flowfinds.ai/api/organic/approve", json={
"platform": "<string>",
"query": "<string>",
"scopes": "<string[]>"
})
data = r.json()Recorded example
curl -s -b cookies.txt -c cookies.txt \
-X POST -H 'Content-Type: application/json' \
-d '{"platform":"…","query":"…","scopes":["…"]}' \
"$FLOWFINDS_ORIGIN/api/organic/approve"Responses
200 — The approval was recorded.
200 — Refused.
| Field | Type | Description |
|---|---|---|
status | string | `refused`. |
reason | string | `nothing_to_approve`. |
explanation | string | The reason's sentence. |
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
GET /api/ad— The ad artifact for the session's product, with its pass criteria.POST /api/ad/edit— Override the ad copy, or reset it to the generated version.POST /api/growth/edit— Edit a growth artifact in natural language.GET /api/ads-manager— The campaign book.POST /api/ads-manager— Save the campaign book.GET /api/adbalance— The advertising balance, its ledger and any pending top-ups.POST /api/adbalance— Start a balance top-up.GET /api/adbalance/confirm— Retired. Balance confirmation is no longer client-driven.
Back to the API reference index, or read the cookbook for recipes that compose this endpoint with others.