Skip to content
Dark MatterDark Matter
EnergyGuides

Run an RFP as a tenant (DemandSpec → Match → Reserve)

Submit a structured DemandSpec, match against ComputeSlot inventory, evaluate Verdicts, reserve allocations.

Overview

This is the buyer's side of the workflow described in Sign a tolling contract. A DemandSpec captures the tenant's requirements — capacity range, jurisdiction, latency class, chip class, compliance constraints, carbon profile — and the rights engine returns which slots in inventory qualify.

Step 1 — Submit the DemandSpec

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

The Pampa JV reference fixture is at packages/fixtures/energy/sample-demand-spec.json:

{
  "demand_id": "demand-hyperscaler-2027-q2-latam",
  "tenant_participant_id": "hyperscaler-tenant-001",
  "status": "open",
  "capacity_mw_min": 800,
  "capacity_mw_max": 1200,
  "duration_months": 60,
  "earliest_energization": "2027-06-01",
  "latency_class": "agnostic",
  "workload_class": "batch_inference",
  "power_quality": "interruptible",
  "chip_class": "blackwell_or_better",
  "geography_filter": {
    "allowed_countries": ["AR", "CL", "PY", "UY", "BR"],
    "excluded_countries": ["VE"]
  },
  "compliance_requirements": ["bis_export_clean", "ofac_clean", "rigi_eligible"],
  "carbon_class": "low_carbon",
  "requires_decomposition": true,
  "preferred_decomposition_block_mw": 100
}

Step 2 — Match

curl -X POST https://sandbox-api.dmtr.ai/v1/energy/demand/demand-hyperscaler-2027-q2-latam/match \
  -H "Authorization: Bearer $DMTR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "tenantOfacScreenedAt": "2026-04-30", "estimatedProjectValueUsd": 800000000 }'

Returns a ranked list of DemandMatchResult objects:

{
  "demand_id": "demand-hyperscaler-2027-q2-latam",
  "results": [
    {
      "slot_id": "slot-pampa-jv-phase1",
      "score": 0.86,
      "allowed": true,
      "conditional": true,
      "missing_compliance": [],
      "mw_offered": 200,
      "notes": "permit_stack: Permits in progress (acceptable for development-stage slots): [environmental_impact, air_emissions]."
    }
  ]
}

allowed: true, conditional: true means the slot can be reserved subject to remaining permits clearing. mw_offered: 200 reflects the partial allocation — Anthropic's 800–1200 MW request is filled in 100 MW blocks per the requires_decomposition: true directive, and Pampa Phase 1 contributes 200 MW.

Step 3 — Reserve via IOI (existing primitive)

DMTR's existing IOI primitive captures the buyer's intent to bind capacity. Use it to reserve the conditional allocation:

curl -X POST https://sandbox-api.dmtr.ai/v1/ioi \
  -d '{
    "ioi_id": "ioi-anthropic-pampa-001",
    "buyer": "hyperscaler-tenant-001",
    "positions": [{ "position_id": "pos-pampa-jv-phase1", "fraction": 1.0 }],
    "total_consideration": "25000000",
    "metadata": { "demand_id": "demand-hyperscaler-2027-q2-latam", "mw_reserved": 200 }
  }'

Step 4 — Once permits clear, sign the CapacityContract

Follow Sign a tolling contract on the seller's side; the buyer countersigns and the tenant_assignment block on the slot is updated.

Step 5 — Subscribe to slot events

Subscribe to energy.slot.* events to track stage-gate transitions, permit updates, and tenant-assignment changes. The webhook surface follows the same pattern as Position events — see Webhooks reference.

Edit this page on GitHub

Last reviewed: May 5, 2026

Was this page helpful?