← Wattweave

Wattweave API documentation

A read-only API (/api/v1/) for AGGL's other apps and systems to pull Wattweave's data. Not for park operators or third parties — this grants broad read access across every operator.

Authentication

Every request needs an Authorization header:

Authorization: Bearer wwk_...

API keys are issued by a Wattweave platform admin (Admin → API keys) — there's no self-service signup. The raw key is only ever shown once at creation, so ask AGGL for one and store it securely on your end; it can't be retrieved again, only revoked and replaced.

Errors

All errors return { error: string } with the relevant HTTP status — 401 for a missing/invalid/ revoked key, 404 for an unknown resource.

Notes

Endpoints

GET/api/v1/operators

Every operator (tenant).

{
  "operators": [
    {
      "id": "cksj...",
      "name": "Fairwood Holiday Parks Ltd",
      "billingEmail": "billing@fairwoodlakes.example",
      "isDemo": false,
      "createdAt": "2026-08-14T11:11:04.815Z",
      "parkCount": 1
    }
  ]
}
GET/api/v1/parks

Every park, across every operator.

{
  "parks": [
    {
      "id": "cksj...",
      "name": "Fairwood Lakes Holiday Park",
      "address": "Fairwood Lane, Gower, Swansea, SA3 1AB",
      "latitude": 51.586,
      "longitude": -4.163,
      "operatorId": "cksj...",
      "operatorName": "Fairwood Holiday Parks Ltd",
      "isDemo": false,
      "pocCount": 1,
      "lodgeCount": 12
    }
  ]
}
GET/api/v1/parks/{id}

Full topology for one park — POCs, constraint set, lodges, assets, and central BESS.

{
  "id": "cksj...",
  "name": "Fairwood Lakes Holiday Park",
  "address": "...",
  "latitude": 51.586,
  "longitude": -4.163,
  "operatorId": "cksj...",
  "operatorName": "Fairwood Holiday Parks Ltd",
  "isDemo": false,
  "centralBess": [
    {
      "id": "cksj...",
      "name": "Wenergy",
      "brand": "Wenergy",
      "model": "BESS Cabinet",
      "pcsBrand": "Yunt",
      "pcsModel": "125kW G99",
      "capacityKwh": 215,
      "powerKw": 125,
      "canGridForm": true,
      "status": "COMMISSIONING"
    }
  ],
  "pocs": [
    {
      "id": "cksj...",
      "mpan": "1200034567890",
      "kvaImportLimit": 500,
      "kvaExportLimit": 300,
      "halfHourlySettled": true,
      "constraintSet": {
        "exportScheme": "G99",
        "exportLimitKw": 250,
        "voltageRiseLimitPercent": 3,
        "defaultSocFloorPercent": 20,
        "defaultSocCeilingPercent": 95
      },
      "lodges": [
        {
          "id": "cksj...",
          "unitNumber": "1",
          "ownership": "OPERATOR",
          "phaseLabel": "L1",
          "assets": [
            { "id": "cksj...", "type": "PV", "brand": "JA Solar", "model": "JAM54D40", "ratedKw": 4.5, "capacityKwh": null, "status": "COMMISSIONING" }
          ]
        }
      ]
    }
  ]
}
GET/api/v1/parks/{id}/dynamic-load-sharing

Dynamic Load Sharing™ savings for one park — real, measured kWh, not an estimate.

{
  "parkId": "cksj...",
  "kwhSaved": 142.5,
  "hasTelemetryConnection": true
}
GET/api/v1/dynamic-load-sharing

Dynamic Load Sharing™ savings across every park, plus a total — the same data shown on Wattweave's own admin dashboard, but including demo parks (flagged via isDemo).

{
  "totalKwh": 142.5,
  "parks": [
    {
      "parkId": "cksj...",
      "parkName": "Fairwood Lakes Holiday Park",
      "operatorId": "cksj...",
      "operatorName": "Fairwood Holiday Parks Ltd",
      "isDemo": false,
      "kwhSaved": 142.5,
      "hasTelemetryConnection": true
    }
  ]
}
GET/api/v1/invoices

Self-consumption invoices. Not the PDF itself — just the billing record.

Optional query params: operatorId, parkId

{
  "invoices": [
    {
      "id": "cksj...",
      "invoiceNumber": "WW-CMSSUJ-202607-0001",
      "operatorId": "cksj...",
      "parkId": "cksj...",
      "pocId": "cksj...",
      "periodStart": "2026-07-01T00:00:00.000Z",
      "periodEnd": "2026-08-01T00:00:00.000Z",
      "selfConsumedKwh": 2300,
      "ratePencePerKwh": 24,
      "subtotal": 552,
      "vatAmount": 0,
      "total": 552,
      "currency": "GBP",
      "status": "ISSUED",
      "createdAt": "2026-08-14T11:11:05.361Z"
    }
  ]
}