Power Expert India

Verified Tariff API

Multi-state Indian electricity tariff calculation, commercial bill verification, regulatory evidence and fail-closed execution through one authenticated API contract.

Production V1.2.0 Controller V2.2.8 11 documented paths States: Bihar (BR) + Maharashtra (MH) + Gujarat (GJ) + Tamil Nadu (TN, payable hold) MH: MSEDCL · TPC-D · AEML · BEST

Overview

Base URL: https://powerexpertindia.com/v1

API version: PEI Verified Tariff API V1.2.0

Controller: PEI Unified Multi-State Controller

Release ID: BR-2026-27-VERIFIED-STRICT-BASE-V1

Verified base tariff plus bounded evidence contracts Base-tariff money is production enabled. Bihar subsidy support currently returns entitlement units only. FPPAS support currently returns historical evidence only. Neither contract modifies the base-tariff amount.
Exact current net bill remains blocked Monetary subsidy, generic subsidy-proration rounding, current applicable FPPAS, corrigendum composition, statutory levies and other utility-bill components remain excluded unless a later response contract explicitly enables them.
9Documented paths
32Verified subcategories
34Schedule rows
38OpenAPI schemas

Authentication

Every API request requires a dedicated client key. Use one of the following header methods.

X-API-Key

export PEI_API_KEY='pei_live_your_key_here'

curl --request GET \
  --url 'https://powerexpertindia.com/v1/health' \
  --header 'Accept: application/json' \
  --header "X-API-Key: ${PEI_API_KEY}"

Authorization: Bearer

export PEI_API_KEY='pei_live_your_key_here'

curl --request GET \
  --url 'https://powerexpertindia.com/v1/states' \
  --header 'Accept: application/json' \
  --header "Authorization: Bearer ${PEI_API_KEY}"
Never place an API key in a URL Query parameters such as ?key=, ?api_key= and ?apikey= are rejected with 401 API_KEY_QUERY_NOT_ALLOWED.

Each key has its own scopes, state allowlist, CORS allowlist and rate-limit profile.

Response contract

Success envelope

{
  "status": "ok",
  "api_version": "PEI Verified Tariff API V1.2.0",
  "request_id": "req_...",
  "data": {},
  "meta": {}
}

Error envelope

{
  "status": "error",
  "api_version": "PEI Verified Tariff API V1.2.0",
  "request_id": "req_...",
  "error": {
    "code": "API_KEY_REQUIRED",
    "message": "A valid API key is required."
  }
}

Every response includes an X-Request-ID header and matching request_id field for support and traceability. Money uses integer paise. A corresponding *_rupees two-decimal string may be returned beside a paise field.

Endpoints

GET /health scope: health:read

Health and release status

Returns service health, release identity, frozen row counts and runtime-gate status.

GET /capabilities scope: health:read

Public capability matrix and release-gated feature availability

Returns an explicit fail-closed matrix showing enabled, evidence-only and blocked bill components.

ParameterTypeUseExampleNotes
state_code string Optional BR Use /states and /capabilities for the current state-specific release, verification and payable status.
GET /states scope: states:read

Released states

Lists states currently approved for verified-strict public serving. The V1 public state inventory includes Bihar, Maharashtra, Gujarat, Tamil Nadu, Rajasthan, Odisha and Telangana. Availability, verification tier and payable status are state-specific.

GET /categories scope: categories:read

Category catalogue

Returns verified State-specific tariff categories and subcategories and the calculation inputs required by each category.

ParameterTypeUseExampleNotes
state_code string Optional BR Integrated state code: BR, MH, GJ, TN, RJ, OD, TS or JH. Use /states and /capabilities as the authoritative discovery contract.
effective_on date Optional 2026-04-01 Exact YYYY-MM-DD date on or after the release effective date.
GET /tariffs scope: tariffs:read

Verified tariff rows

Returns approved schedule rows with integer-paise money fields and public source references.

ParameterTypeUseExampleNotes
state_code string Optional BR Integrated state code: BR, MH, GJ, TN, RJ, OD, TS or JH. Use /states and /capabilities as the authoritative discovery contract.
effective_on date Optional 2026-04-01 Exact YYYY-MM-DD date.
subcategory_code string Optional BR_DS_II Exact Bihar state subcategory code.
supply_type string Optional low_tension Case-insensitive supply-type filter.
area_type string Optional urban Case-insensitive area applicability filter.
GET /subsidy-entitlement scope: tariffs:read

