# BESS Arbitrage Calculator

> BESS Arbitrage Calculator is a paid API for AI agents from bess-x402.onrender.com, paid per call via x402, $0.5/call, status unknown (last checked 2026-10-29).

Computes day-ahead energy arbitrage revenue for a battery storage (BESS) asset in a European bidding zone using a perfect-foresight LP on historical prices, returning annualised revenue per MW, cycle counts, and optional payback period.

## Facts

- Endpoint: GET https://bess-x402.onrender.com/v1/bess/arbitrage?utm_source=zero.xyz
- Price: $0.5/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-29
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/bess-arbitrage-calculator-cfc373f8
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_rbKsO2kKCcj3NCJJZfvrN

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability bess-arbitrage-calculator-cfc373f8
```

Example prompt: How much would a 10 MW, 20 MWh battery have earned doing day-ahead arbitrage in Germany (DE-LU) from 2023-01-01 to 2023-12-31, assuming 88% round-trip efficiency and a capex of $250 per kWh — and what's the estimated payback period?

## When to prefer this

Use this endpoint when you need to quickly screen or size a battery storage project against real historical European day-ahead prices without building your own LP optimiser. It is ideal for comparing bidding zones, estimating revenue in a specific year, or generating payback estimates for investor materials. Prefer it over generic financial modelling tools when the specific input is European wholesale electricity prices and the output must reflect BESS cycling constraints.

## Known failure modes

- Zone not in supported enum (AT, BE, CH, CZ, DE-LU, DK1, DK2, FR, HU, IT-North, NL, NO2, PL, SE4, SI) — 400 validation error
- Date range exceeds 366 days — 400 error
- Start date is after end date — 400 validation error
- Historical price data unavailable for the requested period — may return partial results or 404
- round_trip_efficiency outside 0–1 range — 400 validation error
- Payment not provided or rejected — 402 Payment Required
- Service cold-start latency on first request (hosted on Render free tier)

## How this service works

Battery storage (BESS) day-ahead arbitrage revenue for a European bidding zone: perfect-foresight LP per day on historical prices, annualised revenue per MW, cycles, payback. Use when sizing or screening a battery project, comparing zones, or answering how much a battery would have earned in a given year.

## Output

Returns annualised revenue per MW, total arbitrage revenue over the requested period, number of charge/discharge cycles, and (if capex is supplied) a simple payback estimate. When the daily flag is set, a per-day breakdown of revenue and cycles is also included.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET",
      "HEAD",
      "DELETE"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "zone",
      "start",
      "end"
     ],
     "properties": {
      "end": {
       "type": "string",
       "format": "date",
       "description": "Last day, YYYY-MM-DD, at most 366 days after start"
      },
      "zone": {
       "enum": [
        "AT",
        "BE",
        "CH",
        "CZ",
        "DE-LU",
        "DK1",
        "DK2",
        "FR",
        "HU",
        "IT-North",
        "NL",
        "NO2",
        "PL",
        "SE4",
        "SI"
       ],
       "type": "string",
       "description": "European bidding zone"
      },
      "daily": {
       "type": "boolean",
       "description": "Include the per-day breakdown, default false"
      },
      "start": {
       "type": "string",
       "format": "date",
       "description": "First day, YYYY-MM-DD"
      },
      "power_mw": {
       "type": "number",
       "description": "Battery power rating in MW"
      },
      "energy_mwh": {
       "type": "number",
       "description": "Battery energy capacity in MWh"
      },
      "capex_per_kwh": {
       "type": "number",
       "description": "Optional capex per kWh for a simple payback estimate"
      },
      "max_cycles_per_day": {
       "type": "number",
       "description": "Default 1"
      },
      "round_trip_efficiency": {
       "type": "number",
       "description": "0-1, default 0.88"
      },
      "degradation_cost_per_mwh": {
       "type": "number",
       "description": "Cost per MWh discharged, default 0"
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object"
    }
   }
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/bess-arbitrage-calculator-cfc373f8/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from bess-x402.onrender.com](https://www.zero.xyz/host/bess-x402.onrender.com/llms.txt)
