Platform API

Build on the energy layer.

Push telemetry from any site. Read live UK tariff, wholesale and carbon signals. Bid flexibility into distribution networks. One authenticated interface, documented against what is actually deployed.

Quickstart
Base URLapp.ampverve.com
Spec version2026-07-31
AuthBearer JWT
FormatJSON over HTTPS
No section matches that search. Clear the box to see everything.
Introduction

The mental model

Four nouns. Learn these and the rest of the API follows.

Organisation

Your tenant. Every token carries one, every row is scoped to one, and nothing crosses the boundary. You never pass it explicitly.

Site

A physical location. The unit you report on, contract on, and troubleshoot at.

Asset

A thing at a site that produces or consumes energy. An inverter, a battery, a charger, a meter, a heat pump, a vehicle.

Record

One measurement, from one asset, at one instant. Telemetry is a stream of these.

You register assets against sites, then stream records against assets. Everything else in this API either reads that data back, or enriches it with market and grid signals.

Status labels are part of the contract

Every endpoint on this page carries a label. Treat it as binding.

LabelWhat it meansShould you build on it
LiveDeployed to production and verified by an actual HTTP request on 2026-07-31. Not "present in the codebase".Yes.
BetaDeployed and working, but the response contract may change, or some fields are modelled rather than measured.Yes, with a defensive parser.
PlannedSpecified, not deployed. Returns 404 today.No. Design against it, do not call it.
ModelledThe endpoint is live but this specific field is estimated, not measured.Not for settlement or financial claims.
Why we label this way

A partner codes against documentation, not against intent. An endpoint documented as shipped that turns out not to exist costs a sprint and a lot of trust. Everything marked Live on this page was confirmed with a real request before it was written down, and the machine readable spec records the same labels as x-ampverve-status.

Quickstart

First call in three steps

From nothing to a durable, verified write.

  1. Confirm the platform is up

    No credential needed. This is also the endpoint you will poll in production to detect degradation.

    curl https://app.ampverve.com/api/telemetry/readyz
    {
      "status": "ready",
      "checks": { "kafka": true, "redis": true, "database": true }
    }
  2. Get a token

    Returns a 60 minute access token and a 7 day refresh token. Cache the access token. Do not call this per request; it is rate limited to 5 per minute per IP.

    curl -X POST https://app.ampverve.com/api/auth/login \
      -H 'content-type: application/json' \
      -d '{"email":"you@partner.com","password":"..."}'
    import os, requests
    
    BASE = "https://app.ampverve.com"
    
    r = requests.post(
        f"{BASE}/api/auth/login",
        json={"email": os.environ["AMPVERVE_EMAIL"],
              "password": os.environ["AMPVERVE_PASSWORD"]},
        timeout=30,
    )
    r.raise_for_status()
    token = r.json()["access_token"]
    auth = {"Authorization": f"Bearer {token}"}
    const BASE = "https://app.ampverve.com";
    
    const res = await fetch(`${BASE}/api/auth/login`, {
      method: "POST",
      headers: { "content-type": "application/json" },
      body: JSON.stringify({
        email: process.env.AMPVERVE_EMAIL,
        password: process.env.AMPVERVE_PASSWORD,
      }),
    });
    if (!res.ok) throw new Error(`login failed: ${res.status}`);
    const { access_token } = await res.json();
  3. Write telemetry, and verify it landed

    Send an array. Then check two things in the response: that stored equals count, and that anomalies is empty.

    curl -X POST https://app.ampverve.com/api/telemetry/ingest \
      -H "authorization: Bearer $TOKEN" \
      -H 'content-type: application/json' \
      -d '[
        {"asset_id":"site-0412-inverter-1","ts":"2026-07-31T14:00:00Z",
         "power_kw":-4.812,"voltage":241.3,"status":"producing"},
        {"asset_id":"site-0412-battery-1","ts":"2026-07-31T14:00:00Z",
         "power_kw":2.4,"soc_pct":68.5,"status":"charging"}
      ]'
    batch = [
        {"asset_id": "site-0412-inverter-1",
         "ts": "2026-07-31T14:00:00Z",
         "power_kw": -4.812, "voltage": 241.3,
         "status": "producing"},
        {"asset_id": "site-0412-battery-1",
         "ts": "2026-07-31T14:00:00Z",
         "power_kw": 2.4, "soc_pct": 68.5,
         "status": "charging"},
    ]
    
    r = requests.post(f"{BASE}/api/telemetry/ingest",
                      headers=auth, json=batch, timeout=60)
    r.raise_for_status()
    out = r.json()
    
    # 200 does not mean persisted. Check both.
    if out["stored"] != out["count"]:
        raise RuntimeError(f"not persisted: {out}")
    if out["anomalies"]:
        log.warning("quality flags: %s", out["anomalies"])
    const batch = [
      { asset_id: "site-0412-inverter-1",
        ts: "2026-07-31T14:00:00Z",
        power_kw: -4.812, voltage: 241.3,
        status: "producing" },
    ];
    
    const r = await fetch(`${BASE}/api/telemetry/ingest`, {
      method: "POST",
      headers: {
        authorization: `Bearer ${access_token}`,
        "content-type": "application/json",
      },
      body: JSON.stringify(batch),
    });
    const out = await r.json();
    
    // 200 does not mean persisted. Check both.
    if (out.stored !== out.count) throw new Error("not persisted");
    if (out.anomalies.length) console.warn(out.anomalies);
    { "count": 2, "stored": 2, "streamed": 2, "anomalies": [] }

    Confirm independently with GET /api/telemetry/live/events?limit=5. You are integrated.

Authentication

Bearer tokens

One scheme. Every request carries an Authorization header, and every request is scoped to the organisation inside the token.

PropertyValue
SchemeAuthorization: Bearer <access_token>
Token formatJWT, HS256
Access token lifetime60 minutes
Refresh token lifetime7 days, single use, rotated on every refresh
Claimssub, tenant_id, org_id, roles, iat, exp
IssuancePOST /api/auth/login, or an invitation acceptance
RotationPOST /api/auth/token/refresh
RevocationPOST /api/auth/logout, immediate

Roles, not scopes

There is no OAuth scope model. Authorisation is by role, carried on the token.

RoleCan ingestCan readCan write config
ORG_ADMINYesYesYes
OPERATORYesYesYes
ANALYSTYesYesNo
VIEWERNoYesNo

A machine to machine ingestion integration should use a dedicated user with OPERATOR. Do not share a human's credentials with a service.

Tenant isolation

The organisation is taken from the token, never from a parameter you control. If you send an X-Tenant-ID header that disagrees with the token, the request is rejected with 403 Tenant mismatch. There is no way to read another organisation's data with your token.

Handling expiry

Refresh proactively at roughly 80 percent of the token lifetime, and treat a 401 as a signal to refresh once and retry once. Do not retry a 401 in a loop; you will hit the authentication rate limit and lock yourself out for 15 minutes.

class AmpVerve:
    def __init__(self, email, password, base="https://app.ampverve.com"):
        self.base, self._email, self._pw = base, email, password
        self._token, self._exp = None, 0

    def _headers(self):
        # refresh at 80% of the 60 minute lifetime
        if time.time() > self._exp - 720:
            r = requests.post(f"{self.base}/api/auth/login",
                              json={"email": self._email,
                                    "password": self._pw}, timeout=30)
            r.raise_for_status()
            self._token = r.json()["access_token"]
            self._exp = time.time() + 3600
        return {"Authorization": f"Bearer {self._token}"}

API keys Planned

A long lived, organisation scoped X-API-Key is the right credential for server to server ingestion. It is not available yet.

Be precise about this

POST /api/devtools/apikeys mints a key today, and no endpoint accepts it as a credential. Until API key authentication ships, the bearer JWT is the only thing that authenticates a request. When keys do ship they will be hashed at rest, prefixed, scoped, rotatable and revocable.

Environments

Where to point your client

EnvironmentBase URLStatus
Productionhttps://app.ampverve.comLive
Sandboxhttps://sandbox.ampverve.comPlanned
Branded API hosthttps://api.ampverve.comPlanned
Do not use api.ampverve.com

It has no DNS record. Nor do sandbox, staging, docs or status under ampverve.com. A client configured with any of them fails at name resolution before it sends a byte. The only base URL that resolves today is app.ampverve.com. When a branded host is introduced, both will serve in parallel through a published deprecation window.

Testing without a sandbox

Until an isolated sandbox exists, AmpVerve provisions a dedicated non-production organisation on production infrastructure. It is a real tenant with real isolation, and it is the only supported way to test writes.

  • Ask support for a non-production organisation. You get separate credentials and a separate tenant_id.
  • Prefix your asset identifiers so test data is obvious, for example test-site-0001-inverter-1.
  • Never write test data into a production organisation. Credential and data writes that look like placeholders are rejected at the service layer against real tenants.
  • Read only endpoints, such as market data and carbon intensity, are safe to exercise from any environment.

Getting access

Access is granted per organisation under an integration agreement. Email api@ampverve.com with your organisation name, the environments you need, and the roles your integration requires. You receive credentials for a dedicated integration user, not a shared login.

Data ingestion

Getting data in

This is the surface most integrations spend their time on. Read this section fully before writing a client. The behaviours below are not incidental; they change how you should design retries, deduplication and alerting.

POST/api/telemetry/ingestLive

Accepts one record or an array of records. Normalises each onto the canonical schema, writes to the time series store, publishes to the live stream, and returns a per batch quality report.

Open

Payload shape

Any JSON object is accepted. Unrecognised fields are preserved verbatim, not dropped.

Atomic

Per batch

A batch writes in one transaction. Every row lands, or none do.

Annotates

Quality checks

Flagged records are still stored. Detection never silently drops your data.

Ingestion

Telemetry schema and units

Fields AmpVerve recognises are mapped onto canonical, indexed columns. Everything else is preserved in a raw JSON column and stays queryable. You do not need to strip your native payload down before sending it, but only canonical fields are aggregated and surfaced by the read endpoints.

Canonical fieldAccepted keysTypeUnitNotes
asset_idasset_id, device_idstringidentifierRequired in practice. Without it a record is unattributable.
tstsstringISO 8601Send an explicit UTC offset.
power_kwpower_kwnumberkW, signedPositive is import or charge. Negative is export, generation or discharge.
soc_pctsoc_pctnumberpercent0 to 100. Not a fraction.
voltagevoltagenumbervolts
currentcurrentnumberamperes
temp_ctemp_cnumberdegrees C
statusstatusstringFree text. Defaults to unknown.
tenant_idtenant_id, or the X-Tenant-ID headerstringidentifierMust agree with your token.
run_idrun_idstringOptional correlation identifier.
intent_idintent_idstringOptional correlation identifier.
rawthe whole original objectobjectPreserved exactly as sent.
Sign convention, get this right first

power_kw is signed and aggregation sums it directly across assets. Positive is power flowing into the asset. Solar generation is therefore negative at the inverter asset. An inconsistent sign is the single most common integration defect and it is invisible until someone reads a total.

Common unit mistakes

MistakeSymptomFix
Watts sent as power_kwpower_out_of_range flag when the value exceeds 5000Divide by 1000 before sending.
State of charge sent as a fractionsoc_out_of_range, or a chart that reads 0 to 1Multiply by 100. The field is a percentage.
Energy sent where power is expectedNo flag, silently wrong totalsSend cumulative energy in raw under your own key and let power be instantaneous.
Generation sent as positiveNo flag, site totals double countNegate it. See the sign convention above.
Ingestion

Sites and assets

An asset is what telemetry is about. A site groups assets at one physical location. Register assets once, then stream against them.

curl -X POST https://app.ampverve.com/api/twin/ \
  -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d '{
    "site_id": "site-0412",
    "type": "inverter",
    "name": "site-0412-inverter-1",
    "details": {"vendor":"SolarEdge","rated_kw":7.6,"serial":"7E1F-22B9"}
  }'

Identifier rules

  • site_id is yours. Free form string. Use your own stable site key so your systems and AmpVerve agree without a translation table.
  • asset_id must be globally unique within your organisation, not just within a site. Namespace it: site-0412-inverter-1, not inverter-1.
  • Never reuse an asset_id for different physical hardware. History is keyed on it. Replacing an inverter means a new asset id and a new registry entry.
  • Keep it stable across firmware and vendor portal changes. If your upstream serial changes, keep your asset_id and record the serial in details.
Current limitation you must design around

Telemetry rows do not carry site_id today. The join from a record to a site goes through the asset registry, by asset_id. This works, and it is why a disciplined namespaced asset_id matters so much right now. Direct, indexed site_id on the telemetry row is Planned and is what unlocks native site level error reporting.

Practical mitigation: encode the site in the asset id, and also send your own site_ref key in the payload. It is preserved in raw, so it is available later without a schema change.

Ingestion

Timestamps and timezones

ts is client supplied and is the sole basis for bucketing, ordering and every query in this API. Get it wrong and the data is unusable in a way that is hard to spot.

