> ## Documentation Index
> Fetch the complete documentation index at: https://help-plum.xoxoday.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Mobile Top Up Catalog

> Fetch available mobile top-up products. Pass `"categoryType": "topup"`. Use `parentProductId` to scope results to a specific operator's denominations.

**Real URL:** `POST https://accounts.xoxoday.com/chef/v1/oauth/api`


| Key          | Value Type | Description                                        |
| :----------- | :--------- | :------------------------------------------------- |
| productName  | String     | Product names to be included                       |
| country      | String     | Countries to be included                           |
| price        | String     | Price range filters to be included                 |
| minPrice     | String     | Maximum price of the products looked for           |
| currencyCode | String     | Currency codes to be included                      |
| deliveryType | String     | Delivery type to the voucher (realtime or delayed) |

## Request Schema

| **Parameter**   | **Type**        | **Description**                                                                  |
| :-------------- | :-------------- | :------------------------------------------------------------------------------- |
| limit           | Int             | Number of results to return per page (used for pagination).                      |
| page            | Int             | Page number of results to fetch when using pagination.                           |
| includeProducts | String          | Comma-separated list of product IDs to explicitly include in the response.       |
| excludeProducts | String          | Comma-separated list of product IDs to explicitly exclude from the response.     |
| sort            | SortData        | Sorting configuration (e.g., by price, name, popularity).                        |
| sort.field      | String          | The field name to sort by (e.g., "name")                                         |
| sort.order      | String          | Sorting order → "ASC" for ascending or "DESC" for descending.                    |
| filters         | Array of Object | List of filters to apply. Each filter object should contain a key and **value**. |
| filters.key     | String          | The filter key (e.g., `country`, `currency`, `product_category`).                |
| filters.value   | String          | The filter value corresponding to the key (e.g., `IN`, `USD`, `Electronics`).    |

## Response Schema

| **Path**                                                | **Type**      | **Description**                                                           |
| :------------------------------------------------------ | :------------ | :------------------------------------------------------------------------ |
| data                                                    | object        | Root response object.                                                     |
| data.getVouchers                                        | object        | Container for catalogue data.                                             |
| data.getVouchers.status                                 | number        | API execution status (`1` = success).                                     |
| data.getVouchers.data                                   | array         | List of voucher products.                                                 |
| data.getVouchers.data\[].productId                      | number        | Unique identifier for the voucher product.                                |
| data.getVouchers.data\[].name                           | string        | Product name.                                                             |
| data.getVouchers.data\[].description                    | string (HTML) | Description (supports HTML content).                                      |
| data.getVouchers.data\[].orderQuantityLimit             | number        | Maximum quantity allowed per order.                                       |
| data.getVouchers.data\[].termsAndConditionsInstructions | string (HTML) | Terms & conditions; may contain HTML and links.                           |
| data.getVouchers.data\[].brand                          | array         | Brand metadata (may be empty).                                            |
| data.getVouchers.data\[].expiryAndValidity              | string (HTML) | Voucher validity details.                                                 |
| data.getVouchers.data\[].redemptionInstructions         | string (HTML) | Instructions for redeeming the voucher.                                   |
| data.getVouchers.data\[].categories                     | string        | Comma-separated list of product categories.                               |
| data.getVouchers.data\[].lastUpdateDate                 | string        | Last update timestamp.                                                    |
| data.getVouchers.data\[].imageUrl                       | string        | Product image URL.                                                        |
| data.getVouchers.data\[].currencyCode                   | string        | Currency code.                                                            |
| data.getVouchers.data\[].currencyName                   | string        | Currency name.                                                            |
| data.getVouchers.data\[].countryName                    | string        | Country where product is redeemable.                                      |
| data.getVouchers.data\[].countryCode                    | string        | ISO country code.                                                         |
| data.getVouchers.data\[].countries                      | array         | List of redemption countries.                                             |
| data.getVouchers.data\[].countries\[].code              | string        | Country ISO code.                                                         |
| data.getVouchers.data\[].countries\[].name              | string        | Country name.                                                             |
| data.getVouchers.data\[].valueType                      | string        | Denomination type (`fixed_denomination`, `open_value`).                   |
| data.getVouchers.data\[].maxValue                       | number        | Maximum value (for open value vouchers).                                  |
| data.getVouchers.data\[].minValue                       | number        | Minimum value.                                                            |
| data.getVouchers.data\[].valueDenominations             | string        | Comma-separated fixed denominations.                                      |
| data.getVouchers.data\[].tatInDays                      | string        | Delivery turnaround time.                                                 |
| data.getVouchers.data\[].usageType                      | string        | `online`, `offline`, or `both`.                                           |
| data.getVouchers.data\[].deliveryType                   | string        | `realtime` or `delayed`.                                                  |
| data.getVouchers.data\[].fee                            | number        | Additional fee applied.                                                   |
| data.getVouchers.data\[].discount                       | number        | Discount applied.                                                         |
| data.getVouchers.data\[].exchangeRate                   | number        | FX conversion rate used.                                                  |
| data.getVouchers.data\[].isPhoneNumberMandatory         | boolean       | Whether phone number is required at checkout.                             |
| data.getVouchers.data\[].variants                       | array / null  | Product variants (if any).                                                |
| data.getVouchers.data\[].isRecommended                  | number        | Recommendation flag (`0` or `1`).                                         |
| data.getVouchers.data\[].filterGroupCode                | string        | Filter group identifier.                                                  |
| data.getVouchers.data\[].productMeta                    | string (JSON) | JSON structure defining dynamic checkout fields (e.g., email validation). |
| data.getVouchers.data\[].loyaltyName                    | string / null | Loyalty program name.                                                     |
| data.getVouchers.data\[].loyaltyConversion              | number / null | Conversion factor for loyalty points.                                     |
| data.getVouchers.data\[].metaData                       | string / null | Additional metadata.                                                      |
| data.getVouchers.data\[].showDiscountPercent            | number        | Whether discount percent should be displayed.                             |
| data.getVouchers.data\[].productImages                  | array         | Additional product images.                                                |
| data.getVouchers.data\[].parentProductId                | number / null | Parent product reference.                                                 |
| data.getVouchers.data\[].isDummyProduct                 | number        | Indicates if item is dummy/test (`0` or `1`).                             |
| data.getVouchers.data\[].redemptionFee                  | number        | Redemption fee amount.                                                    |
| data.getVouchers.data\[].redemptionFeeType              | string        | `percentage` or `fixed`.                                                  |
| data.getVouchers.data\[].redemptionFeeBorneByUser       | boolean       | Whether user pays the redemption fee.                                     |
| data.getVouchers.data\[].redemptionFeeTax               | number        | Tax on redemption fee.                                                    |
| data.getVouchers.data\[].is\_free                       | number        | Whether voucher is free (`0` = paid, `1` = free).                         |