125-unit subsidy entitlement

Evaluates the verified Bihar domestic entitlement in units only. It does not calculate a rupee subsidy or reduce the base tariff amount.

ParameterTypeUseExampleNotes
state_code string Optional BR Use BR for this Bihar-only endpoint; other states fail closed or return an explicit not-covered response.
consumer_class string Optional domestic Only domestic consumers are covered.
billing_days integer Optional 30 Executable values are 25, 30 and 40 only. Other values fail closed.
consumption_units integer Optional 126 Whole units. Requires billing_days when supplied.
GET /fppas-periods scope: tariffs:read

Historical FPPAS evidence

Returns verified historical period evidence. It never selects or applies a current FPPAS rate to a bill.

ParameterTypeUseExampleNotes
state_code string Optional BR Use BR for this Bihar-only endpoint; other states fail closed or return an explicit not-covered response.
period_month YYYY-MM Optional 2026-01 Exact historical calculation period.
recovery_month YYYY-MM Optional 2026-03 Exact recovery month when available or derived.
authority string Optional SBPDCL Accepted values: NBPDCL or SBPDCL.
GET /sources scope: sources:read

Source evidence catalogue

Returns approved traceability metadata and schedule-row mappings without exposing raw evidence bodies or server paths.

ParameterTypeUseExampleNotes
state_code string Optional BR Integrated state code: BR, MH, GJ, TN, RJ, OD, TS or JH. Use /states and /capabilities as the authoritative discovery contract.
POST /calculate scope: calculate:write

Tariff calculation & bill verification

Runs state-aware tariff calculation and bill-verification workflows across released and Verified Shadow scopes. Use /states and /capabilities for the current state-specific contract. Unresolved payable components remain fail-closed.

GET /capabilities

Use this route before calculation when an integration needs to distinguish production-enabled features from evidence-only or blocked components.

export PEI_API_KEY='pei_live_your_key_here'

curl --request GET \
  --url 'https://powerexpertindia.com/v1/capabilities?state_code=BR' \
  --header 'Accept: application/json' \
  --header "X-API-Key: ${PEI_API_KEY}"

Capability status summary

{
  "base_tariff_calculation": "enabled",
  "subsidy_entitlement": "enabled_non_monetary",
  "fppas": "historical_evidence_available_current_blocked",
  "monetary_subsidy_amount": "blocked",
  "current_fppas_numeric_regime": "blocked",
  "statutory_levies": "blocked",
  "exact_current_net_bill": "blocked"
}

State support & release status

Power Expert India uses state- and licensee-specific routing. A state appearing in the API does not automatically mean every bill component is payable-enabled. Unsupported or unverified components remain fail-closed.

Bihar (BR)
Production/released verified tariff API. Bihar-specific subsidy entitlement, historical FPPAS evidence and solar-savings contracts are documented separately below.
Maharashtra (MH)
FY 2026-27 verified statewide base-tariff coverage for MSEDCL, TPC-D, AEML and BEST. Explicit licensee selection is required where applicable. No automatic MSEDCL fallback.
Gujarat (GJ)
FY 2026-27 verified statewide guarded routing across 11 explicit licensees. Use canonical licensee and category identifiers returned by the discovery endpoints. Unsupported routing fails closed.
Tamil Nadu (TN)
State routing, health and discovery are live. FY 2026-27 payable calculation remains held fail-closed until the controlling tariff, subsidy, tax and evidence gates are fully satisfied.

Recommended multi-state discovery flow

GET /v1/states
GET /v1/health?state_code=BR
GET /v1/health?state_code=MH
GET /v1/health?state_code=GJ
GET /v1/health?state_code=TN

# Then use the canonical state/licensee/category identifiers
# returned by /states and /categories.
GET /v1/categories?state_code=BR
GET /v1/categories?state_code=MH&licensee_code=<canonical_licensee_code>
GET /v1/categories?state_code=GJ&licensee_code=<canonical_licensee_code>
GET /v1/categories?state_code=TN
Important: Do not guess licensee or category identifiers. Discover canonical values first and pass them back to the tariff/calculate endpoints. State-specific payable and adjustment status is authoritative in the API response.

GET /subsidy-entitlement BR only

