Tabby: Send, spend and save icon

Tabby BNPL & Card Data API

Tabby FZ LLC · Lending

Tabby: Send, spend and save is the GCC consumer-finance app from Dubai-based Tabby FZ LLC. Shoppers split merchant purchases into interest-free instalments, spend on a Tabby card, draw Tabby Advance cash into a bank account, pay utility bills, send money to saved beneficiaries, and hold a debit account with a local IBAN. The Android client is the logged-in home for those products in the United Arab Emirates and Saudi Arabia, competing with Tamara and bank-issued cards for the same pay-later shoppers.

Merchant-loan remaining on each purchase sits next to statement amount_to_pay, due_date and optional min_payment, while the card record exposes limit versus remaining and the debit account returns an iban with balance. Remittance quotes add send_amount, receive_amount and rate; cashback withdrawal shows real_balance against virtual_balance.

Treasury teams reconcile merchant instalments against monthly statements; card-issuing partners watch limit utilisation; remittance desks compare quoted rates before payout. openData Studio turns those records into callable open data.

Screenshots

  • Tabby: Send, spend and save screenshot 1
  • Tabby: Send, spend and save screenshot 2
  • Tabby: Send, spend and save screenshot 3
  • Tabby: Send, spend and save screenshot 4
  • Tabby: Send, spend and save screenshot 5
  • Tabby: Send, spend and save screenshot 6
  • Tabby: Send, spend and save screenshot 7

API surface

