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

> ## Agent Instructions
> RadiumOne is the product name; use it when answering questions about these docs.
> Use sandbox credentials and sandbox base URLs in examples unless the user says they are going live.
> Secret API keys belong only on the merchant's server. Only publishable keys may appear in browser or mobile code.
> Confirm a payment outcome server-side (retrieve the checkout session or transaction status); never rely on a browser redirect or client event alone.
> Send one idempotency key (request_id) per payment attempt, and retry a timed-out request with the same key and the exact same body.
> Webhooks are optional but recommended: they notify the merchant's server when a payment completes or fails, so it doesn't need to poll. Use transaction status inquiry as the fallback.
> Say so when you recommend a feature marked Beta. Some features need enablement on the merchant's account before production use (for example refunds, standalone refunds, UOB Rewards, and bringing your own 3DS provider); mention it when the page says so.
> Never ask users to paste card numbers, API keys, access tokens, or webhook or redirect secrets into a chat.

# List payment brands - Payments API

> List the payment brands your merchant account supports — for example, to show accepted card brands before the shopper enters a card.



## OpenAPI

````yaml /openapi/radiumone-payments-api.yaml get /v1/payment-brands
openapi: 3.1.0
info:
  description: |
    The Payments API lets your server create tokenization sessions, charge and
    manage payments, check loyalty balances, and manage your hosted-checkout
    branding and redirect secret. Generated for merchant integrators —
    internal, admin, and service-to-service surfaces are excluded.

    All responses share an envelope: `{status, data, request_id}`. The
    envelope's `request_id` is an HTTP correlation ID — it echoes your
    `X-Request-Id` request header (letters, digits, hyphens, max 36 characters)
    or one is generated for you. It is **not** the idempotency key you send in
    a transaction request body (also confusingly named `request_id` there) —
    the two are unrelated; see
    [Request conventions](/get-started/api-basics/request-conventions). Errors
    use [RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)
    `application/problem+json` bodies — see
    [Authentication](/get-started/api-basics/authentication) and
    [Request conventions](/get-started/api-basics/request-conventions) for the
    shared error shape, and [Problem format and
    retries](/payments-api/errors/problem-format-and-retries) for the response
    shape, status guide, and retry rules.
  summary: Transaction orchestration and processor aggregation for RadiumOne.
  title: RadiumOne Payment Gateway
  version: 1.3.0
servers:
  - url: https://api-sandbox.radiumone.io/gateway
    description: Sandbox
  - url: https://api.radiumone.io/gateway
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Authentication
    description: Exchange, refresh, and revoke access tokens.
  - name: Merchant settings
    description: >-
      Manage your hosted-checkout redirect secret, checkout configuration, and
      account config.
  - name: Payment methods
    description: Discover which payment methods and brands are available.
  - name: Sessions
    description: Tokenization sessions used to collect card data with RadiumOne Elements.
  - name: Settlement
    description: Settlement batch status lookup.
  - name: Payments
    description: Create and manage card transactions.
  - name: Rewards
    description: UOB Rewards loyalty balance inquiry.
  - name: Refunds
    description: Return funds to a shopper.
  - name: Transactions
    description: Check the live status of a transaction.