ValueVerdictWhy
2026-07-31T14:05:00ZCorrectExplicit UTC. Always unambiguous.
2026-07-31T15:05:00+01:00CorrectExplicit offset. Stored as the equivalent UTC instant.
2026-07-31T14:05:00WrongNo offset. Parsed as naive local time and lands in the wrong bucket.
2026-07-31 14:05:00WrongNot ISO 8601. Parsing fails and the batch write fails with it.
1785506700WrongUnix epoch is not accepted. Convert to ISO 8601 first.
  • Store and send UTC. Convert at the edge of your system, not in the middle of it.
  • British Summer Time is a real hazard. UK sites shift by an hour twice a year. If you derive ts from a vendor portal that reports local wall clock time, the autumn transition produces a duplicated hour and the spring transition a missing one. Convert vendor local time to UTC using a timezone database, never by adding a fixed offset.
  • Timestamps are not deduplicated. Two records with the same asset_id and ts both persist. See idempotency below.
  • Sub second precision is preserved but AmpVerve buckets to a minimum of 5 minutes on read.
Ingestion

Batching and backfill

Batching

  • Send an array. A batch is written in one database transaction, so it is atomic: every row lands or none do.
  • Recommended batch size is 100 to 1000 records. Below 100 you pay per request overhead; above a few thousand you increase the blast radius of a single failed transaction.
  • There is no server enforced record cap today. The practical ceiling is request body size. Treat 5 MB as a safe upper bound.
  • Prefer one batch per site per interval. It keeps failure attribution simple, which is exactly what you want when a single site starts misbehaving.

Backfill

Backfill is the same call with older timestamps. Two constraints apply.

WindowBehaviourWhat to do
Last 30 daysWrites normally.Backfill freely. Throttle to a few batches per second.
Older than 30 daysStorage chunks are compressed. A write into a compressed chunk may be rejected by the storage layer.Coordinate with support before starting. Do not discover this at 2 million rows.
Backfill is visible downstream

Backfilled records are published to the live event stream exactly as fresh records are. A large historical load will appear in live consumers as a burst. Tell anyone consuming your live stream before you start.

Ingestion

Idempotency, deduplication, ordering

There is no server side deduplication today

The write is a plain insert. There is no idempotency key and no duplicate detection. Send the same record twice and it is stored twice, and counted twice in every aggregate. This is the most important thing on this page to design around.

What this means for retries

On a timeout or a 5xx, you do not know whether the write landed. There are two correct strategies. Pick one and be consistent.

StrategyHowTrade off
Verify then retryOn an ambiguous failure, query GET /api/telemetry/live/events?asset_id=... and check whether the batch's timestamps are present before re-sending.Correct, and costs one extra read per ambiguous failure. Recommended.
Accept at-least-onceRetry blindly, and deduplicate on read using (asset_id, ts).Simpler client, but every consumer of the data now has to know to deduplicate. Only choose this if you control every consumer.
def ingest_with_verification(client, batch, attempts=4):
    """Retry safely without risking duplicate rows."""
    key = (batch[0]["asset_id"], batch[0]["ts"])

    for attempt in range(attempts):
        try:
            out = client.post("/api/telemetry/ingest", json=batch).json()
        except (Timeout, ConnectionError):
            # Ambiguous. Verify before re-sending, never blind retry.
            if client.already_present(*key):
                return {"deduplicated": True}
            time.sleep(2 ** attempt)
            continue

        # 200 is not proof of persistence. Compare stored to count.
        if out["stored"] != out["count"]:
            time.sleep(2 ** attempt)
            continue

        return out

    raise IngestFailed("exhausted retries, data buffered locally")

Ordering

  • Records within one batch are written in array order.
  • Concurrent batches interleave. There is no cross batch ordering guarantee.
  • The live event stream is ordered by arrival, not by ts.
  • All read endpoints order by ts, so out of order arrival does not corrupt query results. Only the live tail reflects arrival order.

Idempotency keys Planned

The planned ingestion endpoint accepts an Idempotency-Key header, retained for 24 hours. Replaying a batch with the same key returns the original result without writing again, and deduplication on (site_id, asset_id, ts, metric) reports duplicate_discarded rather than silently double counting. Design your client to emit a stable key per batch now, and it becomes a one line change later.

Ingestion

Detecting bad and partial data

Three independent signals. A production integration watches all three.

1. The anomaly report, per record

Every ingest response includes an anomalies array, computed synchronously per record. A flagged record is still stored. Detection annotates, it never rejects.

ReasonConditionAlmost always meansAction
missing_asset_idNo asset_id or device_idA mapping gap upstreamFix the mapping. The record is unattributable and effectively lost.
soc_out_of_rangesoc_pct below 0 or above 100A fraction sent where a percentage was expectedMultiply by 100 at the source.
power_out_of_rangeAbsolute power_kw above 5000Watts sent as kilowattsDivide by 1000 at the source.
voltage_out_of_rangevoltage negativeA sensor fault or a sign errorInvestigate the device.
{
  "count": 1, "stored": 1, "streamed": 1,
  "anomalies": [
    {
      "asset_id": "site-0412-battery-1",
      "reasons": ["soc_out_of_range", "power_out_of_range"],
      "record": { "soc_pct": 0.685, "power_kw": 2400 }
    }
  ]
}

2. The persistence check, per batch

A 200 does not mean your data was stored

If the time series store is unavailable, ingestion still accepts and streams the batch and still returns 200, but stored comes back as 0. Compare stored against count on every single response. If they differ, your data did not persist. Buffer locally and replay. This is the degradation mode most likely to cost you a day of data if you are not watching for it.

3. The readiness probe, platform wide

Poll GET /api/telemetry/readyz every 30 to 60 seconds. It is unauthenticated and it is the same signal AmpVerve measures its uptime commitment against.

ObservationMeaningWhat to do
200, all checks trueHealthy.Normal operation.
200, checks.database falseSilent degradation. Writes are accepted and streamed but not persisted.Alert. Buffer locally. Keep writing only if you can replay.
503, status: degradedStreaming bus or cache unavailable. Writes will fail.Stop writing. Buffer. Exponential backoff.
No responseNetwork or platform outage.Buffer. Escalate per the support path below.

Reference consumer

def health_gate(base="https://app.ampverve.com"):
    """Return ('ok'|'degraded'|'down', detail). No auth required."""
    try:
        r = requests.get(f"{base}/api/telemetry/readyz", timeout=10)
    except Exception as exc:
        return "down", str(exc)

    body = r.json()
    checks = body.get("checks", {})

    if r.status_code == 503:
        return "down", checks

    # The subtle one: 200 and "ready", but nothing is persisting.
    if not checks.get("database"):
        return "degraded", "writes accepted but not persisted"

    return "ok", checks

Site level failure notification Planned

Today, detecting that one specific site has stopped reporting requires you to query telemetry and infer absence. Two planned capabilities close that gap:

  • GET /api/telemetry/sites/{site_id}/health, returning last received timestamp, staleness, expected against observed record counts, completeness percentage, per asset health, and the open error codes for that site.
  • Webhook events site.data.stale and ingest.batch.rejected, delivered with signature verification and retry, so failure reaches you rather than waiting to be polled for.

Both are specified below and neither is deployed. Until they ship, the readiness probe plus the persistence check plus your own per site staleness monitor is the supported pattern, and it is genuinely sufficient.

Reference

Authentication

POST/api/auth/loginLive

Exchange email and password for an access token and a refresh token. Rate limited to 5 per minute per IP. Locks for 15 minutes after 5 failures, returning 423.

POST/api/auth/token/refreshLive

Exchange refresh_token for a new pair. The presented refresh token is revoked in the same operation. Single use. Store the new one.

POST/api/auth/logoutLive

Revoke a refresh token immediately.

Reference

Ingestion

POST/api/telemetry/ingestLive

Ingest one record or an array. Returns count, stored, streamed and anomalies. Requires ORG_ADMIN, OPERATOR or ANALYST. Full behaviour is documented in the ingestion sections above.

POST/api/ingest/v1/telemetryPlanned

Site aware ingestion. Adds site_id as an indexed column, an Idempotency-Key header, per record outcomes with machine readable codes and remediation actions, deduplication, and 207 Multi-Status for partially accepted batches. Returns 404 today.

Reference

Telemetry

GET/api/telemetry/live/eventsLive

Most recent records, newest first. Query limit (1 to 500, default 50) and asset_id. A recency window, not a query API. Use it to confirm a write landed.

GET/api/telemetry/assets/{asset_type}/{asset_id}/historyLive

Time bucketed series with a summary. Each bucket value is the arithmetic mean of its samples. The series is sparse: empty buckets are omitted, not returned as null, so do not assume a fixed length.

Range and bucket

rangeLookbackBucket
live1 hour5 minutes
hourly (default)24 hours1 hour
daily30 days1 day
weekly12 weeks1 week
historical365 days30 days

Asset type and metric

The pair selects both the source field and the unit. AmpVerve resolves the metric across several field names, including fields nested inside the preserved raw object, so a series still resolves when your payload used a vendor native name. A source field ending in _w is divided by 1000 and returned in kW.

asset_typemetricUnitSource fields tried, in order
solargenerationkWpower_kw, solar_generation_kw, generation_kw, production_kw, production_w
batterysoc%soc_pct, battery_soc, soc
batterychargekWcharge_kw, charging_kw, battery_charge_kw, power_kw
batterydischargekWdischarge_kw, discharging_kw, battery_discharge_kw, power_kw
evsoc%soc_pct, vehicle_soc, battery_level, usable_soc_pct
evsessionskWhsession_kwh, charge_energy_added_kwh, energy_kwh
heat-pumpkwhkWhenergy_kwh, heat_kwh, consumption_kwh
heat-pumpflow-tempdegCflow_temp_c, flow_temperature_c, temp_c
heat-pumpreturn-tempdegCreturn_temp_c, return_temperature_c
smart-meterimportkWimport_kw, grid_import_kw, power_kw
smart-meterexportkWexport_kw, grid_export_kw, power_kw
cost-savingssavingsGBPsavings_gbp, cost_savings_gbp, estimated_savings
curl -H "authorization: Bearer $TOKEN" \
  "https://app.ampverve.com/api/telemetry/assets/solar/site-0412-inverter-1/history?range=hourly"
{
  "asset_id": "site-0412-inverter-1",
  "asset_type": "solar",
  "metric": "generation",
  "range": "hourly",
  "unit": "kW",
  "series": [
    { "t": "2026-07-31T13:00:00+00:00", "v": -4.907 },
    { "t": "2026-07-31T14:00:00+00:00", "v": -5.104 }
  ],
  "summary": { "count": 36, "min": -5.42, "max": -0.11,
                "avg": -3.918, "latest": -5.104 },
  "source": "timeseries"
}
Check the source field

If source is timeseries_unavailable, the store was unreachable and series is empty for that reason, not because there is no data. Never render that as a zero.

GET/api/telemetry/sites/{site_id}/healthPlanned

Site level data health: staleness, completeness, per asset verdicts, open error codes. Returns 404 today.

Reference

Registry

POST/api/twin/Live

Register an asset. Body: site_id, type, name, optional details object stored verbatim.

GET/api/twin/Live

Every asset in your organisation. No pagination today; the full set is returned.

PUT/api/twin/{asset_id}Live

Partial update of name or details.

DELETE/api/twin/{asset_id}Live

Removes the registry entry. Telemetry already written is not deleted and remains queryable by asset_id.

Reference

Market data

Live UK electricity price, wholesale and carbon signals. Sourced from Octopus Energy, Elexon BMRS and National Grid ESO.

GET/api/trading/prices/octopus-agileLive

Half hourly import prices in pence per kWh, VAT inclusive, with the exclusive figure alongside. Query region (GSP letter, default C), period_from, period_to. A full day is 48 slots, published for the following day at roughly 16:00 UK time.

GET/api/trading/prices/currentLive

Current price slot plus the next cheap window. Query region.

GET/api/trading/prices/regionsLive

The 14 Grid Supply Point regions, A through P, used by every UK tariff endpoint.

GET/api/trading/carbon-intensityLive

Current GB grid carbon intensity in gCO2 per kWh for the current half hour settlement period.

GET/api/trading/carbon-intensity/forecastLive

Half hourly forecast. Query hours, 1 to 48, default 24.

GET/api/trading/grid/dno-regionLive

Resolves a UK postcode to its distribution network operator, the flexibility platform that operator uses, and whether the area is flex eligible. Query postcode, required.

GET/api/trading/prices/wholesaleBeta

Elexon BMRS imbalance prices by settlement period. Proxies Elexon directly and returns 502 when the upstream is unavailable, which was observed on 2026-07-31. Do not put it on a critical path without a fallback.

Reference

Flexibility

Distribution network flexibility, via UKPN LocalFlex and SSEN ElectronConnect. All three endpoints return 503 if AmpVerve's credentials for the requested platform are not configured for your environment.

GET/api/vpp/flex/tendersLive

Open tenders, fetched live. Query dno, either UKPN or SSEN.

GET/api/vpp/flex/contractsLive

Awarded contracts with quantity and clearing price.

POST/api/vpp/flex/offersLive

Submit a priced offer. For SSEN, tender_platform_id is mandatory and the request is rejected with 400 without it. Intervals carry start_utc, duration_minutes, price_gbp_per_mwh and capacity_mw.

