Skip to content
Dark MatterDark Matter
EnergyGuides

Sign a tolling CapacityContract

Wire a tolling contract — capacity payment, variable payment, dispatch authority, fuel supply chain, force majeure regime, resource adequacy pledge.

Prerequisites

  • A ComputeSlot registered and at the FINANCE/BUILD gate or beyond
  • Buyer and seller participant_ids in the Identity Graph
  • Counsel-reviewed terms aligned to the standard contractual atoms (see CapacityContract)

Step 1 — Construct the contract payload

Tolling = buyer supplies fuel, dispatches the asset, pays a capacity payment + variable per-MWh fee.

{
  "contract_id": "ccx-pampa-jv-phase1-tenant-001",
  "contract_type": "tolling",
  "status": "executed",
  "slot_id": "slot-pampa-jv-phase1",
  "seller_participant_id": "joule-spv-pampa-001",
  "buyer_participant_id": "hyperscaler-tenant-001",
  "contract_capacity_mw": 200,
  "heat_rate_btu_per_kwh": 7800,
  "dispatch_authority": "buyer",
  "delivery_points": [
    { "kind": "energy", "point_name": "Pampa JV — on-site CCGT busbar (132 kV behind-the-meter)", "voltage_kv": 132 },
    { "kind": "gas", "point_name": "Wellhead direct — Rincón de Aranda Pad 1 separator outlet", "pressure_psig": 600 }
  ],
  "fuel_supply_chain": [
    {
      "dependency_kind": "PGA",
      "counterparty": "Pampa Energía S.A. — Rincón de Aranda upstream",
      "contract_reference": "PGA-PAMPA-RDA-2027",
      "cure_period_days": 10,
      "failure_treats_unit_unavailable": true
    }
  ],
  "capacity_payment": {
    "monthly_payment_usd": "5000000",
    "payment_per_mw_month_usd": "25000",
    "availability_threshold_pct": 0.92,
    "heat_rate_target_btu_per_kwh": 7800,
    "heat_rate_adjustment_per_pct": 1
  },
  "variable_payment": {
    "per_mwh_usd": "4.5",
    "fuel_cost_passthrough": false
  },
  "outage_regime": {
    "forced_outage_notice_window_minutes": 30,
    "planned_outage_advance_notice_days": 60
  },
  "force_majeure": {
    "day_for_day_extension": true,
    "termination_threshold_days": 365
  },
  "settlement_path": "bilateral_private",
  "tolling_currency": "USD_onshore_via_RIGI_carve_out",
  "cfe_obligation": "none",
  "regulatory_corpus_id": "AR@2026-05-06.1",
  "delivery_period_start": "2027-06-01",
  "delivery_period_end": "2032-05-31"
}

Behind-the-meter / off-grid note. This example omits a resource_adequacy_pledge because the slot is structured as off-grid (no SADI interconnect). There is no CAMMESA-administered RA program available to a load that does not consume from the system. Off-grid revenue flows entirely through the bilateral CapacityContract; in-front-of-meter / Autogenerador structures with SADI interconnect would add resource_adequacy_pledge referencing an applicable program (MAT_THERMAL, MAT_ER, or equivalent). See the Argentina corpus reference for the full enumeration and the AR_R1 open counsel-review item.

Step 2 — Submit

curl -X POST https://sandbox-api.dmtr.ai/v1/energy/contracts \
  -H "Authorization: Bearer $DMTR_KEY" \
  -H "Content-Type: application/json" \
  -d @contract.json

Step 3 — Pledge the corresponding Encumbrance on the Position

When the contract carries a resource_adequacy_pledge (in-front-of-meter / Autogenerador structures), reference an encumbrance id and add it to the underlying Position's encumbrances array so the core rights engine sees the pledge:

curl -X PATCH https://sandbox-api.dmtr.ai/v1/positions/pos-pampa-jv-phase1 \
  -d '{
    "encumbrances": [{
      "encumbrance_id": "enc-pampa-001",
      "type": "pledge",
      "holder": "hyperscaler-tenant-001",
      "created_at": "2027-01-15",
      "obligation_reference": "ccx-pampa-jv-phase1-tenant-001"
    }]
  }'

Step 4 — Issue dispatch notices once in delivery

curl -X POST https://sandbox-api.dmtr.ai/v1/energy/contracts/ccx-pampa-jv-phase1-tenant-001/dispatch-notice \
  -d '{
    "dispatch_id": "dn-2027-06-01-001",
    "issued_at": "2027-06-01T08:00:00Z",
    "effective_at": "2027-06-01T08:30:00Z",
    "instruction": "ramp_to_setpoint",
    "target_mw": 180,
    "ramp_rate_mw_per_min": 5
  }'

Settlement calculation

Compute capacity payments using the @dmtr/energy/settlement module:

import { computeAvailability, computeMonthlyCapacityPayment } from "@dmtr/energy/settlement";

const avail = computeAvailability(
  { contract_capacity_mw: 200, available_mw_by_hour: hourly },
  contract.capacity_payment.availability_threshold_pct,
);
const payment = computeMonthlyCapacityPayment(contract, avail, "2027-06", measuredHeatRate);
// → reduced_monthly_capacity_payment_usd, capacity_price_adjustment_factor, heat_rate_adjustment_factor

See CapacityContract for the underlying formulas.

Edit this page on GitHub

Last reviewed: May 5, 2026

Was this page helpful?