> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chip-in.asia/llms.txt
> Use this file to discover all available pages before exploring further.

> Send this request providing, at the very least, the `brand_id` and `currency` query parameters having the same values you'd use to create your Purchase. Be sure to use the same API key you'll create your Purchase with; it will define the test_mode setting used in the lookup.

In the response body you'll receive an object with `available_payment_methods` property containing the list of payment method names available to use with your Purchase (e.g. those codes can be used in `payment_method_whitelist` field or with `?preferred={payment_method}` option of `checkout_url`).

Please note that all lookup arguments must be provided via query parameters after the endpoint, e.g. the minimal call would be similar to: `GET /api/v1/payment_methods/?brand_id=75a76529-91c7-4d98-90a9-8a641d70ee52&currency=EUR`

# List of payment methods

Send this request providing, at the very least, the `brand_id` and `currency` query parameters having the same values you'd use to create your Purchase. Be sure to use the same API key you'll create your Purchase with; it will define the test\_mode setting used in the lookup.

In the response body you'll receive an object with `available_payment_methods` property containing the list of payment method names available to use with your Purchase (e.g. those codes can be used in `payment_method_whitelist` field or with `?preferred={payment_method}` option of `checkout_url`).

Please note that all lookup arguments must be provided via query parameters after the endpoint, e.g. the minimal call would be similar to: `GET /api/v1/payment_methods/?brand_id=75a76529-91c7-4d98-90a9-8a641d70ee52&currency=MYR`


## OpenAPI