GET/api/vpp/portfolioBeta Modelled

Aggregate fleet capacity. available_capacity_mw and availability_rate are derived from a fixed availability assumption, not from measured per asset availability, and regions is not yet segmented. Do not use those fields for settlement or any financial claim.

curl -X POST https://app.ampverve.com/api/vpp/flex/offers \
  -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d '{
    "dno": "SSEN",
    "reserve_object_id": "RO-88213",
    "tender_platform_id": "TND-2026-0731-01",
    "direction_turn_up": false,
    "intervals": [{
      "start_utc": "2026-08-01T17:00:00Z",
      "duration_minutes": 120,
      "price_gbp_per_mwh": 185.0,
      "capacity_mw": 0.45
    }]
  }'
Reference

Certificates

POST/api/esg/Beta

Store a payload as a signed energy receipt with a content hash. The hash is currently computed over a runtime specific string rendering rather than canonical JSON, so it is not reproducible from another language. Treat it as an AmpVerve side identifier, not a cross platform content commitment.

GET/api/esg/Beta

List receipts for your organisation. No pagination today.

POST/api/esg/passport/credentialsBeta Modelled

Issue an Ed25519 signed W3C Verifiable Credential for presentation to a lender.

Substantive caveat on passport credentials

The signature is genuine and verifiable. The credential subject values are currently fixtures, not values derived from your tenant's measured data. Do not present these credentials to a counterparty as evidence of measured performance until this endpoint is marked Live.

Reference

Platform

GET/api/telemetry/readyzLive

Ingestion readiness and dependency health. Unauthenticated. 200 when ready, 503 when degraded. The uptime commitment is measured against this endpoint.

GET/api/telemetry/healthzLive

Process liveness only. Does not check dependencies. Prefer /readyz.

GET/api/telemetry/metricsLive

Prometheus exposition, including telemetry_ingest_total and telemetry_readiness. Scrape it into your own observability stack if you want your dashboards and AmpVerve's to agree.

POST/api/devtools/apikeysBeta

Mints a key. Not yet accepted as a credential by any endpoint. See the authentication section.

POST/api/devtools/webhooksBeta

Registration only. AmpVerve does not deliver webhook events today. See the webhooks section.

Operations

Error catalogue

Every error you can currently receive, what it means, and what to do about it.

The error body today

{ "detail": "Authorization header missing" }
// detail is an ARRAY here, not a string. Parse accordingly.
{
  "detail": [
    { "type": "missing", "loc": ["body", "email"],
      "msg": "Field required", "input": {} }
  ]
}
// The one endpoint with a machine readable code today.
{
  "detail": {
    "error": "plan_limit_exceeded",
    "metric": "api_calls",
    "limit": 100000,
    "upgrade_url": "/billing/upgrade"
  }
}
Branch on status, not on message text

There is no machine readable code field on the general error body today, and detail changes shape across three cases: a string, an array on 422, and an object on 402. Write your parser to handle all three. Treat detail strings as diagnostic text for humans, never as a stable machine contract. The coded envelope below is the committed target.

Live error catalogue

HTTPdetailMeaningRemediation
400Organisation context missingToken carries no organisation.Re-authenticate. If it persists, the user is not attached to an organisation; contact support.
400Endpoint specific stringSemantically invalid request, for example an SSEN offer without tender_platform_id.Read detail. Correct and re-send. Do not retry unchanged.
401Authorization header missingNo credential was sent.Attach Authorization: Bearer.
401Invalid authorization headerHeader present but not Bearer <token>.Fix the header format.
401Invalid or expired tokenSignature failed, or exp has passed.Refresh once, retry once. Do not loop.
401Tenant missingToken carries no tenant_id and no header supplied one.Re-authenticate.
401invalid signatureHMAC verification failed on a signed inbound endpoint.Check the signing secret and that your timestamp is within 300 seconds.
403Tenant mismatchX-Tenant-ID disagrees with the token.Drop the header. The organisation always comes from the token.
403Insufficient permissionsThe role on the token does not satisfy the endpoint.Use an integration user with OPERATOR. See the role table.
403Roles missing on tokenToken carries an empty role list.Contact support. The user is misconfigured.
404Not FoundResource absent, not visible to your organisation, or the endpoint is not deployed.Check the path against this page. If it is labelled Planned, that is why.
422Array of field errorsSchema validation failed.Read loc to find the field. Never retry unchanged.
402plan_limit_exceededPlan quota exhausted.Follow upgrade_url or contact your account manager.
423LockedAccount locked after 5 failed logins, or a device command blocked by a safety gate.Wait 15 minutes for a login lock. For a command block, read the response body.
429Rate limit exceededToo many requests.Honour Retry-After. Back off exponentially with jitter.
500VariesUnhandled server error.Retry idempotent reads with backoff. For ingestion the write outcome is ambiguous; verify before re-sending.
502<provider> API errorAn upstream data provider failed.Retry with backoff. Fall back to your last good value. Not an AmpVerve fault and not counted against the ingestion SLA.
503status: degradedA dependency is unavailable.Stop writing, buffer, back off. Poll /api/telemetry/readyz to detect recovery.
503Credentials not configuredThe DNO flexibility platform is not wired for your environment.Contact support. Not a transient condition; retrying will not help.

Site level coded errors Planned

The committed target is a stable machine readable envelope carrying a code, the site and asset it concerns, and an explicit remediation action, returned per record so a partial failure is actionable without human triage.

{
  "error": {
    "code": "AV-4104",
    "message": "Unknown asset_id for site",
    "site_id": "site-0412",
    "asset_id": "inverter-9",
    "action": "Register the asset via POST /api/twin/ or correct asset_id.",
    "doc_url": "https://www.ampverve.com/api-docs/#errors",
    "request_id": "req_01J9X7QK3M",
    "retryable": false
  }
}
CodeHTTPMeaningRemediationRetryable
AV-4001400Malformed JSON bodyFix the serialiser.No
AV-4002400Batch exceeds the record limitSplit the batch.No
AV-4101401Credential missing or malformedAttach a valid bearer token.No
AV-4102401Token expiredRefresh once, retry once.Yes, once
AV-4103403Role insufficient for ingestionUse an OPERATOR integration user.No
AV-4104422Unknown asset_id for siteRegister the asset, or correct the id.No
AV-4105403Site not owned by this organisationCheck the site_id. Possible cross tenant configuration error.No
AV-4201422Timestamp unparseable or missing offsetSend ISO 8601 with an explicit UTC offset.No
AV-4202207soc_pct outside 0 to 100Check source scaling. Record is stored and flagged.No
AV-4203207power_kw beyond plausible rangeLikely watts sent as kilowatts.No
AV-4204207Duplicate discardedInformational. Your retry was safely absorbed.No
AV-4205422Timestamp in a compressed windowBackfill beyond 30 days needs coordination with support.No
AV-4290429Ingestion rate limit exceededHonour Retry-After, back off with jitter.Yes
AV-5001500Unhandled server errorVerify persistence before re-sending.Yes, with verification
AV-5301200Site stale, no data received in the expected intervalSite health signal, not a request failure. Check the site gateway.n/a
AV-5302200Site partially reporting, completeness below thresholdSome assets at the site are silent. Inspect per asset health.n/a
AV-5303503Persistence layer unavailable, data accepted but not storedBuffer and replay. This is the condition stored == 0 signals today.Yes
Operations

Webhooks

Not delivered today

You can register a webhook endpoint at POST /api/devtools/webhooks, and AmpVerve does not deliver events to it. There is no delivery worker, no signing secret and no retry policy in production. Registering does not cause you to receive anything.

The full contract below is the committed specification. Build your receiver against it now if you wish; do not deploy anything that depends on receiving an event.

Event catalogue Planned

EventFires whenWhy you care
ingest.batch.rejectedA batch fails validation or persistence.Failure reaches you rather than waiting to be polled for.
ingest.record.flaggedA record trips a quality rule.Unit and scaling errors surface within a minute, not at month end.
site.data.staleA site stops reporting for longer than its expected interval.The core site level failure notification.
site.data.partialSite completeness falls below threshold.Some assets are silent while the site still looks alive.
site.data.recoveredA stale or partial site returns to healthy.Closes the alert without a human checking.
platform.degradedThe ingestion layer enters a degraded state.Pause writes, start buffering.
platform.recoveredThe ingestion layer recovers.Resume, replay the buffer.
dispatch.instruction.receivedA DNO issues a flexibility instruction.Act on it inside the delivery window.
settlement.receipt.issuedA settlement receipt is issued.Reconcile revenue.

Payload Planned

{
  "id": "evt_01J9X7QK3MZ2",
  "type": "site.data.stale",
  "created_at": "2026-07-31T14:35:02Z",
  "organisation_id": "org_7f21",
  "api_version": "2026-07-31",
  "data": {
    "site_id": "site-0412",
    "code": "AV-5301",
    "last_received_at": "2026-07-31T14:05:00Z",
    "staleness_seconds": 1802,
    "expected_interval_seconds": 300,
    "assets_silent": ["site-0412-battery-1"]
  }
}

Signature verification Planned

Every delivery will carry X-AmpVerve-Signature: t=<unix>,v1=<base64>, an HMAC-SHA256 over "<t>.<raw body>". This is the same scheme AmpVerve already operates in production for inbound DNO dispatch, so it is proven rather than theoretical.

  • Compute the HMAC over the raw request body, before any JSON parsing. Re-serialising changes the bytes and the signature will not match.
  • Compare in constant time. A naive string comparison leaks timing.
  • Reject a timestamp more than 300 seconds from now, to prevent replay.
  • Multiple v1= values may appear during secret rotation. Accept the delivery if any matches.
import base64, hashlib, hmac, time

def verify(raw_body: bytes, header: str, secret: str, tol=300) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    ts = parts.get("t", "")

    # Reject replays before doing any crypto.
    if not ts.isdigit() or abs(time.time() - int(ts)) > tol:
        return False

    signed = f"{ts}.".encode() + raw_body
    expected = base64.b64encode(
        hmac.new(secret.encode(), signed, hashlib.sha256).digest()
    ).decode()

    # Any v1 may match during secret rotation. Constant time compare.
    return any(
        hmac.compare_digest(expected, candidate)
        for key, candidate in
        (p.split("=", 1) for p in header.split(","))
        if key == "v1"
    )
import crypto from "node:crypto";

export function verify(rawBody, header, secret, tol = 300) {
  const parts = new Map(header.split(",").map((p) => p.split("=")));
  const ts = parts.get("t");

  // Reject replays before doing any crypto.
  if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > tol) return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(Buffer.concat([Buffer.from(`${ts}.`), rawBody]))
    .digest("base64");

  return header
    .split(",")
    .filter((p) => p.startsWith("v1="))
    .some((p) =>
      crypto.timingSafeEqual(
        Buffer.from(expected),
        Buffer.from(p.slice(3)),
      ),
    );
}

Retry, backoff and replay Planned

PropertyBehaviour
SuccessAny 2xx within 10 seconds. Your body is ignored.
Retry schedule8 attempts over roughly 24 hours: 10s, 30s, 2m, 10m, 1h, 3h, 8h, 20h, with jitter.
Not retried410 Gone. Treated as a permanent unsubscribe.
Delivery semanticsAt least once. Deduplicate on the event id.
OrderingNot guaranteed. Order by created_at, never by arrival.
Auto disableAfter 72 hours of continuous failure. You are emailed before it happens.
ReplayEvents are retained 30 days and can be replayed by id or time range from the developer console.
Build your receiver correctly from the start

Respond 2xx immediately and process asynchronously. If you do work inline and exceed 10 seconds, the delivery is recorded as failed and retried, and you will process the same event repeatedly while your queue backs up.

Operations

Rate limits

SurfaceLimitWindowKeyed on
Authentication5 requests1 minuteSource IP, shared across login, signup and reset
Authenticated general100 requests1 minuteUser
Unauthenticated general20 requests1 minuteSource IP
Developer tools60 requests1 minuteOrganisation
  • Exceeding a limit returns 429 with Retry-After in seconds. Honour it.
  • Batch rather than parallelise. One request carrying 500 records costs one unit against the limit; 500 single record requests cost 500. This is the entire reason batching exists.
  • Back off exponentially with jitter. Synchronised retries across your fleet turn one blip into a self inflicted outage.
  • Higher ingestion limits are available under an integration agreement. Tell support your expected sites, assets per site and reporting interval, and a limit is set for you.
Operations

Pagination

Pagination is not uniform across the API yet. Check per endpoint rather than assuming.

PatternParametersWhere
Limit onlylimit, capped per endpoint/api/telemetry/live/events, cap 500
Page and sizepage from 1, page_size 1 to 100. Response carries total and has_more.Wallet and transaction listings
Time boundedrange, or period_from and period_toAsset history, tariff prices
UnpaginatedNone. The full set is returned.GET /api/twin/, GET /api/esg/
Two things that will bite you

Asset and receipt listings return everything. At a few thousand assets that response gets large. Cache it; it changes rarely.

The bucketed history series is sparse. Empty buckets are omitted rather than returned as null, so index by the t value, never by array position.

Cursor pagination with a stable next_cursor is Planned for every list endpoint, and will be introduced additively so existing clients keep working.