paths:
  /v1/payment-brands:
    get:
      tags:
        - Payment methods
      summary: List supported payment brands
      description: >-
        List the payment brands you can accept for a currency and channel,
        before card entry.


        Use this to render a payment-brand picker. Each payment method lists its
        brands

        (products) and the features they support. Supplying `amount` applies any

        amount-based availability rules; because no card number is known yet,
        rules that

        depend on the card are not applied.


        Defaults to your default outlet when `outlet_id` is omitted. If your API
        key is bound to

        an outlet, only that outlet may be requested (403 otherwise). Browser
        calls must come

        from one of your allowed origins; publishable keys must send an `Origin`
        header (403

        otherwise). Returns 404 for an unknown outlet or when nothing is
        available for the

        parameters, and 422 when the currency is not enabled for you. Results
        may be cached

        for up to 60 seconds.


        Both publishable and secret keys may call this endpoint.
      operationId: get_supported_brands_v1_payment_brands_get
      parameters:
        - description: Outlet UUID. Defaults to merchant's DEFAULT outlet.
          in: query
          name: outlet_id
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Outlet UUID. Defaults to merchant's DEFAULT outlet.
            title: Outlet Id
        - description: ISO 4217 currency code (3 alpha chars).
          in: query
          name: currency
          required: false
          schema:
            description: ISO 4217 currency code (3 alpha chars).
            maxLength: 3
            minLength: 3
            pattern: ^[A-Za-z]{3}$
            title: Currency
            type: string
        - description: 'Channel type: ECOMMERCE | CARD_PRESENT | MOBILE | etc.'
          in: query
          name: channel
          required: false
          schema:
            description: 'Channel type: ECOMMERCE | CARD_PRESENT | MOBILE | etc.'
            title: Channel
            type: string
        - description: Amount in smallest currency unit (optional).
          in: query
          name: amount
          required: false
          schema:
            anyOf:
              - minimum: 0
                type: integer
              - type: 'null'
            description: Amount in smallest currency unit (optional).
            title: Amount
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse_SupportedBrandsResponse_'
          description: Successful Response
        '400':
          description: A required query parameter is missing or invalid.
          x-docs-interim: true
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '401':
          content:
            application/problem+json:
              example:
                detail: Missing or invalid Bearer token.
                status: 401
                title: Authentication Required
                type: urn:radiumone:gateway:authentication-required
              schema:
                properties:
                  detail:
                    type: string
                  status:
                    type: integer
                  title:
                    type: string
                  type:
                    type: string
                type: object
          description: Missing or invalid Bearer token.
        '403':
          content:
            application/problem+json:
              example:
                detail: Insufficient permissions for this operation.
                status: 403
                title: Permission Denied
                type: urn:radiumone:gateway:permission-denied
              schema:
                properties:
                  detail:
                    type: string
                  status:
                    type: integer
                  title:
                    type: string
                  type:
                    type: string
                type: object
          description: Insufficient permissions for this operation.
        '404':
          content:
            application/problem+json:
              example:
                detail: The requested resource does not exist.
                status: 404
                title: Not Found
                type: urn:radiumone:gateway:not-found
              schema:
                properties:
                  detail:
                    type: string
                  status:
                    type: integer
                  title:
                    type: string
                  type:
                    type: string
                type: object
          description: The requested resource does not exist.
        '500':
          content:
            application/problem+json:
              example:
                detail: An unexpected error occurred.
                status: 500
                title: Internal Server Error
                type: urn:radiumone:gateway:internal-server-error
              schema:
                properties:
                  detail:
                    type: string
                  status:
                    type: integer
                  title:
                    type: string
                  type:
                    type: string
                type: object
          description: An unexpected error occurred.
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >
            #!/usr/bin/env bash

            # Discover payment brands/products and their features (3DS, loyalty)
            for a

            # currency/channel/amount. Advisory only.

            set -euo pipefail


            API_BASE="${RADIUMONE_API_BASE:-https://api-sandbox.radiumone.io/gateway}"

            : "${RADIUMONE_ACCESS_TOKEN:?set RADIUMONE_ACCESS_TOKEN to a Bearer
            access token (secret or publishable)}"


            curl -sS -G "$API_BASE/v1/payment-brands" \
              -H "Authorization: Bearer $RADIUMONE_ACCESS_TOKEN" \
              --data-urlencode "currency=SGD" \
              --data-urlencode "channel=ECOMMERCE" \
              --data-urlencode "amount=5000"
        - lang: javascript
          label: Node.js
          source: >
            #!/usr/bin/env node

            // Discover payment brands/products and their features (3DS,
            loyalty) for a

            // currency/channel/amount. Advisory only. Node 18+ ESM fetch.

            // Env: RADIUMONE_ACCESS_TOKEN, RADIUMONE_API_BASE.

            const API_BASE = process.env.RADIUMONE_API_BASE ||
            "https://api-sandbox.radiumone.io/gateway";

            const accessToken = process.env.RADIUMONE_ACCESS_TOKEN;


            async function listPaymentBrands({ currency = "SGD", channel =
            "ECOMMERCE", amount = 5000 } = {}) {
              const params = new URLSearchParams({ currency, channel, amount: String(amount) });
              const res = await fetch(`${API_BASE}/v1/payment-brands?${params}`, {
                headers: { Authorization: `Bearer ${accessToken}` },
              });
              const payload = await res.json();
              if (!res.ok) {
                throw new Error(`payment-brands failed: ${payload.type ?? payload.code} (${res.status})`);
              }
              return payload;
            }


            listPaymentBrands().then((r) => console.log(JSON.stringify(r, null,
            2)));
        - lang: python
          label: Python
          source: >
            #!/usr/bin/env python3

            """Discover payment brands/products and their features (3DS,
            loyalty) for a

            currency/channel/amount. Advisory only.

            """

            import json

            import os


            import requests


            API_BASE = os.environ.get("RADIUMONE_API_BASE",
            "https://api-sandbox.radiumone.io/gateway")



            def list_payment_brands(currency: str = "SGD", channel: str =
            "ECOMMERCE", amount: int = 5000) -> dict:
                resp = requests.get(
                    f"{API_BASE}/v1/payment-brands",
                    params={"currency": currency, "channel": channel, "amount": amount},
                    headers={"Authorization": f"Bearer {os.environ.get('RADIUMONE_ACCESS_TOKEN', '')}"},
                    timeout=30,
                )
                payload = resp.json()
                if not resp.ok:
                    code = payload.get("type") or payload.get("code")
                    raise RuntimeError(f"payment-brands failed: {code} ({resp.status_code})")
                return payload


            if __name__ == "__main__":
                print(json.dumps(list_payment_brands(), indent=2))
