Power Expert India

Verified Tariff API

Bihar verified base-tariff calculations, fail-closed non-monetary subsidy entitlement and historical FPPAS evidence through one authenticated API contract.

Production V1.2.0 Controller V2.2.8 11 documented paths States: Bihar (BR) + Maharashtra (MH) 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 Bihar + Maharashtra Controller V2.2.8

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

Bihar capability matrix

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

ParameterTypeUseExampleNotes
state_code string Optional BR Only the released Bihar contract is documented.
GET /states scope: states:read

Released states

Lists states currently approved for verified-strict public serving. Bihar is the released V1 state.

GET /categories scope: categories:read

Category catalogue

Returns verified Bihar subcategories and the calculation inputs required by each category.

ParameterTypeUseExampleNotes
state_code string Optional BR Released state code.
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 Released state code.
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 Only Bihar is supported.
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 Only Bihar is supported.
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 Released state code.
POST /calculate scope: calculate:write

Verified base-tariff calculation

Calculates verified tariff results for Bihar and Maharashtra. Maharashtra supports FY 2026-27 verified base tariffs for MSEDCL, TPC-D, AEML and BEST. Maharashtra FAC/FPPPA and payable ToD are not yet included in the payable total; subsidy, tax, duty and cess remain excluded unless explicitly stated by the response.

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"
}

GET /subsidy-entitlement

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

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

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 BR for Bihar or MH for Maharashtra. Omitted value defaults to BR.
licensee_code string Required for MH MH_AEML Canonical Maharashtra licensee: MH_MSEDCL, MH_TPCD, MH_AEML or MH_BEST. No automatic MSEDCL fallback.
financial_year YYYY-YY Recommended for MH 2026-27 Current verified Maharashtra public release financial year.
category_id string Required for MH HT_INDUSTRY Canonical Maharashtra category returned by GET /categories.
subcategory_code string Required BR_DS_II Exact code returned by GET /categories.
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 Recommended for MH 2026-08-10 Billing date used for verified tariff applicability.
connected_load decimal string Conditional 1 Required for per-kW, per-HP or applicable per-kVA fixed charges. 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
  }'

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 Bihar + Maharashtra Controller V2.2.8"
  }
}
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 V1.2.0 documents the Bihar + Maharashtra public contract and Controller V2.2.8. 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 — Verified Base Tariff Phase 1

Released for FY 2026–27: MSEDCL, TPC-D, AEML and BEST verified base-tariff calculations.

Maharashtra Phase 1 provides verified base-tariff calculation and reference data using human-verified tariff rows and traceable evidence. It is not represented as exact utility-bill reproduction.

Included

  • Verified base tariff for MSEDCL, TPC-D, AEML and BEST.
  • 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.
  • Electricity duty, tax, cess or other statutory levies.
  • 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.

Maharashtra licensee codes

MH_MSEDCL, MH_TPCD, MH_AEML, MH_BEST