Mexico Day-Ahead & Historical Power Prices (CENACE): Hourly
Pricing
Pay per event
Mexico Day-Ahead & Historical Power Prices (CENACE): Hourly
Unofficial. Hourly CENACE nodal (PML) and load-zone (PEND) prices for SIN, BCA and BCS: tomorrow's day-ahead (MDA) or historical backfill since 2016, plus real-time (MTR) about 7 days later. Energy, loss and congestion components. Not affiliated with or endorsed by CENACE.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Plainwork Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Mexico Day-Ahead & Historical Power Prices (CENACE): Hourly PML & Load-Zone Prices
Hourly wholesale electricity prices from Mexico's Wholesale Electricity Market (MEM), published by CENACE, delivered as one clean row per location, operating day and hour:
- Load-zone prices (PEND) for every zone, e.g. MEXICALI, TIJUANA, LA PAZ, CULIACAN, MONTERREY, VDM CENTRO.
- Nodal prices (PML) for any NodoP code, e.g.
01PLO-115. - Day-ahead market (MDA): tomorrow's prices as soon as CENACE publishes them, plus history back to the market start in 2016.
- Real-time market results (MTR): CENACE publishes these about 7 days after the operating day. They are historical results, never live prices.
- All three systems: SIN (national interconnected), BCA (Baja California) and BCS (Baja California Sur).
- Each row includes the price and its energy, loss and congestion components in MXN/MWh, plus local and UTC interval times.
You don't need to work around CENACE's 7-day and 20-node (10-zone) limits per call or read nested Spanish JSON. The Actor splits your request into calls within those limits, makes them one at a time, checks every value and gives you a flat table.
Unofficial. Not affiliated with or endorsed by CENACE.
Input examples
1. Tomorrow's day-ahead prices for 10 load zones (run it daily on a schedule; about 240 rows ≈ USD 0.25):
{"priceType": "zone","market": "MDA","loadZones": ["MEXICALI", "TIJUANA", "ENSENADA", "LA PAZ", "LOS CABOS", "CULIACAN", "MONTERREY", "GUADALAJARA","VDM CENTRO", "HERMOSILLO"],"dateMode": "tomorrow"}
2. One-year backfill of one node (8,760 rows ≈ USD 8.77):
{"priceType": "nodal","market": "MDA","nodes": ["01PLO-115"],"dateMode": "range","startDate": "2025-01-01","endDate": "2025-12-31"}
3. Real-time market (MTR) results for the last 14 published days:
{"priceType": "zone","market": "MTR","loadZones": ["MEXICALI", "CULIACAN"],"dateMode": "lastNDays","lastNDays": 14}
| Field | Meaning |
|---|---|
priceType | zone (PEND, default) or nodal (PML) |
market | MDA (day-ahead, default) or MTR (real-time results, about D−7) |
loadZones / nodes | 1–200 names or codes; zone spaces or hyphens both work (LA PAZ, la-paz) |
system | only for codes that the bundled NodosP catalogue doesn't list: SIN, BCA or BCS |
dateMode | tomorrow (MDA only), lastNDays, or range with startDate/endDate (≤ 366 days, from 2016-01-01) |
maxRows | spend cap in rows (default 50,000); only whole location-days are delivered, so the cap is never exceeded |
useApifyProxy | off by default; when on, the Actor uses Apify's datacenter proxy (never residential) |
The Actor rejects an input with an impossible date, an inverted or too-long range, an empty list, or MTR dates that cannot be published yet before it makes any request. You pay only the start event for it.
Output
One dataset row per location, operating day and hour:
{"system": "BCS", "market": "MDA", "priceType": "PEND", "location": "LA PAZ", "locationType": "loadZone","loadZone": "LA PAZ", "state": null, "municipality": null, "operatingDate": "2026-10-10", "hourEnding": 1,"timezone": "America/Mazatlan", "intervalStartLocal": "2026-10-10T00:00:00-07:00","intervalStartUtc": "2026-10-10T07:00:00Z", "intervalEndUtc": "2026-10-10T08:00:00Z","priceMxnPerMwh": 5412.03, "energyComponent": 5362.29, "lossComponent": 49.75, "congestionComponent": 0,"currency": "MXN", "unit": "MWh", "source": "CENACE SW-PEND","sourceUrl": "https://ws01.cenace.gob.mx:8082/SWPEND/SIM/BCS/MDA/LA-PAZ/2026/10/10/2026/10/10/JSON","retrievedAt": "2026-10-19T01:00:00Z","attribution": "Fuente: CENACE (Centro Nacional de Control de Energía), datos abiertos CC BY 4.0; not affiliated with or endorsed by CENACE."}
Node rows also carry loadZone, state and municipality from CENACE's NodosP catalogue (bundled version
v2026-09-23). A code that isn't in the catalogue is still queried when you set system. Its enrichment fields are
null, and the run logs a warning.
Times (the UTC fields are derived)
hourEnding is CENACE's hour number, kept as published. It runs 1–24, 1–23 on a spring-forward day and 1–25 on a
fall-back day. The Actor derives intervalStartLocal, intervalStartUtc and intervalEndUtc as local midnight
plus (hour − 1) elapsed hours, in these time zones:
| System | Time zone | Evidence |
|---|---|---|
| BCA | America/Tijuana | follows US daylight saving time: 23 hours on 2026-03-08, 25 on 2025-11-02 |
| SIN | America/Mexico_City | 23 hours on 2021-04-04, 25 on 2021-10-31, 24 on 2025-11-02 (Mexico ended DST in 2022) |
| BCS | America/Mazatlan | 23 hours on 2021-04-04, 25 on 2021-10-31 |
These zones are inferred from CENACE's own hour counts on those days, not from a CENACE rule text. That is why the UTC fields are labelled derived. With this rule the UTC intervals are gap-free and strictly increasing across every DST change.
Coverage: what you get and what you pay for
The Actor delivers and charges a location-day only when it is complete: every hour from 1 to N is present
exactly once, and every value is numeric. Everything else appears in the OUTPUT record of the run's key-value store
and is not charged:
missing[].reason | Meaning |
|---|---|
notYetPublished | CENACE has no data yet: MDA for tomorrow, MTR for the last ~7 days |
noDataReturned | CENACE returned no values for an earlier date, e.g. an inactive node |
beforeMarketStart | before the first market day: MDA 2016-01-29 (SIN), 2016-01-27 (BCA), 2016-03-23 (BCS); MTR 2017-01-27 |
incompleteDay | some hours were missing or extra; the whole day is withheld |
parseError | a non-numeric value or two different values for the same hour |
sourceError | CENACE answered with an error for that call |
maxRowsReached / chargeLimitReached | your row cap or the run's maximum charge was reached |
runFailed | the run stopped early (see OUTPUT.error); rows delivered before the stop stay delivered |
OUTPUT also lists each location's requested and returned dates, errors[], rowsCharged, the catalogue version
and the request count. Exact duplicate values are delivered once (duplicatesDropped).
MTR lag: CENACE publishes real-time market results about 7 days after the operating day. On 2026-10-18, the latest MTR day was 2026-10-11. An MTR request for later dates is rejected before any call is made.
Pricing (pay per event)
| Event | Price |
|---|---|
| Actor start | USD 0.005 per run |
| Price row | USD 1.00 per 1,000 delivered rows |
The Actor charges only for rows it actually delivers. Missing dates, empty results, errors and duplicates are free. Set
maxRows or the run's maximum total charge to cap spend.
How it accesses CENACE
The Actor calls only CENACE's public SW-PML and SW-PEND web services at ws01.cenace.gob.mx:8082, using a fixed URL
template. It doesn't read web pages, follow links, log in or use cookies. It makes one request at a time, waits at
least 1 second between requests, retries up to 3 times on timeouts and server errors, and stops if CENACE refuses
requests (HTTP 403/429). Each run first checks that the service host still has no robots.txt. If one appears, the
run stops before any data request and asks for owner review.
Attribution and reuse
Fuente: CENACE (Centro Nacional de Control de Energía), datos abiertos CC BY 4.0. CENACE publishes the same price
series as open data on datos.gob.mx under Creative Commons Attribution 4.0. Keep the attribution field, or an
equivalent credit, when you republish the data. This Actor is not affiliated with or endorsed by CENACE. Rows contain
only codes, dates, times and prices, so they hold no personal data.