Quickstart
Sign up, get an API key, and make your first evaluation in five minutes.
- A FlowBeacon admin account on the target organization.
- The ability to make HTTPS requests from a server (this is not a browser API).
- One Make.com scenario already imported into your organization.
1. Create an account
If you don't have a FlowBeacon account yet, sign up at app.flowbeacon.ai. If your organization already has an account, ask an admin to invite you.
2. Get an API key
- Sign in to the FlowBeacon web console.
- Navigate to Settings → API Keys (
/settings/api-keys). - Click Create API key, give it a name (for example
make-grid-production), pick the permissions you need, and optionally set an IP allowlist and an expiration date. - Copy the raw key shown in the reveal dialog, then tick the "I've stored this key" confirmation.
Once you dismiss this dialog, the raw value cannot be retrieved. If you lose it, rotate or recreate the key — there is no recovery flow.
Keys look like:
fb_live_EXAMPLE_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3. Verify reachability
The health endpoint requires no authentication and no signature — use it to confirm DNS, TLS, and routing.
curl -sS https://api.flowbeacon.ai/api/public/v1/governance/health
Response:
{ "ok": true, "service": "flowbeacon-public-api", "version": "1.0.0" }
4. Submit your first evaluation
Every authenticated request needs both an Authorization header and an X-FB-Signature HMAC header. The snippets below compute the signature inline. See Sign requests with HMAC for the deep dive.
/evaluate
- TypeScript
- Python
- cURL (bash)
import crypto from 'node:crypto';
const API_KEY = process.env.FLOWBEACON_API_KEY!;
const ORG_ID = process.env.FLOWBEACON_ORG_ID!;
const BASE = 'https://api.flowbeacon.ai/api/public/v1';
const PATH = '/evaluate';
const PREFIX = '/api/public/v1';
const ts = Math.floor(Date.now() / 1000);
const body = JSON.stringify({
scenario_ids: ['4729318'],
org_id: ORG_ID,
});
const sig = crypto
.createHmac('sha256', API_KEY)
.update(`${ts}.POST.${PREFIX}${PATH}.${body}`)
.digest('hex');
const res = await fetch(`${BASE}${PATH}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
'X-FB-Signature': `t=${ts},v1=${sig}`,
},
body,
});
const { data } = await res.json();
console.log(data.evaluation_id);
import hashlib, hmac, json, os, time, httpx
API_KEY = os.environ["FLOWBEACON_API_KEY"]
ORG_ID = os.environ["FLOWBEACON_ORG_ID"]
BASE = "https://api.flowbeacon.ai/api/public/v1"
PATH = "/evaluate"
PREFIX = "/api/public/v1"
ts = int(time.time())
body = json.dumps(
{"scenario_ids": ["4729318"], "org_id": ORG_ID},
separators=(",", ":"),
)
sig = hmac.new(
API_KEY.encode(),
f"{ts}.POST.{PREFIX}{PATH}.{body}".encode(),
hashlib.sha256,
).hexdigest()
r = httpx.post(
f"{BASE}{PATH}",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-FB-Signature": f"t={ts},v1={sig}",
},
content=body,
)
print(r.json()["data"]["evaluation_id"])
API_KEY="fb_live_EXAMPLE_xxxxxxxxxxxxxxxxxxxx"
ORG_ID="org_example_01HZYABCDEFGHJKMNPQRSTVWXY"
BASE="https://api.flowbeacon.ai/api/public/v1"
PREFIX="/api/public/v1"
sign() {
local method="$1" path="$2" body="$3" ts sig
ts=$(date +%s)
sig=$(printf '%s.%s.%s.%s' "$ts" "$method" "$path" "$body" \
| openssl dgst -sha256 -hmac "$API_KEY" -binary | xxd -p -c 256)
printf 't=%s,v1=%s' "$ts" "$sig"
}
BODY="{\"scenario_ids\":[\"4729318\"],\"org_id\":\"$ORG_ID\"}"
SIG=$(sign POST "$PREFIX/evaluate" "$BODY")
curl -sS -X POST "$BASE/evaluate" \
-H "Authorization: Bearer $API_KEY" \
-H "X-FB-Signature: $SIG" \
-H "Content-Type: application/json" \
-d "$BODY"
Response (200):
{
"ok": true,
"data": {
"evaluation_id": "req_example_01HZYABC0K7M3P4QVZ9TN2RXEK",
"status": "processing",
"total_scenarios": 1,
"result_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EXAMPLE.EXAMPLE"
},
"meta": { "watermark": "wm_a1b2c3d4" }
}
5. Poll for completion
GET/evaluations/{evaluation_id}
SIG=$(sign GET "$PREFIX/evaluations/req_example_01HZYABC0K7M3P4QVZ9TN2RXEK" "")
curl -sS https://api.flowbeacon.ai/api/public/v1/evaluations/req_example_01HZYABC0K7M3P4QVZ9TN2RXEK \
-H "Authorization: Bearer $API_KEY" \
-H "X-FB-Signature: $SIG"
When status == "complete" the response contains a scenarios[] array with per-scenario scores, violation counts, and module-level rollups.
Register a webhook and react to evaluation.complete deliveries instead. The polling loop above is fine for one-off scripts; webhooks scale better in production.
6. Fetch detailed results
GET/scenarios/{scenario_id}/results
Either:
- Use the one-shot result token returned by
POST /evaluate—GET /results/{token}. Single-use, 15-minute TTL. - Or fetch one scenario at a time with
GET /scenarios/{id}/results(idempotent, cacheable).
SIG=$(sign GET "$PREFIX/scenarios/4729318/results" "")
curl -sS "$BASE/scenarios/4729318/results" \
-H "Authorization: Bearer $API_KEY" \
-H "X-FB-Signature: $SIG"
The response includes a violations[] array, a per-module rollup, and an evaluation_status field — check evaluation_status before showing a green badge to a user.
Next steps
- Authentication — full walkthrough of Bearer + HMAC.
- Handle webhooks — replace the polling loop.
- Rate limits and retries — what to do on
429. - Error taxonomy — every
errorcode and what to do about it.