Operations

Versioning and deprecation

The API is date versioned. The current version is 2026-07-31, and it is the info.version of the OpenAPI document.

What can change without a new version

  • A new endpoint.
  • A new optional request field.
  • A new field in a response object.
  • A new enum value in a field documented as extensible, such as an anomaly reason.

Your client must tolerate all four. Ignore unknown response fields rather than failing on them, and never assume an enum is closed unless this page says it is.

What requires a new version

  • Removing or renaming a field.
  • Changing a field's type, unit or sign convention.
  • Making an optional request field required.
  • Changing the status code for an existing condition.
  • Removing an endpoint.

Deprecation policy

StageNoticeWhat happens
Announced90 days beforeEmail to every integration contact. Marked deprecated: true in the OpenAPI document. Logged in the changelog.
Warning60 days beforeResponses carry Deprecation and Sunset headers per RFC 9745 and RFC 8594.
Brownout14 and 7 days beforeShort scheduled windows returning 410, announced in advance, so a forgotten dependency surfaces while someone is still watching.
SunsetOn the dateEndpoint returns 410 Gone with a link to the replacement.

Endpoints marked Beta are excluded from this policy and may change with 30 days notice. Endpoints marked Planned carry no commitment until they ship.

Operations

Reliability and service levels

The ingestion layer design target, how it is defined, and what is and is not measured today.

99.5%

Ingestion availability target

A design target per calendar quarter, not a contractual commitment. AmpVerve does not currently measure or publish achieved availability.

60s

Measurement interval

Availability is evaluated in one minute buckets.

10.9h

Quarterly budget

The downtime the 99.5 percent target would permit in a 91 day quarter, once measurement is in place.

What counts as available

This is the definition AmpVerve is building toward. It is not yet instrumented, so no availability figure is claimed. A one minute bucket would be available when both hold:

  1. GET /api/telemetry/readyz returns 200 with status: "ready".
  2. A well formed authenticated POST /api/telemetry/ingest returns 2xx with stored equal to count.

Both conditions are required. The second exists deliberately: a response that returns 200 while stored is 0 is not an available minute, because the data did not persist. Availability here means data landed, not that a request completed.

Quarterly availability would be available minutes divided by eligible minutes, expressed as a percentage. No such measurement runs today. The second condition in particular requires an authenticated write probe that AmpVerve does not yet operate, and readyz alone does not distinguish every degraded state. Any availability number quoted before that instrumentation exists would be unsourced, so AmpVerve does not quote one. Enterprise availability terms are agreed in the contract, not on this page.

What is excluded

ExcludedWhy
Client errors, 4xxA malformed or unauthorised request is not an availability failure. 429 is included when it results from a limit AmpVerve reduced without notice.
Scheduled maintenanceAnnounced at least 5 business days ahead, capped at 4 hours per quarter, outside 07:00 to 22:00 UK time.
Consumer side faultsYour network, DNS, TLS configuration or credential expiry.
Third party data providersA 502 from Octopus, Elexon or National Grid affects market data, not ingestion.
Force majeureEvents outside reasonable control, including upstream cloud region failure.

Service credits

AmpVerve does not publish a service credit schedule, because a credit schedule is only meaningful once achieved availability is measured, and it is not measured today. Availability terms, including any credits, are agreed per contract. Ask during commercial discussion and you will get the current position in writing rather than a number this page cannot stand behind.

How degradation is signalled

SignalAvailable todayDetects
GET /api/telemetry/readyzLivePlatform wide degradation, per dependency.
stored against countLiveSilent non persistence on an otherwise successful request.
anomalies arrayLivePer record data quality problems.
source: timeseries_unavailableLiveRead path degradation, distinguished from genuinely empty data.
Prometheus /metricsLiveIngest throughput and readiness, scrapeable into your own stack.
Site health endpointPlannedPer site staleness and completeness.
Webhook alertsPlannedPush notification of failure rather than polling.
Public status pagePlannedIncident history and live component status.
There is no public status page yet

status.ampverve.com does not resolve. Until it exists, incident communication is by email to your integration contacts, and /api/telemetry/readyz is the authoritative live signal. Poll it every 30 to 60 seconds and alert on it. Do not wait for an email to notice.

Recommended consumer posture

  1. Buffer locally. Hold at least 24 hours of un-acknowledged telemetry on disk. Availability targets are not a substitute for a buffer.
  2. Never treat 200 as durability. Acknowledge from your buffer only when stored equals count.
  3. Alert on the readiness probe, not only on your own request failures. It gives you minutes of warning.
  4. Replay in timestamp order after an outage, oldest first, throttled to a few batches per second.
  5. Monitor per site staleness yourself until the site health endpoint ships. A site that stops reporting produces no errors at all, only an absence.
Operations

Security and data handling

Transport

  • TLS 1.2 or above required. Plain HTTP is not served.
  • HSTS is enforced with a one year max age including subdomains.
  • Charge point connections use OCPP security profiles 1 through 3, including mutual TLS with client certificates on the dedicated endpoint.
  • Inbound DNO dispatch is authenticated by HMAC-SHA256 with a 300 second replay window and constant time comparison.

Tenant isolation

  • Every query is scoped by organisation, taken from the token and never from a client supplied parameter.
  • A conflicting X-Tenant-ID header is rejected with 403 rather than silently ignored.
  • Cross tenant data exposure is treated as a P0 incident with immediate notification to every affected organisation.

Credentials

  • Passwords are hashed with bcrypt. They are never stored or logged in a recoverable form.
  • Vendor credentials you supply for device integrations are redacted on every response path. They are never echoed back.
  • Platform secrets live in Azure Key Vault and are surfaced to workloads as Kubernetes secrets. They are never in source control.
  • Refresh tokens are tracked by identifier and revoked immediately on logout.

Data handling and retention

DataRetentionNotes
Telemetry recordsRetained for the life of the agreementCompressed after 30 days. Full fidelity is preserved.
Original payloadSame as the recordYour unmapped fields are kept verbatim, not discarded.
Audit eventsMinimum 12 monthsAuthentication and authorisation outcomes.
Deleted assetsRegistry entry removed immediatelyHistorical telemetry is retained and remains queryable.
  • Data is processed and stored in the UK and EU. It is not transferred outside without a documented safeguard.
  • Export and erasure requests are handled per the data processing agreement. Erasure covers personal data; aggregate settlement records may be retained where a regulatory obligation requires it.

Reporting a vulnerability

Email security@ampverve.com. Acknowledgement within 1 business day, triage within 3. Please do not test against another organisation's data under any circumstances.

See also the security overview and the data processing agreement.

Enterprise guide

Getting started with the AmpVerve API

The AmpVerve API supports integrations for homes, commercial and industrial sites, fleets, data centres, energy suppliers, CPOs, CSMS providers, EMS and BMS platforms, OEMs and market partners. The same tenant boundary applies to every audience. Product access does not imply that every asset can be controlled or that every country has an active revenue programme.

Choose an integration path

Persona Typical starting point What must be agreed before production
Home energy app One organisation, household sites and user delegated assets Consent wording, supported equipment, tariff source and country capability
B2B portfolio operator Organisation, sites, operators, assets and telemetry RBAC, data ownership, site identifiers, retention and support escalation
B2B2C supplier or OEM Partner organisation plus end customer sites Delegation, branding, end user consent, offboarding and data portability
Fleet or CPO Fleet sites, chargers, vehicles, sessions and operational constraints CSMS authority, charger protocol, driver consent, uptime and command limits
Commercial or industrial EMS/BMS Sites, meters, batteries, solar, HVAC and process loads Control boundaries, maintenance windows, fallback mode and audit retention
Data centre Metered boundaries, UPS or battery assets and flexible loads No impact constraints, redundancy policy, change control and dispatch approval
Market partner Eligible sites, programmes, dispatches, metering and settlement Contract, qualification, programme rules, evidence and payout configuration

Current production base URL

https://app.ampverve.com

https://api.ampverve.com and https://sandbox.ampverve.com are planned and do not resolve as of 2026-08-20. Do not place them in a client configuration. See ../ENVIRONMENT_ACTIVATION.md for the activation sequence.

Make the first verified call

Check readiness without credentials:

curl --fail-with-body \
  https://app.ampverve.com/api/telemetry/readyz

Obtain a 60 minute bearer token. Use a dedicated integration user in a dedicated organisation. Never share an administrator's interactive account with a service.

curl --fail-with-body \
  -X POST https://app.ampverve.com/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"integration@example.com","password":"<secret>"}'

Send telemetry only after the identifiers and units in RESOURCE_AND_ASSET_MODEL.md are agreed:

curl --fail-with-body \
  -X POST https://app.ampverve.com/api/telemetry/ingest \
  -H 'Authorization: Bearer <access_token>' \
  -H 'Content-Type: application/json' \
  -d '[{
    "asset_id":"site-0412-battery-1",
    "ts":"2026-08-20T16:30:00Z",
    "power_kw":2.4,
    "soc_pct":61.2,
    "status":"charging"
  }]'

Treat the response as successful only when stored equals count. A 200 response with stored: 0 means the service accepted and streamed the records but did not durably store them. Check readiness, buffer the source records and follow the ambiguity guidance in PLATFORM_CONTRACTS.md before retrying.

Authentication and tenant isolation

The current credential is a bearer JWT obtained with email and password. API key authentication, OAuth client credentials and delegated end user tokens are planned. Keys returned by /api/devtools/apikeys are not accepted as credentials today.

The authenticated token selects the organisation. Do not rely on a UI, client supplied organisation_id, or an X-Tenant-ID header to enforce isolation. A partner client should:

  1. keep separate credentials and storage for every organisation;
  2. never reuse an idempotency key across organisations;
  3. treat 403 tenant mismatch as a security incident, not a retryable error;
  4. preserve organisation_id, site_id, asset_id, request id and event id in
  5. its own audit trail;

  6. use synthetic tenants and assets for tests.

Production access checklist

Before sending customer data, agree all of the following with AmpVerve:

  • organisation and environment identifiers;
  • data controller and processor roles;
  • authentication and credential rotation owner;
  • permitted asset classes, commands and countries;
  • consent capture and revocation flow;
  • expected telemetry frequency, units, backfill and retention;
  • support contacts and incident severity definitions;
  • rate limits and expected burst size;
  • market, settlement and payout gates, if revenue features are in scope;
  • rollback and offboarding procedure.

Tools

The checked in ../openapi.yaml and ../openapi.json are the canonical machine contracts. Import the JSON file into Postman, Insomnia or an OpenAPI code generator. Generated clients are not official AmpVerve SDKs. Pin the specification commit, review generated diffs and keep transport retry behaviour outside generated model code. There are no published npm, PyPI, Maven, NuGet, Swift or Go SDK packages today.

Enterprise guide

Global capability discovery

AmpVerve is designed as a global platform. Global design is not the same as global activation. Country, asset, connection, optimisation, control, market, settlement, payout and carbon capabilities must be discovered independently.

The public contract must never answer the question "is this country supported?" with one boolean. A user may be able to download the app and connect telemetry while smart control, flexibility revenue or carbon monetisation remains unavailable.

Capability dimensions

Resolve capability from all of these inputs:

  • ISO 3166-1 alpha-2 country code;
  • subdivision, postcode, utility territory or grid zone;
  • organisation and contract;
  • customer segment: residential, commercial, industrial, fleet or data centre;
  • site import, export and connection agreement;
  • asset class, make, model, firmware and connectivity path;
  • consent and delegated control authority;
  • tariff and meter data source;
  • market partner, programme, qualification and enrolment;
  • telemetry freshness and control verification;
  • settlement currency, tax information and payout corridor.

Planned discovery endpoint

GET /api/platform/v1/capabilities is planned and returns 404 today. Its planned OpenAPI contract is included in ../openapi.yaml so partners can design an honest availability UI before the route is released.

The endpoint accepts any valid ISO country code. Unknown or unverified coverage returns an explicit unavailable result. It must never fall back to GB or infer market access from locale.

{
  "country_code": "US",
  "subdivision_code": "US-CA",
  "evaluated_at": "2026-08-20T16:30:00Z",
  "evidence_version": "2026-08-20",
  "capabilities": [
    {
      "name": "asset.telemetry",
      "state": "connection_available",
      "asset_types": ["ev", "charger", "battery"],
      "requirements": ["compatible provider account", "customer consent"]
    },
    {
      "name": "flex.revenue",
      "state": "partner_gated",
      "partner": "Leap",
      "requirements": [
        "technical connector merged and deployed",
        "eligible programme and utility territory",
        "meter or device enrolment",
        "dispatch and telemetry verification",
        "settlement and payout activation"
      ]
    }
  ]
}

This example describes the shape and prerequisite chain. It does not claim the planned endpoint or US revenue path is live.

Availability states

State Customer meaning
available Read-only feature is deployed and verified for the returned scope.
connection_available A real connection path exists; instance compatibility is still verified during connection.
control_verified The exact connected asset has passed a safe control test.
partner_gated A partner or credential activation is missing.
qualification_required Grid, market or programme approval is missing.
enrolment_required Customer, meter or asset is not enrolled.
settlement_required Dispatch may be possible, but measurement and settlement are not complete.
payout_required Revenue may be settled, but the payee or payout rail is not active.
research_required No verified evidence pack exists for the country or feature.
unavailable The capability is not offered for this scope.