## Filter Reference Table

| Key          | Value Type | Description                                       |
| :----------- | :--------- | :------------------------------------------------ |
| productName  | String     | Product names to be included                      |
| country      | String     | Countries to be included                          |
| price        | String     | Price range filters to be included                |
| minPrice     | String     | Minimum price of the products looked for          |
| maxPrice     | String     | Maximum price of the products looked for          |
| currencyCode | String     | Currency codes to be included                     |
| deliveryType | String     | Delivery type to the voucher (realtime or delayed |

## Implementation Notes

1. To fetch exchangeRate in the GetVouchersAPI, pass "exchangeRate": 1 in the request body
2. To fetch the list of filters, use GetFiltersAPI
3. To fetch the list of mobile top-up operators, pass "categoryType": "topup" in the GetVouchersAPI request body.
4. To fetch the list of operators under a specific mobile top-up product, pass both "categoryType": "topup" and "parentProductId": "productId" in the request body — where productId is the ID received when fetching products with "categoryType": "topup".
5. If the value type for a product is **"open\_value"**, please refer to the\*\*"minValue"**and the**"maxValue"\*\* parameters
6. The values passed in the "fee" and\*\*"discount"\*\* parameters are in percentage (%)
7. We recommend you cache the response from GetVouchersAPI in your database every time you sync our catalog
8. Use filters “minPrice” and “maxPrice” along with “currencyCode”, as this allows you to search prices with respect to a specific currency. If "currencyCode" code is not added, the filter will be applicable for all currencies.

> Learn about [Error Handling](https://developers.xoxoday.com/v1.2/docs/error-handling-1), [Rate limiting](https://developers.xoxoday.com/v1.2/docs/rate-limiting) and [Best Practice](https://developers.xoxoday.com/v1.2/docs/concepts-1) .


## OpenAPI

````yaml specs/rewards-mobile-top-up.yaml POST /getMobileTopUpCatalog
openapi: 3.0.3
info:
  title: Xoxoday Rewards API – Mobile Top-Up
  version: '1.2'
  description: >
    Mobile Top-Up API endpoints for browsing the catalog, looking up operators,

    placing orders, and reporting.


    All operations dispatch to `POST /v1/oauth/api`. Virtual path suffixes are
    used

    for playground differentiation since OpenAPI does not allow multiple POST
    operations

    on the same path.


    **Host split:**

    - `getFilters`, `getBalance`, `paymentHistory` → `stagingstores.xoxoday.com`

    - `getMobileTopUpCatalog`, `getMobileOperator`, `placeOrder`,
    `getOrderDetails`, `getOrderHistory` → `accounts.xoxoday.com`


    **Get Balance** sends parameters as URL query string (not request body).
servers:
  - url: https://stagingstores.xoxoday.com/chef/v1/oauth/api
    description: Sandbox
  - url: https://accounts.xoxoday.com/chef/v1/oauth/api
    description: Production
  - url: https://canvas.xoxoday.com/chef/v1/oauth/api
    description: Testing
security:
  - BearerAuth: []
tags:
  - name: Catalog
  - name: Orders
  - name: Reporting
paths:
  /getMobileTopUpCatalog:
    post:
      tags:
        - Catalog
      summary: Get Mobile Top-Up Catalog
      description: >
        Fetch available mobile top-up products. Pass `"categoryType": "topup"`.
        Use `parentProductId` to scope results to a specific operator's
        denominations.


        **Real URL:** `POST https://accounts.xoxoday.com/chef/v1/oauth/api`
      operationId: topupGetCatalog
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - query
                - tag
                - variables
              properties:
                query:
                  type: string
                  enum:
                    - plumProAPI.mutation.getVouchers
                  default: plumProAPI.mutation.getVouchers
                tag:
                  type: string
                  enum:
                    - plumProAPI
                  default: plumProAPI
                variables:
                  type: object
                  required:
                    - data
                  properties:
                    data:
                      type: object
                      required:
                        - categoryType
                      properties:
                        categoryType:
                          type: string
                          enum:
                            - topup
                          default: topup
                          description: Must be `"topup"` for this endpoint.
                        parentProductId:
                          type: integer
                          description: Scope results to a specific operator's product tree.
                          example: 55132
                        limit:
                          type: integer
                          example: 10
                        page:
                          type: integer
                          example: 1
                        includeProducts:
                          type: string
                          description: Comma-separated product IDs to include.
                          example: '3211'
                        excludeProducts:
                          type: string
                          description: Comma-separated product IDs to exclude.
                          example: '43211'
                        exchangeRate:
                          type: integer
                          description: Pass `1` to include FX exchange rates.
                          example: 1
                        filters:
                          type: array
                          items:
                            type: object
                            properties:
                              key:
                                type: string
                              value:
                                type: string
            example:
              query: plumProAPI.mutation.getVouchers
              tag: plumProAPI
              variables:
                data:
                  parentProductId: 55132
                  categoryType: topup
                  limit: 10
                  page: 1
                  includeProducts: '3211'
                  excludeProducts: '43211'
                  exchangeRate: 1
      responses:
        '200':
          description: Mobile top-up catalog returned successfully.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      getVouchers:
                        type: object
                        properties:
                          status:
                            type: number
                          data:
                            type: array
                            items:
                              type: object
                              properties:
                                productId:
                                  type: number
                                name:
                                  type: string
                                description:
                                  type: string
                                orderQuantityLimit:
                                  type: number
                                imageUrl:
                                  type: string
                                currencyCode:
                                  type: string
                                countryName:
                                  type: string
                                valueType:
                                  type: string
                                maxValue:
                                  type: number
                                minValue:
                                  type: number
                                valueDenominations:
                                  type: string
                                deliveryType:
                                  type: string
                                fee:
                                  type: number
                                discount:
                                  type: number
                                exchangeRate:
                                  type: number
                                isPhoneNumberMandatory:
                                  type: boolean
                                parentProductId:
                                  type: number
                                  nullable: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '502':
          $ref: '#/components/responses/BadGateway'
      servers:
        - url: https://stagingstores.xoxoday.com/chef/v1/oauth/api
          description: Sandbox
        - url: https://accounts.xoxoday.com/chef/v1/oauth/api
          description: Production
        - url: https://canvas.xoxoday.com/chef/v1/oauth/api
          description: Testing
components:
  responses:
    Unauthorized:
      description: Missing or invalid access token.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: Unauthorized
    BadGateway:
      description: Upstream service error.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer <access_token>`'

````