Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.nomos.energy/llms.txt

Use this file to discover all available pages before exploring further.

What §14a EnWG is

§14a EnWG governs the relationship between a household and its grid operator (Verteilnetzbetreiber, VNB) when that household runs a “controllable consumption device” (steuerbare Verbrauchseinrichtung) over 4.2 kW. Heat pumps, wallboxes, home batteries, and AC units all qualify. Under the BNetzA ruling BK6-22-300, every VNB is obliged to throttle these devices to maintain grid stability when needed and, in exchange, has to grant the customer a reduction on their grid fees.

The two paths

The customer chooses one of two paths:
  • Modul 1, optionally combined with Modul 3. Modul 1 is a flat annual deduction on the base grid fee, available to anyone with a registered §14a-eligible device. For a heat pump customer consuming 5,000 kWh/year, it is worth around 120–155 EUR/year net by the BNetzA formula 80 EUR + (Standard-AP × 3,750 kWh × 0.2). Modul 3 stacks on top of Modul 1 and adds a time-variable grid fee with three windows (low, standard, peak). It can be worth another 100–200 EUR/year if the customer plans high-demand hours around the cheap windows. Modul 3 requires an intelligent metering system (iMSys).
  • Modul 2, on its own. A 60% reduction on the variable (kWh) grid fee, applied through a separate sub-meter behind the controllable device. Savings scale with how much the device consumes: a wallbox doing 4,000 kWh/year typically saves 150–250 EUR/year. Modul 2 cannot be combined with Modul 1 or Modul 3.
Modul 2 requires a dedicated sub-meter behind the controllable device (a separate “Wärmepumpenzähler” or wallbox sub-meter). For most setups we recommend Modul 1 + Modul 3 as the default path: it stacks reliably, needs no extra metering hardware beyond the iMSys, and works for any §14a-eligible device.

How time-variable grid fees work (Modul 3)

A Modul 3 schedule splits the day into three windows:
  • NT (Niedrigtarif): the cheap window, typically a few ct/kWh below the standard rate
  • ST (Standardtarif): the regular grid fee, applied outside NT and HT hours
  • HT (Hochtarif): the expensive window, typically a few ct/kWh above the standard rate
Each VNB publishes its own windows and price spread; schedules are revised at least annually. Example: Netze BW, 2025/26 (source):
NTSTHT
Time10:00–14:00rest of the day17:00–22:00
Price-7 ct/kWhbaseline+7 ct/kWh
A customer who shifts an EV charge from 18:00 to 12:00 saves around 14 ct/kWh on grid fees.

Integration

Prerequisites

The plan you’re quoting against needs §14a enabled, with the modules you want to sell. Plans expose this via the enwg14aOptions configuration; ask Nomos support to enable the modules on a given plan before you start quoting. Modul 3 additionally requires that the customer’s meter is a smart meter (iMSys). The API enforces this and rejects Modul 3 orders against analog meters.

1. Quote with §14a included

The quote endpoint reflects Modul 1 in the price breakdown. Pass 14a_module_1=true to see the pauschale Netzentgeltreduktion as a negative line item alongside the regular grid fee.
const res = await fetch(
  `https://api.nomos.energy/plans/${planId}/quote?` +
    new URLSearchParams({
      zip_code: "70173",
      usage: "5000",
      meter_type: "smart",
      "14a_module_1": "true",
    }),
  {
    headers: { Authorization: `Bearer ${access_token}` },
  },
);

const quote = await res.json();
In the response, the base component’s subcomponents array contains an entry like:
{
  "subgroup": "grid",
  "name": "Pauschale Netzentgeltreduktion (§14a EnWG Modul 1)",
  "amount": -11.21
}
The quote endpoint only models Modul 1. Modul 3 doesn’t surface as a quote line item because its savings depend on a lot of underlying assumptions about the customer’s load-shifting behaviour against their VNB’s specific schedule.
If you use the Nomos hosted checkout components, the §14a Modul 1 reduction is rendered automatically in the quote breakdown once the plan has §14a enabled, with no extra integration work. See Retrieve a quote for the full schema.

2. Order §14a during checkout