Country guides

The country catalog lives in ../markets/. Great Britain and the United States have evidence based guides because there is concrete repository and partnership context. Every other ISO country remains research_required or planned until its market guide is completed and approved. An Axle or Leap market page is useful competitive evidence, but it is not proof of AmpVerve access.

Each country guide records:

  1. market structure and named operators;
  2. programme types and AmpVerve's aggregator route;
  3. eligible assets and customer segments;
  4. meter, telemetry and dispatch requirements;
  5. baseline, verification and settlement method;
  6. currency, tax and payout notes;
  7. carbon method and double counting guard;
  8. consent, privacy and data residency requirements;
  9. technical endpoints and partner dependencies;
  10. readiness state, evidence source and evidence date.

Compatibility discovery

Country availability must be intersected with asset compatibility. A brand catalog entry or protocol implementation is not sufficient. The response should identify the supported connection routes in priority order:

  1. direct OEM cloud API;
  2. approved aggregator connection;
  3. CPO or CSMS path such as OCPP;
  4. site gateway path such as Modbus, SunSpec, BACnet or MQTT;
  5. utility data path such as Green Button;
  6. compatibility request when none is verified.

Every route states whether it provides telemetry, scheduling, real-time control, bidirectional control or data only.

Cache and audit rules

Capability decisions can change when programme windows, provider credentials, device health or user consent change. Responses should carry evaluated_at, an evidence version and a short cache lifetime. Preserve the exact decision and requirements used for every optimisation, command, bid and customer claim.

Enterprise guide

Resource, asset and delegation model

This is the canonical model for new partner integrations. Some resources below do not yet have a public CRUD endpoint. A documented model is not proof that an API is deployed. Check ../openapi.yaml and its x-ampverve-status field before calling anything.

Resource hierarchy

partner
  organisation
    users and service identities
    portfolio or fleet
      site
        grid boundary and meters
        assets
          connection
          capabilities
          telemetry streams
          constraints and consent
          optimisation runs
          commands and verification
        programme enrolments
        dispatches
        settlement lines
        payout allocations

organisation_id is the tenant boundary. site_id is a physical or contractual boundary. asset_id identifies one controllable or observable resource within the organisation. A portfolio is a grouping, not a replacement security boundary.

Audiences and roles

The current API authorises by role, not OAuth scope. Current role names are ORG_ADMIN, OPERATOR, ANALYST, RESEARCHER and VIEWER. New partner APIs should move toward explicit permissions such as telemetry:write, assets:read, control:request and settlement:read, but those scopes are planned.

A B2B2C partner must not make every end customer an organisation administrator. Use delegated grants that record:

  • grantor user and organisation;
  • grantee partner or service identity;
  • site and asset scope;
  • capability scope, such as read telemetry or schedule charging;
  • country and programme scope, where applicable;
  • consent text and version;
  • granted, effective, expiry and revoked timestamps;
  • source channel and evidence reference.

Delegated OAuth and consent resources are planned. Until available, access is provisioned contractually and through organisation roles.

Universal asset envelope

All asset types should share a small stable envelope and put device specific data in typed capability blocks.

{
  "id": "site-0412-battery-1",
  "organisation_id": "org-123",
  "site_id": "site-0412",
  "external_id": "partner-device-987",
  "asset_type": "battery",
  "manufacturer": "example",
  "model": "example-10",
  "country_code": "GB",
  "timezone": "Europe/London",
  "connection": {
    "state": "connected",
    "provider": "oem_cloud",
    "last_verified_at": "2026-08-20T16:00:00Z"
  },
  "capabilities": [
    {"name": "telemetry.read", "state": "verified"},
    {"name": "power.setpoint.write", "state": "unavailable"}
  ]
}

The supported asset vocabulary is designed to include:

  • EVs, chargers, batteries, solar and inverters;
  • heat pumps, HVAC, thermostats and hot water;
  • smart meters, submeters and grid boundary meters;
  • fleets, depots, commercial sites, industrial loads and data centre resources;
  • tariffs, utility accounts and market programme relationships.

An asset type alone never proves control. Capability must be reported and verified per connected instance. For example, a vehicle can expose battery telemetry while its paired charger provides the actual charge control path.

Capability states

State Meaning
declared An adapter or partner says the capability exists. Not yet exercised.
discovered The connected account or device reported it.
verified AmpVerve exercised the exact read or command path successfully.
degraded Previously verified, but freshness, provider or device health is below threshold.
unavailable The connected instance does not support it.
partner_gated Technical path exists but partner activation is missing.
qualification_required A market, grid or programme approval is missing.
revoked The user or operator withdrew authority.

Only verified permits live control, and only while freshness, consent and safety checks remain valid.

Connection and protocol paths

AmpVerve can model OEM cloud APIs, aggregator APIs, OCPP, OCPI, Modbus, SunSpec, BACnet, MQTT, OpenADR, IEEE 2030.5, Green Button and utility or tariff feeds. The presence of an adapter, protocol class or brand in source code is not evidence of production credentials, compatible firmware, geographic coverage or a tested live path.

Every connection response should disclose:

  • connection_method and provider;
  • credential owner and expiry, without returning secrets;
  • asset and country scope;
  • observed and verified capabilities;
  • last successful read and command timestamps;
  • health, rate limit and relink state;
  • fallback mode if the provider is unavailable.

Unsupported assets

Do not return a fake connected asset or a generic success result. The integration flow for an unsupported make, model, protocol or country is:

  1. accept a compatibility request with manufacturer, model, country and asset type;
  2. return request_received, not connected;
  3. provide a request id and status endpoint;
  4. assess an existing aggregator, OEM cloud or local gateway route;
  5. verify the model, account permissions, telemetry and safe command path;
  6. activate only for the requesting organisation and scope;
  7. notify the partner when the capability moves to verified.

Gateway onboarding follows the same rule. A gateway can widen protocol reach, but it cannot create manufacturer permission, grid approval or market qualification.

Lifecycle and deletion

Recommended lifecycle states are requested, authorising, connected, verifying, active, degraded, relink_required, revoked and offboarded. Offboarding must revoke credentials and future control immediately. Telemetry, command and settlement evidence may need retention under contract or regulation; it must not be silently deleted with the registry row.

Enterprise guide

Safe control and revenue lifecycles

AmpVerve's control model is Forecast -> Optimise -> Execute -> Verify -> Monetise. Each transition has its own evidence and failure state. A forecast or optimisation result must never be treated as proof of execution, savings or revenue.

Optimisation

An optimisation input should include the organisation, site, assets, tariff, forecast, availability, comfort or operational constraints, import and export limits, reserve, user consent and data freshness. Store the input version, solver version, objective, constraints, result and explanation.

Recommended job states are queued, running, succeeded, failed, cancelled and expired. A successful solve means a feasible plan was produced. It does not mean a device accepted or executed it.

Live control

Live asset control is fail closed. Before a command is accepted, verify:

  • tenant, role and delegated authority;
  • environment is production and simulation is false;
  • connected asset identity and verified capability;
  • fresh telemetry and current device state;
  • safety, comfort, mobility and reserve constraints;
  • grid connection and export limits;
  • per organisation live control activation;
  • idempotency key and command expiry;
  • command rate and provider limits.

A command is asynchronous. The API contract should distinguish accepted, sent, acknowledged, executing, succeeded, failed, expired, cancelled and superseded. accepted is not succeeded. Verification should use post-command telemetry and preserve provider acknowledgements.

Smart charging, heating and cooling

Optimisation is available only where the connected asset supports the required read and write capabilities. Smart charging also requires a known charging boundary, user departure or ready-by intent and sufficient energy reserve. Heating and cooling require safe temperature bounds, equipment mode support and an explicit fallback when connectivity is lost.

Tariff arbitrage needs a verified tariff, timezone, tax treatment and import or export price basis. Never mix wholesale, retail, imbalance and flexibility prices without labelling the source and unit.

V2H and V2G

Vehicle telemetry or ordinary charger control does not prove bidirectional capability. V2H or V2G execution additionally requires:

  • a compatible EV and bidirectional charger pair;
  • firmware, protocol and installation support;
  • site export permission and grid limits;
  • user reserve, mobility schedule and consent;
  • an exercised charge and discharge command path;
  • a programme that accepts the asset and metering arrangement for V2G revenue.

V2H savings and V2G market revenue are different products and should be reported separately.

Market access gate model

Use these states for each country, programme and organisation:

Gate Evidence required
relationship_recorded Executed commercial agreement or approved partner record
connector_implemented Reviewed connector and contract tests
credentials_verified Production credentials work without exposing secrets
qualification_approved Market or programme approval is recorded
asset_eligible Asset, site, meter and customer satisfy the programme rules
enrolled Programme accepted the enrolment
dispatch_ready Notification, scheduling, control and acknowledgement path exercised
metering_ready Required interval data passes completeness and quality gates
settlement_ready Baseline, performance and reconciliation path exercised
payout_ready Payee, currency, tax and payment rail are active
live All required gates above are current for this exact scope

The founder's Leap relationship in the USA and work with UK DNOs, NESO and Elexon are relevant market-access evidence. They do not by themselves make a country or programme live. As of 2026-08-20, the Leap connector changes are on open PRs rather than enterprise/main. The public API must describe the route as partner-gated until connector deployment and the remaining gates are verified.

Dispatch processing

Dispatch consumers must handle updates, cancellation, overlapping events, priority and duplicate delivery. Store the external event id, version, market, programme, site or group, start and end, requested direction and quantity, received time and raw payload hash. Acknowledge receipt quickly, process asynchronously and reject commands outside the allowed window.

Simulation and communication-test events need explicit flags and separate ledgers. They must not reach live devices or revenue reporting unless a controlled test authorisation says so.

Metering, baseline and settlement

For each dispatch preserve:

  • raw meter and asset intervals with provenance;
  • timezone, interval boundary, unit and sign convention;
  • missing, estimated, substituted and corrected quality flags;
  • baseline method and version;
  • delivered quantity and performance calculation;
  • market statement and settlement version;
  • variance, dispute and correction history;
  • gross revenue, fees, taxes, customer share and currency;
  • link from every payout line to settled evidence.

Settlement ingestion and calculation do not authorise payout. Payout must be a separate idempotent, approved operation that fails closed when payee, tax, currency or bank configuration is incomplete.

Carbon

Operational carbon estimates can use timestamped grid intensity and measured energy. Label them as estimates with geography, source, methodology and data quality. Carbon monetisation additionally requires an accepted methodology, additionality, ownership, double counting prevention, verification, registry or buyer, issuance and settlement. Until those gates are complete, the API must not call an estimate a credit or report saleable revenue.

Enterprise guide

Platform integration contracts

This guide defines the cross-cutting behaviour every public API family should share. Where the current deployed API differs, ../openapi.yaml is authoritative and the difference is called out below.

Request metadata

Partners should send:

  • Authorization: Bearer <token> for protected routes;
  • Content-Type: application/json for JSON bodies;
  • Idempotency-Key for retryable writes once the endpoint documents support;
  • X-Request-ID with a unique value for tracing, when supported;
  • traceparent when distributed tracing is agreed.

AmpVerve responses should return a request id and rate limit headers. These headers are target behaviour, not a promise for every current endpoint.

Errors

The current API generally returns FastAPI's {"detail": ...} envelope. The stable coded envelope is planned:

{
  "error": {
    "code": "AV-CONTROL-4091",
    "message": "Asset capability is not verified",
    "request_id": "req_01J...",
    "retryable": false,
    "details": {
      "asset_id": "site-0412-battery-1",
      "required_capability": "power.setpoint.write"
    }
  }
}

Retry only when the operation and error are explicitly retryable. Do not retry authentication failures, tenant mismatches, missing consent, invalid constraints or rejected market actions.

Idempotency

Current telemetry ingestion has no server side idempotency or duplicate detection. Verify ambiguous outcomes before resending. The planned ingestion v1 contract retains an Idempotency-Key for 24 hours.

For every future write:

  • keys are scoped by organisation, route and caller;
  • the same key and body return the original result;
  • the same key with a different body returns 409;
  • the retention window is documented per endpoint;
  • command, bid, settlement and payout writes require idempotency;
  • webhook consumers deduplicate on event id.

Pagination

Current pagination is not uniform. Some lists return the complete set, some use limit, and some use page and page_size. Check each operation.

The planned standard is cursor pagination:

{
  "data": [],
  "page": {
    "next_cursor": "opaque",
    "has_more": true
  }
}

Clients must treat cursors as opaque and keep stable sort order. Time-series clients should also store the timestamp and source identifier at the page boundary to detect late corrections.

Rate limits

Login is currently limited to five attempts per minute per source IP. Other limits vary by service and plan. Honour Retry-After and use exponential backoff with jitter. Request an agreed ingestion limit before production load testing.

Do not poll high consequence state when a supported webhook exists. Do not exceed an OEM's documented command budget merely because AmpVerve accepts a request.