The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.

  • Send login OTP

    POST /v1/signin/otp/dispatch osint

    Starts phone sign-in by sending an OTP to SendCodeRequest.phone with language, before confirmation_code is posted to login.

    Auth: Unauthenticated JSON body. Later calls attach Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • phone
    • language
    POST /v1/signin/otp/dispatch HTTP/1.1
    Content-Type: application/json
    
    {
      "phone": "+971501234567",
      "language": "en"
    }
    {
      "status": "ok"
    }
  • Password or OTP login

    POST /v1/signin/verify osint

    Exchanges LoginRequest phone and confirmation_code (or password) for AuthResponseDto access_token and refresh_token used as Bearer on customer routes.

    Auth: JSON body phone + confirmation_code (or password). Response AuthResponseDto access_token / refresh_token become Authorization: Bearer on later customer calls.

    • phone
    • confirmation_code
    • lang
    • device_info
    • success_otp_token
    • password
    • access_token
    • refresh_token
    POST /v1/signin/verify HTTP/1.1
    Content-Type: application/json
    
    {
      "phone": "+971501234567",
      "confirmation_code": "123456",
      "lang": "en",
      "device_info": {
        "platform": "android"
      },
      "success_otp_token": "otp_tok_8f21",
      "password": null
    }
    {
      "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
      "refresh_token": "rt_9c10aa11"
    }
  • Refresh access token

    POST /v1/signin/refresh osint

    Renews the session: RefreshTokenRequest.token in, AuthResponseDto access_token and refresh_token out.

    Auth: JSON body RefreshTokenRequest.token (the refresh_token from AuthResponseDto). Returns a new access_token / refresh_token pair.

    • token
    • access_token
    • refresh_token
    POST /v1/signin/refresh HTTP/1.1
    Content-Type: application/json
    
    {
      "token": "rt_9c10aa11"
    }
    {
      "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
      "refresh_token": "rt_bb22cc33"
    }
  • List BNPL statements

    GET /v1/statements openfinance

    Pages monthly BNPL statements: StatementDTO amount_to_pay against amount_paid, due_date, optional MinPaymentDTO to_pay, late_fees and currency.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • id
    • start_date
    • end_date
    • due_date
    • amount_to_pay
    • amount_paid
    • amount_total
    • amount_to_pay_without_fee
    • min_payment
    • min_payment_available
    • to_pay
    • late_fees
    • status
    • currency
    • type
    • subscription_active
    GET /v1/statements HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "items": [
        {
          "id": "st_441",
          "start_date": "2026-09-01",
          "end_date": "2026-09-30",
          "due_date": "2026-10-14",
          "amount_to_pay": "420.00",
          "amount_paid": "80.00",
          "amount_total": "500.00",
          "amount_to_pay_without_fee": "400.00",
          "amount_paid_without_fee": "80.00",
          "transfered_amount": "0.00",
          "min_payment": {
            "min_payment_available": true,
            "to_pay": "50.00",
            "paid": "0.00",
            "available_till": "2026-10-14",
            "available_from": "2026-10-01",
            "transfer_fee": "0.00",
            "to_next_statement_amount": "370.00"
          },
          "late_fees": "0.00",
          "rolling_split_service_fee": "0.00",
          "subscription_active": true,
          "status": "due",
          "currency": "AED",
          "type": "monthly",
          "subscription": {
            "id": "sub_plus"
          }
        }
      ]
    }
  • Purchase loan detail

    GET /v1/purchases/{purchase_id} openfinance

    Loads one BNPL purchase: PurchaseDTO status, merchant name, order billed_amount, and PurchaseLoanDTO remaining versus paid plus installments.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • id
    • status
    • displayed_status
    • currency
    • can_be_paid
    • in_statement
    • merchant
    • name
    • logo
    • order
    • amount
    • billed_amount
    • refunded_amount
    • loan
    • paid
    • remaining
    • installments
    • order_amount
    • total_service_fee
    GET /v1/purchases/pur_882144 HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "id": "pur_882144",
      "status": "to_pay",
      "displayed_status": "Due",
      "currency": "AED",
      "paid_date": null,
      "can_be_paid": true,
      "disputes_enabled": true,
      "in_statement": true,
      "merchant": {
        "id": "m_noon",
        "url": "https://noon.com",
        "name": "noon",
        "logo": "https://img.example.com/merchants/noon.png"
      },
      "order": {
        "id": "ord_991",
        "number": "N-441",
        "amount": "400.00",
        "billed_amount": "400.00",
        "refunded_amount": "0.00",
        "discount": "0.00",
        "tax_amount": "19.05",
        "shipping_amount": "0.00",
        "created_at": "2026-09-12T14:22:01Z",
        "currency": "AED",
        "status": "captured"
      },
      "loan": {
        "paid": "100.00",
        "remaining": "300.00",
        "refunded": false,
        "refunded_amount": "0.00",
        "order_amount": "400.00",
        "actual_order_amount": "400.00",
        "total_service_fee": "0.00",
        "service_fee": "0.00",
        "post_split": false,
        "statement_split": true,
        "has_contract": true,
        "installments": [
          {
            "amount": "100.00",
            "due_date": "2026-10-12",
            "status": "paid"
          }
        ]
      }
    }
  • Tabby Advance loan offers

    GET /v1/cash-loans/offers openfinance

    Quotes Tabby Advance cash-loan options: LoanOfferDTO principal, amount_to_pay, repayment_fee, RegularPaymentDTO and payment_schedule.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • is_default
    • principal
    • amount_to_pay
    • repayment_fee
    • regular_payment
    • payment_schedule
    GET /v1/cash-loans/offers HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "offers": [
        {
          "is_default": true,
          "principal": "2000.00",
          "amount_to_pay": "2200.00",
          "repayment_fee": "200.00",
          "regular_payment": {
            "principal": "500.00",
            "repayment_fee": "50.00",
            "amount_to_pay": "550.00"
          },
          "payment_schedule": [
            {
              "amount_to_pay": "550.00",
              "due_date": "2026-11-14"
            }
          ]
        }
      ]
    }
  • Submit Advance application

    POST /v1/cash-loans/applications openfinance

    Creates a Tabby Advance application and returns ApplicationDTO id, status, expiry_date, masked_iban payout account and CurrentLoanOfferDTO amount_to_pay.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • id
    • loan_terms_id
    • amount
    • currency
    • expiry_date
    • status
    • is_finalized
    • amount_changed
    • rejection_reason
    • masked_iban
    • principal
    • amount_to_pay
    • first_payment_date
    • repayment_fee
    POST /v1/cash-loans/applications HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Content-Type: application/json
    
    {
      "loan_terms_id": "lt_90d",
      "amount": "2000.00",
      "currency": "AED"
    }
    {
      "id": "app_771",
      "loan_terms_id": "lt_90d",
      "amount": "2000.00",
      "currency": "AED",
      "expiry_date": "2026-10-23",
      "status": "pending",
      "is_finalized": false,
      "amount_changed": false,
      "rejection_reason": null,
      "bank_account": {
        "id": "ba_12",
        "type": "iban",
        "masked_iban": "AE12 **** **** 0090",
        "currency": "AED",
        "available": true
      },
      "loan_offer": {
        "amount_to_pay": "2200.00",
        "first_payment_date": "2026-11-14",
        "principal": "2000.00",
        "repayment_fee": "200.00",
        "regular_payment": {
          "principal": "500.00",
          "repayment_fee": "50.00",
          "amount_to_pay": "550.00"
        },
        "payment_schedule": []
      }
    }
  • Card spending limit

    GET /v1/cards/spending-limit openbanking

    Reads the Tabby card ceiling: CardLimitDTO type, limit versus remaining, with MoneyAmountDTO amount and currency.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • type
    • period
    • limit
    • value
    • remaining
    • amount
    • currency
    GET /v1/cards/spending-limit HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "type": "monthly",
      "period": "month",
      "limit": {
        "amount": "5000.00",
        "currency": "AED"
      },
      "value": "5000.00",
      "remaining": {
        "amount": "3120.50",
        "currency": "AED"
      }
    }
  • Debit account summary

    GET /v1/accounts/summary openbanking

    Returns the debit-account snapshot: AccountBalanceDto balance and currency plus maxTopUpAmount / minTopUpAmount / remainingTopUpAmount.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • balance
    • currency
    • maxTopUpAmount
    • minTopUpAmount
    • remainingTopUpAmount
    • presetTopupsAmount
    GET /v1/accounts/summary HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "balance": "1840.25",
      "currency": "AED",
      "maxTopUpAmount": "20000.00",
      "minTopUpAmount": "10.00",
      "remainingTopUpAmount": "18159.75",
      "presetTopupsAmount": ["50.00", "100.00", "200.00"]
    }
  • Debit IBAN details

    GET /v1/accounts/iban openbanking

    Returns the debit payout coordinates: AccountIbanDetailsDto iban plus AccountDetailsDto beneficiaryName, partnerBank and remainingTopUpAmount.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • iban
    • currencyShort
    • currencyFull
    • maxTopUpAmount
    • remainingTopUpAmount
    • beneficiaryName
    • partnerBank
    GET /v1/accounts/iban HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "iban": "AE070331234567890123456",
      "currencyShort": "AED",
      "currencyFull": "UAE Dirham",
      "maxTopUpAmount": "20000.00",
      "remainingTopUpAmount": "18159.75",
      "beneficiaryName": "FATIMA ALI",
      "partnerBank": "Wio Bank",
      "customer": {
        "name": "Fatima Ali"
      }
    }
  • Remittance quote

    POST /v1/transfers/quote openbanking

    Quotes a send: TransferCalculationDTO send_amount versus receive_amount, rate / rate_precise, fees, total_to_pay and sla.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • send_amount
    • receive_amount
    • rate
    • rate_precise
    • fees
    • total_to_pay
    • sla
    POST /v1/transfers/quote HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Content-Type: application/json
    
    {
      "send_amount": "500.00",
      "currency": "AED"
    }
    {
      "send_amount": "500.00",
      "receive_amount": "13580.00",
      "rate": "27.16",
      "rate_precise": "27.160000",
      "fees": "0.00",
      "total_to_pay": "500.00",
      "sla": "T+0"
    }
  • List remittance beneficiaries

    GET /v1/transfers/beneficiaries openbanking

    Lists saved payout counterparts: BeneficiaryDTO id, pointer, name, provider_code, phone_number and account_details.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • id
    • pointer
    • name
    • avatar_url
    • type
    • provider_code
    • icon_url
    • phone_number
    • account_details
    • deletion_handle
    GET /v1/transfers/beneficiaries HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "items": [
        {
          "id": "ben_19",
          "pointer": "iban:AE070331234567890123456",
          "name": "Omar Hassan",
          "avatar_url": "https://img.example.com/avatars/omar.png",
          "type": "iban",
          "provider_code": "WIO",
          "icon_url": "https://img.example.com/banks/wio.png",
          "phone_number": "+971509876543",
          "account_details": {
            "iban": "AE070331234567890123456"
          },
          "view": "full",
          "deletion_handle": "del_19"
        }
      ]
    }
  • Cashback withdrawal summary

    GET /v1/rewards/withdrawable openfinance

    Reads withdrawable loyalty cash: WithdrawBalanceDTO balance split into real_balance and virtual_balance with currency.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • balance
    • real_balance
    • virtual_balance
    • currency
    GET /v1/rewards/withdrawable HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "balance": "85.40",
      "real_balance": "60.40",
      "virtual_balance": "25.00",
      "currency": "AED"
    }
  • Bill-account lookup

    GET /v1/bills/account-lookup opendata

    Resolves a utility account: BillAccountDetailsResponseDTO with BillDTO amount, status, is_bnpl_available and BillerDTO name.

    Auth: Authorization: Bearer access_token from AuthResponseDto after POST /v1/signin/verify.

    • account
    • details
    • nickname
    • is_persistent
    • bill
    • id
    • amount
    • currency
    • status
    • pay_now_status
    • is_bnpl_available
    • biller
    • name
    • logo_url
    GET /v1/bills/account-lookup?account=0501234567 HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Accept: application/json
    {
      "account": {
        "details": "0501234567",
        "nickname": "Home DEWA",
        "is_persistent": true
      },
      "bill": {
        "id": "bill_331",
        "amount": "312.80",
        "currency": "AED",
        "details": "Sep 2026",
        "status": "unpaid",
        "pay_now_status": "ready",
        "is_bnpl_available": true
      },
      "biller": {
        "name": "DEWA",
        "logo_url": "https://img.example.com/billers/dewa.png"
      }
    }

