Skip to content

Flux Decentralized Cloud API (8.18.0)

Flux API Documentation

Welcome to the comprehensive API reference for Flux, the world's leading decentralized Web3 cloud computing platform. This documentation covers all available API endpoints for interacting with the Flux network, nodes, and decentralized applications.

About Flux

Flux is a decentralized Web3 cloud infrastructure powered by globally distributed, user-operated nodes. Built for scalability and censorship resistance, Flux eliminates single points of failure while providing enterprise-grade computing resources for deploying and managing applications.

Key Features

  • 🌐 Decentralized Infrastructure: ~6,400 confirmed FluxNodes worldwide providing 52,000+ CPU cores, 170TB+ RAM and 3PB+ SSD storage across three tiers (Cumulus, Nimbus, Stratus)
  • ⚡ High Performance: Enterprise-grade computing with automatic placement, fault-domain spreading and high availability
  • 🔐 Secure by Design: Multiple authentication methods, enterprise app encryption and runtime tampering detection
  • 💰 Cost Effective: Competitive pricing compared to traditional cloud providers
  • 🚀 Developer Friendly: Docker-based deployments with comprehensive API support
  • 🛡️ ArcaneOS: Hardened, attested node operating system with hardware-backed key custody

Network figures are a live snapshot; query GET /daemon/getfluxnodecount or stats.runonflux.io for current totals.

API Architecture

The Flux API uses a seven-level permission model to ensure secure and controlled access. Every endpoint in this document ends its description with the level it requires:

Permission LevelDescriptionAuthentication Required
PublicOpen access endpoints❌ No
User (user)Any FluxID with a valid signature and a live session✅ Yes
FluxTeam (fluxteam)Flux Team and Flux Support identities✅ Yes
Admin (admin)The operator of this node (initial.zelid in its config)✅ Yes
AdminAndFluxTeam (adminandfluxteam)Node operator or Flux Team✅ Yes
AppOwner (appowner)The FluxID that registered the application✅ Yes
AppOwnerAbove (appownerorfluxteam)Application owner or Flux Team✅ Yes

Every privilege is a set of identities and asks whether the caller is one of them — the compounds read OR, never AND. admin is a hardware role: the node operator administers the machine and is not a party to a customer's application, so app verbs (appstart, appremove, appkill, redeploy, …) require AppOwnerAbove rather than Admin.

Request Methods

  • GET: Most endpoints support GET requests with parameters as query strings or path variables
  • POST: Used for endpoints requiring large payloads or sensitive data
  • WebSocket: Used for real-time communication and simplified authentication flows

Supported Wallet Authentication

Flux supports multiple modern authentication methods for maximum flexibility and security:

🛡️ SSP Wallet

Secure, Simple, Powerful - The next-generation 2FA wallet with enterprise security:

  • True 2-of-2 Multi-Signature: Requires both browser extension and mobile app authorization
  • Advanced Security: BIP48 derivation, Account Abstraction (ERC-4337), Schnorr signatures
  • Multi-Chain Support: Bitcoin, Ethereum, Polygon, BSC, Avalanche, and 15+ blockchains
  • WalletConnect v2: Connect to thousands of dApps seamlessly
  • Professional Audit: Thoroughly audited by security experts in 2025

Installation:

🔑 ZelCore Wallet

Multi-Asset Cryptocurrency Wallet - The original Flux ecosystem wallet:

  • Self-Custodial: Full control over your private keys
  • Decentralized 2FA (d2FA): Unique blockchain-based two-factor authentication
  • Multi-Chain: Support for 80+ blockchains and thousands of assets
  • Hardware Integration: Connect with hardware wallets for enhanced security
  • Deep Linking: Native zel: protocol support

Installation: zelcore.io

🦊 MetaMask Integration

Ethereum Ecosystem Wallet - Popular browser extension wallet:

  • Ethereum Native: Full Ethereum and EVM chain support
  • Sign-In with Ethereum (SIWE): ERC-4361 standard compliance
  • Wide Adoption: Most popular Web3 wallet with extensive dApp support
  • Domain Binding: Advanced phishing protection

Installation: metamask.io

🔗 WalletConnect v2

Universal Wallet Connection Protocol - Connect any compatible wallet:

  • 700+ Wallets: Support for hundreds of popular wallets
  • Cross-Platform: Mobile, desktop, and web wallet compatibility
  • Secure Bridge: Encrypted communication between wallet and dApp
  • QR Code Connection: Simple mobile wallet connection

📧 Traditional Authentication

Email-Based Login - For users preferring traditional authentication:

  • Firebase Integration: Google Firebase authentication backend
  • Email/Password: Standard username/password login
  • Google OAuth: Sign in with Google account
  • Account Recovery: Standard password reset flows