Asynchronous jobs

Optimisation, connection, backfill, bulk enrolment, dispatch allocation, settlement and export operations should use a common job envelope:

{
  "id": "job_01J...",
  "type": "optimisation",
  "state": "queued",
  "submitted_at": "2026-08-20T16:30:00Z",
  "expires_at": "2026-08-20T16:35:00Z",
  "links": {"self": "/api/platform/v1/jobs/job_01J..."}
}

Jobs are organisation scoped, cancellable only where safe, and immutable after terminal state. Results keep input and algorithm provenance. A timeout while polling a job does not cancel it.

Webhooks

POST /api/devtools/webhooks currently stores registrations only. AmpVerve does not deliver events from this route as of the OpenAPI evidence date. Do not deploy a workflow that depends on it.

The planned delivery contract includes:

  • HTTPS endpoints and explicit event subscriptions;
  • HMAC-SHA256 signatures over timestamp plus raw body;
  • timestamp tolerance and multiple signatures during secret rotation;
  • stable event id, type, version, creation time and organisation id;
  • at-least-once delivery with documented retries;
  • replay by id or time range;
  • test events clearly separated from production events;
  • dead-letter visibility and disablement after persistent failure.

Receivers should authenticate before parsing, persist the event before returning 2xx, deduplicate by id, process asynchronously and fetch the current resource when ordering matters.

Audit and provenance

Every high consequence operation should be traceable across:

request -> decision -> job -> command or bid -> provider acknowledgement -> telemetry verification -> settlement -> payout

Preserve organisation, actor, delegated authority, environment, timestamps, inputs, outputs, constraints, algorithm and connector versions, raw partner references, evidence hashes and correction history. Audit data is append-only and tenant scoped. Redact secrets and personal data from logs.

OpenAPI, Postman and SDKs

The OpenAPI JSON can be imported into Postman or used with standard generators. Before publishing an official SDK, AmpVerve needs:

  1. a stable versioned base URL;
  2. consistent error, pagination and idempotency contracts;
  3. generated and handwritten tests against an isolated sandbox;
  4. package ownership, signing and vulnerability handling;
  5. release notes and deprecation policy.

Until then, generated clients are partner-owned artifacts. Do not publish package installation commands under the AmpVerve name.

Versioning, changelog and deprecation

Additive response fields can ship without a new path version. Clients must ignore unknown fields. Removing or renaming a field, changing meaning, tightening an enum or changing auth requires a new version or a documented migration window.

Every deprecation notice should state the replacement, announcement date, last supported date and migration guide. High consequence control and settlement contracts need a longer partner test window than read-only beta endpoints.

Service levels and status

/api/telemetry/readyz is the current machine-readable ingestion readiness signal. A public multi-component status page is planned. Contractual SLA, support response, recovery objectives and service credits belong in the signed partner agreement. Documentation should not invent them.

Enterprise guide

API environment activation runbook

This runbook records what must happen before the founder adds GoDaddy DNS. It is documentation, not authorisation to change production infrastructure or DNS.

Current state, verified 2026-08-20

Host DNS Application state
www.ampverve.com CNAME to ampverve.com, which resolves to 92.205.13.94 Public WordPress site and API documentation page
app.ampverve.com A record to 108.141.64.121 Current production web and API ingress
api.ampverve.com NXDOMAIN No ingress host or TLS certificate
sandbox.ampverve.com NXDOMAIN No isolated sandbox stack, ingress or TLS certificate

infra/k8s/ingress-api-public.yaml now defines the future production API host, its separate certificate and an explicit path allowlist. It is not evidence that DNS, certificate issuance or end-to-end activation has happened. The existing app.ampverve.com manifests and TLS secret are unchanged.

Production API hostname

Complete these steps in order:

  1. Review infra/k8s/ingress-api-public.yaml against every non-planned path in
  2. openapi.yaml. Confirm there is no / catch-all and no internal control, payout, admin or planned route.

  3. Validate the manifest with both client and server dry-run. The infrastructure
  4. workflow runs server dry-run before applying it.

  5. Merge the reviewed change. Let GitHub Actions deploy it. Do not apply the
  6. manifest manually.

  7. Confirm all public API ingresses have address 108.141.64.121, reference secret
  8. tls-api-ampverve, and have only the intended host and paths:

``powershell kubectl -n ampverve get ingress ampverve-public-api-strip ampverve-public-api-esg ampverve-public-api-twin ampverve-public-api-vpp ampverve-public-api-auth -o wide kubectl -n ampverve describe certificate tls-api-ampverve ``

Ready=False can be expected before DNS exists because the HTTP-01 challenge cannot reach the ingress yet. A different ingress address is a stop condition.

  1. Re-resolve app.ampverve.com immediately before the DNS change. Use its
  2. current reserved ingress IP, not a historical value.

  3. In GoDaddy DNS Management for ampverve.com, add exactly this record:
Type Name Value TTL
A api 108.141.64.121 600 seconds during activation
  1. Do not add a forwarding rule, parking entry or second api record. Save the
  2. A record and wait for authoritative DNS plus at least two public resolvers to return the new address:

``powershell Resolve-DnsName api.ampverve.com -Type A nslookup api.ampverve.com 1.1.1.1 nslookup api.ampverve.com 8.8.8.8 ``

  1. Wait for cert-manager to finish the HTTP-01 challenge, then confirm the
  2. certificate is ready and the presented certificate is for the API host:

``powershell kubectl -n ampverve wait --for=condition=Ready certificate/tls-api-ampverve --timeout=10m kubectl -n ampverve get certificate tls-api-ampverve -o wide curl.exe --fail-with-body https://api.ampverve.com/api/telemetry/healthz ``

Do not bypass a TLS error or temporarily serve the web-console certificate.

  1. Confirm the allowlist fails closed. /, /api/hems/healthz and the planned
  2. /api/platform/v1/capabilities route must not be served on the API host.

  3. Probe every documented public path, authentication, tenant mismatch,
  4. request-size, CORS and rate-limit behaviour on the new hostname.

  5. Update openapi.yaml, client configuration and the published docs only after
  6. the probes pass. Keep app.ampverve.com as a compatibility host during a documented migration window.

The A record target in this runbook was rechecked against the live ingress on 2026-08-20. If app.ampverve.com resolves to a different reserved ingress IP at activation time, use that current address and record the reason in the evidence bundle.

Isolated sandbox

Do not point sandbox.ampverve.com at the production ingress as a shortcut. infra/bicep/sandbox/ is a fail-closed foundation: deployment is disabled by default, it has no public ingress target, and it does not create a shared namespace in production. A usable sandbox still needs all of the following:

  • separate namespace or cluster and network policy;
  • separate database, object storage, queues, caches and encryption keys;
  • sandbox-only identity issuer, credentials and tenant ids;
  • synthetic customers, meters, tariffs, assets, programmes and settlements;
  • simulated device and market connectors that cannot call production partners;
  • hard blocks on live commands, bids, payouts, exports and carbon issuance;
  • test webhook delivery, replay and fault injection;
  • data reset and fixture versioning;
  • separate observability, incident labels and support expectations;
  • an environment marker on every response and audit record.

Only after the sandbox ingress and certificate are deployed should the founder create:

Type Name Value TTL
A or CNAME sandbox The dedicated sandbox ingress target supplied by the infrastructure deployment 600 seconds during activation

Do not prefill the target with 108.141.64.121. Sandbox isolation is a product and safety requirement, not a hostname convention.

Go or no-go evidence

Archive these results for each environment:

  • DNS answer from at least two public resolvers;
  • TLS certificate subject, issuer and expiry;
  • ingress and service revision identifiers;
  • liveness and readiness output;
  • OpenAPI contract test result;
  • unauthenticated, wrong-tenant and wrong-role negative tests;
  • test asset and test webhook exercise;
  • proof that sandbox cannot reach production control, market or payout systems;
  • rollback owner and DNS rollback values.
Market guide

ISO country capability index

The planned global capability service accepts every officially assigned ISO 3166-1 alpha-2 code listed below. This is an input catalog, not a coverage claim.

Default status for every code is research_required. Published guides can still have that status: a guide proves that official routes and activation gates were researched, not that AmpVerve has activated them.

Code Country Status Guide
GB United Kingdom, with the market guide scoped to Great Britain partner_gated GB
US United States partner_gated US
AU Australia, NEM scope with a separate WEM boundary research_required AU
CA Canada, province-dependent research_required CA
DE Germany research_required DE
FR France research_required FR
IE Ireland, Republic of Ireland scope research_required IE
NL Netherlands research_required NL
NZ New Zealand research_required NZ
DK Denmark research_required Nordics, Denmark
FI Finland research_required Nordics, Finland
NO Norway research_required Nordics, Norway
SE Sweden research_required Nordics, Sweden

Mobile country metadata supports localisation and disclosure work only. It does not change an energy-market status in this catalog.

All assigned alpha-2 codes

Initial Codes
A AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ
B BA, BB, BD, BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BS, BT, BV, BW, BY, BZ
C CA, CC, CD, CF, CG, CH, CI, CK, CL, CM, CN, CO, CR, CU, CV, CW, CX, CY, CZ
D DE, DJ, DK, DM, DO, DZ
E EC, EE, EG, EH, ER, ES, ET
F FI, FJ, FK, FM, FO, FR
G GA, GB, GD, GE, GF, GG, GH, GI, GL, GM, GN, GP, GQ, GR, GS, GT, GU, GW, GY
H HK, HM, HN, HR, HT, HU
I ID, IE, IL, IM, IN, IO, IQ, IR, IS, IT
J JE, JM, JO, JP
K KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ
L LA, LB, LC, LI, LK, LR, LS, LT, LU, LV, LY
M MA, MC, MD, ME, MF, MG, MH, MK, ML, MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ
N NA, NC, NE, NF, NG, NI, NL, NO, NP, NR, NU, NZ
O OM
P PA, PE, PF, PG, PH, PK, PL, PM, PN, PR, PS, PT, PW, PY
Q QA
R RE, RO, RS, RU, RW
S SA, SB, SC, SD, SE, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SR, SS, ST, SV, SX, SY, SZ
T TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, TV, TW, TZ
U UA, UG, UM, US, UY, UZ
V VA, VC, VE, VG, VI, VN, VU
W WF, WS
Y YE, YT
Z ZA, ZM, ZW

XK is used operationally by some systems for Kosovo but is not an officially assigned ISO 3166-1 alpha-2 code. Treat it as a separately governed extension, not as part of this index.

Moving a country out of research

Copy TEMPLATE.md, name it with the alpha-2 code, complete every section with primary evidence and add it to README.md. A country can have mixed outcomes, such as tariff reads available and market revenue unavailable. Never replace the capability matrix with one country-wide boolean.

Market guide

GB: Great Britain

Readiness

Field Value
Overall state partner_gated
Evidence date 2026-08-20
App availability Separate store decision, not market evidence
UK tariff and carbon reads live for the operations marked live in OpenAPI
UKPN and SSEN public flex routes partner-gated per organisation and credential
NESO DFS AmpVerve appears on the registered provider list; technical and operational gates still apply
Elexon Connector and qualification work exist; do not infer complete settlement or market participation
End user revenue Not globally active; requires programme, asset, dispatch, settlement and payout readiness

Market structure and routes

AmpVerve's current public API exposes GB tariff, wholesale, carbon and DNO region data. The VPP service has connector code for UK Power Networks LocalFlex and SSEN ElectronConnect. Those routes require per-tenant credentials and return a failure when credentials are absent.

NESO's Demand Flexibility Service is a separate national route. NESO publishes current service terms, procurement rules, participation guidance and an API schema. AmpVerve Ltd appears in NESO's registered provider list effective from 9 April 2026. Registration does not prove that a given customer or asset is enrolled, dispatched, measured, settled or paid.

Primary evidence:

Customer and asset scope

Potential customer segments include households, commercial and industrial sites, fleets and data centres. Programme-specific terms decide actual eligibility. Potential assets include EVs, chargers, batteries, solar, heat pumps, HVAC and other controllable demand, but only assets with valid metering, consent and a verified response path can participate.

V2G additionally needs a compatible EV and charger pair, export permission and a programme that accepts the metering arrangement. Smart charging or V2H capability does not establish V2G market eligibility.

Metering, dispatch and settlement

The programme evidence pack must pin the applicable rule version. It records meter identifier, interval, timezone, sign, quality flags, baseline, event, delivered quantity, correction and settlement statement. DNO and NESO events are not interchangeable, and overlapping instructions require a primacy decision.

Elexon data can support wholesale and imbalance context. Elexon integration work or registration is not proof that AmpVerve is the settlement party for a given service. Revenue is realised only after the relevant counterparty accepts the performance and issues or confirms settlement.

Currency, tax and carbon

Amounts are represented in GBP only where the source market or contract is GBP. Customer payout needs a verified payee, contractual revenue share, tax handling and payment rail. The API does not provide tax advice.

GB grid carbon data is suitable for clearly labelled operational estimates. Carbon credits require a separate methodology, ownership, additionality, verification and double counting process.

Public AmpVerve operations

