Fave Payments API

Create charges via QR code or merchant scan.

OpenAPI Specification

fave-payments-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: FavePay Omni (FPO) Payments API
  version: v1
  description: FavePay Omni is Fave's partner payment API for accepting payments online or in-store. Partners create single-use QR codes or payment URLs, process customer-presented (merchant-scan) QR/barcodes, look up and list transactions, acknowledge them, and issue full or partial refunds. Transaction status changes are delivered via signed webhook callbacks. Every request is signed with HMAC-SHA256 using a secret key Fave issues during partner onboarding. Operates across Malaysia (MY), Singapore (SG) and Indonesia (ID).
  contact:
    name: Fave Partner Support
    url: https://developers.myfave.com/
  x-apievangelist:
    generated: '2026-07-19'
    method: generated
    source: https://developers.myfave.com/fpo-guide.html
    note: Faithfully generated from Fave's published partner documentation (FavePay Omni guide). No provider-published OpenAPI was found; this captures the documented endpoints, fields, auth and webhooks verbatim.
servers:
- url: https://omni.myfave.com
  description: Production
- url: https://omni.dino.fave.ninja
  description: Sandbox (test)
security:
- hmacSignature: []
tags:
- name: Payments
  description: Create charges via QR code or merchant scan.
paths:
  /api/fpo/v1/{country_code}/qr_codes:
    post:
      operationId: createQrCode
      tags:
      - Payments
      summary: Create a single-use QR code or payment URL
      description: Creates a single-use QR code or payment URL the customer scans/opens to pay. Returns the payment payload in the requested format.
      parameters:
      - $ref: '#/components/parameters/CountryCode'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateQrCodeRequest'
      responses:
        '200':
          description: QR code / payment payload created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateQrCodeResponse'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalError'
  /api/fpo/v1/{country_code}/merchant_scan:
    post:
      operationId: merchantScan
      tags:
      - Payments
      summary: Process a customer-presented QR / barcode (merchant scan)
      description: Charges a customer by processing the QR or barcode payload the merchant scanned from the customer's Fave app.
      parameters:
      - $ref: '#/components/parameters/CountryCode'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MerchantScanRequest'
      responses:
        '200':
          description: Charge processed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transaction'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  responses:
    InternalError:
      description: Server failure (internal_error / unexpected_error).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Invalid signature or outlet not linked to the integration.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Unknown app_id, missing transaction, or empty transaction history.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ValidationError:
      description: Invalid parameters (validation) or refund outside window (stale_transaction).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnprocessableEntity:
      description: Unsupported format or provider rejection.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    CountryCode:
      name: country_code
      in: path
      required: true
      description: Market the request targets.
      schema:
        type: string
        enum:
        - MY
        - SG
        - ID
  schemas:
    MerchantScanRequest:
      type: object
      required:
      - omni_reference
      - total_amount_cents
      - app_id
      - outlet_id
      - code
      - sign
      properties:
        omni_reference:
          type: string
          maxLength: 28
        total_amount_cents:
          type: integer
        app_id:
          type: string
        outlet_id:
          type: integer
        code:
          type: string
          description: Customer QR or barcode payload.
        callback_url:
          type: string
        details:
          type: object
          description: Arbitrary JSON metadata (excluded from signature).
        sign:
          type: string
    Transaction:
      type: object
      properties:
        id:
          type: string
        receipt_id:
          type: string
        outlet_name:
          type: string
        total_amount_cents:
          type: integer
        payment_type:
          type: string
        payment_type_variant:
          type: string
        currency:
          type: string
        outlet_id:
          type: integer
        mid:
          type: string
        omni_reference:
          type: string
        status:
          type: string
          enum:
          - pending_payment
          - payment_processing
          - successful
          - disputed
          - rejected
          - refunded
        status_code:
          type: integer
          description: 0 pending_payment, 1 payment_processing, 2 successful, 3 disputed, 4 rejected, 5 refunded.
        created_at:
          type: string
        charged_amount_cents:
          type: integer
        campaign_credit_amount_cents:
          type: integer
        campaign_funded_by:
          type: string
        aabig_points_used_amount_cents:
          type: integer
        merchant_cashback_amount_cents:
          type: integer
        fave_credits_amount_cents:
          type: integer
        promo_code_value_cents:
          type: integer
        e_card_credits_used_cents:
          type: integer
        cashback_rate:
          type: number
        merchant_cashback_issued_cents:
          type: integer
        promo_code:
          type: string
        promo_code_cashback_value:
          type: number
        promo_code_cashback_type:
          type: string
        promo_code_cashback_issued_cents:
          type: integer
        promo_code_cashback_funded_by:
          type: string
        fave_fees_percentage:
          type: number
        fave_fees_cents:
          type: integer
        sst_on_total_fees_cents:
          type: integer
        merchant_takeback_cents:
          type: integer
        refund_amount_cents:
          type: integer
        user_id:
          type: string
        fpl_transaction:
          type: boolean
        fpl_fees_percentage:
          type: number
        fpl_fees_cents:
          type: integer
        fpl_merchant_cashback_reduction_percentage:
          type: number
        sign:
          type: string
          description: Present on webhook callback payloads for verification.
    CreateQrCodeRequest:
      type: object
      required:
      - omni_reference
      - total_amount_cents
      - app_id
      - outlet_id
      - sign
      properties:
        omni_reference:
          type: string
          maxLength: 28
          description: Partner reference, format "[prefix]-[id]".
        total_amount_cents:
          type: integer
          description: Positive amount in cents. SG max 1999900.
        app_id:
          type: string
        outlet_id:
          type: integer
        format:
          type: string
          default: base64
          enum:
          - txt
          - base64
          - web_url
          - grab
          - paynow
          - alipay
          - wcp
          - shopeepay
          - atome
        redirect_url:
          type: string
          description: Customer return URL for web_url format.
        callback_url:
          type: string
          description: Per-payment webhook override.
        payment_option:
          type: string
          default: both
          enum:
          - both
          - app
          - pwa
        expiry_time:
          type: integer
          description: Unix timestamp when the code expires.
        shopper_details:
          type: object
          properties:
            email:
              type: string
            phone:
              type: string
            location:
              type: string
        test:
          type: boolean
          description: Enable test payments when supported.
        sign:
          type: string
    CreateQrCodeResponse:
      type: object
      properties:
        code:
          type: string
          description: Payment URL or QR payload.
        format:
          type: string
        expires_in:
          type: integer
          description: Seconds until expiry.
    Error:
      type: object
      properties:
        error:
          type: string
          description: Machine-readable error code (e.g. validation, stale_transaction, resource_not_found, provider, internal_error, unexpected_error, failed_request, already_refunded).
        message:
          type: string
  securitySchemes:
    hmacSignature:
      type: apiKey
      in: query
      name: sign
      description: HMAC-SHA256 signature computed over the URL-encoded request fields in submission order (excluding sign and country_code, and excluding outlet_id on list, id on acknowledge, and details on merchant scan), keyed by the secret Fave issued for the integration. On POST requests the signature is passed as the sign field in the request body.