Getting Started

Follow these steps to start using the Flux API:

1. Choose Your Authentication Method

Select from the supported wallet options above based on your development needs and user preferences. All methods are supported by the FluxOS API.

2. Set Up Your Wallet

Install and configure your chosen wallet:

  • Download from official sources only
  • Secure your seed phrase or recovery information
  • Enable two-factor authentication where available
  • Test with small amounts first

3. Obtain Authentication Credentials

Follow the Authentication section in this API documentation to:

  • Generate login phrases
  • Sign authentication messages
  • Obtain session tokens
  • Set up API headers

4. Configure API Headers

Authenticated requests carry a single zelidauth header. It is a URL-encoded query string, not JSON:

zelidauth: zelid=<address>&signature=<urlencoded-signature>&loginPhrase=<phrase>

A complete example:

zelidauth: zelid=1CbErtneaX2QVyUfwU7JGB7VzvPgrgc3uC&signature=H%2BZB3oSrsw6XkBxxlbwk33LEBJYvqtbMIm2kL9JzuoXMC6pSZd0lBHdnhJYzMTXv81zZQ7G%2FpkK1NvYN7cNF0GE%3D&loginPhrase=1574991374806spbcvsuwerl52tppx9dw5khuz8rew13mkq86gg8r2c

Signatures are base64 and routinely contain +, / and = — all three change meaning inside a query string, so the signature must be URL-encoded or the request will be refused as unauthentic.

5. Start Making API Calls

Test your setup with public endpoints first, then proceed to authenticated endpoints once your credentials are properly configured.

Support & Community


FluxOS is free software published under the GNU AGPLv3. Flux, FluxOS, FluxNode and ArcaneOS are projects of InFlux Technologies USA LLC. © 2026 InFlux Technologies USA LLC.

🚀 Ready to build on the decentralized web? Let's get started!

Important Notes

  • Login phrases expire after 15 minutes
  • Session tokens are valid for up to 14 days
  • Always use HTTPS in production environments
  • Signature values must be URL-encoded inside the zelidauth header

Response Envelope & Error Handling

This is the single most important thing to know about the Flux API.

A request that reaches a handler is answered at HTTP 200, in the body — including when the answer is a failure:

{ "status": "success", "data": { ... } }
{ "status": "error",   "data": { "code": 401, "name": "Unauthorized", "message": "..." } }

The code inside an error body is a FluxOS code, not a wire status. A removed endpoint answers HTTP 200 with data.code: 410; an unauthorised call answers HTTP 200 with data.code: 401. A client that branches on response.ok or response.status will read every one of these as a success.

const res = await fetch(url, { headers: { zelidauth } });
const body = await res.json();
if (body.status !== 'success') {      // <- the check that matters
  throw new Error(body.data?.message ?? 'Flux API error');
}

The in-band shape exists so that a transport failure cannot impersonate a service answer. Wire statuses are therefore reserved for refusals that happen before a handler runs, and for a handful of endpoints that deliberately speak HTTP semantics:

StatusWhere it comes from
403requireHttps — an ArcaneOS endpoint reached over plain HTTP
503 / 400route guards — the node has not finished booting, or query parameters were sent to a route that rejects them
413a request body too large to accept
404a resource that does not exist to be addressed (an unknown operation id, a stream that is not enabled)
202an endpoint that started long-running work — see below

Endpoints that use wire statuses say so in their own responses section. Everything else answers 200 and puts the outcome in status.

Long-Running Operations

Work whose duration scales with the data — copying, compressing or extracting inside an application volume — does not block the request. It answers 202 Accepted with a jobId, a Location header pointing at the status resource and a Retry-After header:

{ "status": "success",
  "data": { "jobId": "op_2f8f...", "statusUrl": "/apps/operations/op_2f8f...", "status": "Running" } }

Poll GET /apps/operations/{jobId} until data.status reaches a terminal value. Completion is read from that field, never from the HTTP code — a failed operation is still a successful poll.

statusMeaning
Runningstill working; respect Retry-After
Succeededfinished
Failedthe work could not be done — error carries an RFC 9457 problem object
Canceledthe caller asked for it via DELETE /apps/operations/{jobId}
Evictedthe node took the work away — neither the caller's request nor their input was at fault

Cancellation is best effort: the flag is raised and the worker stops at its next checkpoint, so status stays Running until it does.

Unknown, expired and not-yours are one answer (404) — a jobId must not reveal whether someone else has an operation running.

Node-Scoped vs Network-Scoped Calls

