fantasti.Spot(max_price=3.10)ComputeSpot Private Preview
Spot GPUs at the market price,
with a ceiling you set.
Spot is GPU capacity that can be reclaimed. In exchange, its price follows supply and demand and stays below the on-demand rate. Follow that price, or set the most you will pay per GPU-hour.
capacity=fantasti.Spot(max_price=2.40) Drag the max price line, click the plot, or use the arrow keys.
- Max price
- $2.40 /GPU·hr
- Ran
- 51 h 15 m of 72 h
- Stopped
- 4×
- Resumed
- 4×
Blocked at start
Illustrative series, not Fantasti market data. A step line shows a spot price for one GPU type over 72 hours in 15-minute steps, between $1.91 and $2.72 per GPU-hour. With the max price at $2.40, the nodes run 51 h 15 m of 72 hours, stop 4 times when the price rises above the max, and resume 4 times when it falls back. You pay the spot price for each interval, not the max.
Five GPUs on spot, from $0.87 per GPU-hour.
The spot price always stays below the on-demand rate for the same GPU.
"From" is the lowest spot price for that GPU. The spot price moves with supply and demand.
B300: spot from $1.09 per GPU-hour, on-demand $10.45. B200: spot from $1.09 per GPU-hour, on-demand $9.35. H200 SXM: spot from $0.87 per GPU-hour, on-demand $5.94. H100 SXM5: spot from $0.87 per GPU-hour, on-demand $5.40. RTX PRO 6000: spot from $0.87 per GPU-hour, on-demand $2.16. "From" is the lowest spot price for that GPU. The spot price moves with supply and demand. The spot price always stays below the on-demand rate for the same GPU.
The contract
- Price
- Moves with the market
- Can change as often as every 15 minutes.
- Ceiling
- Your max price
- Per GPU-hour, in USD. You pay the spot price, not your max.
- Notice
- 60 seconds
- Processes get SIGTERM before a node stops. Anything still running after that is killed.
- State
- Disks are kept
- Stopped nodes keep their volumes. Dynamic public addresses are released.
- Resume
- From the last checkpoint
- Batch Inference and managed jobs restart when capacity at your price returns.
One setting, every product.
The same capacity setting works on GPU instances, cluster worker nodes, workspace worker groups, batch runs and serverless jobs.
job = fx.jobs.create(
image="ghcr.io/acme/train:latest",
gpu="H200:8",
capacity=fantasti.Spot(max_price=3.10), # your ceiling, USD per GPU-hour
)
print(job.status) # blocked | placing | running
follow = fantasti.Spot(max_price="follow") # no ceiling, pay the spot price // the "capacity" field takes one of four forms, on every product
{ "capacity": { "mode": "spot", "max_price": "follow" } }
{ "capacity": { "mode": "spot", "max_price": "3.10",
"currency": "USD", "unit": "gpu_hour" } }
{ "capacity": { "mode": "on_demand" } }
{ "capacity": { "mode": "reserved", "reservation": "rsv_7d2k…" } } # policy.yaml · applies to every request from team "research"
team: research
placement:
gpus: [H100, H200, B200]
fabric: infiniband # multi-node jobs stay on one fabric
regions: ["us-*"]
capacity:
allow: [on_demand, spot, reserved]
spot:
max_price: { H100: 2.40, H200: 3.10 } # USD per GPU-hour, your ceilings
limits:
gpus: { H200: 32 }
sandboxes: { concurrent: 200, max_ttl: 60m }
spend: { monthly_usd: 40000 }
cost_center: research-llm Follow the market, or set your max.
- Follow the market
- No ceiling. You pay the spot price for each interval, and Fantasti never stops your work because the price rose. Spot capacity can still be reclaimed.
- Set a max price
- Choose the most you will pay per GPU-hour. Your nodes run while the spot price is at or below it, and you pay the spot price, not your max. If the spot price rises above your max, those nodes stop.
- Blocked
- If your max is below the current price when you ask, the request waits as Blocked until the price falls or you raise your max.
A max price limits what you pay. It does not reserve capacity. To guarantee capacity, reserve it.
Illustrative series, not Fantasti market data. The same 72-hour spot price as the plot at the top of the page, with three requests made at the start. Request A follows the market: it runs 72 h 00 m and is stopped for price 0 times. Request B sets a max price of $2.40 per GPU-hour: it runs 51 h 15 m, stops 4 times and resumes 4 times. Request C sets a max price of $1.95, under the price at the start: it waits as Blocked for 4 h 00 m, then runs 1 h 15 m of 72 hours. Every request pays the spot price for the intervals it runs, never its max.
15 min is the shortest interval between spot price changes.
What a spot resource can report.
A request whose max price is at or above the spot price goes to placing; one below it waits as blocked until the price falls. Placing becomes running when the nodes are up. A stop notice, sent 60 seconds before a node stops, moves it to stopping, then to stopped for price or reclaimed; disks are kept in both. When capacity at your price is back it resumes from its last checkpoint and runs again. Compute is charged in 2 states: running and stopping. Connections: Your request to Placing: ≤ max; Your request to Blocked: > max; Blocked to Placing: price falls; Placing to Running: nodes up; Running to Stopping: notice; Stopping to Stopped: 60 s; Stopped to Resuming: capacity; Resuming to Running: from checkpoint.
fantasti.Spot(max_price=2.40)placing- charge
- None
running- charge
- Spot price
stopping- charge
- Spot price
blocked- charge
- None
resuming- charge
- None
stopped_price- charge
- None
stopped_reclaimed- charge
- None
fantasti.Spot(max_price=2.40)placing- charge
- None
running- charge
- Spot price
blocked- charge
- None
resuming- charge
- None
stopping- charge
- Spot price
stopped_price- charge
- None
stopped_reclaimed- charge
- None
max_price=2.40blockedplacingrunningstoppingresumingstopped_pricestopped_reclaimed
- Your nodes are up
- Waiting for price
| State | Meaning | Compute charge |
|---|---|---|
| blocked | Your max price is below the current spot price. Nothing has started. | None |
| placing | Capacity at your price is being placed. | None |
| running | Nodes are up. | Spot price for each interval |
| stopping | Stop notice sent. 60 seconds to exit. | Spot price until the node stops |
| stopped_price | The spot price rose above your max. Disks are kept. | None. Storage continues. |
| stopped_reclaimed | The capacity was reclaimed. Disks are kept. | None. Storage continues. |
| resuming | Capacity at your price is back. Work restarts from its checkpoint. | None until running |
-
blockedYour max price is below the current spot price. Nothing has started.
Compute chargeNone
-
placingCapacity at your price is being placed.
Compute chargeNone
-
runningNodes are up.
Compute chargeSpot price for each interval
-
stoppingStop notice sent. 60 seconds to exit.
Compute chargeSpot price until the node stops
-
stopped_priceThe spot price rose above your max. Disks are kept.
Compute chargeNone. Storage continues.
-
stopped_reclaimedThe capacity was reclaimed. Disks are kept.
Compute chargeNone. Storage continues.
-
resumingCapacity at your price is back. Work restarts from its checkpoint.
Compute chargeNone until running
Metered per interval, at the price in effect.
Spot usage is metered by the second at the spot price in effect for each pricing interval.
| Interval | Charge |
|---|---|
| 01Interval 1 | 8 GPUs × 0.25 h × price A |
| 02Interval 2 | 8 GPUs × 0.25 h × price B |
| Total | = the sum of both intervals |
Illustrative. One node with 8 GPUs runs through two pricing intervals of 15 minutes. The spot price is price A in the first interval and price B in the second. The first interval is charged 8 GPUs × 0.25 h × price A, the second 8 GPUs × 0.25 h × price B, and the total is the sum of both intervals.
Your statement shows the total. A per-interval export shows the rate applied to each period.
Where spot applies.
| Product | Spot | Note |
|---|---|---|
| Spot applies | ||
| GPU Instances | Yes | B300, B200, H200, H100 and RTX PRO 6000. |
| GPU Clusters | Worker nodes | The cluster keeps running on the nodes that remain. |
| Workspaces | Worker groups | The head node is always on-demand. |
| Batch Inference | Yes | Resumes from the last checkpoint. |
| Serverless | Jobs and endpoints | |
| Flows Planned | Per step | A stopped step resumes from its checkpoint. |
| Spot does not apply | ||
| CPU Instances | No | On-demand. |
| Rack-scale and reserved capacity | No | Reserved capacity never runs as spot. |
- Sheet
- 01 / 01
- Title
- Spot: states, metering and scope
- Metering
- Per second
- Reviewed
- 2026-10-10
Give it a budget instead of a price.
Give the Broker a ceiling per GPU-hour and a budget for the run. It reads spot prices and free capacity across regions, estimates how likely capacity is to be reclaimed, and chooses when to run and what max price to set. It never goes above your ceiling or your budget.
Planned
capacity=fantasti.Spot(max_price="auto", ceiling=3.10) The Broker Leila Capacity brokerAI agent
You give the Broker a ceiling per GPU-hour and a budget for the run. The Broker reads spot prices, free capacity, by region and the interruption outlook, and sets the max price each time your nodes start, at or under your ceiling. Planned. Connections: Ceiling to Broker; Budget to Broker; The Broker reads to Broker; Broker to Max price; Max price to Your nodes.
ceiling=3.10Per GPU-hour
Budget(usd=…)For the run
max_price="auto"Chooses when to runand what max to set
≤ your ceilingSet at each start
Inside the budget
ceiling=3.10Per GPU-hour
Budget(usd=…)For the run
max_price="auto"Chooses when to runand what max to set
Spot pricesFree capacityInterruptionoutlook
≤ your ceilingSet at each start
Inside the budget
- Reads
- Planned
On-demand, spot or reserved.
Every request names one capacity mode. All three land on the same statement.
- 01 On-demand Work that must not stop and has no fixed term.
fantasti.OnDemand() - 02 Spot Work that checkpoints and can wait.
- 03 Reserved Capacity you need on a date, guaranteed.
fantasti.Reserved("rsv_7d2k")
Ways to pay Prepaid credit, pay-as-you-go and Enterprise. Each one covers on-demand, spot and reserved capacity. How billing works