This route exposes the verified Bihar domestic 125-unit entitlement contract. The frozen official billing-day examples remain fail-closed: 25 days → 104 units, 30 days → 125 units and 40 days → 167 units. In POST /calculate, supported domestic requests may additionally use the verified monetary subsidy core.

export PEI_API_KEY='pei_live_your_key_here'

curl --request GET \
  --url 'https://powerexpertindia.com/v1/subsidy-entitlement?state_code=BR&consumer_class=domestic&billing_days=30&consumption_units=126' \
  --header 'Accept: application/json' \
  --header "X-API-Key: ${PEI_API_KEY}"

Selected evaluation fields

{
  "billing_days": 30,
  "entitlement_units": 125,
  "consumption_units": 126,
  "subsidised_units": 125,
  "chargeable_units": 1,
  "contract_application": "official_example_exact_match",
  "monetary_calculation_performed": false
}
Entitlement route remains non-monetary GET /subsidy-entitlement evaluates entitlement and chargeable units only. POST /calculate may separately apply the verified monetary subsidy core when its frozen billing contract is satisfied. Unsupported billing-day values still fail closed instead of inferring a rounding rule.

GET /fppas-periods BR only

This route provides verified Bihar FPPAS period evidence. Filters may be applied by period month, recovery month or authority. POST /calculate may use only an explicitly approved exact-month FPPAS version whose recovery-month and billing-contract conditions match.

export PEI_API_KEY='pei_live_your_key_here'

curl --request GET \
  --url 'https://powerexpertindia.com/v1/fppas-periods?state_code=BR&authority=SBPDCL&period_month=2026-01' \
  --header 'Accept: application/json' \
  --header "X-API-Key: ${PEI_API_KEY}"

Current serving boundary

{
  "available_period_months": [
    "2025-08",
    "2026-01",
    "2026-02",
    "2026-03"
  ],
  "current_rate_released": false,
  "current_fppas_engine_ready": false,
  "historical_evidence_only": true,
  "rate_applied_to_bill": false
}
Approved exact-period selection only Historical percentages are never used as fallback. POST /calculate may apply only a verified, approved exact-month FPPAS version with matching recovery-month and billing conditions. If no eligible version exists, FPPAS remains explicitly not applied.

POST /solar-savings BR contract

One-call Bihar domestic solar workflow for solar companies. The endpoint resolves a caller-declared domestic classification, calculates verified before-solar and after-solar base-tariff costs, evaluates optional approved FPPAS data and returns proposal evidence.

Production verified Supported state: BR. Required scope: calculate:write. Verification tier: verified_strict.

One-call request

curl -X POST "https://powerexpertindia.com/v1/solar-savings" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
    "state_code": "BR",
    "consumer_type": "domestic",
    "domestic_class": "urban",
    "connected_load": "2",
    "load_unit": "kw",
    "existing_monthly_units": 450,
    "post_solar_import_units": 150,
    "billing_month": "2026-05",
    "discom_code": "SBPDCL",
    "verification_tier": "verified_strict",
    "release_id": "BR-2026-27-VERIFIED-STRICT-BASE-V1"
  }'

Request fields

Field Required Purpose
state_code Yes Currently BR.
consumer_type With domestic_class Currently domestic.
domestic_class Alternative to subcategory_code Caller-declared classification: urban, general, rural or lifeline.
subcategory_code Alternative to domestic_class Existing integrations may send the verified Bihar subcategory directly.
connected_load Category-dependent Connected load used by the tariff calculation.
load_unit With connected_load Use kw; input is case-insensitive.
existing_monthly_units Yes Current monthly grid consumption.
post_solar_import_units Yes Expected monthly grid import after solar, supplied by the client.
billing_month No YYYY-MM month used by the verified Bihar FPPAS selector.
discom_code No NBPDCL or SBPDCL.
verification_tier Yes Must be verified_strict.
release_id Yes Must match the active verified Bihar release.

Domestic class mapping

domestic_class Resolved category Canonical category
urban BR_DS_II DOMESTIC_URBAN
general BR_DS_III DOMESTIC_GENERAL
rural BR_DS_I_RURAL DOMESTIC_RURAL
lifeline BR_KUTIR_JYOTI DOMESTIC_LIFELINE
Classification disclosure The API translates the classification supplied by the client. It does not determine government-scheme, lifeline or Kutir Jyoti eligibility. The client must confirm the consumer classification.

Important response objects

