Tabby BNPL & Card Data API
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
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/dispatchosintStarts 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/verifyosintExchanges 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/refreshosintRenews 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/statementsopenfinancePages 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}openfinanceLoads 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/offersopenfinanceQuotes 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/applicationsopenfinanceCreates 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-limitopenbankingReads 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/summaryopenbankingReturns 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/ibanopenbankingReturns 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/quoteopenbankingQuotes 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/beneficiariesopenbankingLists 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/withdrawableopenfinanceReads 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-lookupopendataResolves 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