Every endpoint in this specification is served by an individual FluxNode. The https://api.runonflux.io gateway load-balances across confirmed nodes, so it is the right target for network-wide data (blockchain state, global application specifications, node lists) and the wrong target for anything that reports or changes the state of one machine.

Call a specific node directly — https://<node-ip>:16127 — for:

  • node status, benchmark, tier, DOS state, clock drift, peers, topology
  • the applications installed on that node, their logs, monitoring and volumes
  • anything marked Admin or AdminAndFluxTeam, which is authorised against that node's operator FluxID
  • the FluxShare, Syncthing, backup/restore and volume-browser surfaces

Node API calls are not rate-limited by FluxOS itself. The public gateway may apply its own limits.

Deprecated & Removed Endpoints

Endpoints marked deprecated in this document still work; endpoints described as Removed answer an error body with code: 410.

KindEndpoints
Removed (answer code: 410)/apps/apppause, /apps/appunpause, /apps/appmonitorstream, /apps/startmonitoring, /apps/stopmonitoring
Deleted (no longer routed)/flux/cruxid, /flux/adjustcruxid, /flux/rebuildhome, /explorer/fluxtxs, /apps/installtemporarylocalapp, POST /apps/fluxshare/upload
RenamedPOST /apps/fluxshare/upload → POST /apps/fluxshare/uploadfile; /flux/rebuildhome → /flux/rebuildui; POST /syncthing/system/error/clear → GET
Aliasesevery /zelid/* route aliases the matching /id/* route; every /daemon/*zelnode* route aliases its *fluxnode* counterpart; /flux/zelid aliases /flux/id; /benchmark/signzelnodetransaction aliases /benchmark/signfluxnodetransaction; /flux/broadcastmessageto{outgoing,incoming} both delegate to /flux/broadcastmessage

Authentication Workflows

🔐 Complete Authentication Flow

Step 1: Get Login Phrase

curl -X GET "https://api.runonflux.io/id/loginphrase"

Step 2: Sign the Login Phrase

  • SSP Wallet: Use browser extension + mobile app to sign the message
  • ZelCore: Use the wallet's message signing feature
  • MetaMask: Use personal_sign method
  • Hardware Wallet: Sign via hardware device integration

Step 3: Verify Login

curl -X POST "https://api.runonflux.io/id/verifylogin" \
  -H "Content-Type: application/json" \
  -d '{
    "zelid": "your-wallet-address",
    "loginPhrase": "phrase-from-step-1", 
    "signature": "your-signature-from-step-2"
  }'

Step 4: Use Authentication Header

curl -X GET "https://api.runonflux.io/id/loggedsessions" \
  -H "zelidauth: zelid=your-address&signature=your-signature&loginPhrase=your-phrase"

📱 SSP Wallet Integration Guide

Browser Extension Setup:

  1. Install SSP Wallet Chrome Extension
  2. Install SSP Key mobile app (iOS/Android)
  3. Pair devices using QR code
  4. Fund wallet with small amount for testing

Signing Messages with SSP:

// Connect to SSP Wallet
if (window.ssp) {
  const accounts = await window.ssp.request({
    method: 'wallet_requestPermissions',
    params: [{ wallet_accounts: {} }]
  });
  
  // Sign login phrase
  const signature = await window.ssp.request({
    method: 'personal_sign',
    params: [loginPhrase, accounts[0]]
  });
}

🦊 MetaMask Integration Guide

Connect and Sign:

// Connect MetaMask
const accounts = await ethereum.request({
  method: 'eth_requestAccounts'
});

// Sign login phrase
const signature = await ethereum.request({
  method: 'personal_sign',
  params: [loginPhrase, accounts[0]]
});

// Use Ethereum address as zelid
const zelid = accounts[0];

🔑 ZelCore Wallet Integration

Deep Link Integration:

// Generate ZelCore deep link for signing
const zelcoreUrl = `zel:?action=sign&message=${encodeURIComponent(loginPhrase)}&icon=https://yourapp.com/icon.png&callback=${encodeURIComponent('https://yourapp.com/auth/callback')}`;

// Open ZelCore for signing
window.location.href = zelcoreUrl;

WebSocket Integration:

// Listen for ZelCore signature via WebSocket
const ws = new WebSocket(`wss://api.runonflux.io/ws/id/${loginPhrase}`);

ws.onmessage = (event) => {
  const authData = JSON.parse(event.data);
  if (authData.status === 'success') {
    // Authentication successful
    console.log('Signed in with ZelID:', authData.data.zelid);
  }
};

🔗 WalletConnect v2 Integration

Setup WalletConnect:

import { SignClient } from '@walletconnect/sign-client';

const signClient = await SignClient.init({
  projectId: 'your-walletconnect-project-id',
  metadata: {
    name: 'Your Flux App',
    description: 'Flux Network Integration',
    url: 'https://yourapp.com',
    icons: ['https://yourapp.com/logo.png']
  }
});

// Connect to wallet
const { uri, approval } = await signClient.connect({
  requiredNamespaces: {
    eip155: {
      methods: ['personal_sign'],
      chains: ['eip155:1'],
      events: ['chainChanged', 'accountsChanged']
    }
  }
});

// Sign message when connected
const signature = await signClient.request({
  topic: session.topic,
  chainId: 'eip155:1',
  request: {
    method: 'personal_sign',
    params: [loginPhrase, address]
  }
});

📧 Traditional Email Authentication

Firebase Integration:

import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';

// Email/password login
const auth = getAuth();
const userCredential = await signInWithEmailAndPassword(auth, email, password);

// Get ID token for API authentication
const idToken = await userCredential.user.getIdToken();

// Use token in API calls
fetch('https://api.runonflux.io/protected-endpoint', {
  headers: {
    'Authorization': `Bearer ${idToken}`,
    'Content-Type': 'application/json'
  }
});

⚠️ Common Integration Issues

Login Phrase Expiration:

// Always check phrase timestamp
const phraseTimestamp = parseInt(loginPhrase.substring(0, 13));
const now = Date.now();
const age = now - phraseTimestamp;

if (age > 15 * 60 * 1000) { // 15 minutes
  throw new Error('Login phrase expired, get a new one');
}

Signature URL Encoding:

// Always URL encode signatures for headers
const encodedSignature = encodeURIComponent(signature);
const authHeader = `zelid=${zelid}&signature=${encodedSignature}&loginPhrase=${loginPhrase}`;

Error Handling:

try {
  const response = await fetch('/api/authenticated-endpoint', {
    headers: { 'zelidauth': authHeader }
  });
  
  if (response.status === 401) {
    // Re-authenticate user
    redirectToLogin();
  }
} catch (error) {
  console.error('API call failed:', error);
}

API Version Information

Current Version: 8.18.0

Version Notes:

  • All endpoints documented in this specification are available in FluxOS 8.18.0
  • This documentation reflects the current stable API implementation and is generated against ZelBack/src/routes.js of the Flux repository
  • For the latest changes and updates, refer to the Flux GitHub repository

Notable changes since 6.6.x

AreaWhat changed
Long-running operationsVolume and file operations no longer block the request. They return a jobId; poll GET /apps/operations/{jobId} and cancel with DELETE /apps/operations/{jobId}.
Volume file managementPOST /apps/moveobject, /apps/copyobject, /apps/compressobject and /apps/extractobject operate inside an application's persistent volume.
PlacementPOST /apps/placementfeasibility answers whether a prospective specification can be placed, and GET /apps/placementlocations publishes the live node/fault-domain/tier geography.
Network observabilityGET /flux/topology, /flux/networkhealth, /flux/peerhistory, /flux/unstablenodes, /flux/peers and the SSE GET /flux/eventstream.
Tampering detectionGET /apps/tamperingevents reports containers whose running image no longer matches the registered specification.
ArcaneOSGET /arcane/authchallenge and POST /arcane/configsync for hardware-attested node configuration. Available only on ArcaneOS nodes.
SyncthingMetrics, health summary, metrics history and peer sync diagnostics endpoints, plus the full configuration write surface.
DeprecationsEvery /zelid/* route is a deprecated alias of the matching /id/* route, and every /daemon/*zelnode* route a deprecated alias of its *fluxnode* counterpart. /flux/cruxid, /flux/adjustcruxid, /flux/rebuildhome, /explorer/fluxtxs and /apps/installtemporarylocalapp were removed; POST /apps/fluxshare/upload is now POST /apps/fluxshare/uploadfile.
Download OpenAPI description
Overview
URL
InFlux Technologies USA LLC — Flux Development Team
License
Languages
Servers
Mock server
https://docs.runonflux.io/_mock/fluxapi
Production API Gateway - global load-balanced endpoint. Requests are served by whichever confirmed FluxNode the gateway routes to, so node-scoped endpoints (anything that reports or changes the state of one machine) should be called against a specific node instead.
https://api.runonflux.io
Direct Flux Node Connection - Connect directly to specific node
https://{nodeip}:16127
Local Development Node - For local testing
http://localhost:16127
Explorer API - Blockchain data and statistics
https://explorer.runonflux.io
Network Statistics API - Real-time network metrics
https://stats.runonflux.io