Object Meaning
before_solar Verified base-tariff calculation before solar.
after_solar Verified base-tariff calculation using post-solar grid-import units.
savings Monthly and annualized base or total comparison.
fppas_comparison Optional approved FPPAS evaluation for both scenarios. If unavailable, the response explicitly falls back to verified base tariff.
subsidy_entitlement_comparison Non-monetary entitlement evaluation. No monetary subsidy amount is calculated or deducted.
proposal_evidence Machine-verifiable release, calculation and proposal evidence.

Common errors

HTTP Error code Reason
409 CATEGORY_CLASSIFICATION_CONFLICT domestic_class and subcategory_code identify different tariff categories.
409 RELEASE_ID_MISMATCH The supplied release is not the active release.
422 INVALID_DOMESTIC_CLASS The domestic classification is unsupported.
422 INPUT_PAIR_REQUIRED connected_load and load_unit were not supplied together.
422 POST_SOLAR_IMPORT_EXCEEDS_EXISTING_USAGE Post-solar grid import exceeds existing consumption.
404 NOT_COVERED State or consumer type is not onboarded.
Calculation boundary The endpoint does not estimate solar generation, apply net metering, calculate export credit, calculate a monetary subsidy, include statutory levies, or calculate ROI/payback. It is not an exact utility bill or a guaranteed solar saving.

POST /calculate

Send Content-Type: application/json. Use category metadata from GET /categories to determine which load or demand fields are required for a subcategory.

FieldTypeUseExampleRules
state_code string Recommended BR Use the canonical state code returned by /states. Current integrated codes include BR, MH, GJ, TN, RJ, OD, TS and JH. State-specific execution and payable status must be read from /capabilities and the calculation response.
licensee_code string State-specific MH_AEML Use an explicit canonical licensee where the selected state contract requires or permits it. Maharashtra requires explicit routing. Jharkhand may resolve from verified location/service context or an explicit licensee signal; no silent JBVNL fallback is allowed.
financial_year YYYY-YY Recommended for MH 2026-27 Current verified Maharashtra public release financial year.
category_id string Required for MH MH_MSEDCL_HT_I_INDUSTRY Canonical Maharashtra category returned by GET /categories.
subcategory_code string State-specific BR_DS_II Use where required by the selected state contract. Bihar and Gujarat use canonical category/subcategory identifiers. Jharkhand V1 uses its location/use/supply routing contract and does not inherit the Bihar subcategory requirement.
district string JH routing Ranchi Jharkhand district/location signal used by the fail-closed licensee resolver.
city / area string JH routing Ranchi Optional Jharkhand city or service-area signal when needed for routing.
supply_type string JH state-specific LT Jharkhand supply type such as LT or HT.
use string JH state-specific DOMESTIC Jharkhand consumer-use signal.
area_class string JH conditional RURAL Required where the resolved Jharkhand tariff/category needs an area classification.
consumption number JH calculation 100 Jharkhand metered consumption for VERIFIED_TARIFF_ESTIMATION_V1.
consumption_unit string JH calculation kWh Unit for the Jharkhand consumption value.
energy_units integer or digit string Required 126 Non-negative whole units from 0 to 100,000,000.
consumption_units number Conditional for MH 1000 Use for Maharashtra tariff rows billed on kWh.
consumption_kvah number Conditional for MH 10000 Use for Maharashtra tariff rows billed on kVAh. No automatic kWh-to-kVAh conversion.
billing_demand_kva decimal Conditional for MH 400 Billing demand in kVA where required by the verified Maharashtra tariff row.
billing_demand_kw decimal Conditional for MH 50 Billing demand in kW where required by the verified Maharashtra tariff row.
billing_date date Conditional for MH 2026-08-10 Use for TPC-D, AEML and BEST where applicable. MSEDCL rejects billing_date and uses timestamp when date/time context is required.
subtype string Conditional for MSEDCL GENERAL Required for MSEDCL HT I Industry; supported values include GENERAL and SEASONAL.
timestamp ISO-8601 Conditional for MSEDCL/ToD 2026-08-13T18:00:00+05:30 Required where MSEDCL or ToD needs date/time context. Include timezone offset.
connected_load decimal string Conditional 1 Required for per-kW, per-HP or applicable per-kVA fixed charges. Gujarat connected-load requirements are category/licensee specific. Maximum three decimal places.
recorded_demand decimal string Conditional 11 Required where billing-demand rules apply and for applicable HT calculations.
contract_demand decimal string Conditional 10 Required where billing-demand rules apply and for applicable HT calculations.
tod_period string Optional off_peak Tariff-dependent Time-of-Day period code.
rts_voltage_mode string Optional standard Allowed values: standard, above_132kv, below_132kv.
apply_htss_11kv_surcharge boolean Optional false Must be a JSON boolean, not a string.
effective_on date Optional 2026-04-01 Exact YYYY-MM-DD date on or after the released effective date.
billing_days integer Optional 30 Domestic subsidy-entitlement evaluation only. Accepted values: 25, 30 or 40. Base money remains unchanged.