````yaml _openapi-chip-collect GET /payment_methods/
openapi: 3.1.0
info:
  title: Public REST API
  version: v1
  description: >
    All the endpoints below have a prefix of `https://gate.chip-in.asia/api/v1`
    (e.g. `POST https://gate.chip-in.asia/api/v1/purchases`).


    You will need your API key that you can obtain in the Developers section in
    your account. Please use this key as a bearer token in the Authorization
    header included in every request: `Authorization: Bearer <secret key>`.


    You can generate and manage your API keys here : <br/>
    https://portal.chip-in.asia/collect/developers/api-keys


    Your Brand ID is required for certain endpoints. You can find it here :
    <br/> https://portal.chip-in.asia/collect/developers/brands


    Before starting the development, we recommend checking out the list of
    ready-to-go connectors to the popular platforms we’ve already built for you.
    It might save you some precious time if you use one of these to develop your
    project.


    Plugins:
    [WooCommerce](https://gate.chip-in.asia/apis/plugins/WooCommerce%20v3.5+),
    [Gravity Forms](https://gate.chip-in.asia/apis/plugins/Gravity%20Forms),
    [OpenCart](https://gate.chip-in.asia/apis/plugins/OpenCart%20v3.0+),
    [Magento](https://gate.chip-in.asia/apis/plugins/Magento%20v2.0+),
    [PrestaShop](https://gate.chip-in.asia/apis/plugins/PrestaShop%20v1.7+)




    Libraries: [PHP](https://gate.chip-in.asia/apis/libraries/PHP),
    [Java](https://gate.chip-in.asia/apis/libraries/Java),
    [C#](https://gate.chip-in.asia/apis/libraries/C%23),
    [Node.js](https://gate.chip-in.asia/apis/libraries/Node.js)


    SDKs: [iOS](https://gate.chip-in.asia/apis/sdks/iOS),
    [Android](https://gate.chip-in.asia/apis/sdks/Android)

    ***


    # Online Purchases


    ## Prebuilt payment flow — Redirect


    Redirect integration allows running payments using the prebuilt payment
    flow.


    To accept payments in your application or website via redirect, use `POST
    /purchases/` request to create the `Purchase` and receive the
    `checkout_url`. Redirect the customer to the `checkout_url` to enter their
    card details for processing. After the payment is processed, the system will
    redirect the customer back to your website (take note of `success_redirect`,
    `failure_redirect`).


    *You have three options to check payment status:*


    1. Use `success_callback` parameter of the `Purchase` object.


    2. Use `GET /purchases/<purchase_id>/` request.


    3. Set up a Webhook using the Developers section of your account or use
    Webhook API to listen to `purchase.paid`, or `purchase.payment_failure`
    event on your server.


    Setting the `skip_capture` flag to `true` allows you to separate the
    authentication and payment execution steps, allowing you to reserve funds on
    the customer's card account for some time.


    This flag can also enable preauthorization capability, allowing you to save
    the card without a financial transaction, if possible.


    If the customer agrees to store his card for future purchases, there will be
    an option to pay with a single click next time. To enable this, create a
    `Client` object for each of your clients and provide `client_id` parameter
    value in your Purchase creation requests.


    To create a Purchase, you must specify the `Brand ID` and `API key`. You can
    find both in the Developers section of your account.




    ## Custom payment flow — Direct Post


    Direct post integration allows running payments through the custom payment
    flow.


    To accept payments in your application or website, use `POST /purchases/`
    request to create a `Purchase`.


    To capture customers card details use an HTML `<form>` hosted on your
    website with `method="POST"` and `action` pointing to the `direct_post_url`
    of the transaction.


    You will also need to fill the form with `<input>`'s for the fields with
    card details. As a result, when a customer submits their card details, it
    will be posted straight to our system, allowing you to customize the
    checkout as you wish. At the same time, your PCI DSS requirement is only
    raised to Self-Assessment Questionnaire (SAQ A-EP), as your system doesn't
    receive or process card data.


    For more details, see the documentation on Purchase's `direct_post_url`
    field.


    ### Tokenization & recurring payments


    You can store card tokens and charge the respective cards without user
    interaction if the payment channel supports tokenization.


    When you pass `remember_card=on` to `direct_post_url`, the respective
    `Purchase`'s ID will serve as a card token. This initial `Purchase` will
    have the `is_recurring_token` field set to `true`.


    To charge the tokenized card once again, create a new Purchase and then call
    the `POST /purchases/{new_purchase_id}/charge/`. In the request body,
    provide `"recurring_token": "initial_purchase_id"`. When the request
    succeeds (response code `200`), the new Purchase will become paid. The token
    will be persisted in the Purchase's recurring_token field.


    Use `"recurring_token": "initial_purchase_id"` in all the upcoming `POST
    /purchases/{new_purchase_id}/charge/` requests.


    If you wish to delete the recurring token stored for the initial `Purchase`,
    use the `POST /purchases/{initial_purhcase_id}/delete_recurring_token/`
    request. Its `is_recurring_token` will reset to `false`.


    ## Testing Integration


    It’s possible to test-drive all checkouts using a test Purchase.


    For a successful payment, you can use the following card numbers:


    *   4444 3333 2222 1111 - non-3D Secure card

    *   5555 5555 5555 4444 - 3D Secure card


    For both cards, please use:


    *   any cardholder name

    *   any expiry larger or equal to the current month/year

    *   CVC = 123


    For a failed payment, please change the CVC or expiration date.


    When using a 3D Secure enrolled card in S2S checkout,  an incorrect CVC will
    trigger an authorization failure on the S2S callback step (after the
    customer returns from test ACS). Using a wrong expiry date emulates data
    validation failure and results in immediate error before that step.



    ***


    # Callbacks


    Two methods for defining asynchronous callbacks are supported - `Purchase`
    success callbacks and webhooks.


    ## Purchase success callbacks


    `Purchase` success callbacks are defined by providing a target URL in the
    `success_callback` field on `Purchase` creation (see [POST
    /purchases/](#/Purchases/purchases_create)). The system will generate a
    callback when:

    * a `Purchase` with `skip_capture=false` is successfully paid;

    * a `Purchase` with `skip_capture=true` is successfully captured (see [POST
    /purchases/{id}/capture/](#/Purchases/purchases_capture));

    * a `Purchase` is successfully paid using a recurring token (see [POST
    /purchases/{id}/charge/](#/Purchases/purchases_charge));


    These callbacks pass a JSON-encoded `Purchase` as their payload. The payload
    represents a snapshot of the state of the `Purchase` when the event was
    created. The payload will include an `event_type` field to indicate which
    specific event (see [Event schema](#model-Event)) triggered the callback.


    The payload is signed using a company-wide key pair. You can obtain the
    public key with `GET /public_key/`. See the `Authentication` section below
    for more details.


    ## Webhooks


    For creating and modifying webhooks, see the Webhook [CRUD API
    specification](#operations-tag-Webhooks).


    `Webhook` callback payloads are signed using a dedicated key pair. You can
    obtain the public key from `Webhook.public_key`. See the
    [Authentication](#callback-auth) section below for more details.


    ## Delivery protocol


    When a callback is not successfully delivered (received by the target server
    and responded to with a 200 series HTTP response code), the system will make
    up to 8 additional attempts at exponentially increasing intervals between
    attempts. No further delivery attempts will be made if the callback is not
    successfully delivered 36 hours after triggering.


    Please note that due to the asynchronous nature of network requests, it is
    possible for a callback delivery confirmation (HTTP response with a 200
    series status code) to not properly arrive from the callback's target
    server. Therefore it is possible in case of severe network faults for the
    target server to receive a callback, respond to it with a 200 series HTTP
    status code and then receive the same callback after an interval.


    Callback deliveries are guaranteed to be sequential to events triggered on
    their source objects. For example, when registering webhooks for both the
    `purchase.created` and `purchase.paid` events, there will be no
    `purchase.paid` callbacks for this `Purchase` until all `purchase.created`
    callbacks for this `Purchase` are successfully delivered.


    ## <b id="callback-auth">Authentication</b>


    Payloads are signed using asymmetric A.K.A. public-key cryptography to
    guarantee the authenticity of delivered callbacks. Each callback delivery
    request includes an X-Signature header field. This field contains a
    base64-encoded RSA PKCS#1 v1.5 signature of the SHA256 digest of the request
    body buffer.


    You can obtain the public key for `Webhook` authentication from
    `Webhook.public_key` of the corresponding `Webhook`.


    You can obtain the public key for success callback authentication from [GET
    /public_key/](#operations-Public_Key-public_key).


    Please note the provider is not responsible for any financial losses
    incurred due to not implementing payload signature verification.
servers:
  - url: https://gate.chip-in.asia/api/v1
security:
  - bearerAuth: []
paths:
  /payment_methods/:
    get:
      tags:
        - Payment methods
      summary: List of payment methods
      description: >-
        Send this request providing, at the very least, the `brand_id` and
        `currency` query parameters having the same values you'd use to create
        your Purchase. Be sure to use the same API key you'll create your
        Purchase with; it will define the test_mode setting used in the lookup.


        In the response body you'll receive an object with
        `available_payment_methods` property containing the list of payment
        method names available to use with your Purchase (e.g. those codes can
        be used in `payment_method_whitelist` field or with
        `?preferred={payment_method}` option of `checkout_url`).


        Please note that all lookup arguments must be provided via query
        parameters after the endpoint, e.g. the minimal call would be similar
        to: `GET
        /api/v1/payment_methods/?brand_id=75a76529-91c7-4d98-90a9-8a641d70ee52&currency=EUR`
      operationId: payment_methods
      parameters:
        - name: brand_id
          in: query
          description: >-
            Which brand would you like to lookup the available payment methods
            for. Use the same value (UUID) you'd set the `Purchase.brand_id` to.
          required: true
          schema:
            type: string
        - name: currency
          in: query
          description: Currency you'd use in your Purchase in ISO 4217 format, e.g. `EUR`.
          required: true
          schema:
            type: string
            enum:
              - MYR
        - name: country
          in: query
          description: Country code in the ISO 3166-1 alpha-2 format (e.g. `GB`). Optional.
          schema:
            type: string
        - name: recurring
          in: query
          description: >-
            If provided in the format of `recurring=true`, will filter out the
            methods that don't support recurring charges (see `POST
            /purchases/{id}/charge/`).
          schema:
            type: boolean
        - name: skip_capture
          in: query
          description: >-
            If provided in the format of `skip_capture=true`, will filter out
            the methods that don't support `skip_capture` functionality (see the
            description for `Purchase.skip_capture field`).
          schema:
            type: boolean
        - name: preauthorization
          in: query
          description: >-
            If provided in the format of `preauthorization=true`, will filter
            out the methods that don't support preauthorization functionality
            (see the description for `Purchase.skip_capture field`).
          schema:
            type: boolean
        - name: language
          in: query
          description: Language code in the ISO 639-1 format (e.g. 'en'). Optional.
          schema:
            type: string
        - name: amount
          in: query
          description: >-
            Amount of money as the smallest indivisible units of the currency.
            Some payment method like FPX are not available when purchase is
            below than RM 1. Optional.
          schema:
            type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  available_payment_methods:
                    type: array
                    items:
                      type: string
                      description: Name of the payment method, e.g. `visa`.
                  by_country:
                    type: object
                    description: >-
                      Payment method names (as returned by
                      `available_payment_methods`) grouped by country codes they
                      are available in. `any` key returns names of payment
                      method available in all countries.
                    properties:
                      any:
                        type: array
                        items:
                          type: string
                          description: Name of the payment method, e.g. `visa`.
                    additionalProperties:
                      type: array
                      items:
                        type: string
                        description: Name of the payment method, e.g. `visa`.
                  country_names:
                    type: object
                    description: >-
                      Human-readable names corresponding to country codes as
                      returned by `by_country` property. `any` code is also
                      decoded to `Other`.
                    additionalProperties:
                      type: string
                      description: Human-readable name of the country.
                  names:
                    type: object
                    description: >-
                      Human-readable names of payment methods as returned by
                      `available_payment_methods` property.
                    additionalProperties:
                      type: string
                      description: Human-readable name of the payment method.
                  logos:
                    type: object
                    description: >-
                      Mapping of payment method names to respective logo file
                      paths (relative to the hostname of API host). Some methods
                      can be displayed as an array of logos.
                    additionalProperties:
                      oneOf:
                        - type: string
                          description: >-
                            Path to the payment method logo file relative to API
                            host.
                        - type: array
                          items:
                            type: string
                            description: >-
                              Path to the payment method logo file relative to
                              API host.
                  card_methods:
                    type: array
                    items:
                      type: string
                      description: >-
                        Names of the card methods listed in
                        `available_payment_methods` property. All of these are
                        grouped under `card` in other properties like
                        `by_country`.
                example:
                  available_payment_methods:
                    - visa
                    - mastercard
                    - some_method
                  by_country:
                    any:
                      - card
                    GB:
                      - some_method
                  country_names:
                    any: Other
                    GB: United Kingdom
                  names:
                    visa: Visa
                    mastercard: Mastercard
                    some_method: Some method
                  logos:
                    some_method:
                      - /static/images/icon-visa.svg
                      - /static/images/icon-mastercard.svg
                      - /static/images/icon-maestro.svg
                    visa: /static/images/icon-visa.svg
                    mastercard: /static/images/icon-mastercard.svg
                  card_methods:
                    - american_express
                    - visa
        '400':
          $ref: '#/components/responses/400'
      security:
        - bearerAuth: []
components:
  responses:
    '400':
      description: Invalid data submitted or request processing error
      content:
        application/json:
          schema:
            type: object
            example: |
              {
                "__all__": {
                  "message": "descriptive error message",
                  "code": "error_code"
                }
              }
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````