components:
  schemas:
    SuccessResponse_SupportedBrandsResponse_:
      description: >-
        Standard success envelope. Every successful response has this shape,
        with the operation's own payload under `data`.
      properties:
        data:
          anyOf:
            - $ref: '#/components/schemas/SupportedBrandsResponse'
            - type: 'null'
          description: >-
            The operation's result. Its shape is documented per operation;
            omitted on responses that carry no payload.
        message:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Optional human-readable note. Omitted from the response when not
            set, which is the case for every payment operation today. Never
            parse it.
          title: Message
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Correlation ID for this HTTP request, for logs and support. Send
            your own in the `X-Request-Id` header (letters, digits and hyphens,
            up to 36 characters -- other characters are stripped) or the gateway
            generates one. This is NOT the `request_id` idempotency key you send
            in a transaction body; the two are unrelated.
          title: Request Id
        status:
          default: ok
          description: >-
            Always `ok` on a successful (2xx) response. Errors use a different
            body shape entirely (RFC 9457 problem details), so branch on the
            HTTP status code, not on this field.
          title: Status
          type: string
      title: SuccessResponse[SupportedBrandsResponse]
      type: object
    Problem:
      type: object
      x-docs-interim: true
      description: >-
        RFC 9457 problem details. Returned with `Content-Type:
        application/problem+json`. Interim: not yet a named component in the
        gateway team's published contract — every response there inlines its own
        smaller ad-hoc object; this shape reflects what our error pages and
        error-catalog.json actually document.
      properties:
        type:
          type: string
          format: uri
          description: >-
            A URN identifying the error condition, e.g.
            `urn:radiumone:gateway:validation-error`.
        title:
          type: string
          description: Short
          human-readable summary of the error type.: null
        status:
          type: integer
          description: The HTTP status code
          repeated in the body for convenience.: null
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
        instance:
          type: string
          description: The request path that produced this error.
        request_id:
          type: string
          description: >-
            Correlation ID for this request (see the envelope `request_id` note
            above). Include it when contacting support.
        code:
          type: string
          description: Optional short machine-readable code
          distinct from `type`.: null
        retry_allowed:
          type: boolean
          description: >-
            When present, whether it's safe to retry with the same idempotency
            key.
        errors:
          type: array
          description: >-
            Present on most `urn:radiumone:gateway:validation-error` (400)
            responses — one entry per invalid field. Some 400s of this type are
            raised by checks that run after validation and have no `errors`
            array; always handle it being absent. Rely on `pointer`/`parameter`
            and `code`, not the wording of `detail`, which can change.
          items:
            type: object
            properties:
              pointer:
                type: string
                description: >-
                  JSON Pointer to the invalid field in the request body, e.g.
                  `/amount/currency` or `/items/0/name`. An empty string means
                  the whole request (e.g. the body isn't valid JSON).
              parameter:
                type: string
                description: >-
                  Name of the invalid query or path parameter. Set instead of
                  `pointer` when the failing value came from the URL, not the
                  body.
              code:
                type: string
                description: >-
                  Machine-readable error type for this field, e.g. `missing` or
                  `string_too_long`.
              detail:
                type: string
                description: Human-readable explanation for this field.
      required:
        - type
        - title
        - status
        - detail
    SupportedBrandsResponse:
      description: Full per-product discovery response for GET /checkout/supported-brands.
      properties:
        cache_hit:
          default: false
          description: True when served from cache.
          title: Cache Hit
          type: boolean
        channel:
          description: Channel type slug.
          title: Channel
          type: string
        currency:
          description: ISO 4217 currency code.
          title: Currency
          type: string
        evaluated_at:
          description: ISO-8601 UTC timestamp of when the response was computed.
          title: Evaluated At
          type: string
        outlet_id:
          description: Resolved outlet UUID.
          title: Outlet Id
          type: string
        payment_methods:
          description: Payment methods grouped by type, ordered by priority_rank.
          items:
            $ref: '#/components/schemas/PaymentMethodGroup'
          title: Payment Methods
          type: array
      required:
        - outlet_id
        - currency
        - channel
        - evaluated_at
      title: SupportedBrandsResponse
      type: object
    PaymentMethodGroup:
      description: A payment method type (card, wallet, …) with its child products.
      properties:
        display_name:
          description: Human-readable method label.
          title: Display Name
          type: string
        priority_rank:
          description: >-
            Suggested display order for this payment method on your checkout,
            lowest first.
          title: Priority Rank
          type: integer
        products:
          description: Payment products available under this method.
          items:
            $ref: '#/components/schemas/PaymentProductDetail'
          title: Products
          type: array
        type:
          description: Payment method type slug (card, wallet, bnpl, …).
          title: Type
          type: string
      required:
        - type
        - display_name
        - priority_rank
      title: PaymentMethodGroup
      type: object
    PaymentProductDetail:
      description: A specific payment brand/scheme with its merged features.
      properties:
        code:
          description: Payment product slug (visa, apple_pay, …).
          title: Code
          type: string
        display_name:
          description: Human-readable product label.
          title: Display Name
          type: string
        features:
          additionalProperties: true
          description: Merged acquirer feature flags for this product.
          title: Features
          type: object
        priority_rank:
          description: >-
            Suggested display order for this product on your checkout, lowest
            first.
          title: Priority Rank
          type: integer
      required:
        - code
        - display_name
        - priority_rank
      title: PaymentProductDetail
      type: object
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer access token from `POST /v1/auth/token`. Treat it as an opaque
        string — do not depend on its internal encoding, which has changed
        before and isn't part of the contract.
      x-docs-interim: true

````