Domestic request with subsidy and payable evaluation

export PEI_API_KEY='pei_live_your_key_here'

curl --request POST \
  --url 'https://powerexpertindia.com/v1/calculate' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header "X-API-Key: ${PEI_API_KEY}" \
  --data '{
    "state_code": "BR",
    "subcategory_code": "BR_DS_II",
    "energy_units": 126,
    "connected_load": "1",
    "billing_days": 30
  }'

Gujarat — explicit licensee routing example

Gujarat requests must use the canonical licensee and tariff category identifiers returned by the discovery endpoints. No automatic licensee fallback is performed.

curl -X POST "https://powerexpertindia.com/v1/calculate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "state_code": "GJ",
    "licensee_code": "GJ_TPL_SURAT",
    "subcategory_code": "RGP",
    "energy_units": 250,
    "connected_load": 3,
    "load_unit": "KW",
    "billing_days": 30
  }'
Gujarat routing rule: GJ_TPL_SURAT + RGP is an explicit canonical example. Do not replace the licensee with a guessed/default Gujarat DISCOM.

Jharkhand — Verified Tariff Estimation V1

Jharkhand is live in VERIFIED_TARIFF_ESTIMATION_V1 mode. The calculation route uses location-aware, fail-closed licensee routing. This is a verified tariff/base-bill estimation release, not a final payable-bill claim.

curl -X POST "https://powerexpertindia.com/v1/calculate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "state_code": "JH",
    "district": "Ranchi",
    "use": "DOMESTIC",
    "supply_type": "LT",
    "area_class": "RURAL",
    "consumption": 100,
    "consumption_unit": "kWh"
  }'
Jharkhand V1 release semantics: JBVNL, TSL and TSUISL are active verified-estimation paths. DVC_JH is active with component holds. SAIL_BSL remains recognized but held-unverified. TPCL is excluded from consumer retail routing. Unresolved FPPAS and electricity duty remain HELD_UNVERIFIED with null amounts. complete_payable=false and production_payable=false. No silent JBVNL fallback or historical tariff carry-forward is used.

Tamil Nadu — fail-closed payable example

Tamil Nadu discovery and health routing are live, but FY 2026-27 payable calculation remains intentionally held until the operational tariff implementation is fully verified.

curl -X POST "https://powerexpertindia.com/v1/calculate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "state_code": "TN",
    "subcategory_code": "LT_IA",
    "energy_units": 100,
    "connected_load": 1,
    "load_unit": "KW",
    "billing_date": "2026-08-22"
  }'

Expected Tamil Nadu payable hold

HTTP 409

{
  "status": "error",
  "error": {
    "code": "TN_FY2026_27_PAYABLE_TARIFF_PENDING",
    "message": "Tamil Nadu payable calculation is temporarily unavailable until the FY 2026-27 operational tariff implementation is verified.",
    "details": {
      "state_code": "TN",
      "release_status": "READY_WITH_FY2026_27_PAYABLE_HOLD",
      "notice_code": "TN_FY2026_27_OPERATIONAL_TARIFF_PENDING",
      "payable_available": false,
      "fail_closed": true,
      "silent_fy2025_26_fallback": false,
      "shadow_payable": false,
      "reason": "FY2026_27_OPERATIONAL_TARIFF_CONFIRMATION"
    }
  }
}
Fail-closed behavior: PEI does not silently fall back to FY 2025-26 Tamil Nadu rates for a FY 2026-27 payable request.

Selected response fields

