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.jsonThe 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.
Related guides
Sign a tolling CapacityContract
Wire a tolling contract — capacity payment, variable payment, dispatch authority, fuel supply chain, force majeure regime, resource adequacy pledge.
Compose a multi-owner pool
End-to-end guide for energy aggregation: DemandSpec -> AllocationPlan -> CapacityPool -> tranches -> waterfall.