> ## Documentation Index
> Fetch the complete documentation index at: https://razorpay-881012b3.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Fetch Billers | BBPS API | Razorpay

> Retrieve a list of BBPS billers with filtering by category, geography and status using Razorpay's Bill Payments API.

<div style={{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"0.35rem 0.9rem",border:"1px solid rgba(128,128,128,0.28)",borderRadius:"0.5rem",padding:"0.45rem 0.75rem",margin:"0 0 1.25rem",fontSize:"0.875rem"}}>
  <span style={{fontWeight:600}}>Available in</span>
  <span>🇮🇳 India</span>
</div>

Use this endpoint to retrieve a list of billers on the Bharat Bill Payment System (BBPS). Filter by `category`, geographic coverage or status. Fetch a specific biller by `biller_id` or `gateway_biller_id`. The response includes the biller's configuration for payment, fees, additional info and account holder inputs. Use these to render the bill retrieval and payment UI.

<Info>
  **Incremental Sync**

  Pass `updated_since` (Unix timestamp) to fetch only billers updated after a specific time. This is the recommended way to keep your local biller catalogue in sync without re-fetching the entire list.
</Info>

<RequestExample>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
  -X GET "https://api.razorpay.com/v1/bill_payments/billers?category=electricity&geo_coverage.state=KA&geo_coverage.city=Bengaluru&geo_coverage.country=IN&status=active&count=10&skip=0"
  ```
</RequestExample>

<ResponseExample>
  ```json Success theme={null}
  {
    "entity": "collection",
    "count": 1,
    "items": [
      {
        "id": "biller_001",
        "entity": "bill_payment.biller",
        "gateway": "bbps",
        "created_at": 1609459200,
        "gateway_updated_at": 1689459200,
        "gateway_biller_id": "TPOW00000MUM01",
        "name": "Electricity Bill Payment",
        "alias_name": "Electricity BP",
        "category": "electricity",
        "status": "active",
        "supported_channels": ["online"],
        "logo_url": "https://example.com/logos/electricity.png",
        "effective_from": 1689459200,
        "effective_to": 1735689600,
        "geo_coverage": {
          "country": "IND",
          "state": "MH",
          "city": "Mumbai"
        },
        "gateway_data": {
          "biller_ownership_type": "Private",
          "payment_config": {
            "amount_exactness": "exact",
            "bill_request_required": "mandatory",
            "support_pending_status": "true",
            "pending_timeout_period": 21600,
            "methods": [
              {
                "method": "cash",
                "min_limit": 100,
                "max_limit": null,
                "support_pending_status": false
              },
              {
                "method": "upi",
                "min_limit": 1,
                "max_limit": null,
                "support_pending_status": true
              },
              {
                "method": "card",
                "type": "credit",
                "min_limit": 1,
                "max_limit": null,
                "support_pending_status": true
              }
            ],
            "amount_type": [
              {
                "name": "base_bill_amount",
                "optional": false,
                "data_type": "string",
                "min_length": 2,
                "max_length": 12,
                "regex": "<regex_pattern>",
                "values": "string",
                "visibility": true
              },
              {
                "name": "fixed_charges",
                "optional": true,
                "data_type": "string",
                "min_length": 2,
                "max_length": 12,
                "regex": "<regex_pattern>",
                "values": "string",
                "visibility": true
              }
            ],
            "amount_groups": [
              {
                "components": ["base_bill_amount", "fixed_charges"]
              },
              {
                "components": ["base_bill_amount"]
              }
            ]
          },
          "channels": [
            {
              "channel": "internet",
              "max_limit": 100000,
              "min_limit": 100,
              "support_pending_status": false
            },
            {
              "channel": "pos",
              "max_limit": 500000,
              "min_limit": 1000,
              "support_pending_status": true
            }
          ],
          "bill_request_config": {
            "upms_supported": null,
            "bill_response_type": "single/multiple",
            "bill_request_required": "mandatory/optional/not_supported",
            "plan_fetch_required": "mandatory/optional/not_supported"
          },
          "additional_info_config": {
            "params": [
              {
                "name": "Customer Mobile Number",
                "data_type": "numeric",
                "optional": true,
                "min_length": 10,
                "max_length": 10,
                "regex": "^[6-9]{1}[0-9]{9}$",
                "values": ["Vehicle Finance", "Home Finance"],
                "visibility": true
              },
              {
                "name": "accountNumber",
                "data_type": "string",
                "optional": false,
                "min_length": 9,
                "max_length": 12,
                "values": ["Vehicle Finance", "Home Finance"],
                "visibility": true
              }
            ]
          },
          "fee_config": {
            "fee_types": [
              {
                "fee_code": "CCF1",
                "fee_description": "Customer Convenience Fee",
                "fee_payer": "customer",
                "fee_details": {
                  "min_amount": 100,
                  "max_amount": 10000,
                  "percentage": 0.5,
                  "flat_amount": 2,
                  "effective_from": 1689459200,
                  "effective_to": 1735689600
                }
              }
            ],
            "fee_rules": [
              {
                "transaction_type": "payment",
                "response_code": "00",
                "method": "card",
                "type": "credit",
                "channel": "AGT",
                "fee_code": ["PFB", "CCF1"],
                "default_fee": false,
                "effective_from": 1689459200,
                "effective_to": 1735689600
              },
              {
                "transaction_type": "payment",
                "response_code": "00",
                "method": "upi",
                "channel": "AGT",
                "fee_code": ["CCF1", "CCF2"],
                "default_fee": true,
                "effective_from": 1689459200,
                "effective_to": 1735689600
              }
            ]
          },
          "account_holder_config": {
            "params": [
              {
                "name": "Customer Mobile Number",
                "data_type": "numeric",
                "optional": true,
                "min_length": 10,
                "max_length": 10,
                "regex": "^[6-9]{1}[0-9]{9}$",
                "values": ["Vehicle Finance", "Home Finance"]
              }
            ],
            "param_group": {
              "step": 1,
              "group_name": "Group1",
              "input_params_required": ["accountNumber"],
              "required_input_count": 1,
              "depends_on_step": null
            }
          }
        }
      }
    ]
  }
  ```

  ```json Failure theme={null}
  {
    "error": {
      "code": "BAD_REQUEST_ERROR",
      "description": "The category 'amazon' is not a valid BBPS category.",
      "field": "category",
      "source": "business",
      "step": "validation",
      "reason": "invalid_category"
    }
  }
  ```
</ResponseExample>

## Query Parameters

<ParamField query="id" type="string">
  Razorpay's internal biller entity id. Use to retrieve a specific biller by Razorpay id. For example, `biller_001`.
</ParamField>

<ParamField query="category" type="string">
  Filter billers by pre-defined BBPS biller category. Case-insensitive. For example, `electricity`, `loan_repayment`, `mobile_postpaid`.
</ParamField>

<ParamField query="gateway_biller_id" type="string">
  BBPS-specific biller id assigned by NPCI. Use to retrieve a specific biller by NPCI id. For example, `TPOW00000MUM01`.
</ParamField>

<ParamField query="biller_id" type="string">
  Fetch a specific biller by Razorpay biller id. For example, `biller_001`.
</ParamField>

<ParamField query="geo_coverage.country" type="string">
  Filter billers by country. Defaults to `IN`.
</ParamField>

<ParamField query="geo_coverage.state" type="string">
  Filter billers by state code. For example, `MH`, `DL`.
</ParamField>

<ParamField query="geo_coverage.city" type="string">
  Filter billers by city. For example, `Bengaluru`, `Mumbai`.
</ParamField>

<ParamField query="updated_since" type="integer">
  Unix timestamp in seconds. Returns only billers updated after this time. Use for incremental sync of your local biller catalogue.
</ParamField>

<ParamField query="status" type="string">
  Filter billers by operational status. Values: `active`, `inactive`, `deactivated`.
</ParamField>

<ParamField query="count" type="integer">
  Number of billers per page. Default is `10`. Maximum is `100`.
</ParamField>

<ParamField query="skip" type="integer">
  Number of biller records to skip for pagination. Default is `0`.
</ParamField>

## Response Parameters

<ResponseField name="entity" type="string">
  Entity type identifier. Here, `collection`.
</ResponseField>

<ResponseField name="count" type="integer">
  Number of biller records returned.
</ResponseField>

<ResponseField name="items" type="array">
  Array of biller objects.
</ResponseField>

<ResponseField name="items[].id" type="string">
  Razorpay biller entity id. Format: `biller_xxx`. Use this when creating a bill request or payment.
</ResponseField>

<ResponseField name="items[].entity" type="string">
  Entity type. Always `bill_payment.biller`.
</ResponseField>

<ResponseField name="items[].gateway" type="string">
  Payment gateway. Defaults to `bbps`.
</ResponseField>

<ResponseField name="items[].created_at" type="integer">
  Biller creation timestamp in Razorpay records (Unix seconds).
</ResponseField>

<ResponseField name="items[].gateway_updated_at" type="integer">
  Last update timestamp from the gateway (Unix seconds). Use for data freshness checks.
</ResponseField>

<ResponseField name="items[].gateway_biller_id" type="string">
  NPCI/BBPS provided biller id (max 20 characters). Use for NPCI reconciliation and audit trail.
</ResponseField>

<ResponseField name="items[].name" type="string">
  Biller display name. Show this on the biller selection UI.
</ResponseField>

<ResponseField name="items[].alias_name" type="string">
  Biller alias or nickname shared in biller MDM. Optionally show alongside `name` for search and selection.
</ResponseField>

<ResponseField name="items[].category" type="string">
  Biller category. Use for grouping and filtering on the UI.
</ResponseField>

<ResponseField name="items[].status" type="string">
  Biller operational status. Values: `active`, `inactive`, `deactivated`. Show deactivated billers with a `deactivated` tag on the UI.
</ResponseField>

<ResponseField name="items[].supported_channels" type="array">
  Biller support type. Values: `online`, `offline`. Use to make channel routing decisions.
</ResponseField>

<ResponseField name="items[].logo_url" type="string">
  Biller logo image URL. Not in NPCI standard - sourced by Razorpay for UI display.
</ResponseField>

<ResponseField name="items[].effective_from" type="integer">
  Start date timestamp when biller becomes active on NPCI (Unix seconds).
</ResponseField>

<ResponseField name="items[].effective_to" type="integer">
  End date timestamp when biller is deprecated on NPCI (Unix seconds). `null` if currently active.
</ResponseField>

<ResponseField name="items[].geo_coverage" type="object">
  Geographic coverage area for the biller.
</ResponseField>

<ResponseField name="items[].geo_coverage.country" type="string">
  Country code. For example, `IND`.
</ResponseField>

<ResponseField name="items[].geo_coverage.state" type="string">
  State code. For example, `MH`.
</ResponseField>

<ResponseField name="items[].geo_coverage.city" type="string">
  City name. For example, `Mumbai`.
</ResponseField>

<ResponseField name="items[].gateway_data" type="object">
  Gateway-specific biller configuration.
</ResponseField>

<ResponseField name="items[].gateway_data.biller_ownership_type" type="string">
  Biller ownership. Values: `Government`, `PSU`, `Private`. Use to know whether the biller is private or government for audit trail.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config" type="object">
  Payment configuration supported by the biller.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.amount_exactness" type="string">
  Payment amount flexibility. Values:

  * `exact` - user must pay the exact amount fetched.
  * `exact_or_above` - user can pay exact amount or more.
  * `exact_or_below` - user can pay exact amount or less.
  * `any` - user can pay any amount.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.bill_request_required" type="string">
  Whether biller supports direct payment without bill request. Values: `mandatory`, `optional`, `not_supported`. Use to enable or disable the quick pay flow on the UI.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.support_pending_status" type="string">
  Whether the biller supports a `pending` payment state. Values: `true`, `false`. Use for async payment confirmation handling.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.pending_timeout_period" type="integer">
  Timeout period in seconds supported by the biller when `support_pending_status` is `true`.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.methods" type="array">
  Payment methods accepted by the biller as per Razorpay nomenclature. Use to filter payment options for the customer.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.methods[].method" type="string">
  Payment method code. Values: `netbanking`, `upi`, `card`, `wallet`.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.methods[].type" type="string">
  For `card` method, sub-type such as `credit`, `debit`, `prepaid`.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.methods[].min_limit" type="integer">
  Minimum transaction amount in paise for this method.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.methods[].max_limit" type="integer">
  Maximum transaction amount in paise for this method. `null` for cash payments.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.methods[].support_pending_status" type="boolean">
  Whether this method supports pending status.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.amount_type" type="array">
  Amount breakup types supported in bill request response. Use to parse the bill retrieval response structure.
</ResponseField>

<ResponseField name="items[].gateway_data.payment_config.amount_groups" type="array">
  Allowed combinations of amount components. Each item contains a `components` array listing valid breakup combinations.
</ResponseField>

<ResponseField name="items[].gateway_data.channels" type="array">
  Initiating channels supported by the biller.
</ResponseField>

<ResponseField name="items[].gateway_data.channels[].channel" type="string">
  Initiating channel code. Values: `internet`, `mobile`, `pos`, `mpos`.
</ResponseField>

<ResponseField name="items[].gateway_data.channels[].min_limit" type="integer">
  Minimum transaction amount in paise for this channel.
</ResponseField>

<ResponseField name="items[].gateway_data.channels[].max_limit" type="integer">
  Maximum transaction amount in paise for this channel.
</ResponseField>

<ResponseField name="items[].gateway_data.channels[].support_pending_status" type="boolean">
  Whether this channel supports pending status.
</ResponseField>

<ResponseField name="items[].gateway_data.bill_request_config" type="object">
  Bill request configuration supported by the biller.
</ResponseField>

<ResponseField name="items[].gateway_data.bill_request_config.bill_response_type" type="string">
  Type of bill response. Values: `single`, `multiple`.
</ResponseField>

<ResponseField name="items[].gateway_data.bill_request_config.bill_request_required" type="string">
  Whether bill retrieval is required before payment. Values: `mandatory`, `optional`, `not_supported`.
</ResponseField>

<ResponseField name="items[].gateway_data.bill_request_config.plan_fetch_required" type="string">
  Whether plan fetch is required. Values: `mandatory`, `optional`, `not_supported`.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config" type="object">
  Additional information configuration supported by the biller.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params" type="array">
  Additional information parameters required from the customer.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].name" type="string">
  Parameter display name. For example, `Customer Mobile Number`.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].data_type" type="string">
  Parameter data type. Values: `numeric`, `alphanumeric`, `alpha`, `date`.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].optional" type="boolean">
  Whether the parameter is optional.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].min_length" type="integer">
  Minimum character length.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].max_length" type="integer">
  Maximum character length.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].regex" type="string">
  Validation regex pattern.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].values" type="array">
  Allowed enum values for the parameter.
</ResponseField>

<ResponseField name="items[].gateway_data.additional_info_config.params[].visibility" type="boolean">
  Whether the parameter should be shown to the customer.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config" type="object">
  Fee configuration supported by the biller.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types" type="array">
  Fee types applicable.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_code" type="string">
  Fee identifier. Values:

  * `PFB` - Physical Biller Fee
  * `EBF` - Electronic Biller Fee
  * `CCF1` / `CCF2` - Customer Convenience Fee
  * `AGSC` - Agent Service Charge
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_description" type="string">
  Customer-facing fee label. For example, `Customer Convenience Fee`.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_payer" type="string">
  Who pays the fee. Values: `B2C` (biller), `C2B` (customer).
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details" type="object">
  Fee calculation parameters.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details.min_amount" type="integer">
  Minimum transaction amount for this fee tier in paise.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details.max_amount" type="integer">
  Maximum transaction amount for this fee tier in paise.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details.percentage" type="decimal">
  Percentage fee component. For example, `0.5` represents 0.5%.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details.flat_amount" type="integer">
  Fixed fee component in paise.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details.effective_from" type="integer">
  Fee validity start timestamp (Unix seconds).
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_types[].fee_details.effective_to" type="integer">
  Fee validity end timestamp (Unix seconds). `null` if ongoing.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules" type="array">
  Rules determining which fee applies for a given transaction.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].transaction_type" type="string">
  Transaction type. Values: `payment`, `fetch`, `validate`. Defaults to `payment`.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].response_code" type="string">
  NPCI response code when fee applies. `00` represents success.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].method" type="string">
  Payment method for this rule. For example, `Internet banking`, `upi`, `card`.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].type" type="string">
  Sub-type of the payment method. Applies only when `method` is `card`. Values: `credit`, `debit`, `prepaid`. Use this to apply different fee rules for credit vs debit card payments.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].channel" type="string">
  Initiating channel for this rule. For example, `AGT`, `INT`, `MOB`.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].fee_code" type="array">
  Array of fee codes applicable. Apply multiple fees if listed.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].default_fee" type="boolean">
  Whether this is the default fee configuration. Used when no specific match is found.
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].effective_from" type="integer">
  Rule validity start timestamp (Unix seconds).
</ResponseField>

<ResponseField name="items[].gateway_data.fee_config.fee_rules[].effective_to" type="integer">
  Rule validity end timestamp (Unix seconds).
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config" type="object">
  Account holder configuration supported by the biller.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params" type="array">
  Customer input parameters required for bill retrieval. Use to build the bill retrieval input form.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].name" type="string">
  Parameter display name. For example, `Customer Mobile Number`.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].data_type" type="string">
  Input data type. Values: `numeric`, `alphanumeric`, `alpha`, `date`.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].optional" type="boolean">
  Whether the parameter is optional.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].min_length" type="integer">
  Minimum character length.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].max_length" type="integer">
  Maximum character length.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].regex" type="string">
  Validation regex pattern.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.params[].values" type="array">
  Allowed enum values for the parameter.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.param_group" type="object">
  Combination and sequence of input parameters required for bill retrieval.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.param_group.step" type="integer">
  Sequence number of the input required from the customer.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.param_group.group_name" type="string">
  NPCI group level identifier. Use to render multi-step forms with progressive disclosure.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.param_group.input_params_required" type="array">
  List of field names the customer must provide in this step.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.param_group.required_input_count" type="integer">
  Minimum count of inputs required mandatorily from this step. Convert to string to render UI accordingly.
</ResponseField>

<ResponseField name="items[].gateway_data.account_holder_config.param_group.depends_on_step" type="integer">
  Which prior step must be completed. `null` if there is no dependency on a previous step.
</ResponseField>

## Errors

<AccordionGroup>
  <Accordion title="The `category` value is not a valid BBPS category.">
    **Code:** `400`

    The category provided does not match any BBPS category.

    **Solution:** Use a valid BBPS category. Case-insensitive matching is supported.
  </Accordion>

  <Accordion title="The `biller_id` is invalid.">
    **Code:** `400`

    The biller id provided does not correspond to a valid biller.

    **Solution:** Use a valid biller id returned by the Fetch Billers API.
  </Accordion>

  <Accordion title="The `count` exceeds the maximum limit.">
    **Code:** `400`

    Count exceeds maximum limit of 100.

    **Solution:** Pass a `count` value between 1 and 100.
  </Accordion>

  <Accordion title="The `geo_coverage.state` is invalid.">
    **Code:** `400`

    Invalid state. Possible values - state, city, country.

    **Solution:** Pass a valid state code.
  </Accordion>

  <Accordion title="Unable to fetch biller information from NPCI MDM.">
    **Code:** `502`

    NPCI did not respond within the timeout window.

    **Solution:** Retry the request after a short interval.
  </Accordion>

  <Accordion
    title="The API `<key/secret>
` provided is invalid."
  >
    **Code:** `401`

    The API credentials passed in the request differ from the ones generated on the Dashboard.

    **Solution:** Ensure your API key and secret are correct and active.
  </Accordion>
</AccordionGroup>
