{"openapi":"3.0.0","paths":{"/api/v1/liveness":{"get":{"operationId":"InfraController_liveness","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessOutput"}}}}},"tags":["Infra"]}},"/api/v1/payments/verification":{"post":{"operationId":"PaymentsController_handleAddPaymentToPassCallback","parameters":[],"responses":{"201":{"description":""}}}},"/api/v1/payments":{"get":{"operationId":"PaymentsController_servePaymentPage","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"PaymentsController_addPaymentToPass","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPaymentToPassInput"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/payments/process":{"get":{"operationId":"PaymentsController_serveProcessPaymentPage","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/memberships/{number}/get-pass/{platform}.{format}":{"get":{"operationId":"MembershipsController_getPass","parameters":[{"name":"number","required":true,"in":"path","schema":{"type":"string"}},{"name":"platform","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/memberships/{number}/coupons/{type}":{"post":{"operationId":"MembershipsController_CreateCouponForMembership","parameters":[{"name":"number","required":true,"in":"path","schema":{"type":"string"}},{"name":"type","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"boolean"}}}}}}},"/api/v1/whiteLabelMembership/passes/{templateId}":{"get":{"operationId":"WhitelabelMembershipController_getAnonymousPass","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/whiteLabelMembership":{"get":{"operationId":"WhitelabelMembershipController_GetWhitelabelMembership","parameters":[{"name":"memberid","required":true,"in":"query","schema":{"minLength":3,"type":"string"}},{"name":"platform","required":true,"in":"query","schema":{"enum":["Google","Apple"],"type":"string"}},{"name":"name","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetWhiteLabelMembershipOutput"}}}}}}},"/api/v1/whiteLabelMembership/{memberid}/platform/{platform}":{"get":{"operationId":"WhitelabelMembershipController_GetWhiteLabelMembershipByMemberIdAndPlatform","parameters":[{"name":"memberid","required":true,"in":"path","schema":{"type":"string"}},{"name":"platform","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetWhiteLabelMembershipOutput"}}}}}}},"/api/v1/lobyco/member-campaigns":{"get":{"operationId":"LobycoController_getMemberCampaigns","summary":"List the current member's loyalty campaigns","description":"Returns active Lobyco campaigns for the authenticated member. Optionally narrows to a single campaign by `campaignId`. Pagination via `limit` (default 50, max 100) and `offset`.","parameters":[{"name":"campaignId","required":false,"in":"query","description":"Lobyco unifiedCampaignId. When set, the response is narrowed to a single campaign (the wrapper shape is unchanged — `campaigns` is still an array with 0 or 1 entries).","example":"2026-q2-83c860f7-b3bf-4dec-bdc6-916421e95338","schema":{"maxLength":255,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max raw rows to fetch from Lobyco per page.","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Raw-row offset into the Lobyco result set.","schema":{"minimum":0,"default":0,"type":"number"}}],"responses":{"200":{"description":"Step-based campaign payload with per-step progress, campaign-level aggregate progress, and pagination metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCampaignsOutput"}}}},"400":{"description":"Invalid query parameters (e.g. `limit` outside 1–100, or `offset` < 0)."},"401":{"description":"Missing or invalid JWT — caller is not an authenticated member."}},"tags":["Lobyco loyalty"]}},"/api/v1/lobyco/member-coupons":{"get":{"operationId":"LobycoController_getMemberCoupons","summary":"List the current member's loyalty coupons","parameters":[{"name":"queryRedeemed","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMemberCouponsOutput"}}}}},"tags":["Lobyco loyalty"]}},"/api/v1/lobyco/push-trigger":{"post":{"operationId":"LobycoController_sendPushTrigger","summary":"Trigger a push notification for a member (Lobyco → HML → Klaviyo)","description":"Relays a push-notification trigger from Lobyco to HML. The body identifies the event — member (`memberId`, the bare hagarId), activity, campaign and status; HML's Klaviyo flow builds and delivers the message. Returns 202 once the trigger is queued; delivery is asynchronous.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushTriggerInput"}}}},"responses":{"202":{"description":"Trigger accepted and queued for HML."},"400":{"description":"Invalid payload."},"401":{"description":"Missing or invalid system token."}},"tags":["Lobyco loyalty"],"security":[{"bearer":[]}]}}},"info":{"title":"Olís REST endpoints","description":"Collection of endpoints to handle callbacks and redirects that should not be handled with GraphQL","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"schemas":{"LivenessOutput":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]},"AddPaymentToPassInput":{"type":"object","properties":{"cardNumber":{"type":"string"},"expMonth":{"type":"string","pattern":"/^(0[1-9]|1[0-2])$/"},"expYear":{"type":"string","pattern":"/^[0-9]{2}$/"},"securityCode":{"type":"string","minLength":3,"maxLength":4},"membershipNumber":{"type":"string"}},"required":["cardNumber","expMonth","expYear","securityCode","membershipNumber"]},"GetWhiteLabelMembershipOutput":{"type":"object","properties":{"memberId":{"type":"string"},"membershipId":{"type":"string"},"qrCode":{"type":"string"},"expiryDate":{"format":"date-time","type":"string"},"name":{"type":"string"}},"required":["memberId","membershipId"]},"ChallengeRules":{"type":"object","properties":{"measureBy":{"type":"object","nullable":true},"unit":{"type":"object","nullable":true},"singlePurchaseOnly":{"type":"boolean","nullable":true}}},"ChallengeAvailability":{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"},"chainIds":{"nullable":true,"type":"array","items":{"type":"string"}},"storeIds":{"nullable":true,"type":"array","items":{"type":"string"}},"maxActivations":{"type":"number","nullable":true}},"required":["startDate","endDate"]},"ChallengeProgress":{"type":"object","properties":{"isComplete":{"type":"boolean"},"isActive":{"type":"boolean"},"currentValue":{"type":"number"},"targetValue":{"type":"number"},"ratio":{"type":"number"},"cardId":{"type":"string","nullable":true},"activatedCount":{"type":"number"},"completedAt":{"type":"string","nullable":true},"completedCardsCount":{"type":"number","nullable":true}},"required":["isComplete","isActive","currentValue","targetValue","ratio","activatedCount"]},"LoyaltyChallengeGoal":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"backgroundImageUrl":{"type":"string","nullable":true},"termsAndConditions":{"type":"string","nullable":true},"rules":{"$ref":"#/components/schemas/ChallengeRules"},"availability":{"$ref":"#/components/schemas/ChallengeAvailability"},"progress":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ChallengeProgress"}]},"progressLabel":{"type":"string","nullable":true},"completionLabel":{"type":"string","nullable":true}},"required":["id","title","rules","availability"]},"LoyaltyReward":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"brand":{"type":"string","nullable":true},"discountLabel":{"type":"string","nullable":true},"preactivated":{"type":"boolean"},"maxRedemptions":{"type":"number","nullable":true},"defaultValidDays":{"type":"number","nullable":true}},"required":["title","preactivated"]},"StepCouponAvailability":{"type":"object","properties":{"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"chainIds":{"nullable":true,"type":"array","items":{"type":"string"}},"storeIds":{"nullable":true,"type":"array","items":{"type":"string"}}}},"LoyaltyStepCoupon":{"type":"object","properties":{"id":{"type":"string"},"isRedeemed":{"type":"boolean"},"activatedAt":{"type":"string","nullable":true},"redemptionLimit":{"type":"number","nullable":true},"redeemedCount":{"type":"number"},"availability":{"$ref":"#/components/schemas/StepCouponAvailability"}},"required":["id","isRedeemed","redeemedCount","availability"]},"LoyaltyCampaignStep":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"order":{"type":"number"},"status":{"type":"object","nullable":true},"validFrom":{"type":"string","nullable":true},"validTo":{"type":"string","nullable":true},"goal":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/LoyaltyChallengeGoal"}]},"reward":{"$ref":"#/components/schemas/LoyaltyReward"},"coupons":{"nullable":true,"type":"array","items":{"$ref":"#/components/schemas/LoyaltyStepCoupon"}}},"required":["id","order","reward"]},"LoyaltyCampaignProgress":{"type":"object","properties":{"totalSteps":{"type":"number"},"completedSteps":{"type":"number"},"completedStepIds":{"type":"array","items":{"type":"string"}},"currentStep":{"type":"number"},"currentStepId":{"type":"string","nullable":true},"currentValue":{"type":"number"},"targetValue":{"type":"number"},"ratio":{"type":"number","nullable":true}},"required":["totalSteps","completedSteps","completedStepIds","currentStep","currentValue","targetValue"]},"LoyaltyCampaign":{"type":"object","properties":{"id":{"type":"string","nullable":true},"validFrom":{"type":"string","nullable":true},"validTo":{"type":"string","nullable":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/LoyaltyCampaignStep"}},"progress":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/LoyaltyCampaignProgress"}]}},"required":["steps"]},"LoyaltyCampaignPageInfo":{"type":"object","properties":{"limit":{"type":"number"},"offset":{"type":"number"},"total":{"type":"number","nullable":true},"hasMore":{"type":"boolean"}},"required":["limit","offset","hasMore"]},"GetCampaignsOutput":{"type":"object","properties":{"campaigns":{"type":"array","items":{"$ref":"#/components/schemas/LoyaltyCampaign"}},"pageInfo":{"$ref":"#/components/schemas/LoyaltyCampaignPageInfo"}},"required":["campaigns","pageInfo"]},"LoyaltyCouponContent":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"brand":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"discountLabel":{"type":"string","nullable":true},"receiptDisplayText":{"type":"string","nullable":true}}},"LoyaltyCoupon":{"type":"object","properties":{"couponId":{"type":"string"},"campaignId":{"type":"string"},"posCouponId":{"type":"string","nullable":true},"campaignType":{"type":"string","nullable":true},"campaignContent":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/LoyaltyCouponContent"}]},"validFrom":{"type":"string","nullable":true},"validTo":{"type":"string","nullable":true},"activationTime":{"type":"string","nullable":true},"storeIds":{"nullable":true,"type":"array","items":{"type":"string"}},"chainIds":{"nullable":true,"type":"array","items":{"type":"string"}},"isRedeemed":{"type":"boolean"},"redemptionLimit":{"type":"number","nullable":true},"redeemedCount":{"type":"number","nullable":true},"displayPriority":{"type":"number","nullable":true}},"required":["couponId","campaignId","isRedeemed"]},"GetMemberCouponsOutput":{"type":"object","properties":{"coupons":{"type":"array","items":{"$ref":"#/components/schemas/LoyaltyCoupon"}}},"required":["coupons"]},"PushTriggerInput":{"type":"object","properties":{"memberId":{"type":"string","maxLength":255,"description":"Member to notify — the resolved Hagar ID (bare UUID, no `HAGAR-` prefix).","example":"4ddb5e06-2430-46a7-a3f6-39e836fce6b6"},"activityId":{"type":"string","maxLength":255,"description":"Lobyco activity that triggered the notification."},"campaignId":{"type":"string","maxLength":255,"description":"Campaign the activity belongs to."},"status":{"type":"string","maxLength":255,"description":"Activity/campaign status — drives which Klaviyo flow fires."}},"required":["memberId","activityId","campaignId","status"]}}}}