Skip to main content
Luxxon prices in micro-USDC per second (µUSDC/s). A baseline rate gets multiplied by three dynamic factors at the moment a session is priced.

The formula

rate = base × supply_factor × demand_factor × corridor_multiplier
Everything in basis points internally (10000 = 1.0×) to keep settlement math in integers — no float drift.
TermSource
base_ratePlatform setting. Default: 1000 µUSDC/s (0.001/s=0.001/s = 0.06/min).
supply_factorclamp(1 / active_operators_in_range, 0.7×, 3.0×). Few operators → surge up.
demand_factorclamp(1 + open_sessions_in_range / available_operators, 1.0×, 3.0×). Busy area → surge up.
corridor_multiplierPer-zone override set by the platform (tourist zones, off-hours, special events). Default 1.0×.
The clamps prevent runaway pricing — even in the most starved combination, the rate caps at base × 3 × 3 × corridor_max.
During early access, supply_factor, demand_factor, and corridor_multiplier all return 1.0×. Real factor computation lights up once there are operators online to count. The API surface and contract are stable; the numbers behind them get more interesting.

Two flows: spot and quote-locked

Spot. Don’t pre-fetch a quote. POST /sessions directly; the server computes the current rate at request time and stamps it on the session. Fastest, no round-trip overhead, no surge guarantee.
curl -X POST .../sessions \
  -H "Authorization: Bearer $KEY" \
  -d '{"lat":4.71,"lng":-74.07,"maxDurationSeconds":300}'
Quote-locked. Pre-fetch a quote, then reference it on create. Server validates the quote isn’t expired and uses that rate. Standard pattern for surge-sensitive flows.
QUOTE=$(curl -s ".../pricing/quote?lat=4.71&lng=-74.07&durationSeconds=300" \
  -H "Authorization: Bearer $KEY" | jq -r '.data.quoteId')

curl -X POST .../sessions \
  -H "Authorization: Bearer $KEY" \
  -d "{\"lat\":4.71,\"lng\":-74.07,\"maxDurationSeconds\":300,\"quoteId\":\"$QUOTE\"}"
Quotes expire after 30 seconds. Single-use — once consumed by a session create, the same quoteId returns pricing:quoteAlreadyUsed (409).

Rate-locking through a session

The rate stamped on the session is immutable for the duration of that session. Surges can rise mid-session but already-running sessions keep their locked rate. New sessions opened after the surge see the new rate. Operators are paid at the locked rate too — symmetric.

The settlement math

When a session ends, the meter produces cleanSeconds (billable) and failedSeconds (non-billable, e.g. QoS violations). The amount math:
chargeable_seconds   = cleanSeconds                        # failedSeconds drop out
operator_share_bps   = 10000 − platform_fee_bps            # default fee 1500 (15%)
operator_earned      = chargeable_seconds × rate × operator_share_bps / 10000
platform_fee         = chargeable_seconds × rate × platform_fee_bps  / 10000
consumer_charged     = operator_earned + platform_fee
These are the toAmount / feeAmount you’ll see on the settlement payload at /settlements/:sessionId.

Failed seconds are not billed

If 60 seconds of a session were live but 15 of them had geofence breaches or QoS failures, the consumer is charged for 45 seconds and the operator earns on 45 seconds. The platform’s fee is on 45 seconds. Nobody pays for what didn’t work. The discrimination criteria themselves (QoS thresholds, geofence radius, telemetry continuity) are documented in Trust model — the short version is failed = measurable platform breach, not consumer dissatisfaction.

Currency

USDC on Base. Only. See Wallet for funding flow.