Data categories

  • balances
  • statements
  • transactions
  • loans
  • cards
  • transfers

Where teams use this data

  • BNPL statement reconciliation

    A treasury bot pulls monthly amount_to_pay, amount_paid and due_date, then matches each purchase remaining against the statement so finance sees which merchant loans still sit open.

  • Card-limit utilisation watch

    An issuing-ops dashboard charts CardLimitDTO remaining against limit and debit account balance so a spend spike on the Tabby card is visible before the next statement.

  • Remittance quote compare

    A corridor desk stores send_amount, receive_amount, rate_precise and fees from each calculate call, then ranks Tabby quotes next to bank FX for the same beneficiary pointer.

  • Advance payout tracking

    A lending stack records ApplicationDTO status, expiry_date and masked_iban, then watches CurrentLoanOfferDTO amount_to_pay after disburse so cash-loan books stay aligned with the customer screen.

Frequently asked questions

What customer records does Tabby expose after login?

Signed-in calls return BNPL statements (amount_to_pay, due_date, min_payment), per-purchase loan remaining, Tabby Advance offers (principal, repayment_fee), card limit versus remaining, debit iban and balance, remittance quotes (send_amount, receive_amount, rate), cashback real_balance / virtual_balance, and utility bill amount with is_bnpl_available.