When you create the subscription, include a product_orders entry with type: "14a_enwg" and flag the modules the customer is signing up for. The API will validate that the plan supports each requested module.
const subscription = await fetch("https://api.nomos.energy/subscriptions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${access_token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    plan: planId,
    customer: {
      /* ... */
    },
    address: { zip: "70173", street: "Königstraße", house_number: "1" },
    meter: { estimated_usage: 5000, type: "smart" },
    payment_method: { type: "sepa_debit", iban: "DE..." },
    previous_supplier: "sup_...",
    product_orders: [
      {
        type: "14a_enwg",
        "14a_enwg": { module_1: true, module_3: true },
      },
    ],
  }),
}).then((r) => r.json());
Behind the scenes Nomos creates one grid_fee_reduction per requested module and sends an EDIFACT order to the VNB once the subscription is confirmed. Customers checking out via the Nomos hosted checkout components can opt into the available §14a modules directly in the same flow; the components handle the product_orders payload for you. See Create a subscription for the full body schema.

3. Order §14a after the subscription exists

Customers often install a heat pump or wallbox months after switching supplier. Use the POST /grid-fee-reductions endpoint to add a module to an existing subscription. The endpoint takes the subscription ID in the body, not the path.
const reduction = await fetch("https://api.nomos.energy/grid-fee-reductions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${access_token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    subscription: "sub_abc123",
    type: "enwg-14a-module-3",
  }),
}).then((r) => r.json());
The request body only carries subscription and type. The valid_from and valid_until fields appear in the response and are populated once the VNB confirms the activation date. Customers can also add a §14a module from the Nomos hosted customer portal or, if you use it, the Nomos dashboard. Both call this same endpoint under the hood.
Re-ordering after a rejection is allowed. The endpoint will refuse a new order only if there is an active (intended, ordered, or activated) reduction of the same type for the same subscription.
See Create a grid fee reduction.

4. Read state and the status lifecycle

List all grid fee reductions for the organization (or, for customer-scoped tokens, just that customer’s):
const list = await fetch(
  "https://api.nomos.energy/grid-fee-reductions?filter[status][eq]=ordered",
  { headers: { Authorization: `Bearer ${access_token}` } },
).then((r) => r.json());
Retrieve a single one by ID:
const reduction = await fetch(
  `https://api.nomos.energy/grid-fee-reductions/${id}`,
  { headers: { Authorization: `Bearer ${access_token}` } },
).then((r) => r.json());
The status field walks through this lifecycle:
StatusMeaning
intendedOrder has been recorded but the subscription isn’t confirmed yet. No EDIFACT message has been sent.
orderedEDIFACT order has been sent to the VNB. Awaiting their reply.
activatedThe VNB confirmed activation; a valid_from date is set and the reduction is being applied to billing.
endedThe reduction has stopped (subscription ended, or the customer switched modules).
rejectedThe VNB declined the order. Inspect the reason, fix the underlying cause, then re-order.
See List grid fee reductions and Retrieve a grid fee reduction.
Dedicated webhook events for grid fee reduction state changes are coming soon. Until then, poll the list endpoint with filter[status] or react to subscription.activated to know when an order is eligible to ship.

Clearing

Rejections are part of normal operation, not an exception. For Modul 1, the most common cause is that the controllable consumption device (steuerbare Verbrauchseinrichtung) hasn’t been registered with the VNB yet. The customer (or their installer) registers the device through the VNB’s portal; once that’s done, you can retrigger the order.

Resolving a stuck or rejected order

You can drive clearing yourself, both via the API and via the Nomos dashboard. API. GET /grid-fee-reductions/{id} returns the current status. Once the underlying cause is fixed, re-send with a fresh POST /grid-fee-reductions; the previous rejected record stays in the list for audit. Dashboard. The grid fee reduction detail view shows the current status and the rejection reason returned by the VNB, lets you initiate a clearing conversation with the grid operator directly from the order, and re-sends the order in one click once the issue is resolved.
Don’t loop on POST /grid-fee-reductions to “force” a reorder while one is already in ordered. The API blocks duplicates and you’ll just generate 400 responses.