---
# System prepended metadata

title: BBPS COU Specs to be exposed to Partners (Draft)

---

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*

- [BBPS COU Specs to be exposed to Partners (Draft)](#bbps-cou-specs-to-be-exposed-to-partners-draft)
    - [General API response structure](#general-api-response-structure)
    - [Generic error codes](#generic-error-codes)
    - [Categories](#categories)
    - [Biller list](#biller-list)
        - [Biller list request](#biller-list-request)
        - [Biller event webhook response](#biller-event-webhook-response)
    - [Biller Details](#biller-details)
    - [Biller Plans](#biller-plans)
        - [Biller Plan request](#biller-plan-request)
        - [Biller plan event webhook response](#biller-plan-event-webhook-response)
    - [Get agent details](#get-agent-details)
    - [Bill fetch](#bill-fetch)
        - [Bill fetch request API](#bill-fetch-request-api)
        - [Bill fetch response API](#bill-fetch-response-api)
    - [Bill payment](#bill-payment)
        - [Bill payment request - for fetched bills](#bill-payment-request-for-fetched-bills)
        - [Bill payment request - Direct bill payments](#bill-payment-request-direct-bill-payments)
        - [Payment response API](#payment-response-api)
    - [Transactions report](#transactions-report)
    - [Dispute](#dispute)
            - [Request API - Raise dispute](#request-api-raise-dispute)
            - [Response API  - dispute status](#response-api-dispute-status)
            - [List disputes](#list-disputes)
    - [Note](#note)
- [Partner configuration](#partner-configuration)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# BBPS COU Specs to be exposed to Partners (Draft)


## General API response structure

```json
{
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "data": {},
    "error": {}
}
```

1. `success` will determine if the API call has failed or succeeded
2. `data` will contain the api response data if API was successful
3. `error` will contain the error code and message if API was failure
4. `traceId` can be used by Setu to Debug an API call.

Error response will look like this

```json
{
    "data": null,
    "success": false,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "error": {
        "code": "validation-error",
        "message": "Input is invalid"
    }
}
```



## Generic error codes

1. `authentication-failure` - 401
2. `method-not-allowed` - 405
3. `not-found` - 404
4. `validation-error` - 400



## Categories

GET request.

URL: `/api/v1/bbps/categories`

Response

```json
{
    "data": {
        "categories": [
            {
                "name": "Loan Repayment",
                "billerCount": 100
            },
            {
                "name": "Water",
                "billerCount": 50
            },
            {
                "name": "DTH",
                "billerCount": 10
            },
            {
                "name": "Electricity",
                "billerCount": 146
            }
        ]
    },
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "error": null
}
```

## Biller list

### Biller list request

GET request. Query params supported: search, CategoryName, city, state, pincode(?), agentType, paymentMode

URL: `/api/v1/bbps/billers?search=Aditya&CategoryName=Loan+Repayment&CategoryName=Insurance`

Response

```json
{
    "data": {
        "billers": [
            {
                "id": "ADIT00000NAT0T",
                "name": "Aditya Birla Sun Life Insurance",
                "categoryName": "Insurance"
            },
            {
                "id": "ADIT00000NATRA",
                "name": "Aditya Birla Housing Finance Limited",
                "categoryName": "Loan Repayment"
            }
        ],
        "nextPage": "/api/bbps/billers?search=Aditya&CategoryName=Loan+Repayment&CategoryName=Insurance&after=ABCC00000PTNNS&limit=100"
    },
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "error": null
}
```

### Biller event webhook response

The URL is passed by the partner via config at `/partner`. The event is pushed to URL in `config.eventWebhookURL` in partner config.

Response:

```json
{
	"id": "C3SFG0O6N88R6UI7EQ",
	"timeStamp": 1633579653,
	"event": "NEWBILLER",
	"data": {
        "billers": [
            {
                "id": "ADIT00000NAT0T",
                "name": "Aditya Birla Sun Life Insurance",
                "categoryName": "Insurance"
            },
            {
                "id": "ADIT00000NATRA",
                "name": "Aditya Birla Housing Finance Limited",
                "categoryName": "Loan Repayment"
            }
        ]
    },
}
```



## Biller Details

GET request.

URL: `/api/v1/bbps/billers/:billerId`


```json
{
  "data": {
    "id": "ADIT00000NAT0T",
    "name": "Aditya Birla Sun Life Insurance",
    "categoryName": "loan-repayment",
    "exactness": "ANY/EXACT/EXACT_DOWN/EXACT_UP",
    "payWithoutFetchAllowed": true,
    "fetchApiType": "FETCH/VALIDATE/None",
    "billerMode": "OFFLINE/ONLINE",
    "supportsPendingStatus": true,
    "customerParams": [
        {
            "paramName": "Loan Account Number",
            "dataType": "ALPHANUMERIC",
            "optional": false,
            "minLength": 7,
            "maxLength": 15,
            "minValue": null,
            "maxValue": null,
            "visibility": true,
            "regex": null,
            "values": null
        },
        {
            "paramName": "Mobile or Vehicle Registration Number",
            "dataType": "ALPHANUMERIC",
            "optional": false,
            "minLength": 5,
            "maxLength": 20,
            "minValue": null,
            "maxValue": null,
            "visibility": true,
            "regex": null,
            "values": null
        }
    ],
    "paymentModes": [
      {
        "paymentMode": "Internet_Banking",
        "maxLimit": null,
        "minLimit": 1
      },
      {
        "paymentMode": "Debit_Card",
        "maxLimit": null,
        "minLimit": 1
      },
      {
        "paymentMode": "Prepaid_Card",
        "maxLimit": null,
        "minLimit": 1
      },
      {
        "paymentMode": "IMPS",
        "maxLimit": null,
        "minLimit": 1
      },
      {
        "paymentMode": "Cash",
        "maxLimit": null,
        "minLimit": null
      },
      {
        "paymentMode": "UPI",
        "maxLimit": null,
        "minLimit": 1
      },
      {
        "paymentMode": "Wallet",
        "maxLimit": null,
        "minLimit": 1
      },
      {
        "paymentMode": "NEFT",
        "maxLimit": 500000000,
        "minLimit": 10100
      },
      {
        "paymentMode": "AEPS",
        "maxLimit": 500000000,
        "minLimit": 10100
      },
      {
        "paymentMode": "Account_Transfer",
        "maxLimit": 500000000,
        "minLimit": 10100
      }
    ],
    "paymentChannels": [
      {
        "paymentChannel": "Internet",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "Internet_Banking",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "Mobile",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "Mobile_Banking",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "POS",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "MPOS",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "ATM",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": true
      },
      {
        "paymentChannel": "Bank_Branch",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": false
      },
      {
        "paymentChannel": "Kiosk",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": false
      },
      {
        "paymentChannel": "Agent",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": false
      },
      {
        "paymentChannel": "Business_Correspondent",
        "maxLimit": 500000000,
        "minLimit": 10100,
        "supportsPendingStatus": false
      }
    ]
  },
  "success": true,
  "error": null
}

```


## Biller Plans

### Biller Plan request

GET request.

URL: `/api/v1/bbps/billers/:billerId/plans`


```json
{
    "data": {
        "plans": [
            {
                "id": "1",
                "billerId": "ZEE500000NAT01",
                "categoryType": "Premium",
                "categorySubType": {
                    "subType": "1 Month"
                },
                "amountInRupees": "99.0",
                "planDescription": "All ZEE5 Originals and Exclusives, Blockbuster Movies, All ALT Balaji Shows, Zindagi TV Shows,\nKids, Live TV, TV shows before telecast. Watch on 5 devices at a time",
                "planAdditionalInfo": [
                    {
                        "paramName": "Package Name",
                        "paramValue": "ZEE5 Premium 1 Month Plan"
                    },
                    {
                        "paramName": "Package Duration",
                        "paramValue": "1 Month"
                    }
                ],
                "effectiveFrom": "2021-01-01",
                "effectiveTo": "2021-12-31",
                "status": "ACTIVE"
            },
            {
                "Id": "2",
                "billerId": "ZEE500000NAT01",
                "categoryType": "Premium",
                "categorySubType": {
                    "subType": "3 Months"
                },
                "amountInRupees": "299.0",
                "planDescription": "All ZEE5 Originals and Exclusives, Blockbuster Movies, All ALT Balaji Shows, Zindagi TV Shows,\nKids, Live TV, TV shows before telecast. Watch on 5 devices at a time",
                "planAdditionalInfo": [
                    {
                        "paramName": "Package Name",
                        "paramValue": "ZEE5 Premiun 3 Months Plan"
                    },
                    {
                        "paramName": "Package Duration",
                        "paramValue": "3 Months"
                    }
                ],
                "effectiveFrom": "2021-01-01",
                "effectiveTo": "2021-12-31",
                "status": "ACTIVE"
            }
        ]
    },
    "success": true,
    "error": null
}

```

Error codes

1. `invalid-biller-type`: If the biller does not support plans

### Biller plan event webhook response

The URL is passed by the partner via config at `/partner`. The event is pushed to URL in `config.eventWebhookURL` in partner config.

Response:

```json
{
	"id": "C3SFG0O6N88R6UI7EQ",
	"timeStamp": 1633579653,
	"event": "NEWPLAN",
	"data": {
        "plans": [
            {
                "id": "1",
                "billerId": "ZEE500000NAT01",
                "categoryType": "Premium",
                "categorySubType": {
                    "subType": "1 Month"
                },
                "amountInRupees": "99.0",
                "planDescription": "All ZEE5 Originals and Exclusives, Blockbuster Movies, All ALT Balaji Shows, Zindagi TV Shows,\nKids, Live TV, TV shows before telecast. Watch on 5 devices at a time",
                "planAdditionalInfo": [
                    {
                        "paramName": "Package Name",
                        "paramValue": "ZEE5 Premium 1 Month Plan"
                    },
                    {
                        "paramName": "Package Duration",
                        "paramValue": "1 Month"
                    }
                ],
                "effectiveFrom": "2021-01-01",
                "effectiveTo": "2021-12-31",
                "status": "ACTIVE"
            },
            {
                "Id": "2",
                "billerId": "ZEE500000NAT01",
                "categoryType": "Premium",
                "categorySubType": {
                    "subType": "3 Months"
                },
                "amountInRupees": "299.0",
                "planDescription": "All ZEE5 Originals and Exclusives, Blockbuster Movies, All ALT Balaji Shows, Zindagi TV Shows,\nKids, Live TV, TV shows before telecast. Watch on 5 devices at a time",
                "planAdditionalInfo": [
                    {
                        "paramName": "Package Name",
                        "paramValue": "ZEE5 Premiun 3 Months Plan"
                    },
                    {
                        "paramName": "Package Duration",
                        "paramValue": "3 Months"
                    }
                ],
                "effectiveFrom": "2021-01-01",
                "effectiveTo": "2021-12-31",
                "status": "ACTIVE"
            }
        ]
    }
}
```

## Get agent details

GET request `/api/v1/bbps/agent/:agentid`

```json
{
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "data": {
        "app": "SmartPay",
        "channel": "INT",
        "geocode": "19.0139,72.8254",
        "id": "AX01AI06512391457204",
        "ifsc": "ICIC0000152",
        "imei": "123456789012345",
        "ip": "124.170.23.24",
        "mac": "48-4D-7E-CB-DB-6F",
        "mobile": "9481773011",
        "os": "iOS",
        "postalCode": "600001",
        "terminalId": "6000011234"
    },
    "error": null
}

```

## Bill fetch

### Bill fetch request API

POST request `/api/v1/bbps/bills/fetch/request`


```json
{
  "customer": {
    "mobile": "9505987798",
    "billParameters": [
        {
            "name": "Parameter 1",
            "value": "Value 1"
        },
        {
            "name": "Parameter 2",
            "value": "Value 2"
        },
        {
            "name": "Parameter 3",
            "value": "Value 3"
        }
    ]
  },
  "agent": {
    "app": "SmartPay",
    "channel": "INT",
    "geocode": "19.0139,72.8254",
    "id": "AX01AI06512391457204",
    "ifsc": "ICIC0000152",
    "imei": "123456789012345",
    "ip": "124.170.23.24",
    "mac": "48-4D-7E-CB-DB-6F",
    "mobile": "9481773011",
    "os": "iOS",
    "postalCode": "600001",
    "terminalId": "6000011234"
  },
  "biller": {
    "id": "VODA00000MUM03"
  }
}
```

Response

```json

{
    "data": {
        "refId": "LNMSQQR4RKT7X1UGPY7JGUV454PL9T2C689",
    },
    "success": true,
    "error": null
}
```

Error codes

1. `invalid-biller-id`
2. `invalid-customer-parameters`




### Bill fetch response API

POST request: `/api/v1/bbps/bills/fetch/response`

Sync Request/Async Response 

```json
{
    "refId": "LNMSQQR4RKT7X1UGPY7JGUV454PL9T2C689"
}
```

Sync Response/Async Request

If status is PROCESSING, retry the API after 5 seconds

```json

{
    "data": {
        "additionalInfo": [
            {
                "name": "Distributor Contact",
                "value": "Cockatoojelly"
            },
            {
                "name": "Distributor Name",
                "value": "Frightstripe"
            },
            {
                "name": "Consumer Number",
                "value": "105"
            },
            {
                "name": "Consumer Address",
                "value": "Samuraipsychadelic"
            }
        ],
        "bill": { // optional - not present if biller does not support it
            "amount": 301500,
            "billDate": "2021-09-13",
            "billNumber": "8394852342371080869",
            "billPeriod": "Monthly",
            "customerName": "William Miller",
            "dueDate": "2021-09-26"
        },
        "billerRefId": "4047076513",
        "exactness": "ANY",
        "paymentLimits": [
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "Internet Banking",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "Debit Card",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "Credit Card",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "Prepaid Card",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "IMPS",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 4999900,
                "minLimit": 100,
                "paymentMode": "Cash",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "UPI",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "Wallet",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "NEFT",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "AEPS",
                "supportsPendingStatus": false
            },
            {
                "maxLimit": 20000000,
                "minLimit": 100,
                "paymentMode": "Account Transfer",
                "supportsPendingStatus": false
            }
        ],
        "refId": "C51JQ9ED608P36RN28GGM9L63RN12591837",
        "status": "Success"
    },
    "success": true,
    "traceId": "C51JQCUD608P36RN28H0"
}

```

Error codes

1. `invalid-ref-id`
2. `fetch-not-allowed`




## Bill payment 

### Bill payment request - for fetched bills

POST request `/api/v1/bbps/bills/payment/request`


```json
{
    "refId": "LNMSQQR4RKT7X1UGPY7JGUV454PL9T2C689"
}
```

### Bill payment request - Direct bill payments


```json
{
    "customer": {
        "mobile": "9505987798",
        "billParameters": [
            {
                "name": "Parameter 1",
                "value": "Value 1"
            },
            {
                "name": "Parameter 2",
                "value": "Value 2"
            },
            {
                "name": "Parameter 3",
                "value": "Value 3"
            }
        ]
    },
    "agent": {
        "app": "SmartPay",
        "channel": "INT",
        "geocode": "19.0139,72.8254",
        "id": "AX01AI06512391457204",
        "ifsc": "ICIC0000152",
        "imei": "123456789012345",
        "ip": "124.170.23.24",
        "mac": "48-4D-7E-CB-DB-6F",
        "mobile": "9481773011",
        "os": "iOS",
        "postalCode": "600001",
        "terminalId": "6000011234"
    },
    "biller": {
        "id": "VODA00000MUM03"
    },
    "paymentDetails": {
        "mode": "Internet Banking/Debit Card/Credit Card/IMPS/Cash/UPI/Wallet/NEFT/Prepaid Card/AEPS/Account Transfer/Bharat QR/USSD",
        "paymentRefId": "N2001121212344",
        "amount": "100.00",
        "timestamp": "2020-12-12T13:12:00+05:30"
    }
}
```


Response


```json

{
    "data": {
        "refId": "LNMSQQR4RKT7X1UGPY7JGUV454PL9T2C689",
    },
    "success": true,
    "error": null
}
```


Error codes

1. `invalid-ref-id`
2. `direct-pay-not-allowed`
3. `insufficient-funds`



### Payment response API

Post request: POST request `/api/v1/bbps/bills/payment/response`

Sync Request/Async Response

```json
{
    "refId": "C51JRCED608P36RN28M0WZKDDJ412591857"
}
```

Sync Response/Async Request

If status is PROCESSING, retry the API after 30 seconds

```json
{
    "data": {
        "refId": "HENSVVR4QOS7X1UGPY7JGUV444P10102202",
        "status": "PROCESSING/SUCCESS/FAILURE",
        "billerRefId": "ABC1235",
        "transactionId": "AX01122999900001",
        "failureReason": {
            "code": "BRR005",
            "message": "Biller not accepting payments at the moment"
        },
        "paymentDetails": {
            "mode": "Internet Banking/Debit Card/Credit Card/IMPS/Cash/UPI/Wallet/NEFT/Prepaid Card/AEPS/Account Transfer/Bharat QR/USSD",
            "paymentRefId": "N2001121212344",
            "amount": 10000,
            "timestamp": "2020-12-12T13:12:00+05:30"
        },
        "billerId": "VODA00000MUM03",
    },
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "error": null
}
```


## Transactions report

GET API `/api/v1/bbps/transactions`

Query params

- limit
- startDate
- endDate
- billerId



```json
{
    "data": {
        "nextPage": "/transactions?after=AX511229z200620zPTSW&limit=2",
        "transactions": [
            {
                "amount": 488200,
                "billerId": "AX5100000OUT01",
                "partnerRefId": "N2001121212344",
                "refId": "C4DSI5UD608GN14HFBP01B6I8CE12292003",
                "status": "Processing",
                "customerMobileNumber": "9481773011",
                "transactionId": "AX511229z200515z64W9"
            },
            {
                "amount": 588400,
                "billerId": "AX5100000OUT01",
                "partnerRefId": "N2001121212344",
                "refId": "C4DSIMED608GN14HFC4GZE809LX12292009",
                "status": "Processing",
                "customerMobileNumber": "9481773011",
                "transactionId": "AX511229z200620zPTSW"
            }
        ]
    },
    "success": true,
    "traceId": "C4DSM36D608UKCRLL28G"
}
```


## Dispute

These APIs are sync



#### Request API - Raise dispute

POST request `/api/v1/bbps/bills/complaint/request`


```json
{
  "transactionId": "OP011034EYE7A8Z1T7FU",
  "dispute-type": "account-not-updated", // TODO: define enums for these
  "description": "I have paid but account is not updated"
}
```

Response

```json

{
    "data": {
        "refId": "LNMSQQR4RKT7X1UGPY7JGUV454PL9T2C689"
    },
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "error": null
}
```

#### Response API  - dispute status

POST request `/api/v1/bbps/bills/complaint/response`

Sync Request/async response

```json
{
    "refId": "LNMSQQR4RKT7X1UGPY7JGUV454PL9T2C689"
}
```


Sync response/ async response

```json

{
    "data": {
        "refId": "JPMRPBOGGDTP1EFRZVXVESQVQIS10461642",
        "complaintId": "OP0121046567755",
        "status": "PROCESSING/OPEN/CLOSED",
        "assignedTo": "AX39",
        "remarks": "Resolved in favor of customer"
    },
    "success": true,
    "error": null
}

```

#### List disputes

GET request. Query params supported: status

URL: `/api/v1/bbps/disputes?status=Initialized&status=ASSIGNED`

Response

```json
{
    "data": {
        "dispute": [
            {
                "Assigned":        "OP One Two",
                "ComplaintID":     "1234",
                "ComplaintStatus": "INITIALIZED",
                "RefID":           "C4J0G9ECIE6O3FHT2PG04RM536L12371445",
                "Remarks":         "Remarks",
                "ResponseCode":    "001",
                "ResponseReason":  "ResponseReason",
            },
            {
                "Assigned":        "OP Two Two",
                "ComplaintID":     "5678",
                "ComplaintStatus": "ASSIGNED",
                "RefID":           "C4J0GDECIE6O3FHT2PH0GOLZ5CV12371401",
                "Remarks":         "Remarks",
                "ResponseCode":    "002",
                "ResponseReason":  "ResponseReason",
            }
        ],
        "nextPage": "/api/bbps/billers?status=Initialized&status=ASSIGNED&after=704429425982178385&limit=100"
    },
    "success": true,
    "traceId": "C3SFG0O6N88R6UI7EQ",
    "error": null
}
```

## Note

Fetch/Pay/Dispute/Validate APIs will be made available in sync and async for the agent - If the agent wants async version, the response is sent to them over webhooks.

# Partner configuration

[partner.md](./partner.md) contains all the partner configuration details