See ../openapi.yaml for the full schemas:

  • GET /api/trading/prices/octopus-agile, live;
  • GET /api/trading/prices/regions, live;
  • GET /api/trading/prices/current, live;
  • GET /api/trading/carbon-intensity, live;
  • GET /api/trading/carbon-intensity/forecast, live;
  • GET /api/trading/prices/wholesale, beta;
  • GET /api/trading/grid/dno-region, live;
  • GET /api/vpp/flex/tenders, partner-gated;
  • GET /api/vpp/flex/contracts, partner-gated;
  • POST /api/vpp/flex/offers, partner-gated.

No public NESO DFS operation is in the curated OpenAPI document as of the evidence date.

Open gates

  • exercise each partner API with production credentials for the exact tenant;
  • complete programme qualification and enrolled-asset evidence;
  • exercise notification, dispatch, cancellation and fallback paths;
  • validate metering completeness and baseline version;
  • reconcile a real settlement statement;
  • exercise customer payout end to end;
  • document primacy and stacking across DNO and NESO services.
Market guide

US: United States

Readiness

Field Value
Overall state partner_gated
Evidence date 2026-08-20
Market access relationship Founder reports an AmpVerve partnership with Leap
AmpVerve Leap connector Open PRs, not present on enterprise/main
State and utility coverage Must be resolved per address, utility, programme and asset
End user revenue Not active until connector, enrolment, dispatch, settlement and payout gates pass

Market structure and Leap route

US flexibility is not one national programme. Eligibility depends on ISO or RTO, state, utility territory, programme, customer class, meter and device. Leap's official market access page describes offerings in California, Texas, New England, New York and PJM. That is Leap coverage, not automatic AmpVerve coverage.

Leap's developer model follows a meter journey: onboard, manage, transact and monetise. Its current APIs separate meter details and enrolment, support dispatch webhooks and polling, and expose interval, performance and revenue data. AmpVerve should map that lifecycle onto its organisation, site, asset, dispatch, settlement and payout records without leaking Leap identifiers across tenants.

Primary evidence:

Customer and asset scope

Potential segments include households, commercial buildings, industrial loads, fleets, charging networks and data centres. Leap supports multiple technology and programme types, but the exact programme requirements determine whether an EV, charger, battery, HVAC, heat pump, meter or other load is eligible.

Before enrolment, resolve the utility account or device programme path, customer authorisation, service address, meter identity, asset characteristics and partner reference. Store Leap meter_id and market group mappings within the owning organisation.

Dispatch and metering

Prefer authenticated webhook delivery where the programme needs short notice, with polling as recovery. Process multiple and overlapping timeslots, priorities, cancellations and test flags. Deduplicate on Leap's event identifiers and preserve the raw notification.

Performance and interval data must remain distinct from final revenue. Leap notes that analytics data can differ from revenue data frozen at settlement. AmpVerve must keep settlement versions and corrections rather than overwriting operational estimates.

Currency, tax and payout

Partner statements are expected to be denominated under the applicable US programme agreement, commonly USD, but the contract is authoritative. Customer payout requires payee onboarding, applicable reporting, revenue-share rules and an exercised payment rail. The API guide does not provide tax advice.

Carbon

US carbon estimates need a named regional factor and timestamp. Market dispatch performance is not automatically a carbon credit. Any monetisation path requires ownership, additionality, methodology, verification, registry or buyer and a double counting control.

AmpVerve technical state and open gates

There is no Leap endpoint in the curated AmpVerve public OpenAPI on the evidence date. Connector work exists in PR #12 and broader integration work in PR #38, but open code is not deployed capability.

Before any US programme is marked live:

  1. reconcile and merge the connector against current enterprise/main;
  2. validate production and staging credentials without exposing them;
  3. map organisation-scoped sites, meters and partner references;
  4. implement and test enrolment status synchronisation;
  5. exercise webhook authentication, replay, cancellation and polling recovery;
  6. exercise safe dispatch against synthetic and then approved pilot assets;
  7. reconcile interval, baseline, performance and a real settlement;
  8. exercise customer payout and correction handling;
  9. publish programme-specific capability results, not a generic US available flag.
Market guide

AU: Australia

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
Scope National Electricity Market (NEM); Western Australia and the Northern Territory require separate guides
AmpVerve market access Not evidenced
AmpVerve market connector Catalogue scaffold only, not a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision A store country selection does not activate an energy capability
Asset connection research_required per manufacturer and model Production credentials, consent, telemetry and command tests for the exact asset
Read-only optimisation research_required per tenant Valid tariff, meter and forecast inputs, plus an online asset if the result is to be actionable
Live control and smart energy research_required Tenant activation, a controllable asset, network limits, consent and a tested safe fallback
Grid export or V2G research_required DNSP connection agreement, compatible bidirectional equipment and current export limits
Flexibility participation research_required AEMO participant or intermediary route, classification, qualification and dispatch integration
Settlement and customer payout research_required Accepted metering, market statement, contract, tax review and an exercised AUD payout
Carbon monetisation research_required Eligible method, project rights, additionality, monitoring, audit, registry and buyer

Official market routes

AEMO operates the NEM in Queensland, New South Wales and the Australian Capital Territory, Victoria, South Australia and Tasmania. Western Australia has the separate Wholesale Electricity Market (WEM), and the Northern Territory is not connected to the NEM.

A Demand Response Service Provider (DRSP) can classify qualifying load as a Wholesale Demand Response Unit or plant as an Ancillary Service Unit. AEMO's wholesale demand response route is aimed at qualifying large retail customers and has baseline, telemetry, aggregation and registration requirements.

An Integrated Resource Provider acting as a Small Resource Aggregator can aggregate small production or bidirectional units and may apply to classify plant for market ancillary services. This is a potential route for distributed resources, not evidence that an individual household asset is eligible.

Export remains a connection and network matter. The Australian Energy Regulator recognises two-way pricing and flexible export limits, so a retail export tariff does not override the DNSP's technical envelope.

AmpVerve activation state

The mobile catalogue contains Australian locale, currency and manufacturer metadata. The DNO registry labels the AEMO adapter as scaffold. No production AEMO credentials, participant registration, intermediary contract, classified portfolio, dispatch test, settlement statement or customer payout evidence was found on enterprise/main. No Australia-specific operation is present in the curated public OpenAPI contract.

Carbon

The Australian Carbon Credit Unit Scheme only issues units to registered, eligible projects using an approved method, with project rights, monitoring, reporting and audit obligations. An operational estimate of avoided grid emissions from smart charging is not an ACCU and must not be sold as one.

Evidence

Open activation gates

  • select NEM or WEM scope and the exact state, DNSP and retail route;
  • contract with or qualify as the required AEMO participant or intermediary;
  • complete asset classification, metering, telemetry, dispatch and cancellation tests;
  • enforce DNSP export envelopes for every bidirectional command;
  • reconcile an AEMO or intermediary statement and exercise AUD payout;
  • approve a carbon method before presenting anything beyond an operational estimate.
Market guide

CA: Canada

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
Scope Province, utility and system-operator specific
AmpVerve market access Not evidenced in any province
AmpVerve market connector No verified production IESO, AESO or utility-programme integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision Canadian store presence does not create province or utility access
Asset or Green Button connection research_required Province, utility, consent, production credential and data-quality validation
Read-only optimisation research_required per tenant Exact retail rate, province, utility, meter and timezone
Live control and smart energy research_required Online capable asset, backend activation, consent and utility constraints
Grid export or V2G research_required Local distribution connection, tariff, metering and approved equipment
Flexibility participation research_required Province-specific operator or utility contract, qualification and enrolled portfolio
Settlement and payout research_required Programme performance statement, tax review and exercised CAD payout
Carbon monetisation research_required Applicable federal or provincial protocol, additionality, verification, registry and buyer

Official market routes

Canada does not have one national electricity-market participation model. Activation must be determined by province, system operator, distributor and utility account.

Province example Official route Boundary
Ontario IESO wholesale dispatchable loads and Capacity Auction demand response Current DER wholesale participation is limited and expanded models are still being developed
Alberta AESO energy and ancillary-services markets Operating Reserve requires energy-market participation, asset registration and technical integration
British Columbia BC Hydro behavioural and automated demand response Utility programme eligibility and approved devices apply, not an open national market
Quebec Hydro-Quebec demand-response options Utility customer, programme and performance rules determine bill credits

A Green Button or device-data connection can support monitoring but does not confer IESO or AESO participant status, utility programme enrolment, dispatch authority or export permission.

AmpVerve activation state

The mobile application contains Canadian locale, CAD, Green Button and manufacturer catalogue metadata. No province-specific market contract, production operator credential, qualified portfolio, utility programme enrolment, dispatch test, settlement statement or customer payout evidence was found on enterprise/main. No Canada-specific operation is present in the curated public OpenAPI contract.

Carbon

Canada's Federal Greenhouse Gas Offset System requires an eligible protocol and reductions beyond business as usual and legal requirements. Provincial systems may differ. Smart-energy avoided-emissions estimates are not federal offset credits and must remain non-monetised without a protocol, project registration, verification, serialisation and buyer.

Evidence

Open activation gates

  • select province, utility, tariff, DSO and system operator before capability discovery;
  • choose wholesale, utility programme, retail optimisation or export scope;
  • obtain participant, aggregator or programme contracts and credentials;
  • qualify each asset and validate dispatch, cancellation and metering;
  • reconcile programme or market statements and exercise CAD payout;
  • complete federal and provincial privacy, consumer and tax review.
Market guide

DE: Germany

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
AmpVerve market access Not evidenced
AmpVerve TSO or BSP connector Not present as a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision Store presence does not grant supplier, DSO, TSO or market access
Asset connection research_required per manufacturer and model Verified consent, production API or gateway, telemetry and command path
Read-only optimisation research_required per tenant Valid tariff and meter inputs and correct German market-location mapping
Live control and smart charging, heating or cooling research_required Backend activation, capable asset and compliance with section 14a controls
Grid export or V2G research_required DSO connection, metering, registration and export permission for the exact site
Flexibility and balancing participation research_required BSP route, product prequalification, portfolio mapping and live TSO communications
Settlement and payout research_required BRP and BSP allocation, accepted activation data, invoice and exercised EUR payout
Carbon monetisation research_required A separate eligible methodology, rights, verification, registry and buyer

Official market routes

Germany's four transmission system operators procure balancing services through the joint Regelleistung platform. A prospective Balancing Service Provider must prequalify technical units and pass the required operating evidence before it can offer a reserve product.

Section 14a of the Energy Industry Act applies network-oriented control rules to specified controllable consumption devices, including private EV charging, heat pumps, cooling equipment and storage while consuming. It provides reduced network charges in exchange for controllability. It is not a balancing-market contract and it does not by itself create a customer revenue stream.

The Federal Network Agency's Market Master Data Register requires market actors and installations such as solar and stationary battery storage to be registered. Registration does not prove dispatch qualification or export permission.

AmpVerve activation state

The mobile application includes German locale, EUR and manufacturer catalogue metadata, and the DNO catalogue contains scaffold records. Those records are discovery metadata only. No tenant-scoped German BSP agreement, prequalified unit, TSO production credential, exercised dispatch, settlement statement or customer payout was found on enterprise/main. No Germany-specific operation is present in the curated public OpenAPI contract.

Carbon

The EU Union Registry accounts for EU ETS allowances and compliance. It does not turn a household smart-energy estimate into a tradeable credit. AmpVerve would need a separately approved voluntary or compliance methodology, ownership, additionality, verification, registry and double-counting controls.

Evidence

Open activation gates

  • select the balancing products and contracting BSP or become qualified;
  • map every asset to market location, metering operator, DSO, BRP and portfolio;
  • complete section 14a technical and commercial compliance for controlled load;
  • prove export permission separately from import-side controllability;
  • exercise prequalification, bidding, activation, metering, settlement and EUR payout;
  • complete GDPR roles, retention and cross-border transfer review.
Market guide

FR: France

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
AmpVerve market access Not evidenced
AmpVerve RTE or Enedis connector Catalogue scaffold only, not a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision Store presence is not French market qualification
Asset or Linky connection research_required User consent, production credential, correct site and validated interval data
Read-only optimisation research_required per tenant Contracted tariff, meter basis and complete data
Live control and smart energy research_required Online capable asset, tenant activation, consent and safe fallback
Grid export or V2G research_required Enedis or local DSO connection, export contract, meter and compatible equipment
Flexibility, demand response and reserves research_required RTE agreement, technical approval, balance perimeter and qualified portfolio
Settlement and payout research_required Validated load-reduction data, supplier compensation, statement and EUR payout
Carbon monetisation research_required Approved methodology, ownership, verification, registry and buyer

Official market routes

RTE operates the balancing mechanism, frequency services and capacity mechanism. Demand-side resources can participate when their operator satisfies the relevant market rules and technical requirements.

RTE's current NEBCO demand-response route, historically known as NEBEF, allows eligible consumption reductions to be valued on energy markets. A Demand Response Aggregator must sign the market participation agreement, obtain technical approval and have a balance perimeter directly or through a Balance Responsible Party. RTE verifies delivered load reduction under the selected control method, and supplier compensation rules form part of the financial path.