{
  "status": "ok",
  "api_version": "PEI Verified Tariff API V1.2.0",
  "request_id": "req_...",
  "data": {
    "state_code": "BR",
    "subcategory_code": "BR_DS_II",
    "calculation_scope": "verified_base_tariff_plus_non_monetary_subsidy_entitlement",
    "result": {
      "energy_charge_paise": 93492,
      "fixed_charge_paise": 8000,
      "fixed_charge_basis": "per_kw_or_part_per_month",
      "base_total_paise": 101492,
      "base_total_paise_rupees": "1014.92",
      "currency": "INR",
      "integer_paise_only": true
    },
    "subsidy_entitlement": {
      "status": "evaluated_non_monetary",
      "billing_days": 30,
      "entitlement_units": 125,
      "consumption_units": 126,
      "subsidised_units": 125,
      "chargeable_units": 1,
      "monetary_subsidy_amount_paise": null,
      "monetary_calculation_performed": false,
      "base_tariff_amount_adjusted_for_subsidy": false,
      "fppas_included": false
    },
    "excluded_components": [
      "monetary_subsidy_amount",
      "fppas_fpppa",
      "corrigendum_composition",
      "statutory_levies"
    ]
  },
  "meta": {
    "release_id": "BR-2026-27-VERIFIED-STRICT-BASE-V1",
    "controller_version": "PEI Unified Multi-State Controller"
  }
}
Backward compatible billing_days is optional. When omitted for a Bihar domestic category, the subsidy-entitlement block reports a not-evaluated status. When supplied, only 25, 30 or 40 are accepted. In every case the verified base total remains unchanged by subsidy or FPPAS.

Client examples

Browser JavaScript

const response = await fetch(
  'https://powerexpertindia.com/v1/tariffs?state_code=BR&subcategory_code=BR_DS_II',
  {
    method: 'GET',
    headers: {
      'Accept': 'application/json',
      'X-API-Key': apiKey
    }
  }
);

const payload = await response.json();

if (!response.ok) {
  throw new Error(`${payload.error.code}: ${payload.error.message}`);
}

console.log(payload.data);

PHP cURL

<?php
$apiKey = getenv('PEI_API_KEY');
$url = 'https://powerexpertindia.com/v1/categories?state_code=BR';

$curl = curl_init($url);
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Accept: application/json',
        'Authorization: Bearer ' . $apiKey,
    ],
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT => 30,
]);

$body = curl_exec($curl);
$status = (int) curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ($body === false) {
    throw new RuntimeException(curl_error($curl));
}

curl_close($curl);
$data = json_decode($body, true, 64, JSON_THROW_ON_ERROR);

if ($status >= 400) {
    throw new RuntimeException(
        ($data['error']['code'] ?? 'API_ERROR') . ': ' .
        ($data['error']['message'] ?? 'Request failed')
    );
}

Browser access also requires the page origin to be present in the client key’s CORS allowlist. Server-to-server requests do not send a browser Origin header.

Standard errors

