|
{ |
|
"openapi": "3.1.0", |
|
"info": { |
|
"title": "Coop Norway Medlem API", |
|
"version": "4.17.3", |
|
"description": "Reverse-engineered API specification for the Coop Norway \"Coop medlem\" Android app (no.coop.members v4.17.3). Extracted via static analysis of the compiled Dart binary (libapp.so) from the Flutter APK.\n\nThis API powers Norway's Coop loyalty program including purchase history, digital receipts, coupons, Coopay mobile payment, shopping lists, and Shop Express.\n\n**Authentication:** OpenID Connect via Auth0 at https://login.coop.no/\n**Strong Customer Auth (Coopay):** Aera SDK at https://api.aerahost.com/\n\n⚠️ Unofficial, reverse-engineered spec. Use responsibly for personal data access only.", |
|
"contact": { "name": "Helge Sverre", "url": "https://helgesver.re" }, |
|
"license": { "name": "MIT" } |
|
}, |
|
"servers": [ |
|
{ "url": "https://api.coop.no", "description": "Production" }, |
|
{ "url": "https://api.staging.coop", "description": "Staging" } |
|
], |
|
"security": [{ "oidcAuth": [] }], |
|
"tags": [ |
|
{ "name": "Purchases", "description": "Purchase history, receipts, and spending data" }, |
|
{ "name": "Coupons", "description": "Digital coupons and offers" }, |
|
{ "name": "Profile", "description": "User profile and preferences" }, |
|
{ "name": "Family", "description": "Family membership management" }, |
|
{ "name": "Coopay", "description": "Mobile payment (Coopay)" }, |
|
{ "name": "Parking", "description": "Parking history and stores" }, |
|
{ "name": "Vehicles", "description": "Vehicle registration for parking" }, |
|
{ "name": "Mastercard", "description": "Coop Mastercard management" }, |
|
{ "name": "BankAxept", "description": "BankAxept account linking" }, |
|
{ "name": "ShopExpress", "description": "Self-checkout scanning" }, |
|
{ "name": "Stores", "description": "Store information" }, |
|
{ "name": "Content", "description": "Articles, banners, recipes" }, |
|
{ "name": "Push", "description": "Push notification management" }, |
|
{ "name": "ShoppingList", "description": "gRPC shopping lists (handleliste.coop.no)" } |
|
], |
|
"paths": { |
|
"/user/pay/history/dashboard": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "getPurchaseDashboard", |
|
"summary": "Purchase dashboard overview", |
|
"description": "Returns an overview of spending with monthly breakdowns. This is the main entry point for purchase data.", |
|
"responses": { |
|
"200": { |
|
"description": "Dashboard data", |
|
"content": { |
|
"application/json": { |
|
"schema": { "$ref": "#/components/schemas/PurchaseDashboardResponse" } |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"/user/pay/history/list": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "getPurchaseHistoryList", |
|
"summary": "Purchase history list", |
|
"description": "Returns a list of purchase summary stubs grouped by month.", |
|
"responses": { |
|
"200": { |
|
"description": "Purchase list", |
|
"content": { |
|
"application/json": { |
|
"schema": { "$ref": "#/components/schemas/PurchaseHistoryResponse" } |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"/user/pay/history/month": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "getPurchaseHistoryMonth", |
|
"summary": "Monthly purchase breakdown", |
|
"description": "Returns detailed purchase data for a specific month.", |
|
"responses": { |
|
"200": { "description": "Monthly purchase data" } |
|
} |
|
} |
|
}, |
|
"/user/pay/history/details": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "getPurchaseDetails", |
|
"summary": "Purchase details with line items", |
|
"description": "Returns full purchase details including individual product line items with EAN codes, quantities, prices, and discounts.", |
|
"responses": { |
|
"200": { |
|
"description": "Purchase details", |
|
"content": { |
|
"application/json": { |
|
"schema": { "$ref": "#/components/schemas/PurchaseSummaryResponse" } |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"/user/pay/history/search": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "searchPurchases", |
|
"summary": "Search purchase history", |
|
"parameters": [ |
|
{ "name": "searchQuery", "in": "query", "schema": { "type": "string" }, "description": "Search term (product name, store, etc.)" } |
|
], |
|
"responses": { |
|
"200": { |
|
"description": "Search results", |
|
"content": { |
|
"application/json": { |
|
"schema": { "$ref": "#/components/schemas/PurchaseHistorySearchResponse" } |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"/user/pay/history/search/continue": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "searchPurchasesContinue", |
|
"summary": "Continue paginated purchase search", |
|
"responses": { "200": { "description": "Next page of search results" } } |
|
} |
|
}, |
|
"/user/pay/history/receipt.pdf": { |
|
"get": { |
|
"tags": ["Purchases"], |
|
"operationId": "getReceiptPdf", |
|
"summary": "Download receipt as PDF", |
|
"parameters": [ |
|
{ "name": "receiptid", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Receipt/summary ID" } |
|
], |
|
"responses": { |
|
"200": { |
|
"description": "Receipt PDF", |
|
"content": { "application/pdf": { "schema": { "type": "string", "format": "binary" } } } |
|
} |
|
} |
|
} |
|
}, |
|
"/coupon/all": { |
|
"get": { |
|
"tags": ["Coupons"], |
|
"operationId": "getAllCoupons", |
|
"summary": "Get all available coupons", |
|
"responses": { |
|
"200": { |
|
"description": "Coupon list", |
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/CouponResponse" } } } |
|
} |
|
} |
|
} |
|
}, |
|
"/coupon/activate": { |
|
"post": { |
|
"tags": ["Coupons"], |
|
"operationId": "activateCoupon", |
|
"summary": "Activate a coupon", |
|
"requestBody": { |
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/CouponActivationRequest" } } } |
|
}, |
|
"responses": { "200": { "description": "Coupon activated" } } |
|
} |
|
}, |
|
"/coupon/swap": { |
|
"post": { |
|
"tags": ["Coupons"], |
|
"operationId": "swapCoupon", |
|
"summary": "Swap a coupon for a different one", |
|
"responses": { "200": { "description": "Coupon swapped" } } |
|
} |
|
}, |
|
"/user/myoffers": { |
|
"get": { |
|
"tags": ["Coupons"], |
|
"operationId": "getMyOffers", |
|
"summary": "Get personalized offers", |
|
"responses": { "200": { "description": "Personal offers" } } |
|
} |
|
}, |
|
"/store/all": { |
|
"get": { |
|
"tags": ["Stores"], |
|
"operationId": "getAllStores", |
|
"summary": "Get all Coop stores", |
|
"responses": { |
|
"200": { |
|
"description": "Store list", |
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/StoreListResponse" } } } |
|
} |
|
} |
|
} |
|
}, |
|
"/user/profile": { |
|
"get": { |
|
"tags": ["Profile"], |
|
"operationId": "getUserProfile", |
|
"summary": "Get user profile", |
|
"responses": { "200": { "description": "User profile data" } } |
|
} |
|
}, |
|
"/user/benefits/overview": { |
|
"get": { |
|
"tags": ["Profile"], |
|
"operationId": "getBenefitsOverview", |
|
"summary": "Member benefits overview", |
|
"responses": { "200": { "description": "Benefits data" } } |
|
} |
|
}, |
|
"/user/content/memberbenefits": { |
|
"get": { |
|
"tags": ["Profile"], |
|
"operationId": "getMemberBenefitsContent", |
|
"summary": "Detailed member benefits content", |
|
"responses": { "200": { "description": "Member benefits content" } } |
|
} |
|
}, |
|
"/user/terms": { "get": { "tags": ["Profile"], "operationId": "getTerms", "summary": "Terms and conditions", "responses": { "200": { "description": "Terms" } } } }, |
|
"/user/legaltext": { "get": { "tags": ["Profile"], "operationId": "getLegalText", "summary": "Legal text", "responses": { "200": { "description": "Legal text" } } } }, |
|
"/user/newsfeed": { "get": { "tags": ["Content"], "operationId": "getNewsfeed", "summary": "News feed", "responses": { "200": { "description": "News items" } } } }, |
|
"/user/content/articles": { "get": { "tags": ["Content"], "operationId": "getArticles", "summary": "Content articles", "responses": { "200": { "description": "Articles" } } } }, |
|
"/user/content/banners": { "get": { "tags": ["Content"], "operationId": "getBanners", "summary": "Promotional banners", "responses": { "200": { "description": "Banners" } } } }, |
|
"/user/content/recipes": { "get": { "tags": ["Content"], "operationId": "getRecipes", "summary": "Recipes", "responses": { "200": { "description": "Recipes" } } } }, |
|
"/user/new_device": { "post": { "tags": ["Profile"], "operationId": "registerNewDevice", "summary": "Register new device", "responses": { "200": { "description": "Device registered" } } } }, |
|
"/user/consent/MARKETING_ANALYSIS": { "post": { "tags": ["Profile"], "operationId": "setMarketingConsent", "summary": "Set marketing analysis consent", "responses": { "200": { "description": "Consent updated" } } } }, |
|
"/user/ageverification/consent": { "post": { "tags": ["Profile"], "operationId": "setAgeVerificationConsent", "summary": "Age verification consent", "responses": { "200": { "description": "Consent set" } } } }, |
|
"/user/feedback/nps": { "post": { "tags": ["Profile"], "operationId": "submitNpsFeedback", "summary": "Submit NPS feedback", "responses": { "200": { "description": "Feedback submitted" } } } }, |
|
"/user/feedback/config": { "get": { "tags": ["Profile"], "operationId": "getFeedbackConfig", "summary": "Get feedback configuration", "responses": { "200": { "description": "Feedback config" } } } }, |
|
"/user/dynalink/resolve": { "post": { "tags": ["Profile"], "operationId": "resolveDynamicLink", "summary": "Resolve dynamic link", "responses": { "200": { "description": "Resolved link" } } } }, |
|
"/user/family/myfamily": { "get": { "tags": ["Family"], "operationId": "getMyFamily", "summary": "Get family members", "responses": { "200": { "description": "Family data" } } } }, |
|
"/user/family/send_invitation": { "post": { "tags": ["Family"], "operationId": "sendFamilyInvitation", "summary": "Invite family member", "responses": { "200": { "description": "Invitation sent" } } } }, |
|
"/user/family/revoke_invitation": { "post": { "tags": ["Family"], "operationId": "revokeFamilyInvitation", "summary": "Revoke family invitation", "responses": { "200": { "description": "Invitation revoked" } } } }, |
|
"/user/family/remove_member": { "post": { "tags": ["Family"], "operationId": "removeFamilyMember", "summary": "Remove family member", "responses": { "200": { "description": "Member removed" } } } }, |
|
"/user/pay/": { "get": { "tags": ["Coopay"], "operationId": "getPaymentOverview", "summary": "Coopay payment overview", "responses": { "200": { "description": "Payment overview" } } } }, |
|
"/user/pay/activate": { "post": { "tags": ["Coopay"], "operationId": "activateCoopay", "summary": "Activate Coopay", "responses": { "200": { "description": "Coopay activated" } } } }, |
|
"/user/pay/activate/device": { "post": { "tags": ["Coopay"], "operationId": "activateDevice", "summary": "Activate device for Coopay", "responses": { "200": { "description": "Device activated" } } } }, |
|
"/user/pay/deactivate": { "post": { "tags": ["Coopay"], "operationId": "deactivateCoopay", "summary": "Deactivate Coopay", "responses": { "200": { "description": "Coopay deactivated" } } } }, |
|
"/user/pay/delete": { "post": { "tags": ["Coopay"], "operationId": "deleteCoopay", "summary": "Delete Coopay account", "responses": { "200": { "description": "Coopay deleted" } } } }, |
|
"/user/pay/devices": { "get": { "tags": ["Coopay"], "operationId": "getCoopayDevices", "summary": "List Coopay devices", "responses": { "200": { "description": "Device list" } } } }, |
|
"/user/pay/scancodes": { "get": { "tags": ["Coopay"], "operationId": "getPaymentScanCodes", "summary": "Get payment QR/scan codes", "responses": { "200": { "description": "Scan codes" } } } }, |
|
"/user/pay/get-new-approval-inquiry": { "get": { "tags": ["Coopay"], "operationId": "getApprovalInquiry", "summary": "Get new payment approval inquiry", "responses": { "200": { "description": "Approval inquiry" } } } }, |
|
"/user/pay/get-payment-result": { "get": { "tags": ["Coopay"], "operationId": "getPaymentResult", "summary": "Get payment result", "responses": { "200": { "description": "Payment result" } } } }, |
|
"/user/pay/update-approval": { "post": { "tags": ["Coopay"], "operationId": "updatePaymentApproval", "summary": "Accept or reject payment", "responses": { "200": { "description": "Approval updated" } } } }, |
|
"/user/pay/event": { "post": { "tags": ["Coopay"], "operationId": "postPaymentEvent", "summary": "Post payment event", "responses": { "200": { "description": "Event posted" } } } }, |
|
"/user/pay/bankid/identify": { "post": { "tags": ["Coopay"], "operationId": "bankIdIdentify", "summary": "BankID identification", "responses": { "200": { "description": "BankID response" } } } }, |
|
"/user/pay/bankid/hwp": { "post": { "tags": ["Coopay"], "operationId": "bankIdHwp", "summary": "BankID HWP request", "responses": { "200": { "description": "HWP response" } } } }, |
|
"/user/pay/wallet/prepsign": { "post": { "tags": ["Coopay"], "operationId": "walletPrepSign", "summary": "Prepare wallet signing", "responses": { "200": { "description": "Prep sign data" } } } }, |
|
"/user/pay/wallet/hwp": { "post": { "tags": ["Coopay"], "operationId": "walletHwp", "summary": "Wallet HWP request", "responses": { "200": { "description": "HWP response" } } } }, |
|
"/user/pay/offline/debt": { "get": { "tags": ["Coopay"], "operationId": "getOfflineDebt", "summary": "Get offline payment debt", "responses": { "200": { "description": "Offline debt" } } } }, |
|
"/user/pay/offline/params": { "get": { "tags": ["Coopay"], "operationId": "getOfflineParams", "summary": "Get offline payment parameters", "responses": { "200": { "description": "Offline params" } } } }, |
|
"/user/pay/offline/trigger": { "post": { "tags": ["Coopay"], "operationId": "triggerOfflinePayment", "summary": "Trigger offline payment", "responses": { "200": { "description": "Payment triggered" } } } }, |
|
"/user/parking/history": { "get": { "tags": ["Parking"], "operationId": "getParkingHistory", "summary": "Get parking history", "responses": { "200": { "description": "Parking records" } } } }, |
|
"/user/parking/stores": { "get": { "tags": ["Parking"], "operationId": "getParkingStores", "summary": "Get stores with parking", "responses": { "200": { "description": "Parking stores" } } } }, |
|
"/user/vehicle/list": { "get": { "tags": ["Vehicles"], "operationId": "listVehicles", "summary": "List registered vehicles", "responses": { "200": { "description": "Vehicle list" } } } }, |
|
"/user/vehicle/add": { "post": { "tags": ["Vehicles"], "operationId": "addVehicle", "summary": "Register a vehicle", "responses": { "200": { "description": "Vehicle added" } } } }, |
|
"/user/vehicle/update": { "post": { "tags": ["Vehicles"], "operationId": "updateVehicle", "summary": "Update vehicle details", "responses": { "200": { "description": "Vehicle updated" } } } }, |
|
"/user/vehicle/remove": { "post": { "tags": ["Vehicles"], "operationId": "removeVehicle", "summary": "Remove a vehicle", "responses": { "200": { "description": "Vehicle removed" } } } }, |
|
"/user/vehicle/lookup": { "get": { "tags": ["Vehicles"], "operationId": "lookupVehicle", "summary": "Lookup vehicle by plate", "responses": { "200": { "description": "Vehicle info" } } } }, |
|
"/user/mastercard/": { "get": { "tags": ["Mastercard"], "operationId": "getMastercardOverview", "summary": "Coop Mastercard overview", "responses": { "200": { "description": "Mastercard overview" } } } }, |
|
"/user/mastercard/card-info": { "get": { "tags": ["Mastercard"], "operationId": "getMastercardInfo", "summary": "Get card info", "responses": { "200": { "description": "Card info" } } } }, |
|
"/user/mastercard/movements": { "get": { "tags": ["Mastercard"], "operationId": "getMastercardMovements", "summary": "Get card transactions/movements", "responses": { "200": { "description": "Movements" } } } }, |
|
"/user/bankaxept/account-number": { "get": { "tags": ["BankAxept"], "operationId": "getBankAxeptAccount", "summary": "Get linked BankAxept account", "responses": { "200": { "description": "Account number" } } } }, |
|
"/user/bankaxept/enrollment": { "post": { "tags": ["BankAxept"], "operationId": "enrollBankAxept", "summary": "Enroll BankAxept", "responses": { "200": { "description": "Enrolled" } } } }, |
|
"/user/shopexpress/stores": { "get": { "tags": ["ShopExpress"], "operationId": "getShopExpressStores", "summary": "Stores with Shop Express", "responses": { "200": { "description": "Store list" } } } }, |
|
"/user/shopexpress/shoppingtrip/init": { "post": { "tags": ["ShopExpress"], "operationId": "initShoppingTrip", "summary": "Start a Shop Express trip", "responses": { "200": { "description": "Trip initialized" } } } }, |
|
"/user/shopexpress/shoppingtrip/add_cart_item": { "post": { "tags": ["ShopExpress"], "operationId": "addCartItem", "summary": "Scan and add item to cart", "responses": { "200": { "description": "Item added" } } } }, |
|
"/user/shopexpress/shoppingtrip/status": { "get": { "tags": ["ShopExpress"], "operationId": "getTripStatus", "summary": "Get shopping trip status", "responses": { "200": { "description": "Trip status" } } } }, |
|
"/push/register": { "post": { "tags": ["Push"], "operationId": "registerPush", "summary": "Register for push notifications", "responses": { "200": { "description": "Registered" } } } }, |
|
"/push/unregister": { "post": { "tags": ["Push"], "operationId": "unregisterPush", "summary": "Unregister from push notifications", "responses": { "200": { "description": "Unregistered" } } } } |
|
}, |
|
"components": { |
|
"securitySchemes": { |
|
"oidcAuth": { |
|
"type": "openIdConnect", |
|
"openIdConnectUrl": "https://login.coop.no/.well-known/openid-configuration", |
|
"description": "Auth0-hosted OpenID Connect. Use Authorization Code with PKCE (S256). Redirect URI: no.coop.members://auth/callback" |
|
} |
|
}, |
|
"schemas": { |
|
"PurchaseDashboardResponse": { |
|
"type": "object", |
|
"properties": { |
|
"dashboardTotal": { "type": "number", "description": "Total spending amount" }, |
|
"monthlyBreakdown": { "type": "array", "items": { "$ref": "#/components/schemas/MonthlyBreakdown" } } |
|
} |
|
}, |
|
"MonthlyBreakdown": { |
|
"type": "object", |
|
"properties": { |
|
"month": { "type": "integer" }, |
|
"year": { "type": "integer" }, |
|
"amount": { "type": "number" } |
|
} |
|
}, |
|
"PurchaseHistoryResponse": { |
|
"type": "object", |
|
"properties": { |
|
"purchases": { "type": "array", "items": { "$ref": "#/components/schemas/PurchaseSummaryStub" } } |
|
} |
|
}, |
|
"PurchaseSummaryStub": { |
|
"type": "object", |
|
"properties": { |
|
"summaryId": { "type": "string", "description": "Unique purchase identifier" }, |
|
"purchaseDate": { "type": "string", "format": "date-time" }, |
|
"storeName": { "type": "string" }, |
|
"storeId": { "type": "string" }, |
|
"chainId": { "type": "string", "description": "Coop chain identifier (Extra, Prix, Mega, Obs, etc.)" }, |
|
"amount": { "type": "number", "description": "Total amount in NOK" }, |
|
"totalDiscount": { "type": "number", "description": "Total discount in NOK" } |
|
} |
|
}, |
|
"PurchaseSummaryStubMonthGroup": { |
|
"type": "object", |
|
"properties": { |
|
"month": { "type": "integer" }, |
|
"year": { "type": "integer" }, |
|
"purchases": { "type": "array", "items": { "$ref": "#/components/schemas/PurchaseSummaryStub" } } |
|
} |
|
}, |
|
"PurchaseSummaryResponse": { |
|
"type": "object", |
|
"properties": { |
|
"summary": { "$ref": "#/components/schemas/PurchaseSummary" } |
|
} |
|
}, |
|
"PurchaseSummary": { |
|
"type": "object", |
|
"description": "Full purchase details including line items", |
|
"properties": { |
|
"summaryId": { "type": "string" }, |
|
"receiptId": { "type": "string" }, |
|
"purchaseDate": { "type": "string", "format": "date-time" }, |
|
"storeName": { "type": "string" }, |
|
"storeId": { "type": "string" }, |
|
"chainId": { "type": "string" }, |
|
"amount": { "type": "number" }, |
|
"totalDiscount": { "type": "number" }, |
|
"totalDiscountFormatted": { "type": "string", "description": "Formatted discount string (e.g. 'kr 42,50')" }, |
|
"memberBonus": { "type": "number", "description": "Member bonus earned" }, |
|
"lines": { "type": "array", "items": { "$ref": "#/components/schemas/PurchaseSummaryLine" } } |
|
} |
|
}, |
|
"PurchaseSummaryLine": { |
|
"type": "object", |
|
"description": "Individual product line item on a receipt", |
|
"properties": { |
|
"productName": { "type": "string" }, |
|
"ean13": { "type": "string", "description": "EAN-13 barcode" }, |
|
"gtin13": { "type": "string", "description": "GTIN-13 barcode" }, |
|
"barcode": { "type": "string", "description": "Barcode value" }, |
|
"quantity": { "type": "number" }, |
|
"amount": { "type": "number", "description": "Line total in NOK" }, |
|
"discount": { "type": "number", "description": "Discount on this line" }, |
|
"discountAmountPerQuantity": { "type": "number" }, |
|
"unitPrice": { "type": "number", "description": "Price per unit" } |
|
} |
|
}, |
|
"PurchaseHistorySearchResponse": { |
|
"type": "object", |
|
"properties": { |
|
"searchQuery": { "type": "string" }, |
|
"purchases": { "type": "array", "items": { "$ref": "#/components/schemas/PurchaseSummaryStub" } } |
|
} |
|
}, |
|
"CouponResponse": { |
|
"type": "object", |
|
"properties": { |
|
"coupons": { "type": "array", "items": { "$ref": "#/components/schemas/Coupon" } } |
|
} |
|
}, |
|
"Coupon": { |
|
"type": "object", |
|
"properties": { |
|
"id": { "type": "string" }, |
|
"title": { "type": "string" }, |
|
"description": { "type": "string" }, |
|
"discountAmount": { "type": "number" }, |
|
"expiresAt": { "type": "string", "format": "date-time" }, |
|
"activated": { "type": "boolean" }, |
|
"tags": { "type": "array", "items": { "$ref": "#/components/schemas/CouponTag" } } |
|
} |
|
}, |
|
"CouponTag": { |
|
"type": "object", |
|
"properties": { |
|
"name": { "type": "string" }, |
|
"value": { "type": "string" } |
|
} |
|
}, |
|
"CouponActivationRequest": { |
|
"type": "object", |
|
"properties": { |
|
"couponId": { "type": "string" } |
|
} |
|
}, |
|
"StoreListResponse": { |
|
"type": "object", |
|
"properties": { |
|
"stores": { "type": "array", "items": { "$ref": "#/components/schemas/Store" } } |
|
} |
|
}, |
|
"Store": { |
|
"type": "object", |
|
"properties": { |
|
"storeId": { "type": "string" }, |
|
"storeName": { "type": "string" }, |
|
"chainId": { "type": "string" } |
|
} |
|
}, |
|
"Membership": { |
|
"type": "object", |
|
"properties": { |
|
"membershipNumber": { "type": "string" }, |
|
"name": { "type": "string" }, |
|
"scanCode": { "type": "string", "description": "Barcode for in-store scanning" }, |
|
"qrCodeExpiryTime": { "type": "string", "format": "date-time" } |
|
} |
|
}, |
|
"MemberBonus": { |
|
"type": "object", |
|
"properties": { |
|
"memberBonus": { "type": "number" }, |
|
"memberBonuses": { "type": "array", "items": { "type": "object" } } |
|
} |
|
} |
|
} |
|
} |
|
} |