The fact that mainland consumption sites may be technically eligible does not mean that every household, device or aggregation is qualified.

AmpVerve activation state

The mobile catalogue lists France, EUR, Linky and manufacturer metadata. No production Linky consent flow, RTE information-system access, signed NEBCO or balancing agreement, approved portfolio, dispatch test, supplier-compensation reconciliation, settlement statement or customer payout evidence was found on enterprise/main. No France-specific operation is present in the curated public OpenAPI contract.

Carbon

EU ETS allowance accounting is not a crediting method for household energy savings. Carbon impact may be estimated only with a named factor and data basis. Monetisation remains off until a separate method, rights, verification, registry and buyer are approved.

Evidence

Open activation gates

  • select NEBCO, balancing, frequency or capacity product and contracting route;
  • obtain RTE information-system access, agreement and technical approval;
  • establish the BRP and supplier-compensation model;
  • validate Linky or other metering consent, interval quality and baseline method;
  • test activation, cancellation, correction, settlement and EUR payout;
  • complete GDPR and French consumer disclosure review.
Market guide

IE: Ireland

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
Scope Republic of Ireland; Northern Ireland has separate SONI and jurisdictional requirements
AmpVerve market access Not evidenced
AmpVerve EirGrid, SEM or ESB Networks connector Not present as a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision Store presence does not establish Irish programme access
Asset or meter connection research_required Production consent, exact MPRN and validated meter or device data
Tariff optimisation research_required per tenant Contracted tariff, interval alignment and supplier-specific terms
Live control and smart energy research_required Online controllable asset, backend activation, user limits and safe fallback
Grid export or V2G research_required ESB Networks connection, export meter and compatible approved equipment
SEM or system services research_required Registered and tested providing unit, aggregator route and EirGrid communications
Distribution flexibility research_required ESB Networks procurement, eligible location, contract and dispatch path
Settlement and payout research_required Accepted performance, market or contract statement and exercised EUR payout
Carbon monetisation research_required Separate methodology, ownership, verification, registry and buyer

Official market routes

EirGrid defines a Demand Side Unit as one or more Individual Demand Sites that can be instructed to reduce demand. The published setup route requires at least 4 MW for a registered DSU, permits aggregation and requires Grid Code testing. Providing units seeking system-services contracts must also demonstrate their capability through the relevant compliance and testing process.

ESB Networks procures distribution flexibility for specified needs. Its Demand Flexibility Product is location-specific and contract-based. An announced product or national policy target is not an open API or automatic residential revenue path.

The Commission for Regulation of Utilities describes dynamic tariffs available from June 2026. A dynamic retail tariff can support optimisation, but only when the customer's supplier, contract and half-hour prices are verified.

AmpVerve activation state

The mobile application contains Irish locale, EUR and manufacturer catalogue metadata. No EirGrid or SEM participant registration, qualified DSU, ESB Networks flexibility contract, production market credential, dispatch test, settlement statement or customer payout evidence was found on enterprise/main. No Ireland-specific operation is present in the curated public OpenAPI contract.

Carbon

Estimated operational carbon impact is separate from a verified unit. EU ETS registry infrastructure does not by itself credit household demand shifting. Carbon monetisation remains off until a method, rights, verification, registry and buyer are approved.

Evidence

Open activation gates

  • choose DSU, system-services, distribution-flex or tariff-only scope;
  • contract with the required aggregator or complete participant registration;
  • qualify the portfolio and complete Grid Code and communication tests;
  • verify MPRN, meter interval, baseline, event and correction rules;
  • reconcile settlement or contract invoices and exercise EUR payout;
  • document Republic of Ireland versus Northern Ireland routing and data roles.
Market guide

NL: Netherlands

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
AmpVerve market access Not evidenced
AmpVerve TenneT or GOPACS connector Not present as a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision Store presence does not establish Dutch energy access
Asset or P1 connection research_required Production data path, consent, meter identity and validation for the exact installation
Read-only optimisation research_required per tenant Valid tariff, imbalance or other price source and complete meter data
Live control and smart energy research_required Online capable asset, backend activation, grid constraints and safe fallback
Grid export or V2G research_required DSO connection terms, metering and permission for the exact site and equipment
Flexibility and TSO balancing research_required TenneT BSP recognition, product prequalification, framework agreement and communications
Local congestion flexibility research_required GOPACS CSP access, product and location eligibility, bid and dispatch integration
Settlement and payout research_required BRP treatment, accepted performance, statement, tax review and exercised EUR payout
Carbon monetisation research_required Separate methodology, ownership, verification, registry and buyer

Official market routes

TenneT procures balancing services from recognised Balancing Service Providers. FCR, aFRR and mFRR products have distinct prequalification, bidding, communications and framework-agreement requirements. Imbalance settlement and balancing-service settlement must not be treated as the same ledger.

GOPACS is a joint initiative of Dutch grid operators for congestion management. Its products include congestion-service contracts and redispatch routes. A flexibility need is location and time specific, and a market participant or Congestion Service Provider must satisfy the applicable product conditions.

A P1 port or smart-meter catalogue entry is only a possible local telemetry method. It does not confer TenneT BSP status, GOPACS access or export permission.

AmpVerve activation state

The mobile application contains Dutch locale, EUR, P1 and manufacturer catalogue metadata. The DNO registry has a TenneT scaffold record. No recognised BSP or CSP role, prequalified portfolio, production credential, live dispatch, settlement statement or customer payout evidence was found on enterprise/main. No Netherlands-specific operation is present in the curated public OpenAPI contract.

Carbon

EU ETS allowance accounting does not issue a carbon credit for shifting a home's electricity use. AmpVerve carbon monetisation remains unavailable until a separate method, ownership, additionality, verification, registry and buyer are approved.

Evidence

Open activation gates

  • choose TenneT reserve products, GOPACS products or both and document stacking rules;
  • obtain BSP or CSP agreements and product prequalification;
  • map each asset to DSO, connection, meter, BRP and congestion area;
  • validate bidding, activation, cancellation and real-time communications;
  • reconcile accepted performance and exercise EUR customer payout;
  • complete GDPR roles, consent, retention and cross-border transfer review.
Market guide

Nordics: Denmark, Finland, Norway and Sweden

Readiness

Field Value
Overall state research_required for DK, FI, NO and SE
Evidence date 2026-08-20
AmpVerve market access Not evidenced in any Nordic country
AmpVerve TSO connector Not present as a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision for each country Store presence is not TSO or reserve-market access
Asset connection research_required per manufacturer, model and country Production credential, consent, telemetry and command tests
Read-only optimisation research_required per tenant Country, bidding zone, retail tariff, meter and timezone
Live control and smart energy research_required Online capable asset, backend activation, consent and network limits
Grid export or V2G research_required National and DSO connection rules, metering and compatible equipment
Flexibility and reserve participation research_required National BSP agreement, product prequalification and TSO communications
Settlement and payout research_required Country and product settlement, BRP handling and exercised local-currency payout
Carbon monetisation research_required Separate methodology, ownership, verification, registry and buyer

Official market routes

Country distinctions

Nordic balancing cooperation does not create one commercial onboarding path. Each TSO qualifies providers and resources under national terms, while products, bidding zones, currencies, balance responsibility and technical interfaces can differ.

Country TSO Currency Official route and boundary
Denmark (DK) Energinet DKK FCR, aFRR and mFRR tender conditions apply. DK1 and DK2 are distinct bidding and synchronous contexts.
Finland (FI) Fingrid EUR Reserve markets accept consumption, storage and aggregation. Independent aggregation is allowed only under the applicable product terms.
Norway (NO) Statnett NOK FFR, FCR, aFRR and mFRR are procured through reserve-market arrangements with Norwegian bidding-zone and qualification rules.
Sweden (SE) Svenska kraftnat SEK The TSO procures support services from production, adjustable consumption and storage, subject to product qualification and communications.

The common Nordic mFRR and evolving European-platform work affects market design and interfaces. It does not remove the need for national agreements, prequalification, asset mapping, BRP treatment or settlement validation.

AmpVerve activation state

The mobile application contains locale, currency and manufacturer catalogue metadata for Denmark, Finland, Norway and Sweden. The DNO catalogue contains planned TSO records for Finland and Sweden. No national BSP agreement, prequalified unit or group, production market credential, exercised activation, settlement statement or customer payout evidence was found on enterprise/main. No Nordic-country-specific operation is present in the curated public OpenAPI contract.

Carbon

Operational carbon estimates must identify the bidding zone, time interval, factor source and whether the value is marginal or average. They are not carbon credits. No Nordic carbon-credit methodology, verifier, registry or buyer is activated for AmpVerve.

Evidence

Open activation gates

  • choose country, bidding zone, product and contractual BSP route;
  • obtain national TSO agreements and prequalify the exact resource group;
  • map resources to DSO, meter, BRP and product-specific aggregation rules;
  • implement and test bidding, activation, acknowledgement, cancellation and telemetry;
  • validate capacity and energy settlement separately and exercise payout in DKK, EUR, NOK or SEK;
  • document stacking and primacy across local, national, Nordic and European products.
Market guide

NZ: New Zealand

Readiness

Field Value
Overall state research_required
Evidence date 2026-08-20
AmpVerve market access Not evidenced
AmpVerve System Operator or WITS connector Not present as a verified production integration

Capability separation

Capability AmpVerve state What must be true
App availability Separate store decision Store presence does not establish New Zealand market participation
Asset connection research_required per manufacturer and model Production credentials, consent, telemetry and command tests
Read-only optimisation research_required per tenant Contracted retail or spot exposure, nodal basis and validated interval data
Live control and smart energy research_required Online capable asset, tenant activation and tested safe fallback
Grid export or V2G research_required Distributor connection, metering and export terms for the exact installation
Flexibility and demand-side market participation research_required Registered purchaser or agent, approved station, WITS and dispatch integration
Settlement and payout research_required Accepted meter validation, clearing statement, contract and exercised NZD payout
Carbon monetisation research_required Eligible NZ ETS or other method, rights, verification, registry and buyer

Official market routes

The Electricity Authority describes three wholesale demand-side mechanisms: dispatchable demand, dispatch notification and difference bids. Dispatchable demand is intended for large consumers above 10 MW and requires real-time telemetry and binding dispatch. Dispatch notification can serve loads above 1 MW and below 10 MW, including aggregated household resources, with monthly meter verification and the ability to decline a notification within the rules. Difference bids signal price sensitivity but do not receive dispatch or revenue.

Participation requires the relevant industry role or agent, an approved dispatch-capable station, acceptable metering and access to the Wholesale Information and Trading System. A public spot price feed alone does not satisfy these gates.

AmpVerve activation state

The mobile application contains New Zealand locale, NZD and manufacturer catalogue metadata. No market participant or agent agreement, approved load station, WITS production credential, dispatch integration, settlement statement or customer payout evidence was found on enterprise/main. No New Zealand-specific operation is present in the curated public OpenAPI contract.

Carbon

The New Zealand Emissions Trading Scheme creates NZUs for activities covered by its rules. It does not automatically issue units for a household smart-charging estimate. AmpVerve needs a verified eligible method, legal rights, monitoring, registry controls and a buyer before carbon monetisation can be enabled.

Evidence

Open activation gates

  • choose dispatchable demand, dispatch notification or a retail-only route;
  • secure participant or agent status and System Operator approval;
  • integrate WITS, dispatch messaging, acknowledgements and withdrawal states;
  • validate meter, GXP, baseline and monthly verification processes;
  • reconcile clearing or partner statements and exercise NZD payout;
  • complete Privacy Act, consent, retention and data-location review.
Meta

Changelog

2026-07-31 Current

  • First published OpenAPI 3.1 specification, generated from the deployed services rather than hand written.
  • Every endpoint labelled Live, Beta or Planned, verified against production.
  • Complete error catalogue with remediation actions.
  • Ingestion documented in depth: canonical schema, sign convention, timezone handling, batching, backfill, idempotency, ordering, and the three degradation signals.
  • Uptime commitment defined with an explicit measurement method and a service credit schedule.
  • Webhook contract specified in full and clearly marked as not yet delivered.
  • Correction. A previous revision of this page documented base URLs and endpoints that do not exist, including api.ampverve.com, a sandbox host, and client SDK packages. None of them were live. They have been removed and replaced with the verified surface. If you built against that revision, contact support and it will be corrected with you directly.
Meta

Support

Integration support

api@ampverve.com
Schema questions, credentials, environments, rate limit increases.

Incidents

support@ampverve.com
Subject line [P1] for a production ingestion outage.

Security

security@ampverve.com
Vulnerability reports and coordinated disclosure.

What to include in an incident report

This turns a day of back and forth into an hour.

  • Your organisation identifier and the affected site_id or asset_id.
  • The exact request: method, full path, and headers with the token redacted.
  • The full response body and status code.
  • Timestamps in UTC, with the window over which it occurred.
  • The output of GET /api/telemetry/readyz taken at the time.
  • Whether stored matched count on the failing requests.

This documentation describes the AmpVerve Platform API as deployed on 2026-07-31. Every endpoint marked Live was verified by an actual request. If you find one that does not respond as described, report it to api@ampverve.com and it will be corrected, because a partner is building against it.