---
title: "Texas Solar Buyback Plan Catalog"
method: POST
path: "/api/v1/list-solar-buyback-plans"
tags: ["data-feed"]
---

# Texas Solar Buyback Plan Catalog

`POST /api/v1/list-solar-buyback-plans`

## Request

- Base URL: `https://meterplan.com`
- URL: `https://meterplan.com/api/v1/list-solar-buyback-plans`
- Auth: none declared
- TypeScript: <https://skmtc.dev/meterplan/apis/meter-energy-public-api/docs/api/v1/list-solar-buyback-plans/post.ts> (a function with typed inputs; its response is checked against the schema)

Return the current catalog of solar buyback plans available in Texas, across every deregulated TDU (Oncor, CenterPoint, AEP Texas Central, AEP Texas North, TNMP, Lubbock Power & Light). Includes Meter Energy plans (fetched live from the Light API) plus competitor plans (TXU, Reliant, Octopus, Rhythm, Gexa, Cirro, Champion, and others). For each plan: provider name, plan name, TDU, contract term, import rate (¢/kWh), export buyback rate, base fee, ETF, estimated annual cost at a default profile, battery program support, signup URL, and source URL. Optional filters: tdu, providerType, termMonths.

A developer-facing data feed of every Texas solar buyback plan Meter
tracks. Backed by the same engine that powers the public JSON feed at
`/data/texas-solar-buyback-plans.json` and the markdown feed at
`/data/texas-solar-buyback-plans.md` — surfaced here as a callable tool
so it shows up in the discovery manifest and OpenAPI spec, and can be
bundled into a submitted MCP app when it has a clear user-facing job.

**What you get:**
- `plans` — array of solar buyback plans. Each row is a (provider × plan
  × TDU) tuple with import rate, export rate, base fee, ETF, term length,
  estimated annual cost at a default profile, battery program support,
  and source/signup URLs.
- `tduReferences` — representative ZIP code for each Texas TDU. Useful
  for downstream lookups against `get-utility-for-zip` or
  `get-tdu-delivery-rates`.
- `assumptions` — the default energy profile used to compute
  `estimatedAnnualCostDollars`. Override these client-side if you have
  the customer's actual usage shape.
- `sourceStatus` — per-source freshness and coverage status. Always
  inspect this before treating a TDU slice as complete; competitor
  coverage is partial outside Oncor and CenterPoint today.
- `methodology` and `publisher` — provenance for citation.

**Use cases:**
- Build a "compare Texas solar plans" page or quote engine.
- Power AI agents that recommend a plan and need real, current rate data.
- Audit a homeowner's current plan against alternatives.
- Track competitor pricing over time (the feed updates as Meter's
  underlying `formatted_plans` table refreshes).

**Filters:** all optional. Omit all three to get the full catalog.
- `tdu` — case-insensitive partial match on display name (e.g. "Oncor",
  "CenterPoint", "AEP Texas Central").
- `providerType` — `meter` for Meter Energy plans only, `competitor`
  for everything else.
- `termMonths` — exact contract length filter (e.g. 12, 24, 36).

**Methodology notes:**
- Meter plans are fetched live from the Light API using one
  representative ZIP per TDU. Rates are real-time.
- Competitor plans are read from Meter's `formatted_plans` dataset and
  costed with the same engine the public `/solarbuybackplans`
  comparison page uses.
- `estimatedAnnualCostDollars` assumes a default solar homeowner
  profile (700 kWh imported and 700 kWh exported per month, 40% of
  imports at night, no battery). For personalized estimates, post the
  profile fields you have to `/api/v1/plan-cost-calc`.

This is an audience-4 (developer / agent) tool. For a ranked
homeowner-facing recommendation given a ZIP, use `find-electricity-plan`
instead — it does the ZIP-to-TDU lookup and ranks the cheapest plans for
the user's stated usage.

## Request body

- object
  - `tdu` string: Optional filter on TDU (Transmission and Distribution Utility) display name. Case-insensitive partial match. Examples: 'Oncor', 'CenterPoint', 'AEP Texas Central', 'AEP Texas North', 'TNMP', 'Lubbock Power & Light'. Omit to return plans from every TDU.
  - `providerType` 'meter' | 'competitor': Optional filter on provider type. 'meter' returns only Meter Energy plans. 'competitor' returns only non-Meter plans (TXU, Reliant, Octopus, Rhythm, Gexa, Cirro, Champion, and others). Omit to return both.
  - `termMonths` integer: Optional filter on exact contract length in months. Typical values: 12, 24, 36. Omit to return every term length.