HTTPCodeMeaning
400 API_KEY_CONFLICT X-API-Key and Bearer headers contain different keys.
400 INVALID_QUERY_PARAMETER A query parameter exceeds its allowed length.
400 JSON_BODY_REQUIRED POST /calculate has no JSON body.
400 INVALID_JSON The request body is malformed JSON.
400 JSON_OBJECT_REQUIRED The JSON body is not an object.
401 API_KEY_REQUIRED No valid API key was supplied.
401 API_KEY_INVALID The supplied API key is malformed, inactive, expired or unknown.
401 API_KEY_SCHEME_INVALID Authorization does not use the Bearer scheme.
401 API_KEY_QUERY_NOT_ALLOWED An API key was placed in the URL query string.
403 API_SCOPE_DENIED The key does not include the route’s required scope.
403 API_STATE_ACCESS_DENIED The key is not allowed to access the requested state.
403 CORS_ORIGIN_DENIED The browser origin is not in the active registry allowlist.
404 STATE_NOT_RELEASED The requested tariff state is not released.
404 SUBSIDY_ENTITLEMENT_STATE_NOT_SUPPORTED The subsidy-entitlement contract is available only for Bihar.
404 FPPAS_PERIODS_STATE_NOT_SUPPORTED The historical FPPAS evidence catalogue is available only for Bihar.
404 SUBCATEGORY_NOT_FOUND The subcategory is not in the verified release.
404 TARIFF_NOT_EFFECTIVE The released tariff was not effective on the requested date.
404 ROUTE_NOT_FOUND The route does not exist.
405 METHOD_NOT_ALLOWED The route was called with an unsupported HTTP method.
409 AMBIGUOUS_TARIFF_VARIANT A tariff variant selector is required.
413 REQUEST_BODY_TOO_LARGE The request body exceeds 65,536 bytes.
415 UNSUPPORTED_MEDIA_TYPE POST /calculate did not use application/json.
422 REQUIRED_INPUT_MISSING A required calculation field is missing.
422 INVALID_CALCULATION_INPUT An integer calculation input is outside its allowed range.
422 INVALID_DECIMAL_INPUT A load or demand value is not a valid non-negative decimal string.
422 INVALID_BOOLEAN_INPUT A boolean input was supplied using the wrong JSON type.
422 INVALID_TOD_PERIOD The requested Time-of-Day period is unavailable.
422 INVALID_EFFECTIVE_DATE effective_on is not an exact YYYY-MM-DD date.
422 INVALID_INTEGER_QUERY A subsidy query value is not a non-negative integer.
422 INTEGER_QUERY_OUT_OF_RANGE A subsidy query integer is outside the supported range.
422 NON_DOMESTIC_NOT_ELIGIBLE The released 125-unit entitlement applies only to domestic consumers.
422 SUBSIDY_BILLING_DAYS_REQUIRED billing_days is required when consumption_units is supplied.
422 SUBSIDY_PRORATION_RULE_NOT_VERIFIED The requested billing-day entitlement is not frozen in the official-example contract.
422 SUBSIDY_ENTITLEMENT_NOT_APPLICABLE billing_days was supplied for a non-domestic calculation.
422 INVALID_FPPAS_MONTH period_month or recovery_month does not use YYYY-MM.
422 INVALID_FPPAS_AUTHORITY authority is not NBPDCL or SBPDCL.
429 RATE_LIMIT_EXCEEDED The per-minute or burst allowance has been reached.
500 INTERNAL_SERVER_ERROR The API request could not be completed.
503 VERIFIED_RUNTIME_UNAVAILABLE Required verified serving evidence is unavailable.

Rate limits

The launch default is 60 requests per minute per API key, with a 20-request burst allowance within 10 seconds. Limits are registry-driven and may differ by client agreement.

HeaderMeaning
X-RateLimit-LimitConfigured per-minute limit for the authenticated key.
X-RateLimit-RemainingRemaining accepted requests in the active minute window.
X-RateLimit-ResetUnix epoch when the oldest active request leaves the minute window.
Retry-AfterSeconds to wait after a 429 response.

Clients should respect Retry-After and use bounded exponential backoff rather than immediate retry loops.

Security and privacy

  • Dedicated API keys are accepted only in request headers.
  • The protected registry stores SHA-256 key hashes rather than plaintext keys.
  • Every key has route scopes, a state allowlist, a CORS allowlist and its own rate-limit configuration.
  • Public output excludes raw evidence bodies, text windows and filesystem paths.
  • Request logging is privacy-safe and does not record the dedicated API key.
  • The calculation endpoint is deterministic and uses integer-paise money arithmetic.
  • Evidence-only routes do not silently promote historical or partial evidence into current payable-bill logic.

Release evidence

Contract sync: PASS OpenAPI documents the current multi-state public contract surface. Use /states and /capabilities for authoritative state discovery, verification tier and payable status. Released and Verified Shadow states remain explicitly distinguished, and unresolved payable components fail closed. The 294 local references resolve and the response examples parse successfully.
84/84API and security regression
29/29Runtime gates
17/17Subsidy source-contract gates
8/8Subsidy fixture cases

Current release: BR-2026-27-VERIFIED-STRICT-BASE-V1. Public contract changes require a versioned documentation and OpenAPI update plus complete regression review before monetary or current-regime capabilities are enabled.

Maharashtra — LIVE · MSEDCL Complete Payable V2

Released for FY 2026–27: MSEDCL Complete Payable V2 production for approved profiles; TPC-D, AEML and BEST verified base-tariff calculations.

Maharashtra provides statewide verified public tariff calculation for MSEDCL, TPC-D, AEML and BEST, with reference data using human-verified tariff rows and traceable evidence. It is not represented as exact utility-bill reproduction.

Included

  • MSEDCL Complete Payable V2 production for approved profiles. TPC-D, AEML and BEST retain verified base-tariff coverage.
  • Licensee-specific category and tariff lookup.
  • Verified fixed, energy, wheeling and published variable tariff components where applicable.
  • Evidence metadata and SHA-256 traceability.
  • FAC/FPPPA/PPCA and ToD status or shadow information where verified/context is available.

