Health and release status
Returns service health, release identity, frozen row counts and runtime-gate status.
Bihar verified base-tariff calculations, fail-closed non-monetary subsidy entitlement and historical FPPAS evidence through one authenticated API contract.
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
Every API request requires a dedicated client key. Use one of the following header methods.
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}"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}"Each key has its own scopes, state allowlist, CORS allowlist and rate-limit profile.
{
"status": "ok",
"api_version": "PEI Verified Tariff API V1.2.0",
"request_id": "req_...",
"data": {},
"meta": {}
}{
"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.
Returns service health, release identity, frozen row counts and runtime-gate status.
Returns an explicit fail-closed matrix showing enabled, evidence-only and blocked bill components.
| Parameter | Type | Use | Example | Notes |
|---|---|---|---|---|
state_code |
string | Optional | BR |
Only the released Bihar contract is documented. |
Lists states currently approved for verified-strict public serving. Bihar is the released V1 state.
Returns verified Bihar subcategories and the calculation inputs required by each category.
| Parameter | Type | Use | Example | Notes |
|---|---|---|---|---|
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. |
Returns approved schedule rows with integer-paise money fields and public source references.
| Parameter | Type | Use | Example | Notes |
|---|---|---|---|---|
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. |
Evaluates the verified Bihar domestic entitlement in units only. It does not calculate a rupee subsidy or reduce the base tariff amount.
| Parameter | Type | Use | Example | Notes |
|---|---|---|---|---|
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. |
Returns verified historical period evidence. It never selects or applies a current FPPAS rate to a bill.
| Parameter | Type | Use | Example | Notes |
|---|---|---|---|---|
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. |
Returns approved traceability metadata and schedule-row mappings without exposing raw evidence bodies or server paths.
| Parameter | Type | Use | Example | Notes |
|---|---|---|---|---|
state_code |
string | Optional | BR |
Released state code. |
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.
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}"{
"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"
}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}"{
"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
}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}"{
"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
}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.
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"
}'
| 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 | 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 |
| 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. |
| 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. |
Send Content-Type: application/json. Use category metadata from GET /categories to determine which load or demand fields are required for a subcategory.
| Field | Type | Use | Example | Rules |
|---|---|---|---|---|
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. |
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
}'{
"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"
}
}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
$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.
| HTTP | Code | Meaning |
|---|---|---|
| 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. |
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.
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Configured per-minute limit for the authenticated key. |
X-RateLimit-Remaining | Remaining accepted requests in the active minute window. |
X-RateLimit-Reset | Unix epoch when the oldest active request leaves the minute window. |
Retry-After | Seconds to wait after a 429 response. |
Clients should respect Retry-After and use bounded exponential backoff rather than immediate retry loops.
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 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.
MH_MSEDCL,
MH_TPCD,
MH_AEML,
MH_BEST