## Response `200`

Tool ran successfully.

- object
  - `name` 'Texas Solar Buyback Plan Index', required: Catalog identifier.
  - `generatedAt` string, required: ISO 8601 timestamp the catalog was assembled.
  - `validThrough` string, required: ISO 8601 timestamp after which the catalog should be re-fetched. The underlying feed revalidates hourly.
  - `publisher` object, required: Catalog publisher and provenance metadata.
    - `name` 'Meter Energy Inc.', required
    - `url` 'https://meterplan.com', required
    - `puctBrokerNumber` 'BR250137', required
    - `description` string, required: Plain-text description of the publisher.
  - `methodology` string[], required: Bullet points documenting how the catalog is assembled. Cite these when summarizing the data.
  - `assumptions` object, required: Default profile used to compute estimatedAnnualCostDollars.
    - `defaultProfileName` string, required: Name of the default energy profile used to compute estimated costs.
    - `monthlyImportKwh` number, required: Default monthly grid imports in kWh.
    - `monthlyExportKwh` number, required: Default monthly grid exports in kWh.
    - `nightImportPercent` number, required: Default share of imports occurring overnight, as a percentage (0-100).
    - `peakImportPercent` number, required: Default share of imports occurring during peak hours, as a percentage.
    - `daytimeImportPercent` number, required: Default share of imports occurring during daytime hours, as a percentage.
    - `weekendImportPercent` number, required: Default share of imports occurring on weekends, as a percentage.
    - `batteryBrand` string, nullable, required: Default battery brand assumed in the cost estimate. Null when no battery is assumed.
    - `batteryKwh` number, nullable, required: Default battery capacity in kWh assumed in the cost estimate. Null when no battery is assumed.
    - `notes` string[], required: Free-form notes clarifying when the default estimate may not apply.
  - `tduReferences` object[], required: Representative ZIP and landing URL for each Texas TDU.
    - `tdu` string, required: TDU display name.
    - `representativeZipcode` string, required: Representative 5-digit ZIP for this TDU territory.
    - `plansUrl` string, required: URL on meterplan.com listing plans for this TDU.
  - `sourceStatus` object[], required: Per-source freshness and coverage status. Inspect before treating a TDU slice as complete.
    - `source` string, required: Label for the data source contributing to this row (e.g. 'Meter plans - Oncor').
    - `status` 'ok' | 'partial' | 'unavailable', required: Freshness and coverage status for this source. Treat 'partial' or 'unavailable' slices as incomplete.
    - `detail` string, required: Human-readable explanation of the status.
    - `planCount` number, required: Number of plans contributed by this source.
  - `recommendedPages` object[], required: Public pages on meterplan.com to link to for human readers and follow-up workflows.
    - `label` string, required: Display label for the recommended page.
    - `url` string, required: Public URL on meterplan.com.
    - `description` string, required: One-sentence summary of what the page offers.
  - `plans` object[], required: Solar buyback plan rows after applying any filters from the input. Sorted by TDU, then by estimated annual cost ascending, then by provider and plan name.
    - `providerName` string, required: Provider company name as displayed to consumers. Examples: 'Meter Energy', 'TXU Energy', 'Reliant', 'Octopus Energy'.
    - `providerType` 'meter' | 'competitor', required: 'meter' for Meter Energy plans, 'competitor' for every other retail electric provider.
    - `planName` string, required: Plan product name. Examples: 'Meter Saver 12', 'TXU Solar Buyback 12'.
    - `tdu` string, required: TDU display name. One of: 'Oncor', 'CenterPoint', 'AEP Texas Central', 'AEP Texas North', 'TNMP', 'Lubbock Power & Light'.
    - `representativeZipcode` string, required: Representative 5-digit ZIP used to fetch this plan from the source. Plans are available throughout the TDU territory, not only at this ZIP.
    - `termMonths` number, required: Contract length in months.
    - `planType` 'fixed_export' | 'real_time_wholesale' | 'free_nights' | 'battery_vpp' | 'standard' | 'other', required: Plan structure classification. 'fixed_export' = solar buyback at a fixed rate. 'real_time_wholesale' = export credit tied to ERCOT wholesale prices. 'free_nights' = nighttime usage free. 'battery_vpp' = battery program with a virtual power plant credit. 'standard' = non-solar fixed-rate plan included for comparison. 'other' = none of the above.
    - `importRateCentsPerKwh` number, nullable, required: Energy charge in cents per kWh for grid imports. Excludes TDU delivery and base fees.
    - `exportRateCentsPerKwh` number, nullable, required: Solar buyback credit in cents per kWh for grid exports. Null for real-time wholesale plans (variable) and plans without solar buyback.
    - `exportRateType` 'fixed' | 'real_time_wholesale' | 'none' | 'unknown', required: Structure of the export credit. 'fixed' = locked ¢/kWh for the term. 'real_time_wholesale' = tied to ERCOT prices. 'none' = no buyback. 'unknown' = not on file.
    - `baseFeeDollarsPerMonth` number, nullable, required: Monthly base fee in dollars charged by the retailer. Null if not on file.
    - `earlyTerminationFeeDollars` number, nullable, required: Early termination fee in dollars. Null if the plan has no ETF or the value is not on file.
    - `estimatedAnnualCostDollars` number, nullable, required: Estimated annual electricity cost in dollars at the default solar homeowner profile (see assumptions). Excludes battery program credits.
    - `displayImportRate` string, required: Human-readable import rate string. Example: '14.5 cents/kWh'.
    - `displayExportRate` string, required: Human-readable export rate string. Example: '4.2 cents/kWh' or 'ERCOT wholesale'.
    - `displayBaseFee` string, required: Human-readable base fee string. Example: '$0/month' or '$9.95/month'.
    - `displayEarlyTerminationFee` string, required: Human-readable ETF string. Example: '$295' or 'None'.
    - `batterySupport` object, required: Battery program eligibility and credit structure for this plan.
      - `tesla` boolean, required: True if Tesla Powerwall is eligible for this plan's battery program.
      - `solaredge` boolean, required: True if SolarEdge battery is eligible.
      - `enphase` boolean, required: True if Enphase battery is eligible.
      - `qcells` boolean, required: True if Qcells battery is eligible.
      - `eligibleBrands` string[], required: List of battery brands eligible for this plan's battery program. Empty if the plan has no battery program.
      - `customerStorageCreditDollarsPerKwhMonth` number, nullable, required: Customer-facing storage credit in dollars per kWh per month. Null if the plan has no battery program.
      - `storageCreditIncludedInEstimatedCost` boolean, required: True if estimatedAnnualCostDollars already nets out the storage credit. False (the default) means the credit is shown but not subtracted from the estimate, since the default profile assumes no battery.
      - `exampleMonthlyCreditDollars` number, nullable, required: Illustrative monthly credit dollars at the default battery capacity (one 13.5 kWh Tesla Powerwall). Null if the plan has no battery program.
      - `meterStorageCreditDollarsPerKwhMonth` number, nullable, required: Deprecated alias of customerStorageCreditDollarsPerKwhMonth. Kept for existing consumers.
    - `creditNotes` string[], required: Per-plan notes explaining structure quirks (rate type, battery program rules, profile sensitivity, etc.).
    - `signupUrl` string, nullable, required: Direct URL where the customer can sign up for this plan. Null if no public signup URL is on file.
    - `sourceUrl` string, required: URL on meterplan.com where this plan is presented to consumers.
    - `updatedAt` string, nullable, required: ISO 8601 timestamp of the most recent source refresh for this plan.
  - `filter` object, required: Echo of the filter inputs alongside before/after plan counts. Useful for confirming a filter narrowed the catalog as expected.
    - `tdu` string, nullable, required
    - `providerType` 'meter' | 'competitor', nullable, required
    - `termMonths` number, nullable, required
    - `totalPlansBeforeFilter` number, required
    - `totalPlansAfterFilter` number, required

## Other responses

- `400`: Request body was missing, malformed JSON, or failed input schema validation.
- `422`: Input was valid but the tool could not complete the request. `message` is safe to show the user.
- `500`: Tool execution failed or produced an output that violated the schema.

## Changes

- **2026-10-21** `2b73e36f9afd`: 2 warning, 3 info
  - added the new `tool_error` enum value to the `error` response property for the response status `400`
  - added the new `tool_error` enum value to the `error` response property for the response status `500`
  - added the non-success response with the status `422`
  - added the optional property `error_code` to the response with the `400` status
  - …1 more

[Operation history](https://skmtc.dev/meterplan/apis/meter-energy-public-api/changes/api/v1/list-solar-buyback-plans/post.md)

---

[API](https://skmtc.dev/meterplan/apis/meter-energy-public-api.md) - [All operations](https://skmtc.dev/meterplan/apis/meter-energy-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/meterplan/apis/meter-energy-public-api/revisions/2b73e36f9afd?raw)
