Decentralised consensus for critical operations. When enabled, financial API calls require network approval before they execute.
FFP is an optional security layer that sits between your agents and high-stakes external services (payment processors, exchanges, etc.). When an agent tries to call a protected domain, FFP submits a consensus proposal to the network. The operation only proceeds if the network approves it within 30 seconds.
This is useful when you want a second layer of verification beyond standard authentication — for example, in automated trading bots, multi-agent financial workflows, or anywhere you cannot afford a rogue or compromised agent to make real money moves unilaterally.
net_http_post to https://api.binance.com/...GET /api/ffp/audit/:agentId.When FFP_REQUIRE_CONSENSUS=true, the following domains require consensus approval before any HTTP call is allowed:
binance.comCrypto exchangecoinbase.comCrypto exchangekraken.comCrypto exchangestripe.comPayment processorpaypal.comPayment processorbraintreepayments.comPayment processorAll other domains pass through without any FFP overhead.
FFP is controlled entirely through environment variables. Set these in your deployment environment (Vercel, Docker, .env, etc.):
# Required to activate FFP FFP_MODE=enabled # The chain/network identifier for your FFP node FFP_CHAIN_ID=mainnet # URL of the FFP network node you are connecting to FFP_NODE_URL=https://your-ffp-node.example.com # This deployment's agent identity on the FFP network FFP_AGENT_ID=agent_abc123... # Set to true to actually block protected domains pending consensus # Without this, FFP logs operations but doesn't block anything FFP_REQUIRE_CONSENSUS=true
FFP_MODE, FFP_CHAIN_ID, FFP_NODE_URL, or FFP_AGENT_ID are missing, FFP is automatically disabled and all calls are no-ops — existing deployments are completely unaffected./api/ffp/statusReturns current FFP configuration: whether it is enabled, the chain ID, node URL, and whether consensus is required.
{
"enabled": true,
"chainId": "mainnet",
"nodeUrl": "https://...",
"requireConsensus": true
}/api/ffp/audit/:agentIdQuery all operations logged on the FFP chain for a given agent. Optional query params: chain_id, start_time, end_time.
[
{
"primitive": "net",
"action": "http_post",
"params": { "url": "https://api.binance.com/..." },
"result": { "approved": true },
"timestamp": 1743500000,
"agentId": "agent_abc123..."
}
]/api/ffp/consensus/:agentIdQuery the consensus proposal history for an agent — which proposals were submitted, approved, denied, or timed out.
[
{
"proposalId": "prop_xyz...",
"domain": "binance.com",
"status": "approved",
"createdAt": "2026-03-31T..."
}
]curl -s https://agentos-app.vercel.app/api/ffp/status \ -H "Authorization: Bearer $ADMIN_TOKEN" | jq
When FFP is not configured, every call to ffpLog() and ffpConsensus() is a synchronous no-op — it returns immediately without any network call or side effect.
This means you can deploy AgentOS without FFP and it will never slow down a single request. FFP only adds latency (the consensus round trip) when it is explicitly enabled AND the target domain is in the protected list.