Not included in payable total

  • FAC/FPPPA/FPPAS/PPCA payable adjustment.
  • Time-of-Day payable adjustment.
  • Subsidy.
  • Unverified tax, cess or statutory levies. Verified electricity duty may be applied when explicitly resolved in the response.
  • Meter rent, arrears, penalties/DPS and miscellaneous ancillary charges.
Important: FAC/FPPPA and ToD are non-payable in Phase 1. The returned base-tariff amount must not be described as the exact current electricity bill.

Live calculation examples

MSEDCL — HT I Industry

export PEI_API_KEY='pei_live_your_key_here'

curl --request POST \
  --url 'https://powerexpertindia.com/v1/calculate' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header "X-API-Key: ${PEI_API_KEY}" \
  --data '{
    "state_code": "MH",
    "licensee_code": "MH_MSEDCL",
    "category_id": "MH_MSEDCL_HT_I_INDUSTRY",
    "subtype": "GENERAL",
    "financial_year": "2026-27",
    "billing_demand_kva": 400,
    "consumption_units": 10000,
    "timestamp": "2026-08-13T18:00:00+05:30"
  }'

TPC-D — HT Industry

export PEI_API_KEY='pei_live_your_key_here'
curl --request POST --url 'https://powerexpertindia.com/v1/calculate' --header 'Content-Type: application/json' --header "X-API-Key: ${PEI_API_KEY}" --data '{"state_code":"MH","licensee_code":"MH_TPCD","category_id":"HT_INDUSTRY","financial_year":"2026-27","billing_demand_kva":400,"consumption_kvah":10000,"billing_date":"2026-08-13"}'

AEML — HT Industry

export PEI_API_KEY='pei_live_your_key_here'
curl --request POST --url 'https://powerexpertindia.com/v1/calculate' --header 'Content-Type: application/json' --header "X-API-Key: ${PEI_API_KEY}" --data '{"state_code":"MH","licensee_code":"MH_AEML","category_id":"HT_INDUSTRY","financial_year":"2026-27","billing_demand_kva":400,"consumption_kvah":10000,"billing_date":"2026-08-13"}'

BEST — HT Industry

export PEI_API_KEY='pei_live_your_key_here'
curl --request POST --url 'https://powerexpertindia.com/v1/calculate' --header 'Content-Type: application/json' --header "X-API-Key: ${PEI_API_KEY}" --data '{"state_code":"MH","licensee_code":"MH_BEST","category_id":"HT_INDUSTRY","financial_year":"2026-27","billing_demand_kva":400,"consumption_kvah":10000,"billing_date":"2026-08-13"}'

Maharashtra licensee codes

MH_MSEDCL, MH_TPCD, MH_AEML, MH_BEST

Odisha V1 — Verified Shadow Calculation

Odisha is available through the public /v1/calculate route in verified shadow mode. Four licensees are explicitly supported: OD_TPCODL, OD_TPNODL, OD_TPWODL and OD_TPSODL. Automatic licensee fallback is disabled.

Domestic calculation

Use state_code=OD, subcategory_code=DOMESTIC, energy_units, an explicit licensee_code, and a supported load input. Odisha V1 remains shadow-only and production_payable=false.

Gross metering

Gross metering is activated only by explicitly supplying metering_mode=gross_metering. generation_kwh is required for that mode. Supplying generation_kwh alone does not activate gross metering.

The gross-metering route currently requires load in kW. PEI does not guess kVA-to-kW or HP-to-kW conversions. Caller-supplied gross FiT values are not accepted.

Current regulatory hold

The gross-metering mechanism and generation quantity accounting are verified, but a generic current OERC gross FiT has not yet been verified for monetary execution. Therefore the response remains partial_verified, export rate is null, export credit is null, combined settlement is null, and production_payable=false.

{
  "state_code": "OD",
  "licensee_code": "OD_TPCODL",
  "subcategory_code": "DOMESTIC",
  "energy_units": 100,
  "connected_load": 1,
  "load_unit": "kw",
  "metering_mode": "gross_metering",
  "generation_kwh": 40
}

Odisha SDK examples: JavaScript · Python. Both examples use the frozen Odisha request fields subcategory_code=DOMESTIC, energy_units and explicit licensee_code.