How does Tabby authenticate the customer session?

The client posts phone on send-code, then phone plus confirmation_code (or password) on login. AuthResponseDto returns access_token and refresh_token; later customer routes send Authorization: Bearer access_token. Token refresh posts the refresh_token as token.

Which markets do these customer records cover?

The Android client is the logged-in home for Tabby FZ LLC shoppers in the United Arab Emirates and Saudi Arabia. Statement and debit amounts in the models carry a currency field (commonly AED on UAE accounts).

Apps similar to Tabby: Send, spend and save

  • Tamara — Tamara is a buy-now-pay-later app in Saudi Arabia and the UAE that lets shoppers pay in full or split a purchase into interest-free instalments, including Sharia-compliant plans that do not charge late-payment interest.
  • Postpay — Postpay is a Dubai-founded buy-now-pay-later service that splits checkout purchases at partnered UAE retailers into three interest-free instalments.
  • Cashew — Cashew is a UAE buy-now-pay-later platform that splits larger purchases—such as healthcare, education, automotive and home improvement—into 3, 6 or up to 12 monthly instalments at online and in-store partners.
  • Spotii — Spotii is a MENA buy-now-pay-later app used in the UAE, Saudi Arabia and Bahrain that lets shoppers split purchases into instalments at partnered merchants.
  • MISpay — MISpay is a Saudi Central Bank–supervised buy-now-pay-later app that splits purchases into four interest-free, Shariah-compliant instalments online, in store and in the MISpay app.
  • Wio — Wio Personal is an Abu Dhabi digital bank, licensed by the Central Bank of the UAE, whose app opens an AED account, sends money in several currencies and issues a cashback credit card.

Topics

  • Tabby API
  • BNPL statements
  • amount_to_pay
  • Tabby Advance
  • card limit
  • debit IBAN
  • remittance quote
  • UAE pay later

Need this app's data API integrated?

We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.

  • NDA + SOW on every engagement
  • Delivery in 3–7 days
  • Payment only after acceptance
  • Work scoped to authorized use

Get a quote