| from fastapi import FastAPI, Request, File, UploadFile, HTTPException, WebSocket, WebSocketDisconnect |
| from fastapi.middleware.cors import CORSMiddleware |
| from datetime import datetime, timedelta |
| import logging |
| import gradio as gr |
| import uvicorn |
| import random |
| import os |
| from typing import List, Dict, Any, Optional |
| import numpy as np |
| from PIL import Image |
| import io |
| import json |
| import base64 |
| import asyncio |
| import jwt |
| import httpx |
| import re |
| from bs4 import BeautifulSoup |
| from contextlib import asynccontextmanager |
| import hashlib |
| import cv2 |
|
|
| |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger(__name__) |
|
|
| |
| |
| |
| HF_TOKEN = os.getenv("HF_TOKEN") |
| client = None |
| HF_AVAILABLE = False |
|
|
| |
| try: |
| from huggingface_hub import InferenceClient |
| HF_AVAILABLE = True |
| except ImportError: |
| HF_AVAILABLE = False |
| logger.warning("huggingface_hub not available") |
|
|
| |
| if HF_TOKEN and HF_AVAILABLE: |
| try: |
| client = InferenceClient(token=HF_TOKEN) |
| logger.info("✅ HF Token found - will test during first analysis") |
| except Exception as e: |
| logger.error(f"❌ Failed to initialize client: {e}") |
| client = None |
| else: |
| logger.warning("⚠️ DEMO MODE: No HF_TOKEN found") |
|
|
| |
| |
| |
| ALL_CONDITIONS = [ |
| |
| {"id": "acne", "name": "Acne", "base_conf": 75}, |
| {"id": "blackheads", "name": "Blackheads", "base_conf": 72}, |
| {"id": "whiteheads", "name": "Whiteheads", "base_conf": 70}, |
| {"id": "papules", "name": "Papules", "base_conf": 68}, |
| {"id": "pustules", "name": "Pustules", "base_conf": 71}, |
| {"id": "cystic-acne", "name": "Cystic Acne", "base_conf": 65}, |
| {"id": "hormonal-acne", "name": "Hormonal Acne", "base_conf": 73}, |
| {"id": "fungal-acne", "name": "Fungal Acne", "base_conf": 69}, |
| {"id": "nodular-acne", "name": "Nodular Acne", "base_conf": 64}, |
| {"id": "back-acne", "name": "Back Acne", "base_conf": 70}, |
| |
| |
| {"id": "hyperpigmentation", "name": "Hyperpigmentation", "base_conf": 82}, |
| {"id": "melasma", "name": "Melasma", "base_conf": 78}, |
| {"id": "pih", "name": "Post-Inflammatory Hyperpigmentation", "base_conf": 80}, |
| {"id": "sun-spots", "name": "Sun Spots", "base_conf": 75}, |
| {"id": "age-spots", "name": "Age Spots", "base_conf": 74}, |
| {"id": "freckles", "name": "Freckles", "base_conf": 85}, |
| {"id": "dark-underarms", "name": "Dark Underarms", "base_conf": 76}, |
| {"id": "dark-knees", "name": "Dark Knees", "base_conf": 75}, |
| {"id": "dark-elbows", "name": "Dark Elbows", "base_conf": 75}, |
| |
| |
| {"id": "keratosis-pilaris", "name": "Keratosis Pilaris", "base_conf": 70}, |
| {"id": "enlarged-pores", "name": "Enlarged Pores", "base_conf": 76}, |
| {"id": "sebaceous-filaments", "name": "Sebaceous Filaments", "base_conf": 72}, |
| {"id": "milia", "name": "Milia", "base_conf": 68}, |
| {"id": "skin-tags", "name": "Skin Tags", "base_conf": 65}, |
| |
| |
| {"id": "dry-skin", "name": "Dry Skin", "base_conf": 80}, |
| {"id": "dehydrated-skin", "name": "Dehydrated Skin", "base_conf": 78}, |
| {"id": "eczema", "name": "Eczema", "base_conf": 75}, |
| {"id": "contact-dermatitis", "name": "Contact Dermatitis", "base_conf": 70}, |
| {"id": "sensitive-skin", "name": "Sensitive Skin", "base_conf": 74}, |
| {"id": "perioral-dermatitis", "name": "Perioral Dermatitis", "base_conf": 69}, |
| {"id": "seborrheic-dermatitis", "name": "Seborrheic Dermatitis", "base_conf": 73}, |
| {"id": "psoriasis", "name": "Psoriasis", "base_conf": 71}, |
| {"id": "rosacea", "name": "Rosacea", "base_conf": 72}, |
| |
| |
| {"id": "oily-skin", "name": "Oily Skin", "base_conf": 78}, |
| {"id": "combination-skin", "name": "Combination Skin", "base_conf": 76}, |
| {"id": "oily-t-zone", "name": "Oily T-Zone", "base_conf": 77}, |
| |
| |
| {"id": "fine-lines", "name": "Fine Lines", "base_conf": 74}, |
| {"id": "wrinkles", "name": "Wrinkles", "base_conf": 72}, |
| {"id": "crow-feet", "name": "Crow's Feet", "base_conf": 71}, |
| {"id": "forehead-lines", "name": "Forehead Lines", "base_conf": 70}, |
| {"id": "smile-lines", "name": "Smile Lines", "base_conf": 69}, |
| {"id": "loss-of-elasticity", "name": "Loss of Elasticity", "base_conf": 68}, |
| {"id": "sagging-skin", "name": "Sagging Skin", "base_conf": 66}, |
| {"id": "dull-skin", "name": "Dull Skin", "base_conf": 73}, |
| |
| |
| {"id": "acne-scars", "name": "Acne Scars", "base_conf": 65}, |
| {"id": "stretch-marks", "name": "Stretch Marks", "base_conf": 68}, |
| {"id": "keloid-scars", "name": "Keloid Scars", "base_conf": 64}, |
| {"id": "surgical-scars", "name": "Surgical Scars", "base_conf": 63}, |
| |
| |
| {"id": "sunburn", "name": "Sunburn", "base_conf": 77}, |
| {"id": "sun-damage", "name": "Sun Damage", "base_conf": 74}, |
| {"id": "photoaging", "name": "Photoaging", "base_conf": 72}, |
| |
| |
| {"id": "razor-bumps", "name": "Razor Bumps", "base_conf": 73}, |
| {"id": "ingrown-hairs", "name": "Ingrown Hairs", "base_conf": 72}, |
| {"id": "folliculitis", "name": "Folliculitis", "base_conf": 70}, |
| |
| |
| {"id": "dandruff", "name": "Dandruff", "base_conf": 77}, |
| {"id": "heat-rash", "name": "Heat Rash", "base_conf": 75}, |
| {"id": "tinea-versicolor", "name": "Tinea Versicolor", "base_conf": 70} |
| ] |
|
|
| |
| |
| |
| @asynccontextmanager |
| async def lifespan(app: FastAPI): |
| logger.info("🚀 Glow AI Starting up...") |
| |
| asyncio.create_task(update_all_prices_periodically()) |
| yield |
| logger.info("👋 Glow AI Shutting down...") |
|
|
| app = FastAPI( |
| title="Glow AI - Skincare & Cosmetics AI", |
| description="AI-powered skin analysis and cosmetics matching platform", |
| version="2.0.0", |
| lifespan=lifespan |
| ) |
|
|
| |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| |
| |
| |
|
|
| SECRET_KEY = os.getenv("SECRET_KEY", "your-secret-key-here-change-in-production") |
| ALGORITHM = "HS256" |
|
|
| USERS = { |
| "test@example.com": { |
| "password": "password123", |
| "name": "Test User", |
| "user_id": "usr001", |
| "created_at": datetime.utcnow().isoformat() |
| } |
| } |
|
|
| def create_access_token(data: dict): |
| to_encode = data.copy() |
| expire = datetime.utcnow() + timedelta(hours=24) |
| to_encode.update({"exp": expire}) |
| encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) |
| return encoded_jwt |
|
|
| def verify_token(token: str): |
| try: |
| payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) |
| return payload |
| except jwt.PyJWTError: |
| return None |
|
|
| |
| |
| |
|
|
| class ProductDatabase: |
| def __init__(self): |
| self.products = [] |
| self.last_updated = {} |
| self.load_all_products() |
| |
| def load_all_products(self): |
| """Load ALL 150+ products from the Nigerian market""" |
| self.products = [ |
| |
| { |
| "id": "crv001", |
| "name": "CeraVe Hydrating Cleanser", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "hydrating", |
| "size": "236ml", |
| "price": 12400, |
| "original_price": 11400, |
| "rating": 4.8, |
| "reviews": 12453, |
| "description": "Hydrating cleanser with ceramides for normal to dry skin", |
| "benefits": ["Hydrating", "Non-stripping", "Ceramides"], |
| "skin_types": ["dry", "normal", "sensitive"], |
| "ingredients": ["Ceramides", "Hyaluronic Acid", "Glycerin"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-hydrating-cleanser-236ml-8oz-uk-version", |
| "tags": ["bestseller", "dermatologist_recommended"], |
| "image_url": "/images/cerave-hydrating.jpg" |
| }, |
| { |
| "id": "crv002", |
| "name": "CeraVe Foaming Cleanser", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "foaming", |
| "size": "236ml", |
| "price": 15700, |
| "original_price": 14700, |
| "rating": 4.7, |
| "reviews": 8923, |
| "description": "Foaming cleanser for normal to oily skin", |
| "benefits": ["Removes oil", "Non-drying", "Ceramides"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Ceramides", "Niacinamide", "Glycerin"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-foaming-cleanser-uk-version-236ml-8oz", |
| "image_url": "/images/cerave-foaming.jpg" |
| }, |
| { |
| "id": "crv003", |
| "name": "CeraVe Foaming Cleanser (Family Size)", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "foaming", |
| "size": "473ml", |
| "price": 19300, |
| "original_price": 18300, |
| "rating": 4.8, |
| "reviews": 5678, |
| "description": "Foaming cleanser for normal to oily skin (family size)", |
| "benefits": ["Removes oil", "Non-drying", "Ceramides"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Ceramides", "Niacinamide", "Glycerin"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-foaming-cleanser-uk-version-473ml-16oz", |
| "image_url": "/images/cerave-foaming-family.jpg" |
| }, |
| { |
| "id": "crv004", |
| "name": "CeraVe Hydrating Cream-to-Foam Cleanser", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "hydrating", |
| "size": "236ml", |
| "price": 14600, |
| "original_price": 13600, |
| "rating": 4.7, |
| "reviews": 3456, |
| "description": "Cream-to-foam cleanser for normal to dry skin", |
| "benefits": ["Hydrating", "Non-stripping", "Ceramides"], |
| "skin_types": ["dry", "normal"], |
| "ingredients": ["Ceramides", "Hyaluronic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-hydrating-cream-to-foam-cleanser-236ml-8oz-uk-version", |
| "image_url": "/images/cerave-cream-foam.jpg" |
| }, |
| { |
| "id": "crv005", |
| "name": "CeraVe SA Smoothing Cleanser", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "exfoliating", |
| "size": "236ml", |
| "price": 15200, |
| "original_price": 14200, |
| "rating": 4.7, |
| "reviews": 6789, |
| "description": "Salicylic acid cleanser for rough, bumpy skin", |
| "benefits": ["Exfoliates", "Smooths texture", "Ceramides"], |
| "skin_types": ["rough", "acne-prone", "keratosis pilaris"], |
| "ingredients": ["Salicylic Acid", "Ceramides", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-sa-smoothing-cleanser-236ml-8oz", |
| "image_url": "/images/cerave-sa.jpg" |
| }, |
| { |
| "id": "crv006", |
| "name": "CeraVe SA Smoothing Cleanser (Family Size)", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "exfoliating", |
| "size": "473ml", |
| "price": 21900, |
| "original_price": 20900, |
| "rating": 4.8, |
| "reviews": 2345, |
| "description": "Salicylic acid cleanser (family size)", |
| "benefits": ["Exfoliates", "Smooths texture", "Ceramides"], |
| "skin_types": ["rough", "acne-prone"], |
| "ingredients": ["Salicylic Acid", "Ceramides"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-sa-smoothing-cleanser-473ml-16oz", |
| "image_url": "/images/cerave-sa-family.jpg" |
| }, |
| { |
| "id": "crv007", |
| "name": "CeraVe Blemish Control Cleanser", |
| "brand": "CeraVe", |
| "category": "cleanser", |
| "subcategory": "treatment", |
| "size": "236ml", |
| "price": 16200, |
| "original_price": 15200, |
| "rating": 4.6, |
| "reviews": 3456, |
| "description": "Blemish control cleanser with salicylic acid", |
| "benefits": ["Fights blemishes", "Exfoliates", "Ceramides"], |
| "skin_types": ["acne-prone", "oily"], |
| "ingredients": ["Salicylic Acid", "Ceramides", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-blemish-control-cleanser-236ml-8oz", |
| "image_url": "/images/cerave-blemish.jpg" |
| }, |
| { |
| "id": "crv008", |
| "name": "CeraVe Moisturising Lotion", |
| "brand": "CeraVe", |
| "category": "moisturizer", |
| "subcategory": "lotion", |
| "size": "236ml", |
| "price": 13400, |
| "original_price": 12400, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Daily moisturizing lotion with ceramides", |
| "benefits": ["Hydrating", "Lightweight", "Ceramides"], |
| "skin_types": ["normal", "dry"], |
| "ingredients": ["Ceramides", "Hyaluronic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-moisturising-lotion-236ml-8oz-uk-version", |
| "image_url": "/images/cerave-lotion.jpg" |
| }, |
| { |
| "id": "crv009", |
| "name": "CeraVe Moisturising Lotion (Family Size)", |
| "brand": "CeraVe", |
| "category": "moisturizer", |
| "subcategory": "lotion", |
| "size": "473ml", |
| "price": 20000, |
| "original_price": 19000, |
| "rating": 4.9, |
| "reviews": 12345, |
| "description": "Daily moisturizing lotion (family size)", |
| "benefits": ["Hydrating", "Lightweight", "Ceramides"], |
| "skin_types": ["normal", "dry"], |
| "ingredients": ["Ceramides", "Hyaluronic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-moisturising-lotion-473ml-16oz-uk-version", |
| "image_url": "/images/cerave-lotion-family.jpg" |
| }, |
| { |
| "id": "crv010", |
| "name": "CeraVe Moisturising Cream", |
| "brand": "CeraVe", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "340g", |
| "price": 16900, |
| "original_price": 15900, |
| "rating": 4.9, |
| "reviews": 15678, |
| "description": "Rich moisturizing cream with ceramides", |
| "benefits": ["24hr hydration", "Restores barrier", "Non-comedogenic"], |
| "skin_types": ["dry", "very dry", "normal"], |
| "ingredients": ["Ceramides", "Hyaluronic Acid", "Glycerin"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-moisturising-cream-340g-12oz-uk-version", |
| "tags": ["bestseller", "dermatologist_recommended"], |
| "image_url": "/images/cerave-cream.jpg" |
| }, |
| { |
| "id": "crv011", |
| "name": "CeraVe Moisturising Cream (Family Size)", |
| "brand": "CeraVe", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "454g", |
| "price": 20900, |
| "original_price": 19900, |
| "rating": 4.9, |
| "reviews": 8921, |
| "description": "Rich moisturizing cream (family size)", |
| "benefits": ["24hr hydration", "Restores barrier", "Non-comedogenic"], |
| "skin_types": ["dry", "very dry"], |
| "ingredients": ["Ceramides", "Hyaluronic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-moisturizing-cream-454g-16oz", |
| "image_url": "/images/cerave-cream-family.jpg" |
| }, |
| { |
| "id": "crv012", |
| "name": "CeraVe PM Facial Moisturising Lotion", |
| "brand": "CeraVe", |
| "category": "moisturizer", |
| "subcategory": "lotion", |
| "size": "52ml", |
| "price": 17000, |
| "original_price": 16000, |
| "rating": 4.8, |
| "reviews": 8921, |
| "description": "Night moisturizer with niacinamide", |
| "benefits": ["Night repair", "Niacinamide", "Oil-free"], |
| "skin_types": ["all"], |
| "ingredients": ["Niacinamide", "Ceramides", "Hyaluronic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-pm-facial-moisturising-lotion-52ml", |
| "image_url": "/images/cerave-pm.jpg" |
| }, |
| { |
| "id": "crv013", |
| "name": "CeraVe Skin Renewing Night Cream", |
| "brand": "CeraVe", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "48g", |
| "price": 30400, |
| "original_price": 29400, |
| "rating": 4.8, |
| "reviews": 3456, |
| "description": "Anti-aging night cream with peptides", |
| "benefits": ["Anti-aging", "Renews skin", "Ceramides"], |
| "skin_types": ["mature", "dry"], |
| "ingredients": ["Peptides", "Ceramides", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cerave-skin-renewing-night-cream-48g-1-7oz", |
| "image_url": "/images/cerave-renewing.jpg" |
| }, |
|
|
| |
| { |
| "id": "cos001", |
| "name": "COSRX Low pH Good Morning Gel Cleanser", |
| "brand": "COSRX", |
| "category": "cleanser", |
| "subcategory": "gel", |
| "size": "150ml", |
| "price": 10000, |
| "original_price": 9000, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Gentle low pH cleanser with tea tree oil", |
| "benefits": ["Gentle cleansing", "pH balancing", "Soothing"], |
| "skin_types": ["all", "sensitive", "acne-prone"], |
| "ingredients": ["Tea Tree Oil", "Betaine Salicylate", "BHA"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-low-ph-good-morning-cleanser", |
| "tags": ["bestseller", "kbeauty"], |
| "image_url": "/images/cosrx-lowph.jpg" |
| }, |
| { |
| "id": "cos002", |
| "name": "COSRX Salicylic Acid Daily Gentle Cleanser", |
| "brand": "COSRX", |
| "category": "cleanser", |
| "subcategory": "treatment", |
| "size": "150ml", |
| "price": 10200, |
| "original_price": 9200, |
| "rating": 4.7, |
| "reviews": 12345, |
| "description": "Salicylic acid cleanser for acne-prone skin", |
| "benefits": ["Acne treatment", "Exfoliating", "Gentle"], |
| "skin_types": ["acne-prone", "oily"], |
| "ingredients": ["Salicylic Acid", "Tea Tree Oil"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-salicylic-acid-daily-gentle-cleanser", |
| "image_url": "/images/cosrx-sa.jpg" |
| }, |
| { |
| "id": "cos003", |
| "name": "COSRX Advanced Snail 96 Mucin Power Essence", |
| "brand": "COSRX", |
| "category": "essence", |
| "subcategory": "serum", |
| "size": "100ml", |
| "price": 14700, |
| "original_price": 13700, |
| "rating": 4.9, |
| "reviews": 34567, |
| "description": "96% snail mucin essence for repairing skin", |
| "benefits": ["Repairs", "Hydrates", "Plumps"], |
| "skin_types": ["all", "damaged", "aging"], |
| "ingredients": ["Snail Secretion Filtrate", "Hyaluronic Acid", "Arginine"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-advanced-snail-96-mucin-power-essence", |
| "tags": ["bestseller", "kbeauty", "holy_grail"], |
| "image_url": "/images/cosrx-snail.jpg" |
| }, |
| { |
| "id": "cos004", |
| "name": "COSRX Advanced Snail 92 All-in-One Cream", |
| "brand": "COSRX", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "100g", |
| "price": 16300, |
| "original_price": 15300, |
| "rating": 4.8, |
| "reviews": 18765, |
| "description": "Snail mucin cream for intense hydration", |
| "benefits": ["Hydrating", "Repairing", "Soothing"], |
| "skin_types": ["dry", "damaged", "sensitive"], |
| "ingredients": ["Snail Mucin", "Hyaluronic Acid", "Betaine"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-advanced-snail-92-all-in-one-cream", |
| "tags": ["kbeauty"], |
| "image_url": "/images/cosrx-snail-cream.jpg" |
| }, |
| { |
| "id": "cos005", |
| "name": "COSRX Oil-Free Ultra Moisturizing Lotion", |
| "brand": "COSRX", |
| "category": "moisturizer", |
| "subcategory": "lotion", |
| "size": "100ml", |
| "price": 16300, |
| "original_price": 15300, |
| "rating": 4.7, |
| "reviews": 8921, |
| "description": "Oil-free lotion for oily and combination skin", |
| "benefits": ["Oil-free", "Hydrating", "Lightweight"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Birch Sap", "Tea Tree Oil"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-oil-free-ultra-moisturizing-lotion", |
| "image_url": "/images/cosrx-oilfree.jpg" |
| }, |
| { |
| "id": "cos006", |
| "name": "COSRX Full Fit Propolis Synergy Toner", |
| "brand": "COSRX", |
| "category": "toner", |
| "subcategory": "hydrating", |
| "size": "150ml", |
| "price": 13200, |
| "original_price": 12200, |
| "rating": 4.8, |
| "reviews": 6789, |
| "description": "Propolis toner for glowing skin", |
| "benefits": ["Glow", "Hydrating", "Soothing"], |
| "skin_types": ["all"], |
| "ingredients": ["Propolis", "Honey", "Royal Jelly"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-full-fit-propolis-synergy-toner-150ml", |
| "image_url": "/images/cosrx-propolis.jpg" |
| }, |
| { |
| "id": "cos007", |
| "name": "COSRX Aloe Soothing Sun Cream SPF 50", |
| "brand": "COSRX", |
| "category": "sunscreen", |
| "subcategory": "chemical", |
| "size": "50ml", |
| "price": 10900, |
| "original_price": 9900, |
| "rating": 4.7, |
| "reviews": 4567, |
| "description": "Aloe sunscreen with SPF 50", |
| "benefits": ["SPF 50", "Soothing", "Moisturizing"], |
| "skin_types": ["all", "sensitive"], |
| "ingredients": ["Aloe Vera", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-aloe-soothing-sun-cream-spf-50", |
| "image_url": "/images/cosrx-aloe-sun.jpg" |
| }, |
| { |
| "id": "cos008", |
| "name": "COSRX Acne Pimple Master Patch", |
| "brand": "COSRX", |
| "category": "treatment", |
| "subcategory": "patches", |
| "size": "24 patches", |
| "price": 6200, |
| "original_price": 5200, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Hydrocolloid patches for pimples", |
| "benefits": ["Heals pimples", "Protects", "Invisible"], |
| "skin_types": ["acne-prone"], |
| "ingredients": ["Hydrocolloid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosrx-acne-pimple-master-patch", |
| "tags": ["bestseller"], |
| "image_url": "/images/cosrx-patch.jpg" |
| }, |
|
|
| |
| { |
| "id": "ff001", |
| "name": "Face Facts Blemish Patches (Stars)", |
| "brand": "Face Facts", |
| "category": "treatment", |
| "subcategory": "patches", |
| "size": "24 patches", |
| "price": 3800, |
| "original_price": 2800, |
| "rating": 4.7, |
| "reviews": 3456, |
| "description": "Star-shaped hydrocolloid patches for blemishes", |
| "benefits": ["Heals pimples", "Protects", "Cute design"], |
| "skin_types": ["acne-prone"], |
| "ingredients": ["Hydrocolloid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-blemish-patches-stars-24-patches", |
| "image_url": "/images/ff-stars.jpg" |
| }, |
| { |
| "id": "ff002", |
| "name": "Face Facts Blemish Patches (Hearts)", |
| "brand": "Face Facts", |
| "category": "treatment", |
| "subcategory": "patches", |
| "size": "24 patches", |
| "price": 3800, |
| "original_price": 2800, |
| "rating": 4.7, |
| "reviews": 2345, |
| "description": "Heart-shaped hydrocolloid patches for blemishes", |
| "benefits": ["Heals pimples", "Protects", "Cute design"], |
| "skin_types": ["acne-prone"], |
| "ingredients": ["Hydrocolloid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-blemish-patches-hearts-24-patches", |
| "image_url": "/images/ff-hearts.jpg" |
| }, |
| { |
| "id": "ff003", |
| "name": "Face Facts Blemish Patches (Holographic Diamonds)", |
| "brand": "Face Facts", |
| "category": "treatment", |
| "subcategory": "patches", |
| "size": "24 patches", |
| "price": 3800, |
| "original_price": 2800, |
| "rating": 4.7, |
| "reviews": 1876, |
| "description": "Holographic diamond patches for blemishes", |
| "benefits": ["Heals pimples", "Protects", "Holographic"], |
| "skin_types": ["acne-prone"], |
| "ingredients": ["Hydrocolloid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-blemish-patches-holographic-diamonds-24-patches", |
| "image_url": "/images/ff-diamonds.jpg" |
| }, |
| { |
| "id": "ff004", |
| "name": "Face Facts Niacinamide Serum", |
| "brand": "Face Facts", |
| "category": "serum", |
| "subcategory": "treatment", |
| "size": "30ml", |
| "price": 4900, |
| "original_price": 3900, |
| "rating": 4.6, |
| "reviews": 4567, |
| "description": "Niacinamide serum for oil control and brightness", |
| "benefits": ["Oil control", "Brightening", "Pore refining"], |
| "skin_types": ["oily", "combination", "acne-prone"], |
| "ingredients": ["Niacinamide", "Zinc", "Panthenol"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-niacinamide-serum-30ml", |
| "tags": ["affordable"], |
| "image_url": "/images/ff-niacinamide.jpg" |
| }, |
| { |
| "id": "ff005", |
| "name": "Face Facts Ceramide Oil Control Moisturising Gel Cream", |
| "brand": "Face Facts", |
| "category": "moisturizer", |
| "subcategory": "gel_cream", |
| "size": "50ml", |
| "price": 4900, |
| "original_price": 3900, |
| "rating": 4.5, |
| "reviews": 3210, |
| "description": "Oil control gel cream with ceramides", |
| "benefits": ["Oil control", "Moisturizing", "Ceramides"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Ceramides", "Niacinamide", "Salicylic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-ceramide-oil-control-moisturising-gel-cream-50ml", |
| "image_url": "/images/ff-gel.jpg" |
| }, |
| { |
| "id": "ff006", |
| "name": "Face Facts Ceramide Oil Control Hydrating Toner", |
| "brand": "Face Facts", |
| "category": "toner", |
| "subcategory": "hydrating", |
| "size": "200ml", |
| "price": 6600, |
| "original_price": 5600, |
| "rating": 4.4, |
| "reviews": 2345, |
| "description": "Hydrating toner with ceramides", |
| "benefits": ["Hydrating", "Oil control", "Ceramides"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Ceramides", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-ceramide-oil-control-hydrating-toner-200ml", |
| "image_url": "/images/ff-toner.jpg" |
| }, |
| { |
| "id": "ff007", |
| "name": "Face Facts Ceramide Oil Control Foaming Cleanser", |
| "brand": "Face Facts", |
| "category": "cleanser", |
| "subcategory": "foaming", |
| "size": "400ml", |
| "price": 7900, |
| "original_price": 6900, |
| "rating": 4.5, |
| "reviews": 3456, |
| "description": "Foaming cleanser with ceramides", |
| "benefits": ["Oil control", "Cleansing", "Ceramides"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Ceramides", "Salicylic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-oil-control-foaming-cleanser-400ml", |
| "image_url": "/images/ff-cleanser.jpg" |
| }, |
| { |
| "id": "ff008", |
| "name": "Face Facts Soothe Body Oil", |
| "brand": "Face Facts", |
| "category": "body_oil", |
| "subcategory": "soothing", |
| "size": "200ml", |
| "price": 7500, |
| "original_price": 6500, |
| "rating": 4.6, |
| "reviews": 2345, |
| "description": "Soothing body oil with bergamot and pepper", |
| "benefits": ["Soothing", "Moisturizing", "Aromatherapy"], |
| "skin_types": ["all"], |
| "ingredients": ["Bergamot Oil", "Pepper Extract", "Vitamin E"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-soothe-body-oil-bergamot-pepper-200ml", |
| "image_url": "/images/ff-oil.jpg" |
| }, |
| { |
| "id": "ff009", |
| "name": "Face Facts Ceramide Serum", |
| "brand": "Face Facts", |
| "category": "serum", |
| "subcategory": "treatment", |
| "size": "30ml", |
| "price": 4600, |
| "original_price": 3600, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Ceramide serum for barrier repair", |
| "benefits": ["Barrier repair", "Hydrating", "Soothing"], |
| "skin_types": ["dry", "sensitive", "damaged"], |
| "ingredients": ["Ceramides", "Panthenol"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-ceramide-serum", |
| "image_url": "/images/ff-ceramide.jpg" |
| }, |
| { |
| "id": "ff010", |
| "name": "Face Facts Ceramide Repairing Serum Cream", |
| "brand": "Face Facts", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "30ml", |
| "price": 4500, |
| "original_price": 3500, |
| "rating": 4.5, |
| "reviews": 1876, |
| "description": "Serum cream with ceramides", |
| "benefits": ["Repairing", "Hydrating", "Ceramides"], |
| "skin_types": ["dry", "damaged"], |
| "ingredients": ["Ceramides", "Shea Butter"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-ceramide-repairing-serum-cream", |
| "image_url": "/images/ff-cream.jpg" |
| }, |
| { |
| "id": "ff011", |
| "name": "Face Facts Wonder Cream", |
| "brand": "Face Facts", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "50ml", |
| "price": 8200, |
| "original_price": 7200, |
| "rating": 4.6, |
| "reviews": 3456, |
| "description": "Fragrance-free wonder cream", |
| "benefits": ["Hydrating", "Soothing", "Fragrance-free"], |
| "skin_types": ["sensitive", "all"], |
| "ingredients": ["Ceramides", "Panthenol", "Shea Butter"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-wonder-cream-50ml-fragrance-free", |
| "image_url": "/images/ff-wonder.jpg" |
| }, |
| { |
| "id": "ff012", |
| "name": "Face Facts Kojic Acid Body Lotion", |
| "brand": "Face Facts", |
| "category": "body_lotion", |
| "subcategory": "brightening", |
| "size": "400ml", |
| "price": 7700, |
| "original_price": 6700, |
| "rating": 4.6, |
| "reviews": 5678, |
| "description": "Kojic acid body lotion with retinol", |
| "benefits": ["Brightening", "Even tone", "Moisturizing"], |
| "skin_types": ["all"], |
| "ingredients": ["Kojic Acid", "Retinol", "Shea Butter"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-kojic-acid-body-lotion-with-retinol-400ml", |
| "image_url": "/images/ff-kojic.jpg" |
| }, |
| { |
| "id": "ff013", |
| "name": "Face Facts Clean Skin Towels", |
| "brand": "Face Facts", |
| "category": "accessories", |
| "subcategory": "towels", |
| "size": "50 towels", |
| "price": 9300, |
| "original_price": 8300, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Disposable clean skin towels", |
| "benefits": ["Hygienic", "Convenient", "Gentle"], |
| "skin_types": ["all"], |
| "ingredients": ["Cotton"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/face-facts-clean-skin-towels-50-towels", |
| "image_url": "/images/ff-towels.jpg" |
| }, |
|
|
| |
| { |
| "id": "pan001", |
| "name": "PanOxyl Acne Foaming Wash 10% BP", |
| "brand": "PanOxyl", |
| "category": "cleanser", |
| "subcategory": "treatment", |
| "size": "156g", |
| "price": 17500, |
| "original_price": 16500, |
| "rating": 4.7, |
| "reviews": 12345, |
| "description": "10% benzoyl peroxide foaming wash for acne", |
| "benefits": ["Kills acne bacteria", "Unclogs pores", "Fast acting"], |
| "skin_types": ["acne-prone", "oily"], |
| "ingredients": ["Benzoyl Peroxide 10%", "Glycerin"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/panoxyl-acne-foaming-wash-benzoyl-peroxide-10", |
| "tags": ["dermatologist_recommended", "acne"], |
| "image_url": "/images/panoxyl-10.jpg" |
| }, |
| { |
| "id": "pan002", |
| "name": "PanOxyl Acne Creamy Wash 4% BP", |
| "brand": "PanOxyl", |
| "category": "cleanser", |
| "subcategory": "treatment", |
| "size": "170g", |
| "price": 17500, |
| "original_price": 16500, |
| "rating": 4.6, |
| "reviews": 8765, |
| "description": "4% benzoyl peroxide creamy wash for sensitive acne-prone skin", |
| "benefits": ["Gentle on skin", "Fights acne", "Moisturizing"], |
| "skin_types": ["acne-prone", "sensitive"], |
| "ingredients": ["Benzoyl Peroxide 4%"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/panoxyl-acne-creamy-wash-benzoyl-peroxide-4", |
| "image_url": "/images/panoxyl-4.jpg" |
| }, |
| { |
| "id": "pan003", |
| "name": "PanOxyl Clarifying Exfoliant", |
| "brand": "PanOxyl", |
| "category": "exfoliant", |
| "subcategory": "liquid", |
| "size": "118ml", |
| "price": 18100, |
| "original_price": 17100, |
| "rating": 4.5, |
| "reviews": 4567, |
| "description": "2% salicylic acid clarifying exfoliant", |
| "benefits": ["Exfoliates", "Unclogs pores", "Clarifies"], |
| "skin_types": ["acne-prone", "oily"], |
| "ingredients": ["Salicylic Acid 2%"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/panoxyl-clarifying-exfoliant-2-salicylic-acid-118ml-4oz", |
| "image_url": "/images/panoxyl-exfoliant.jpg" |
| }, |
|
|
| |
| { |
| "id": "boj001", |
| "name": "Beauty of Joseon Glow Deep Serum", |
| "brand": "Beauty of Joseon", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 14400, |
| "original_price": 13400, |
| "rating": 4.8, |
| "reviews": 15678, |
| "description": "Rice and alpha arbutin serum for brightening", |
| "benefits": ["Brightening", "Dark spot correction", "Glowing"], |
| "skin_types": ["all", "hyperpigmentation"], |
| "ingredients": ["Rice Extract", "Alpha Arbutin", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/beauty-of-joseon-glow-deep-serum-rice-alpha-arbutin-30ml", |
| "tags": ["kbeauty"], |
| "image_url": "/images/boj-deep.jpg" |
| }, |
| { |
| "id": "boj002", |
| "name": "Beauty of Joseon Glow Serum", |
| "brand": "Beauty of Joseon", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 14400, |
| "original_price": 13400, |
| "rating": 4.8, |
| "reviews": 12345, |
| "description": "Propolis and niacinamide glow serum", |
| "benefits": ["Glow", "Brightening", "Soothing"], |
| "skin_types": ["all"], |
| "ingredients": ["Propolis", "Niacinamide", "Rice Extract"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/beauty-of-joseon-glow-serum-propolis-niacinamide-30ml", |
| "image_url": "/images/boj-glow.jpg" |
| }, |
| { |
| "id": "boj003", |
| "name": "Beauty of Joseon Relief Sun SPF 50", |
| "brand": "Beauty of Joseon", |
| "category": "sunscreen", |
| "subcategory": "chemical", |
| "size": "50ml", |
| "price": 15700, |
| "original_price": 14700, |
| "rating": 4.9, |
| "reviews": 23456, |
| "description": "Rice and probiotics sunscreen with SPF 50", |
| "benefits": ["SPF 50", "Moisturizing", "No white cast"], |
| "skin_types": ["all", "sensitive"], |
| "ingredients": ["Rice Extract", "Probiotics", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/beauty-of-joseon-relief-sun-rice-probiotics-spf-50-50ml", |
| "tags": ["bestseller", "kbeauty", "viral"], |
| "image_url": "/images/boj-sunscreen.jpg" |
| }, |
| { |
| "id": "boj004", |
| "name": "Beauty of Joseon Glow Replenishing Rice Milk", |
| "brand": "Beauty of Joseon", |
| "category": "toner", |
| "subcategory": "hydrating", |
| "size": "150ml", |
| "price": 10000, |
| "original_price": 9000, |
| "rating": 4.7, |
| "reviews": 5678, |
| "description": "Rice milk toner for glowing skin", |
| "benefits": ["Glow", "Hydrating", "Soothing"], |
| "skin_types": ["all"], |
| "ingredients": ["Rice Milk", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/beauty-of-joseon-glow-replenishing-rice-milk-150ml", |
| "image_url": "/images/boj-rice.jpg" |
| }, |
|
|
| |
| { |
| "id": "anua001", |
| "name": "Anua Niacinamide 10 + TXA 4 Serum", |
| "brand": "Anua", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 19900, |
| "original_price": 18900, |
| "rating": 4.8, |
| "reviews": 5678, |
| "description": "Niacinamide and tranexamic acid serum for dark spots", |
| "benefits": ["Dark spot correction", "Brightening", "Even tone"], |
| "skin_types": ["hyperpigmentation", "all"], |
| "ingredients": ["Niacinamide 10%", "Tranexamic Acid 4%"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/anua-niacinamide-10-txa-4-serum-30ml", |
| "tags": ["kbeauty", "viral"], |
| "image_url": "/images/anua.jpg" |
| }, |
|
|
| |
| { |
| "id": "baf001", |
| "name": "Balance Active Formula Salicylic Acid + Zinc Clarifying Toner", |
| "brand": "Balance Active Formula", |
| "category": "toner", |
| "subcategory": "exfoliating", |
| "size": "200ml", |
| "price": 9500, |
| "original_price": 8500, |
| "rating": 4.5, |
| "reviews": 3456, |
| "description": "Salicylic acid toner for oily and acne-prone skin", |
| "benefits": ["Exfoliates", "Unclogs pores", "Oil control"], |
| "skin_types": ["oily", "acne-prone"], |
| "ingredients": ["Salicylic Acid", "Zinc", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/balance-salicylic-acid-zinc-clarifying-toner-200ml", |
| "image_url": "/images/balance-toner.jpg" |
| }, |
| { |
| "id": "baf002", |
| "name": "Balance Active Formula Niacinamide Blemish Recovery Serum", |
| "brand": "Balance Active Formula", |
| "category": "serum", |
| "subcategory": "treatment", |
| "size": "30ml", |
| "price": 9500, |
| "original_price": 8500, |
| "rating": 4.5, |
| "reviews": 4321, |
| "description": "Niacinamide serum for blemish recovery", |
| "benefits": ["Reduces blemishes", "Oil control", "Brightening"], |
| "skin_types": ["acne-prone", "oily"], |
| "ingredients": ["Niacinamide", "Zinc", "Panthenol"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/balance-active-formula-niacinamide-blemish-recovery-serum-30ml-1oz", |
| "image_url": "/images/balance-niacinamide.jpg" |
| }, |
|
|
| |
| { |
| "id": "ord001", |
| "name": "The Ordinary Glycolic Acid 7% Exfoliating Toner", |
| "brand": "The Ordinary", |
| "category": "toner", |
| "subcategory": "exfoliating", |
| "size": "100ml", |
| "price": 19100, |
| "original_price": 18100, |
| "rating": 4.7, |
| "reviews": 23456, |
| "description": "Glycolic acid toner for skin texture and brightness", |
| "benefits": ["Exfoliates", "Brightens", "Smooths texture"], |
| "skin_types": ["normal", "oily", "combination"], |
| "ingredients": ["Glycolic Acid 7%", "Ginseng", "Aloe Vera"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/the-ordinary-glycolic-acid-7-exfoliating-toner-100ml", |
| "tags": ["the_ordinary", "cult_favorite"], |
| "image_url": "/images/ordinary-glycolic.jpg" |
| }, |
| { |
| "id": "ord002", |
| "name": "The Ordinary Niacinamide 10% + Zinc 1%", |
| "brand": "The Ordinary", |
| "category": "serum", |
| "subcategory": "treatment", |
| "size": "30ml", |
| "price": 16200, |
| "original_price": 15200, |
| "rating": 4.8, |
| "reviews": 45678, |
| "description": "High-strength niacinamide serum for blemishes", |
| "benefits": ["Oil control", "Blemishes", "Brightening"], |
| "skin_types": ["oily", "acne-prone"], |
| "ingredients": ["Niacinamide 10%", "Zinc 1%"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/the-ordinary-niacinamide-10-zinc-1-serum", |
| "tags": ["bestseller"], |
| "image_url": "/images/ordinary-niacinamide.jpg" |
| }, |
| { |
| "id": "ord003", |
| "name": "The Ordinary Hyaluronic Acid 2% + B5", |
| "brand": "The Ordinary", |
| "category": "serum", |
| "subcategory": "hydrating", |
| "size": "30ml", |
| "price": 15800, |
| "original_price": 14800, |
| "rating": 4.7, |
| "reviews": 34567, |
| "description": "Hydrating serum with hyaluronic acid", |
| "benefits": ["Hydrating", "Plumping", "Smoothing"], |
| "skin_types": ["dry", "dehydrated", "all"], |
| "ingredients": ["Hyaluronic Acid", "Vitamin B5"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/the-ordinary-hyaluronic-acid-2-b5", |
| "image_url": "/images/ordinary-ha.jpg" |
| }, |
|
|
| |
| { |
| "id": "kor001", |
| "name": "Acwell Licorice pH Balancing Cleansing Toner", |
| "brand": "Acwell", |
| "category": "toner", |
| "subcategory": "balancing", |
| "size": "300ml", |
| "price": 16800, |
| "original_price": 15800, |
| "rating": 4.7, |
| "reviews": 4567, |
| "description": "Licorice toner for pH balancing and brightening", |
| "benefits": ["pH balancing", "Brightening", "Soothing"], |
| "skin_types": ["all"], |
| "ingredients": ["Licorice Root", "Niacinamide", "Green Tea"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/acwell-licorice-ph-balancing-cleansing-toner-300ml", |
| "image_url": "/images/acwell.jpg" |
| }, |
| { |
| "id": "kor002", |
| "name": "Isntree Hyaluronic Acid Watery Sun Gel SPF 50", |
| "brand": "Isntree", |
| "category": "sunscreen", |
| "subcategory": "chemical", |
| "size": "50ml", |
| "price": 16200, |
| "original_price": 15200, |
| "rating": 4.8, |
| "reviews": 6789, |
| "description": "Hyaluronic acid sunscreen with SPF 50", |
| "benefits": ["SPF 50", "Hydrating", "No white cast"], |
| "skin_types": ["all", "dry"], |
| "ingredients": ["Hyaluronic Acid", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/isntree-hyaluronic-acid-watery-sun-gel-spf-50-50ml", |
| "tags": ["kbeauty", "sunscreen"], |
| "image_url": "/images/isntree.jpg" |
| }, |
| { |
| "id": "kor003", |
| "name": "La Roche-Posay Anthelios UVMune 400 Oil Control Sunscreen", |
| "brand": "La Roche-Posay", |
| "category": "sunscreen", |
| "subcategory": "chemical", |
| "size": "50ml", |
| "price": 21100, |
| "original_price": 20100, |
| "rating": 4.8, |
| "reviews": 8901, |
| "description": "Oil control sunscreen with SPF 50", |
| "benefits": ["SPF 50", "Oil control", "Matte finish"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Mexoryl 400", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/la-roche-posay-anthelios-uvmune-400-oil-control-gel-cream-spf-50-50ml", |
| "image_url": "/images/lrp-sunscreen.jpg" |
| }, |
| { |
| "id": "kor004", |
| "name": "Jumiso Snail Mucin 88 + Peptide Cream", |
| "brand": "Jumiso", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "30ml", |
| "price": 10200, |
| "original_price": 9200, |
| "rating": 4.6, |
| "reviews": 3456, |
| "description": "Snail mucin cream with peptides", |
| "benefits": ["Hydrating", "Repairing", "Plumping"], |
| "skin_types": ["dry", "damaged", "aging"], |
| "ingredients": ["Snail Mucin 88%", "Peptides"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/jumiso-snail-mucin-88-peptide-cream-30ml", |
| "image_url": "/images/jumiso.jpg" |
| }, |
| { |
| "id": "kor005", |
| "name": "Axis Y Dark Spot Correcting Glow Serum", |
| "brand": "Axis Y", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "50ml", |
| "price": 13200, |
| "original_price": 12200, |
| "rating": 4.8, |
| "reviews": 12345, |
| "description": "Niacinamide serum for dark spots and glow", |
| "benefits": ["Dark spot correction", "Glow", "Brightening"], |
| "skin_types": ["hyperpigmentation", "all"], |
| "ingredients": ["Niacinamide", "Arbutin", "Sea Buckthorn"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/axis-y-dark-spot-correcting-glow-serum-50ml", |
| "tags": ["kbeauty", "viral"], |
| "image_url": "/images/axis-y.jpg" |
| }, |
| { |
| "id": "kor006", |
| "name": "Revox B77 Just Alpha Arbutin 2% + HA Serum", |
| "brand": "Revox", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 12300, |
| "original_price": 11300, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Alpha arbutin serum with hyaluronic acid", |
| "benefits": ["Brightening", "Dark spot correction", "Hydrating"], |
| "skin_types": ["hyperpigmentation"], |
| "ingredients": ["Alpha Arbutin 2%", "Hyaluronic Acid"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/revox-b77-just-alpha-arbutin-2-ha-brightening-serum-30ml", |
| "image_url": "/images/revox.jpg" |
| }, |
| { |
| "id": "kor007", |
| "name": "Mary & May Tranexamic Acid + Glutathione Eye Cream", |
| "brand": "Mary & May", |
| "category": "eye_cream", |
| "subcategory": "brightening", |
| "size": "12g", |
| "price": 6200, |
| "original_price": 5200, |
| "rating": 4.5, |
| "reviews": 1876, |
| "description": "Eye cream with tranexamic acid and glutathione", |
| "benefits": ["Brightening", "Dark circle reduction", "Hydrating"], |
| "skin_types": ["all"], |
| "ingredients": ["Tranexamic Acid", "Glutathione", "Adenosine"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/mary-may-tranexamic-acid-glutathione-eye-cream-12g", |
| "image_url": "/images/mary-may.jpg" |
| }, |
|
|
| |
| { |
| "id": "gar001", |
| "name": "Garnier Bright Complete Extra Body Lotion", |
| "brand": "Garnier", |
| "category": "body_lotion", |
| "subcategory": "brightening", |
| "size": "400ml", |
| "price": 9500, |
| "original_price": 8500, |
| "rating": 4.5, |
| "reviews": 7890, |
| "description": "Brightening body lotion with vitamin C", |
| "benefits": ["Brightening", "Moisturizing", "Vitamin C"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C", "Shea Butter"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/garnier-bright-complete-extra-body-lotion-400ml", |
| "image_url": "/images/garnier-body.jpg" |
| }, |
| { |
| "id": "gar002", |
| "name": "Garnier Even & Matte Vitamin C Booster Serum", |
| "brand": "Garnier", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 10000, |
| "original_price": 9000, |
| "rating": 4.4, |
| "reviews": 5678, |
| "description": "Vitamin C serum for even and matte skin", |
| "benefits": ["Brightening", "Oil control", "Vitamin C"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Vitamin C", "Salicylic Acid"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/garnier-vitamin-c-serum", |
| "image_url": "/images/garnier-serum.jpg" |
| }, |
|
|
| |
| { |
| "id": "koj001", |
| "name": "Kojie San Lightening Body Lotion SPF 25", |
| "brand": "Kojie San", |
| "category": "body_lotion", |
| "subcategory": "brightening", |
| "size": "250g", |
| "price": 14500, |
| "original_price": 13500, |
| "rating": 4.6, |
| "reviews": 6789, |
| "description": "Lightening body lotion with SPF 25", |
| "benefits": ["Brightening", "SPF 25", "Moisturizing"], |
| "skin_types": ["all"], |
| "ingredients": ["Kojic Acid", "SPF 25"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/kojie-san-lightening-body-lotion-spf-25-250g", |
| "image_url": "/images/kojie-lotion.jpg" |
| }, |
| { |
| "id": "koj002", |
| "name": "Kojie San Soap", |
| "brand": "Kojie San", |
| "category": "body_soap", |
| "subcategory": "brightening", |
| "size": "100g x 3", |
| "price": 7600, |
| "original_price": 6600, |
| "rating": 4.5, |
| "reviews": 12345, |
| "description": "Kojic acid soap for brightening", |
| "benefits": ["Brightening", "Exfoliating", "Kojic Acid"], |
| "skin_types": ["all"], |
| "ingredients": ["Kojic Acid", "Papaya Extract"], |
| "in_stock": True, |
| "store": "buybetter.ng", |
| "url": "https://buybetter.ng/kojie-san-soap", |
| "image_url": "/images/kojie-soap.jpg" |
| }, |
|
|
| |
| { |
| "id": "vas001", |
| "name": "Vaseline Body Oil", |
| "brand": "Vaseline", |
| "category": "body_oil", |
| "subcategory": "moisturizing", |
| "size": "200ml", |
| "price": 8500, |
| "original_price": 7500, |
| "rating": 4.5, |
| "reviews": 23456, |
| "description": "Hydrating body oil with petroleum jelly", |
| "benefits": ["Hydrating", "Glowing", "Non-greasy"], |
| "skin_types": ["dry", "all"], |
| "ingredients": ["Petroleum Jelly", "Mineral Oil", "Vitamin E"], |
| "in_stock": True, |
| "store": "buybetter.ng", |
| "url": "https://buybetter.ng/vaseline-body-oil", |
| "image_url": "/images/vaseline-oil.jpg" |
| }, |
|
|
| |
| { |
| "id": "aks001", |
| "name": "Advanced Korean Skin Bright & Clear Body Gel Wash", |
| "brand": "Advanced Korean Skin", |
| "category": "body_wash", |
| "subcategory": "brightening", |
| "size": "1200ml", |
| "price": 12500, |
| "original_price": 11500, |
| "rating": 4.5, |
| "reviews": 3456, |
| "description": "Brightening body gel wash with papaya", |
| "benefits": ["Brightening", "Cleansing", "Refreshing"], |
| "skin_types": ["all"], |
| "ingredients": ["Papaya Extract", "Vitamin C"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/advanced-korean-skin-bright-clear-body-gel-wash-papaya-1200ml", |
| "image_url": "/images/aks-papaya.jpg" |
| }, |
| { |
| "id": "aks002", |
| "name": "Advanced Korean Skin Bright & Fair Body Gel Wash", |
| "brand": "Advanced Korean Skin", |
| "category": "body_wash", |
| "subcategory": "brightening", |
| "size": "1200ml", |
| "price": 12500, |
| "original_price": 11500, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Brightening body gel wash with vitamin C", |
| "benefits": ["Brightening", "Cleansing", "Refreshing"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C", "Citrus Extracts"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/advanced-korean-skin-bright-clear-body-gel-wash-vitamin-c-1200ml", |
| "image_url": "/images/aks-vitamin.jpg" |
| }, |
| { |
| "id": "aks003", |
| "name": "Advanced Korean Skin Brighter Face Cream", |
| "brand": "Advanced Korean Skin", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "100g", |
| "price": 10600, |
| "original_price": 9600, |
| "rating": 4.4, |
| "reviews": 1876, |
| "description": "Brightening face cream", |
| "benefits": ["Brightening", "Moisturizing", "Even tone"], |
| "skin_types": ["all"], |
| "ingredients": ["Niacinamide", "Vitamin C"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/advanced-korean-skin-brighter-face-cream-100g", |
| "image_url": "/images/aks-brighter.jpg" |
| }, |
| { |
| "id": "aks004", |
| "name": "Advanced Korean Skin Active Fair Face Cream", |
| "brand": "Advanced Korean Skin", |
| "category": "moisturizer", |
| "subcategory": "cream", |
| "size": "100g", |
| "price": 10600, |
| "original_price": 9600, |
| "rating": 4.4, |
| "reviews": 1654, |
| "description": "Active fair face cream for brightening", |
| "benefits": ["Brightening", "Moisturizing", "Active formula"], |
| "skin_types": ["all"], |
| "ingredients": ["Kojic Acid", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/advanced-korean-skin-active-fair-face-cream-100g", |
| "image_url": "/images/aks-fair.jpg" |
| }, |
| { |
| "id": "aks005", |
| "name": "Advanced Korean Skin Brightest Body Oil", |
| "brand": "Advanced Korean Skin", |
| "category": "body_oil", |
| "subcategory": "brightening", |
| "size": "280ml", |
| "price": 10000, |
| "original_price": 9000, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Brightest body oil for glowing skin", |
| "benefits": ["Glowing", "Brightening", "Hydrating"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C", "Oils blend"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/advanced-korean-skin-brightest-body-oil-280ml", |
| "image_url": "/images/aks-brightest.jpg" |
| }, |
| { |
| "id": "aks006", |
| "name": "Advanced Korean Skin Fairest Body Oil", |
| "brand": "Advanced Korean Skin", |
| "category": "body_oil", |
| "subcategory": "brightening", |
| "size": "280ml", |
| "price": 10000, |
| "original_price": 9000, |
| "rating": 4.5, |
| "reviews": 1987, |
| "description": "Fairest body oil for even skin tone", |
| "benefits": ["Even tone", "Brightening", "Hydrating"], |
| "skin_types": ["all"], |
| "ingredients": ["Kojic Acid", "Vitamin E"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/advanced-korean-skin-fairest-body-oil-280ml", |
| "image_url": "/images/aks-fairest.jpg" |
| }, |
|
|
| |
| { |
| "id": "niu001", |
| "name": "Niu Skin Total Effects Platinum White Body Lotion", |
| "brand": "Niu Skin", |
| "category": "body_lotion", |
| "subcategory": "brightening", |
| "size": "480ml", |
| "price": 7500, |
| "original_price": 6500, |
| "rating": 4.6, |
| "reviews": 3456, |
| "description": "Brightening body lotion with oud wood scent", |
| "benefits": ["Brightening", "Moisturizing", "Long lasting"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C", "Kojic Acid", "Shea Butter"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/niu-skin-total-effects-platinum-white-perfumed-body-lotion-oud-wood-480ml", |
| "tags": ["nigerian_brand", "body_care"], |
| "image_url": "/images/niu-lotion.jpg" |
| }, |
| { |
| "id": "niu002", |
| "name": "Niu Skin Total Effects Platinum White Intensive Serum", |
| "brand": "Niu Skin", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 5600, |
| "original_price": 4600, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Intensive brightening serum for face", |
| "benefits": ["Brightening", "Dark spot correction", "Glow"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C", "Kojic Acid", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/niu-skin-total-effects-platinum-white-intensive-serum-30ml", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/niu-serum.jpg" |
| }, |
| { |
| "id": "niu003", |
| "name": "Niu Skin Total Effects Platinum White Face Essence Lotion", |
| "brand": "Niu Skin", |
| "category": "moisturizer", |
| "subcategory": "lotion", |
| "size": "30ml", |
| "price": 5600, |
| "original_price": 4600, |
| "rating": 4.4, |
| "reviews": 1876, |
| "description": "Face essence lotion for brightening", |
| "benefits": ["Brightening", "Hydrating", "Essence"], |
| "skin_types": ["all"], |
| "ingredients": ["Niacinamide", "Vitamin C"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/niu-skin-total-effects-platinum-white-face-essence-lotion", |
| "image_url": "/images/niu-essence.jpg" |
| }, |
| { |
| "id": "niu004", |
| "name": "Niu Skin Glowing Body Wash", |
| "brand": "Niu Skin", |
| "category": "body_wash", |
| "subcategory": "glowing", |
| "size": "800ml", |
| "price": 8500, |
| "original_price": 7500, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Glowing body wash for radiant skin", |
| "benefits": ["Glowing", "Cleansing", "Moisturizing"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C", "Natural Oils"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/niu-skin-glowing-body-wash-800ml", |
| "image_url": "/images/niu-wash.jpg" |
| }, |
|
|
| |
| { |
| "id": "zaron001", |
| "name": "Skin by Zaron Skin Glow Therapy Ultra Moisturizing Body Lotion", |
| "brand": "Zaron", |
| "category": "body_lotion", |
| "subcategory": "moisturizing", |
| "size": "500ml", |
| "price": 14700, |
| "original_price": 13700, |
| "rating": 4.7, |
| "reviews": 4567, |
| "description": "Ultra moisturizing body lotion for glow", |
| "benefits": ["Moisturizing", "Glow", "Nourishing"], |
| "skin_types": ["dry", "normal"], |
| "ingredients": ["Shea Butter", "Vitamin E", "Coconut Oil"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/skin-by-zaron-skin-glow-therapy-ultra-moisturizing-body-lotion-500ml", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/zaron-lotion.jpg" |
| }, |
| { |
| "id": "zaron002", |
| "name": "Zaron Liquid Foundation", |
| "brand": "Zaron", |
| "category": "foundation", |
| "subcategory": "liquid", |
| "shades": 10, |
| "price": 10500, |
| "original_price": 9500, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Liquid foundation for flawless finish", |
| "benefits": ["Flawless finish", "Buildable", "Natural"], |
| "skin_types": ["all"], |
| "in_stock": True, |
| "store": "Zaron", |
| "url": "https://zaroncosmetics.com/product/liquid-foundation", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/zaron-foundation.jpg" |
| }, |
| { |
| "id": "zaron003", |
| "name": "Zaron Velvet Lipstick", |
| "brand": "Zaron", |
| "category": "lipstick", |
| "subcategory": "velvet", |
| "shades": 10, |
| "price": 6200, |
| "original_price": 5200, |
| "rating": 4.5, |
| "reviews": 1876, |
| "description": "Velvet finish lipstick for everyday wear", |
| "benefits": ["Velvet finish", "Hydrating", "Long-wear"], |
| "in_stock": True, |
| "store": "Zaron", |
| "url": "https://zaroncosmetics.com/product/velvet-lipstick", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/zaron-lipstick.jpg" |
| }, |
|
|
| |
| { |
| "id": "cosmo001", |
| "name": "Cosmo Glow White Skin Perfector Whitening Body Lotion", |
| "brand": "Cosmo", |
| "category": "body_lotion", |
| "subcategory": "brightening", |
| "size": "500ml", |
| "price": 8500, |
| "original_price": 7500, |
| "rating": 4.4, |
| "reviews": 2345, |
| "description": "Whitening body lotion for even skin tone", |
| "benefits": ["Brightening", "Whitening", "Moisturizing"], |
| "skin_types": ["all"], |
| "ingredients": ["Kojic Acid", "Vitamin C"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/cosmo-glow-white-skin-perfector-whitening-body-lotion-500ml", |
| "image_url": "/images/cosmo.jpg" |
| }, |
|
|
| |
| { |
| "id": "bf001", |
| "name": "Beauty Formulas Illuminating Serum 10% Niacinamide", |
| "brand": "Beauty Formulas", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 4500, |
| "original_price": 3500, |
| "rating": 4.4, |
| "reviews": 5678, |
| "description": "Affordable niacinamide serum for brightening", |
| "benefits": ["Brightening", "Oil control", "Affordable"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Niacinamide 10%"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/beauty-formulas-illuminating-serum-10-niacinamide-30ml", |
| "image_url": "/images/bf-niacinamide.jpg" |
| }, |
| { |
| "id": "bf002", |
| "name": "Beauty Formulas Glowing Serum 2% Vitamin C", |
| "brand": "Beauty Formulas", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "30ml", |
| "price": 4500, |
| "original_price": 3500, |
| "rating": 4.3, |
| "reviews": 4567, |
| "description": "Affordable vitamin C serum for glow", |
| "benefits": ["Glow", "Brightening", "Affordable"], |
| "skin_types": ["all"], |
| "ingredients": ["Vitamin C 2%"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/beauty-formulas-glowing-serum-2-vitamin-c-30ml", |
| "image_url": "/images/bf-vitamin.jpg" |
| }, |
|
|
| |
| { |
| "id": "tree001", |
| "name": "Tree Hut Foaming Gel Body Wash", |
| "brand": "Tree Hut", |
| "category": "body_wash", |
| "subcategory": "foaming", |
| "size": "532ml", |
| "price": 18000, |
| "original_price": 17000, |
| "rating": 4.7, |
| "reviews": 4567, |
| "description": "Foaming gel body wash in Moroccan rose", |
| "benefits": ["Foaming", "Hydrating", "Aromatherapy"], |
| "skin_types": ["all"], |
| "ingredients": ["Shea Butter", "Rose Oil"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/tree-hut-foaming-gel-body-wash-moroccan-rose-532ml", |
| "image_url": "/images/treehut.jpg" |
| }, |
|
|
| |
| { |
| "id": "aplb001", |
| "name": "APLB Glutathione Niacinamide Body Wash", |
| "brand": "APLB", |
| "category": "body_wash", |
| "subcategory": "brightening", |
| "size": "300ml", |
| "price": 10400, |
| "original_price": 9400, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Body wash with glutathione and niacinamide", |
| "benefits": ["Brightening", "Glutathione", "Niacinamide"], |
| "skin_types": ["all"], |
| "ingredients": ["Glutathione", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/aplb-glutathione-niacinamide-body-wash-300ml", |
| "image_url": "/images/aplb-wash.jpg" |
| }, |
| { |
| "id": "aplb002", |
| "name": "APLB Glutathione Niacinamide Body Lotion", |
| "brand": "APLB", |
| "category": "body_lotion", |
| "subcategory": "brightening", |
| "size": "300ml", |
| "price": 10400, |
| "original_price": 9400, |
| "rating": 4.5, |
| "reviews": 1987, |
| "description": "Body lotion with glutathione and niacinamide", |
| "benefits": ["Brightening", "Glutathione", "Niacinamide"], |
| "skin_types": ["all"], |
| "ingredients": ["Glutathione", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/aplb-glutathione-niacinamide-body-lotion-300ml", |
| "image_url": "/images/aplb-lotion.jpg" |
| }, |
|
|
| |
| { |
| "id": "lrp001", |
| "name": "La Roche-Posay Mela B3 Serum", |
| "brand": "La Roche-Posay", |
| "category": "serum", |
| "subcategory": "brightening", |
| "size": "10ml", |
| "price": 17000, |
| "original_price": 16000, |
| "rating": 4.8, |
| "reviews": 4567, |
| "description": "Dark spot corrector serum with Mela B3", |
| "benefits": ["Dark spot correction", "Brightening", "Even tone"], |
| "skin_types": ["hyperpigmentation"], |
| "ingredients": ["Mela B3", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/la-roche-posay-mela-b3-serum-dark-spot-corrector-10ml", |
| "image_url": "/images/lrp-mela.jpg" |
| }, |
| { |
| "id": "lrp002", |
| "name": "La Roche-Posay Anthelios UVMune 400 Oil Control Sunscreen", |
| "brand": "La Roche-Posay", |
| "category": "sunscreen", |
| "subcategory": "chemical", |
| "size": "50ml", |
| "price": 21100, |
| "original_price": 20100, |
| "rating": 4.8, |
| "reviews": 6789, |
| "description": "Oil control sunscreen with SPF 50", |
| "benefits": ["SPF 50", "Oil control", "Matte finish"], |
| "skin_types": ["oily", "combination"], |
| "ingredients": ["Mexoryl 400", "Niacinamide"], |
| "in_stock": True, |
| "store": "24eleven.ng", |
| "url": "https://www.24eleven.ng/la-roche-posay-anthelios-uvmune-400-oil-control-gel-cream-spf-50-50ml", |
| "image_url": "/images/lrp-sunscreen.jpg" |
| }, |
|
|
| |
| { |
| "id": "fnd001", |
| "name": "Fenty Beauty Pro Filt'r Soft Matte Foundation", |
| "brand": "Fenty Beauty", |
| "category": "foundation", |
| "subcategory": "matte", |
| "shades": 50, |
| "price": 29500, |
| "original_price": 28500, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Soft matte foundation with 50 shades for all skin tones", |
| "benefits": ["Transfer-resistant", "Buildable", "Natural matte"], |
| "skin_types": ["oily", "combination"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/fenty-foundation", |
| "image_url": "/images/fenty-foundation.jpg" |
| }, |
| { |
| "id": "fnd002", |
| "name": "Maybelline Fit Me Matte Foundation", |
| "brand": "Maybelline", |
| "category": "foundation", |
| "subcategory": "matte", |
| "shades": 16, |
| "price": 10500, |
| "original_price": 9500, |
| "rating": 4.6, |
| "reviews": 56789, |
| "description": "Pore-minimizing foundation for normal to oily skin", |
| "benefits": ["Pore-minimizing", "Matte finish", "Affordable"], |
| "skin_types": ["oily", "combination"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/maybelline-fit-me", |
| "image_url": "/images/maybelline-fitme.jpg" |
| }, |
| { |
| "id": "fnd003", |
| "name": "MAC Studio Fix Fluid Foundation", |
| "brand": "MAC", |
| "category": "foundation", |
| "subcategory": "matte", |
| "shades": 50, |
| "price": 25500, |
| "original_price": 24500, |
| "rating": 4.7, |
| "reviews": 34567, |
| "description": "Oil-controlling foundation with medium to full coverage", |
| "benefits": ["Oil-control", "Buildable", "Long-wear"], |
| "skin_types": ["oily", "combination"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-foundation", |
| "image_url": "/images/mac-foundation.jpg" |
| }, |
| { |
| "id": "fnd004", |
| "name": "Estée Lauder Double Wear Foundation", |
| "brand": "Estée Lauder", |
| "category": "foundation", |
| "subcategory": "longwear", |
| "shades": 40, |
| "price": 36000, |
| "original_price": 35000, |
| "rating": 4.9, |
| "reviews": 45678, |
| "description": "24-hour wear foundation with oil-free formula", |
| "benefits": ["24hr wear", "Transfer-resistant", "Natural finish"], |
| "skin_types": ["all"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/estee-lauder-foundation", |
| "image_url": "/images/estee-foundation.jpg" |
| }, |
| { |
| "id": "fnd005", |
| "name": "L'Oreal Paris Infallible Fresh Wear Foundation", |
| "brand": "L'Oreal Paris", |
| "category": "foundation", |
| "subcategory": "longwear", |
| "shades": 20, |
| "price": 15500, |
| "original_price": 14500, |
| "rating": 4.6, |
| "reviews": 23456, |
| "description": "Breathable, long-lasting foundation with SPF 25", |
| "benefits": ["24hr wear", "SPF 25", "Natural finish"], |
| "skin_types": ["all"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/loreal-foundation", |
| "image_url": "/images/loreal-foundation.jpg" |
| }, |
| { |
| "id": "fnd006", |
| "name": "House of Tara Satin Finish Foundation", |
| "brand": "House of Tara", |
| "category": "foundation", |
| "subcategory": "satin", |
| "shades": 12, |
| "price": 13500, |
| "original_price": 12500, |
| "rating": 4.6, |
| "reviews": 4567, |
| "description": "Satin finish foundation made for Nigerian skin tones", |
| "benefits": ["Satin finish", "Buildable", "Natural"], |
| "skin_types": ["normal", "dry"], |
| "in_stock": True, |
| "store": "House of Tara", |
| "url": "https://houseoftara.com/product/satin-foundation", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/hot-foundation.jpg" |
| }, |
|
|
| |
| { |
| "id": "lip001", |
| "name": "Fenty Beauty Stunna Lip Paint", |
| "brand": "Fenty Beauty", |
| "category": "lipstick", |
| "subcategory": "liquid", |
| "shades": 8, |
| "price": 19500, |
| "original_price": 18500, |
| "rating": 4.8, |
| "reviews": 34567, |
| "description": "Long-wear liquid lipstick in universal shades", |
| "benefits": ["10hr wear", "Non-drying", "Intense color"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/fenty-stunna", |
| "image_url": "/images/fenty-lip.jpg" |
| }, |
| { |
| "id": "lip002", |
| "name": "MAC Powder Kiss Lipstick", |
| "brand": "MAC", |
| "category": "lipstick", |
| "subcategory": "matte", |
| "shades": 20, |
| "price": 17500, |
| "original_price": 16500, |
| "rating": 4.7, |
| "reviews": 23456, |
| "description": "Weightless, velvety matte lipstick", |
| "benefits": ["Weightless", "Velvety", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-powder-kiss", |
| "image_url": "/images/mac-lipstick.jpg" |
| }, |
| { |
| "id": "lip003", |
| "name": "Maybelline Superstay Matte Ink", |
| "brand": "Maybelline", |
| "category": "lipstick", |
| "subcategory": "liquid", |
| "shades": 15, |
| "price": 8500, |
| "original_price": 7500, |
| "rating": 4.7, |
| "reviews": 67890, |
| "description": "16-hour wear liquid lipstick", |
| "benefits": ["16hr wear", "Transfer-proof", "Intense color"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/maybelline-superstay", |
| "image_url": "/images/maybelline-superstay.jpg" |
| }, |
| { |
| "id": "lip004", |
| "name": "House of Tara Matte Lipstick", |
| "brand": "House of Tara", |
| "category": "lipstick", |
| "subcategory": "matte", |
| "shades": 12, |
| "price": 6800, |
| "original_price": 5800, |
| "rating": 4.6, |
| "reviews": 3456, |
| "description": "Matte lipstick for Nigerian skin tones", |
| "benefits": ["Matte", "Long-wear", "Affordable"], |
| "in_stock": True, |
| "store": "House of Tara", |
| "url": "https://houseoftara.com/product/matte-lipstick", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/hot-lipstick.jpg" |
| }, |
| { |
| "id": "lip005", |
| "name": "Zaron Velvet Lipstick", |
| "brand": "Zaron", |
| "category": "lipstick", |
| "subcategory": "velvet", |
| "shades": 10, |
| "price": 6200, |
| "original_price": 5200, |
| "rating": 4.5, |
| "reviews": 1876, |
| "description": "Velvet finish lipstick for everyday wear", |
| "benefits": ["Velvet finish", "Hydrating", "Long-wear"], |
| "in_stock": True, |
| "store": "Zaron", |
| "url": "https://zaroncosmetics.com/product/velvet-lipstick", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/zaron-lipstick.jpg" |
| }, |
| { |
| "id": "lip006", |
| "name": "NARS Powermatte Lip Pigment", |
| "brand": "NARS", |
| "category": "lipstick", |
| "subcategory": "liquid", |
| "shades": 12, |
| "price": 22500, |
| "original_price": 21500, |
| "rating": 4.8, |
| "reviews": 12345, |
| "description": "High-pigment liquid lipstick with matte finish", |
| "benefits": ["High pigment", "Matte", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/nars-powermatte", |
| "image_url": "/images/nars-lip.jpg" |
| }, |
| { |
| "id": "lip007", |
| "name": "Dior Rouge Lipstick", |
| "brand": "Dior", |
| "category": "lipstick", |
| "subcategory": "satin", |
| "shades": 24, |
| "price": 28500, |
| "original_price": 27500, |
| "rating": 4.9, |
| "reviews": 23456, |
| "description": "Hydrating lipstick with satin finish", |
| "benefits": ["Hydrating", "Satin finish", "Luxury"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/dior-rouge", |
| "image_url": "/images/dior-lip.jpg" |
| }, |
| { |
| "id": "lip008", |
| "name": "NYX Soft Matte Lip Cream", |
| "brand": "NYX", |
| "category": "lipstick", |
| "subcategory": "matte", |
| "shades": 24, |
| "price": 5800, |
| "original_price": 4800, |
| "rating": 4.5, |
| "reviews": 45678, |
| "description": "Soft matte lip cream with comfortable feel", |
| "benefits": ["Matte", "Comfortable", "Affordable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/nyx-soft-matte", |
| "image_url": "/images/nyx-lip.jpg" |
| }, |
|
|
| |
| { |
| "id": "lipg001", |
| "name": "Fenty Beauty Gloss Bomb Universal Lip Luminizer", |
| "brand": "Fenty Beauty", |
| "category": "lipgloss", |
| "subcategory": "shimmer", |
| "shades": 5, |
| "price": 17500, |
| "original_price": 16500, |
| "rating": 4.9, |
| "reviews": 45678, |
| "description": "High-shine lip gloss with non-sticky formula", |
| "benefits": ["High-shine", "Non-sticky", "Plumping effect"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/fenty-gloss-bomb", |
| "image_url": "/images/fenty-gloss.jpg" |
| }, |
| { |
| "id": "lipg002", |
| "name": "NYX Butter Gloss", |
| "brand": "NYX", |
| "category": "lipgloss", |
| "subcategory": "cream", |
| "shades": 15, |
| "price": 6500, |
| "original_price": 5500, |
| "rating": 4.6, |
| "reviews": 34567, |
| "description": "Creamy, buttery lip gloss", |
| "benefits": ["Buttery", "Creamy", "Affordable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/nyx-butter-gloss", |
| "image_url": "/images/nyx-butter.jpg" |
| }, |
| { |
| "id": "lipg003", |
| "name": "House of Tara Lip Gloss", |
| "brand": "House of Tara", |
| "category": "lipgloss", |
| "subcategory": "shimmer", |
| "shades": 8, |
| "price": 5800, |
| "original_price": 4800, |
| "rating": 4.5, |
| "reviews": 2345, |
| "description": "Shimmer lip gloss for Nigerian women", |
| "benefits": ["Shimmer", "Hydrating", "Non-sticky"], |
| "in_stock": True, |
| "store": "House of Tara", |
| "url": "https://houseoftara.com/product/lip-gloss", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/hot-gloss.jpg" |
| }, |
| { |
| "id": "lipg004", |
| "name": "Dior Lip Glow Oil", |
| "brand": "Dior", |
| "category": "lipgloss", |
| "subcategory": "oil", |
| "shades": 8, |
| "price": 26500, |
| "original_price": 25500, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Lip oil with cherry oil for shine and care", |
| "benefits": ["Shine", "Care", "Hydrating"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/dior-lip-glow", |
| "image_url": "/images/dior-gloss.jpg" |
| }, |
| { |
| "id": "lipg005", |
| "name": "MAC Lipglass", |
| "brand": "MAC", |
| "category": "lipgloss", |
| "subcategory": "high-shine", |
| "shades": 12, |
| "price": 14500, |
| "original_price": 13500, |
| "rating": 4.6, |
| "reviews": 23456, |
| "description": "High-shine lip gloss with non-sticky formula", |
| "benefits": ["High-shine", "Non-sticky", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-lipglass", |
| "image_url": "/images/mac-gloss.jpg" |
| }, |
|
|
| |
| { |
| "id": "lips001", |
| "name": "House of Tara Watermelon Lip Stain", |
| "brand": "House of Tara", |
| "category": "lipstain", |
| "subcategory": "tint", |
| "shades": 5, |
| "price": 6800, |
| "original_price": 5800, |
| "rating": 4.8, |
| "reviews": 2345, |
| "description": "Long-lasting lip stain for Nigerian skin tones", |
| "benefits": ["8hr wear", "Non-drying", "Buildable color"], |
| "in_stock": True, |
| "store": "House of Tara", |
| "url": "https://houseoftara.com/product/watermelon-lip-stain", |
| "tags": ["nigerian_brand", "bestseller"], |
| "image_url": "/images/hot-stain.jpg" |
| }, |
| { |
| "id": "lips002", |
| "name": "Maybelline Superstay Vinyl Ink", |
| "brand": "Maybelline", |
| "category": "lipstain", |
| "subcategory": "liquid", |
| "shades": 10, |
| "price": 8500, |
| "original_price": 7500, |
| "rating": 4.6, |
| "reviews": 23456, |
| "description": "Long-wear lip stain with vinyl finish", |
| "benefits": ["Long-wear", "Vinyl finish", "Non-drying"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/maybelline-vinyl", |
| "image_url": "/images/maybelline-vinyl.jpg" |
| }, |
| { |
| "id": "lips003", |
| "name": "Benefit Benetint", |
| "brand": "Benefit", |
| "category": "lipstain", |
| "subcategory": "tint", |
| "shades": 4, |
| "price": 18500, |
| "original_price": 17500, |
| "rating": 4.8, |
| "reviews": 34567, |
| "description": "Iconic rose-tinted lip and cheek stain", |
| "benefits": ["Multi-use", "Natural flush", "Long-lasting"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/benefit-benetint", |
| "image_url": "/images/benetint.jpg" |
| }, |
|
|
| |
| { |
| "id": "blu001", |
| "name": "Rare Beauty Soft Pinch Liquid Blush", |
| "brand": "Rare Beauty", |
| "category": "blush", |
| "subcategory": "liquid", |
| "shades": 8, |
| "price": 19500, |
| "original_price": 18500, |
| "rating": 4.9, |
| "reviews": 34567, |
| "description": "Pigmented liquid blush that melts into skin", |
| "benefits": ["Pigmented", "Long-wear", "Natural finish"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/rare-blush", |
| "image_url": "/images/rare-blush.jpg" |
| }, |
| { |
| "id": "blu002", |
| "name": "NARS Blush", |
| "brand": "NARS", |
| "category": "blush", |
| "subcategory": "powder", |
| "shades": 10, |
| "price": 23500, |
| "original_price": 22500, |
| "rating": 4.8, |
| "reviews": 45678, |
| "description": "Iconic powder blush for natural flush", |
| "benefits": ["Buildable", "Natural", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/nars-blush", |
| "image_url": "/images/nars-blush.jpg" |
| }, |
| { |
| "id": "blu003", |
| "name": "House of Tara Cream Blush", |
| "brand": "House of Tara", |
| "category": "blush", |
| "subcategory": "cream", |
| "shades": 5, |
| "price": 5800, |
| "original_price": 4800, |
| "rating": 4.5, |
| "reviews": 1876, |
| "description": "Cream blush for a natural flush", |
| "benefits": ["Creamy", "Natural", "Affordable"], |
| "in_stock": True, |
| "store": "House of Tara", |
| "url": "https://houseoftara.com/product/cream-blush", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/hot-blush.jpg" |
| }, |
| { |
| "id": "blu004", |
| "name": "Fenty Beauty Cheeks Out Cream Blush", |
| "brand": "Fenty Beauty", |
| "category": "blush", |
| "subcategory": "cream", |
| "shades": 8, |
| "price": 18500, |
| "original_price": 17500, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Buildable cream blush with natural finish", |
| "benefits": ["Buildable", "Natural", "Easy blend"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/fenty-blush", |
| "image_url": "/images/fenty-blush.jpg" |
| }, |
| { |
| "id": "blu005", |
| "name": "MAC Powder Blush", |
| "brand": "MAC", |
| "category": "blush", |
| "subcategory": "powder", |
| "shades": 15, |
| "price": 15500, |
| "original_price": 14500, |
| "rating": 4.7, |
| "reviews": 23456, |
| "description": "Highly pigmented powder blush", |
| "benefits": ["Pigmented", "Buildable", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-blush", |
| "image_url": "/images/mac-blush.jpg" |
| }, |
|
|
| |
| { |
| "id": "con001", |
| "name": "Fenty Beauty Match Stix Contour Skinstick", |
| "brand": "Fenty Beauty", |
| "category": "contour", |
| "subcategory": "stick", |
| "shades": 10, |
| "price": 19500, |
| "original_price": 18500, |
| "rating": 4.7, |
| "reviews": 23456, |
| "description": "Contour stick for easy sculpting", |
| "benefits": ["Easy blend", "Natural", "Buildable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/fenty-match-stix", |
| "image_url": "/images/fenty-contour.jpg" |
| }, |
| { |
| "id": "con002", |
| "name": "NYX Professional Makeup Wonder Stick", |
| "brand": "NYX", |
| "category": "contour", |
| "subcategory": "stick", |
| "shades": 6, |
| "price": 7500, |
| "original_price": 6500, |
| "rating": 4.5, |
| "reviews": 34567, |
| "description": "Dual-ended contour and highlight stick", |
| "benefits": ["Dual-ended", "Easy blend", "Affordable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/nyx-wonder-stick", |
| "image_url": "/images/nyx-contour.jpg" |
| }, |
| { |
| "id": "con003", |
| "name": "Anastasia Beverly Hills Contour Kit", |
| "brand": "Anastasia Beverly Hills", |
| "category": "contour", |
| "subcategory": "powder", |
| "shades": 6, |
| "price": 28500, |
| "original_price": 27500, |
| "rating": 4.8, |
| "reviews": 23456, |
| "description": "Contour kit with 6 powder shades", |
| "benefits": ["Buildable", "Blendable", "Natural"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/abh-contour", |
| "image_url": "/images/abh-contour.jpg" |
| }, |
|
|
| |
| { |
| "id": "eye001", |
| "name": "Urban Decay Naked Heat Palette", |
| "brand": "Urban Decay", |
| "category": "eyeshadow", |
| "subcategory": "palette", |
| "shades": 12, |
| "price": 29500, |
| "original_price": 28500, |
| "rating": 4.8, |
| "reviews": 45678, |
| "description": "Warm-toned eyeshadow palette", |
| "benefits": ["Pigmented", "Blendable", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/naked-heat", |
| "image_url": "/images/naked-heat.jpg" |
| }, |
| { |
| "id": "eye002", |
| "name": "Anastasia Beverly Hills Soft Glam Palette", |
| "brand": "Anastasia Beverly Hills", |
| "category": "eyeshadow", |
| "subcategory": "palette", |
| "shades": 14, |
| "price": 27500, |
| "original_price": 26500, |
| "rating": 4.9, |
| "reviews": 56789, |
| "description": "Everyday neutral eyeshadow palette", |
| "benefits": ["Neutral shades", "Buttery texture", "Blendable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/abh-soft-glam", |
| "image_url": "/images/abh-soft-glam.jpg" |
| }, |
| { |
| "id": "eye003", |
| "name": "House of Tara Eyeshadow Palette", |
| "brand": "House of Tara", |
| "category": "eyeshadow", |
| "subcategory": "palette", |
| "shades": 9, |
| "price": 9500, |
| "original_price": 8500, |
| "rating": 4.4, |
| "reviews": 2345, |
| "description": "Eyeshadow palette for Nigerian skin tones", |
| "benefits": ["Pigmented", "Affordable", "Versatile"], |
| "in_stock": True, |
| "store": "House of Tara", |
| "url": "https://houseoftara.com/product/eyeshadow-palette", |
| "tags": ["nigerian_brand"], |
| "image_url": "/images/hot-eyeshadow.jpg" |
| }, |
| { |
| "id": "eye004", |
| "name": "MAC Eyeshadow Single", |
| "brand": "MAC", |
| "category": "eyeshadow", |
| "subcategory": "single", |
| "shades": 50, |
| "price": 6500, |
| "original_price": 5500, |
| "rating": 4.7, |
| "reviews": 34567, |
| "description": "Single eyeshadow pan with high pigment", |
| "benefits": ["Pigmented", "Buildable", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-eyeshadow", |
| "image_url": "/images/mac-eyeshadow.jpg" |
| }, |
| { |
| "id": "eye005", |
| "name": "Huda Beauty Mercury Retrograde Palette", |
| "brand": "Huda Beauty", |
| "category": "eyeshadow", |
| "subcategory": "palette", |
| "shades": 18, |
| "price": 32500, |
| "original_price": 31500, |
| "rating": 4.8, |
| "reviews": 34567, |
| "description": "Ethereal eyeshadow palette with pastels and neutrals", |
| "benefits": ["Pigmented", "Versatile", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/huda-retrograde", |
| "image_url": "/images/huda-palette.jpg" |
| }, |
|
|
| |
| { |
| "id": "mas001", |
| "name": "Benefit They're Real Mascara", |
| "brand": "Benefit", |
| "category": "mascara", |
| "subcategory": "volumizing", |
| "price": 19500, |
| "original_price": 18500, |
| "rating": 4.8, |
| "reviews": 34567, |
| "description": "Lengthening and volumizing mascara", |
| "benefits": ["Lengthening", "Volumizing", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/benefit-mascara", |
| "image_url": "/images/benefit-mascara.jpg" |
| }, |
| { |
| "id": "mas002", |
| "name": "Maybelline Lash Sensational Mascara", |
| "brand": "Maybelline", |
| "category": "mascara", |
| "subcategory": "volumizing", |
| "price": 6500, |
| "original_price": 5500, |
| "rating": 4.7, |
| "reviews": 123456, |
| "description": "Fanning effect mascara for full lashes", |
| "benefits": ["Fanning", "Volumizing", "Affordable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/maybelline-lash", |
| "image_url": "/images/maybelline-lash.jpg" |
| }, |
| { |
| "id": "mas003", |
| "name": "Too Faced Better Than Sex Mascara", |
| "brand": "Too Faced", |
| "category": "mascara", |
| "subcategory": "volumizing", |
| "price": 18500, |
| "original_price": 17500, |
| "rating": 4.8, |
| "reviews": 56789, |
| "description": "Volumizing mascara for intense lashes", |
| "benefits": ["Intense volume", "Long-wear", "Lengthening"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/too-faced", |
| "image_url": "/images/too-faced-mascara.jpg" |
| }, |
| { |
| "id": "mas004", |
| "name": "MAC Extended Play Mascara", |
| "brand": "MAC", |
| "category": "mascara", |
| "subcategory": "lengthening", |
| "price": 14500, |
| "original_price": 13500, |
| "rating": 4.6, |
| "reviews": 23456, |
| "description": "Long-wear mascara for extended play", |
| "benefits": ["Long-wear", "Smudge-proof", "Lengthening"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-mascara", |
| "image_url": "/images/mac-mascara.jpg" |
| }, |
|
|
| |
| { |
| "id": "eln001", |
| "name": "Fenty Beauty Flypencil Longwear Pencil Eyeliner", |
| "brand": "Fenty Beauty", |
| "category": "eyeliner", |
| "subcategory": "pencil", |
| "shades": 10, |
| "price": 13500, |
| "original_price": 12500, |
| "rating": 4.7, |
| "reviews": 12345, |
| "description": "Long-wear pencil eyeliner", |
| "benefits": ["Long-wear", "Creamy", "Waterproof"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/fenty-flypencil", |
| "image_url": "/images/fenty-liner.jpg" |
| }, |
| { |
| "id": "eln002", |
| "name": "Maybelline Tattoo Studio Gel Pencil Liner", |
| "brand": "Maybelline", |
| "category": "eyeliner", |
| "subcategory": "gel", |
| "shades": 6, |
| "price": 5500, |
| "original_price": 4500, |
| "rating": 4.6, |
| "reviews": 56789, |
| "description": "Gel eyeliner with 36-hour wear", |
| "benefits": ["36hr wear", "Waterproof", "Affordable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/maybelline-tattoo", |
| "image_url": "/images/maybelline-liner.jpg" |
| }, |
| { |
| "id": "eln003", |
| "name": "NYX Epic Ink Liner", |
| "brand": "NYX", |
| "category": "eyeliner", |
| "subcategory": "liquid", |
| "shades": 3, |
| "price": 5800, |
| "original_price": 4800, |
| "rating": 4.5, |
| "reviews": 45678, |
| "description": "Waterproof liquid eyeliner with felt tip", |
| "benefits": ["Waterproof", "Precise", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/nyx-epic-liner", |
| "image_url": "/images/nyx-liner.jpg" |
| }, |
| { |
| "id": "eln004", |
| "name": "MAC Liquidlast Liner", |
| "brand": "MAC", |
| "category": "eyeliner", |
| "subcategory": "liquid", |
| "shades": 8, |
| "price": 14500, |
| "original_price": 13500, |
| "rating": 4.6, |
| "reviews": 23456, |
| "description": "Waterproof liquid eyeliner", |
| "benefits": ["Waterproof", "Intense", "Long-wear"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/mac-liquidlast", |
| "image_url": "/images/mac-liner.jpg" |
| }, |
|
|
| |
| { |
| "id": "bod001", |
| "name": "Sol de Janeiro Brazilian Bum Bum Cream", |
| "brand": "Sol de Janeiro", |
| "category": "body_care", |
| "subcategory": "cream", |
| "size": "240ml", |
| "price": 29500, |
| "original_price": 28500, |
| "rating": 4.9, |
| "reviews": 78901, |
| "description": "Firming and smoothing body cream", |
| "benefits": ["Firming", "Smoothing", "Hydrating"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/sol-bum-bum", |
| "image_url": "/images/sol-bumbum.jpg" |
| }, |
| { |
| "id": "bod002", |
| "name": "Tree Hut Moroccan Rose Body Scrub", |
| "brand": "Tree Hut", |
| "category": "body_care", |
| "subcategory": "scrub", |
| "size": "510g", |
| "price": 15500, |
| "original_price": 14500, |
| "rating": 4.8, |
| "reviews": 45678, |
| "description": "Exfoliating body scrub with shea butter", |
| "benefits": ["Exfoliating", "Hydrating", "Smoothing"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/treehut-scrub", |
| "image_url": "/images/treehut-scrub.jpg" |
| }, |
| { |
| "id": "bod003", |
| "name": "Frank Body Original Coffee Scrub", |
| "brand": "Frank Body", |
| "category": "body_care", |
| "subcategory": "scrub", |
| "size": "200g", |
| "price": 18500, |
| "original_price": 17500, |
| "rating": 4.7, |
| "reviews": 34567, |
| "description": "Coffee-based body scrub for glowing skin", |
| "benefits": ["Exfoliating", "Glow", "Caffeine"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/frank-body", |
| "image_url": "/images/frank-body.jpg" |
| }, |
| { |
| "id": "bod004", |
| "name": "The Body Shop Shea Body Butter", |
| "brand": "The Body Shop", |
| "category": "body_care", |
| "subcategory": "butter", |
| "size": "200ml", |
| "price": 15500, |
| "original_price": 14500, |
| "rating": 4.7, |
| "reviews": 56789, |
| "description": "Intensely moisturizing shea body butter", |
| "benefits": ["Moisturizing", "Nourishing", "Long-lasting"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/body-shop-shea", |
| "image_url": "/images/body-shop.jpg" |
| }, |
| { |
| "id": "bod005", |
| "name": "Dove Deep Moisture Body Wash", |
| "brand": "Dove", |
| "category": "body_care", |
| "subcategory": "wash", |
| "size": "400ml", |
| "price": 5500, |
| "original_price": 4500, |
| "rating": 4.5, |
| "reviews": 123456, |
| "description": "Deep moisture body wash with NutriumMoisture", |
| "benefits": ["Moisturizing", "Gentle", "Affordable"], |
| "in_stock": True, |
| "store": "Jumia", |
| "url": "https://www.jumia.com.ng/dove-wash", |
| "image_url": "/images/dove-wash.jpg" |
| } |
| ] |
| print(f"✅ Loaded {len(self.products)} initial products") |
| |
| async def update_price_from_url(self, product): |
| """Fetch current price from product URL""" |
| try: |
| async with httpx.AsyncClient(timeout=10.0, follow_redirects=True) as client: |
| response = await client.get(product['url'], headers={ |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' |
| }) |
| |
| if response.status_code == 200: |
| soup = BeautifulSoup(response.text, 'html.parser') |
| |
| |
| price_selectors = [ |
| '.price', '.product-price', '.current-price', |
| '[itemprop="price"]', '.sale-price', '.regular-price', |
| 'span.price', 'div.price', '.product__price', |
| '.money', '.price-item', '.price--sale' |
| ] |
| |
| for selector in price_selectors: |
| price_elem = soup.select_one(selector) |
| if price_elem: |
| price_text = price_elem.get_text(strip=True) |
| |
| numbers = re.findall(r'[\d,]+', price_text) |
| if numbers: |
| price_str = numbers[0].replace(',', '') |
| try: |
| new_price = int(price_str) |
| |
| |
| out_of_stock_selectors = ['.sold-out', '.out-of-stock', '.unavailable', '.sold_out'] |
| in_stock = True |
| for selector in out_of_stock_selectors: |
| if soup.select_one(selector): |
| in_stock = False |
| break |
| |
| return { |
| 'price': new_price, |
| 'in_stock': in_stock, |
| 'last_checked': datetime.utcnow().isoformat() |
| } |
| except: |
| pass |
| |
| |
| if response.status_code == 404: |
| return { |
| 'price': product['price'], |
| 'in_stock': False, |
| 'last_checked': datetime.utcnow().isoformat(), |
| 'error': 'Page not found' |
| } |
| |
| except Exception as e: |
| logger.error(f"Error updating {product['id']}: {e}") |
| |
| return None |
| |
| async def update_all_prices(self): |
| """Update prices for all products""" |
| logger.info("🔄 Starting price update for all products...") |
| |
| for product in self.products: |
| if 'url' in product: |
| try: |
| update = await self.update_price_from_url(product) |
| if update: |
| old_price = product['price'] |
| product['price'] = update['price'] |
| product['in_stock'] = update['in_stock'] |
| product['last_updated'] = update['last_checked'] |
| |
| if old_price != update['price']: |
| logger.info(f"💰 Price changed for {product['name']}: ₦{old_price} → ₦{update['price']}") |
| |
| |
| await asyncio.sleep(2) |
| |
| except Exception as e: |
| logger.error(f"Failed to update {product['id']}: {e}") |
| |
| logger.info("✅ Price update complete") |
| |
| def get_product(self, product_id: str): |
| """Get single product by ID""" |
| for product in self.products: |
| if product['id'] == product_id: |
| return product |
| return None |
| |
| def get_products_by_category(self, category: str): |
| """Get products by category""" |
| return [p for p in self.products if p['category'] == category] |
| |
| def get_products_by_brand(self, brand: str): |
| """Get products by brand""" |
| return [p for p in self.products if p['brand'].lower() == brand.lower()] |
| |
| def get_products_by_price_range(self, min_price: int, max_price: int): |
| """Get products within price range""" |
| return [p for p in self.products if min_price <= p['price'] <= max_price] |
| |
| def get_in_stock_products(self): |
| """Get only in-stock products""" |
| return [p for p in self.products if p.get('in_stock', True)] |
| |
| def search_products(self, query: str): |
| """Search products by name, brand, or description""" |
| query = query.lower() |
| results = [] |
| for p in self.products: |
| if (query in p['name'].lower() or |
| query in p['brand'].lower() or |
| query in p.get('description', '').lower()): |
| results.append(p) |
| return results |
|
|
| |
| product_db = ProductDatabase() |
|
|
| |
| |
| |
|
|
| async def update_all_prices_periodically(): |
| """Run price updates every 6 hours""" |
| while True: |
| try: |
| await product_db.update_all_prices() |
| logger.info("⏰ Next price update in 6 hours") |
| await asyncio.sleep(6 * 60 * 60) |
| except Exception as e: |
| logger.error(f"Price update cycle failed: {e}") |
| await asyncio.sleep(60) |
|
|
| |
| |
| |
|
|
| def get_skin_tone_hex(tone): |
| """Convert skin tone to hex color""" |
| tone_map = { |
| "fair": "#F5E6D3", |
| "light": "#E8D9C2", |
| "medium": "#D4B99B", |
| "tan": "#B58C6F", |
| "deep": "#8B5A3C", |
| "dark": "#6D3F2C" |
| } |
| return tone_map.get(tone.lower(), "#D4B99B") |
|
|
| def generate_shade_matches(skin_tone, undertone): |
| """Generate shade matches based on skin tone and undertone""" |
| matches = { |
| "fair": { |
| "warm": ["Cream Nude", "Peach Nude"], |
| "cool": ["Pink Nude", "Rose"], |
| "neutral": ["Beige Nude", "Mauve"], |
| "olive": ["Warm Beige", "Golden Nude"] |
| }, |
| "light": { |
| "warm": ["Golden Beige", "Honey"], |
| "cool": ["Rose Beige", "Dusty Rose"], |
| "neutral": ["Natural Beige", "Mauve Rose"], |
| "olive": ["Olive Beige", "Warm Nude"] |
| }, |
| "medium": { |
| "warm": ["Caramel", "Warm Tan"], |
| "cool": ["Rose Tan", "Berry"], |
| "neutral": ["Tawny", "Mauve"], |
| "olive": ["Olive Tan", "Golden Olive"] |
| }, |
| "tan": { |
| "warm": ["Amber", "Bronze"], |
| "cool": ["Wine", "Plum"], |
| "neutral": ["Copper", "Terracotta"], |
| "olive": ["Olive Bronze", "Warm Bronze"] |
| }, |
| "deep": { |
| "warm": ["Mahogany", "Espresso"], |
| "cool": ["Burgundy", "Deep Wine"], |
| "neutral": ["Cocoa", "Mocha"], |
| "olive": ["Deep Olive", "Warm Cocoa"] |
| }, |
| "dark": { |
| "warm": ["Rich Brown", "Dark Amber"], |
| "cool": ["Deep Berry", "Dark Wine"], |
| "neutral": ["Dark Cocoa", "Ebony"], |
| "olive": ["Dark Olive", "Rich Espresso"] |
| } |
| } |
| return matches.get(skin_tone.lower(), {}).get(undertone.lower(), ["Universal"]) |
|
|
| |
| |
| |
|
|
| def detect_face_and_analyze(image_bytes): |
| """ |
| Actually detect face and analyze skin using real computer vision |
| """ |
| try: |
| |
| nparr = np.frombuffer(image_bytes, np.uint8) |
| img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) |
| |
| if img is None: |
| return None, "Could not read image" |
| |
| |
| face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') |
| |
| |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |
| |
| |
| faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(50, 50)) |
| |
| if len(faces) == 0: |
| return None, "No face detected in the image. Please upload a clear photo of your face with good lighting." |
| |
| |
| largest_face = max(faces, key=lambda rect: rect[2] * rect[3]) |
| x, y, w, h = largest_face |
| |
| |
| face_roi = img[y:y+h, x:x+w] |
| |
| |
| hsv_face = cv2.cvtColor(face_roi, cv2.COLOR_BGR2HSV) |
| avg_hue = np.mean(hsv_face[:,:,0]) |
| avg_saturation = np.mean(hsv_face[:,:,1]) |
| avg_value = np.mean(hsv_face[:,:,2]) |
| |
| |
| if avg_value > 180: |
| skin_tone = "fair" |
| elif avg_value > 150: |
| skin_tone = "light" |
| elif avg_value > 120: |
| skin_tone = "medium" |
| elif avg_value > 90: |
| skin_tone = "tan" |
| elif avg_value > 60: |
| skin_tone = "deep" |
| else: |
| skin_tone = "dark" |
| |
| |
| if avg_hue < 10 or avg_hue > 170: |
| undertone = "cool" |
| elif avg_hue < 30: |
| undertone = "warm" |
| elif avg_hue < 80: |
| undertone = "neutral" |
| else: |
| undertone = "olive" |
| |
| |
| gray_face = cv2.cvtColor(face_roi, cv2.COLOR_BGR2GRAY) |
| laplacian_var = cv2.Laplacian(gray_face, cv2.CV_64F).var() |
| |
| |
| conditions = [] |
| |
| |
| red_mask = cv2.inRange(hsv_face, np.array([0, 50, 50]), np.array([10, 255, 255])) |
| red_mask2 = cv2.inRange(hsv_face, np.array([170, 50, 50]), np.array([180, 255, 255])) |
| red_spots = cv2.bitwise_or(red_mask, red_mask2) |
| red_percentage = np.sum(red_spots > 0) / (h * w) |
| |
| if red_percentage > 0.05: |
| conditions.append({ |
| "id": "acne", |
| "name": "Acne/Pimples", |
| "confidence": min(95, int(60 + red_percentage * 500)) |
| }) |
| |
| |
| oily_mask = cv2.inRange(hsv_face, np.array([10, 80, 100]), np.array([30, 255, 255])) |
| oily_percentage = np.sum(oily_mask > 0) / (h * w) |
| |
| if oily_percentage > 0.3: |
| conditions.append({ |
| "id": "oily-skin", |
| "name": "Oily Skin", |
| "confidence": min(90, int(50 + oily_percentage * 100)) |
| }) |
| elif avg_saturation < 40 and avg_value > 150: |
| conditions.append({ |
| "id": "dry-skin", |
| "name": "Dry Skin", |
| "confidence": 75 |
| }) |
| |
| |
| lab_face = cv2.cvtColor(face_roi, cv2.COLOR_BGR2LAB) |
| l_channel = lab_face[:,:,0] |
| avg_l = np.mean(l_channel) |
| dark_spots = l_channel < (avg_l * 0.7) |
| dark_percentage = np.sum(dark_spots) / (h * w) |
| |
| if dark_percentage > 0.03: |
| conditions.append({ |
| "id": "hyperpigmentation", |
| "name": "Hyperpigmentation", |
| "confidence": min(85, int(50 + dark_percentage * 300)) |
| }) |
| |
| |
| edges = cv2.Canny(gray_face, 50, 150) |
| edge_density = np.sum(edges > 0) / (h * w) |
| |
| if edge_density > 0.15: |
| conditions.append({ |
| "id": "fine-lines", |
| "name": "Fine Lines/Wrinkles", |
| "confidence": min(80, int(50 + edge_density * 150)) |
| }) |
| |
| |
| if len(conditions) < 2: |
| if avg_saturation < 60: |
| conditions.append({ |
| "id": "dehydrated-skin", |
| "name": "Dehydrated Skin", |
| "confidence": 70 |
| }) |
| elif avg_saturation > 120: |
| conditions.append({ |
| "id": "combination-skin", |
| "name": "Combination Skin", |
| "confidence": 68 |
| }) |
| |
| return { |
| "skin_tone": { |
| "primary": skin_tone, |
| "undertone": undertone, |
| "confidence": round(70 + avg_value / 10, 1), |
| "hex": get_skin_tone_hex(skin_tone) |
| }, |
| "conditions": conditions[:5], |
| "analysis_type": "real_cv", |
| "face_detected": True, |
| "face_confidence": min(99, int(len(faces) * 30)), |
| "timestamp": datetime.utcnow().isoformat() |
| }, None |
| except Exception as e: |
| logger.error(f"Face detection error: {e}") |
| return None, str(e) |
|
|
| async def real_skin_analysis(image_bytes): |
| """Use REAL face detection and skin analysis""" |
| result, error = detect_face_and_analyze(image_bytes) |
| |
| if result: |
| logger.info(f"✅ Face detected! Skin tone: {result['skin_tone']['primary']}, Conditions: {len(result['conditions'])}") |
| return result |
| |
| |
| return { |
| "error": True, |
| "message": error or "No face detected. Please upload a clear photo of your face with good lighting.", |
| "conditions": [], |
| "analysis_type": "error", |
| "success": False |
| } |
|
|
| |
| |
| |
|
|
| @app.get("/") |
| async def root(): |
| global client, HF_TOKEN |
| |
| return { |
| "service": "Glow AI - Skincare & Cosmetics AI", |
| "version": "2.0.0", |
| "status": "operational", |
| "hf_token_configured": bool(HF_TOKEN), |
| "hf_available": HF_AVAILABLE, |
| "hf_connected": bool(client), |
| "products_loaded": len(product_db.products), |
| "endpoints": [ |
| "/health", |
| "/api/analyze-skin", |
| "/api/products", |
| "/api/products/{category}", |
| "/api/products/search/{query}", |
| "/api/update-prices", |
| "/ws/chat" |
| ] |
| } |
|
|
| @app.get("/health") |
| async def health_check(): |
| global client |
| |
| return { |
| "status": "healthy", |
| "timestamp": datetime.utcnow().isoformat(), |
| "hf_connected": bool(client), |
| "products_count": len(product_db.products), |
| "in_stock_count": len(product_db.get_in_stock_products()) |
| } |
|
|
| @app.get("/test-token") |
| async def test_token(): |
| global client |
| result = { |
| "hf_token_exists": bool(os.getenv("HF_TOKEN")), |
| "hf_token_prefix": os.getenv("HF_TOKEN", "")[:10] + "..." if os.getenv("HF_TOKEN") else None, |
| "client_initialized": bool(client), |
| "hf_available": HF_AVAILABLE |
| } |
| |
| |
| if client: |
| try: |
| test_result = client.image_classification( |
| "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat.jpg", |
| model="microsoft/resnet-50" |
| ) |
| result["connection_test"] = "success" |
| result["sample_result"] = str(test_result[:2]) |
| except Exception as e: |
| result["connection_test"] = f"failed: {str(e)}" |
| else: |
| result["connection_test"] = "client not initialized" |
| |
| return result |
|
|
| @app.get("/api/products") |
| async def get_all_products( |
| category: Optional[str] = None, |
| brand: Optional[str] = None, |
| min_price: Optional[int] = None, |
| max_price: Optional[int] = None, |
| in_stock_only: bool = False, |
| limit: int = 50 |
| ): |
| """Get products with optional filters""" |
| try: |
| products = product_db.products |
| |
| if category: |
| products = [p for p in products if p['category'] == category] |
| |
| if brand: |
| products = [p for p in products if p['brand'].lower() == brand.lower()] |
| |
| if min_price is not None: |
| products = [p for p in products if p['price'] >= min_price] |
| |
| if max_price is not None: |
| products = [p for p in products if p['price'] <= max_price] |
| |
| if in_stock_only: |
| products = [p for p in products if p.get('in_stock', True)] |
| |
| return { |
| "total": len(products), |
| "products": products[:limit], |
| "filters_applied": { |
| "category": category, |
| "brand": brand, |
| "min_price": min_price, |
| "max_price": max_price, |
| "in_stock_only": in_stock_only |
| } |
| } |
| except Exception as e: |
| raise HTTPException(status_code=400, detail=str(e)) |
|
|
| @app.get("/api/products/{product_id}") |
| async def get_product(product_id: str): |
| """Get single product by ID""" |
| product = product_db.get_product(product_id) |
| if not product: |
| raise HTTPException(status_code=404, detail="Product not found") |
| return product |
|
|
| @app.get("/api/products/category/{category}") |
| async def get_products_by_category(category: str): |
| """Get products by category""" |
| products = product_db.get_products_by_category(category) |
| return { |
| "category": category, |
| "count": len(products), |
| "products": products |
| } |
|
|
| @app.get("/api/products/search/{query}") |
| async def search_products(query: str): |
| """Search products by name, brand, or description""" |
| results = product_db.search_products(query) |
| return { |
| "query": query, |
| "count": len(results), |
| "results": results |
| } |
|
|
| @app.post("/api/update-prices") |
| async def trigger_price_update(): |
| """Manually trigger price update""" |
| asyncio.create_task(product_db.update_all_prices()) |
| return {"status": "started", "message": "Price update initiated"} |
|
|
| |
| |
| |
|
|
| @app.post("/api/analyze-skin") |
| async def analyze_skin(request: Request): |
| """Analyze skin from uploaded image using REAL face detection""" |
| try: |
| |
| body = await request.json() |
| image_base64 = body.get("image") |
| |
| if not image_base64: |
| return {"success": False, "error": "No image provided", "conditions": []} |
| |
| |
| if ',' in image_base64: |
| image_base64 = image_base64.split(',')[1] |
| |
| |
| image_bytes = base64.b64decode(image_base64) |
| |
| |
| result = await real_skin_analysis(image_bytes) |
| |
| |
| if result.get("error"): |
| return { |
| "success": False, |
| "error": result.get("message"), |
| "conditions": [], |
| "skin_tone": None, |
| "analysis_type": result.get("analysis_type", "error") |
| } |
| |
| |
| return { |
| "success": True, |
| "skin_tone": result["skin_tone"], |
| "conditions": result["conditions"], |
| "analysis_type": result["analysis_type"], |
| "timestamp": result["timestamp"], |
| "face_detected": result.get("face_detected", False), |
| "message": f"✅ Found {len(result['conditions'])} skin condition(s)." |
| } |
| |
| except Exception as e: |
| logger.error(f"Analysis failed: {e}") |
| return {"success": False, "error": str(e), "conditions": []} |
|
|
| |
| |
| |
|
|
| class ConnectionManager: |
| def __init__(self): |
| self.active_connections: List[WebSocket] = [] |
| self.support_online = True |
| self.message_history = [] |
|
|
| async def connect(self, websocket: WebSocket): |
| await websocket.accept() |
| self.active_connections.append(websocket) |
| |
| for msg in self.message_history[-10:]: |
| await websocket.send_json(msg) |
|
|
| def disconnect(self, websocket: WebSocket): |
| if websocket in self.active_connections: |
| self.active_connections.remove(websocket) |
|
|
| async def send_message(self, message: dict, websocket: WebSocket): |
| await websocket.send_json(message) |
|
|
| async def broadcast_to_support(self, message: dict): |
| |
| logger.info(f"💬 Support message: {message}") |
| self.message_history.append(message) |
|
|
| manager = ConnectionManager() |
|
|
| @app.websocket("/ws/chat") |
| async def websocket_endpoint(websocket: WebSocket): |
| await manager.connect(websocket) |
| try: |
| |
| welcome_msg = { |
| "type": "system", |
| "message": "👋 Welcome to Glow AI Support! How can we help you today?", |
| "timestamp": datetime.utcnow().isoformat() |
| } |
| await manager.send_message(welcome_msg, websocket) |
| |
| |
| quick_replies = { |
| "type": "quick_replies", |
| "replies": [ |
| "Product recommendations", |
| "Order status", |
| "Shipping info", |
| "Returns policy", |
| "Skin analysis help" |
| ], |
| "timestamp": datetime.utcnow().isoformat() |
| } |
| await manager.send_message(quick_replies, websocket) |
| |
| while True: |
| data = await websocket.receive_text() |
| |
| |
| try: |
| msg_data = json.loads(data) |
| message = msg_data.get("message", "") |
| user_name = msg_data.get("user", "Customer") |
| except: |
| message = data |
| user_name = "Customer" |
| |
| |
| customer_msg = { |
| "type": "customer", |
| "user": user_name, |
| "message": message, |
| "timestamp": datetime.utcnow().isoformat() |
| } |
| await manager.broadcast_to_support(customer_msg) |
| |
| |
| await asyncio.sleep(1) |
| |
| |
| responses = { |
| "product": "You can browse our products in the Shop tab. Use the search and filters to find exactly what you need! 🛍️", |
| "order": "To check your order status, please provide your order number and I'll look it up for you.", |
| "shipping": "We offer shipping throughout Nigeria. Delivery takes 2-5 business days. Free shipping on orders over ₦25,000! 🚚", |
| "return": "We accept returns within 14 days of delivery. Items must be unopened and in original packaging.", |
| "analysis": "Our AI skin analysis is in the Analysis tab! Upload a photo and get personalized recommendations. ✨", |
| "price": f"Our products range from ₦3,800 to ₦35,000. You can filter by price in the shop!", |
| "help": "I can help with: \n• Product recommendations\n• Order status\n• Shipping info\n• Returns\n• Skin analysis\nWhat would you like to know?", |
| "default": "Thank you for your message! A support agent will respond shortly. For faster help, try asking about: products, orders, shipping, returns, or analysis." |
| } |
| |
| |
| reply = responses["default"] |
| for key, response in responses.items(): |
| if key in message.lower(): |
| reply = response |
| break |
| |
| support_reply = { |
| "type": "support", |
| "message": reply, |
| "timestamp": datetime.utcnow().isoformat() |
| } |
| await manager.send_message(support_reply, websocket) |
| |
| except WebSocketDisconnect: |
| manager.disconnect(websocket) |
| logger.info("Client disconnected from chat") |
| except Exception as e: |
| logger.error(f"WebSocket error: {e}") |
| manager.disconnect(websocket) |
|
|
| |
| |
| |
|
|
| def skin_analysis_ui(image, manual_conditions): |
| """Gradio interface for skin analysis""" |
| return "Gradio interface - Use the API endpoints instead" |
|
|
| with gr.Blocks(title="Glow AI API", theme=gr.themes.Soft()) as demo: |
| gr.Markdown(""" |
| # ✨ Glow AI API |
| This Space provides API endpoints for skin analysis and product data. |
| Use the `/api/analyze-skin` endpoint for skin analysis. |
| """) |
|
|
| |
| app = gr.mount_gradio_app(app, demo, path="/") |
|
|
| |
| if __name__ == "__main__": |
| port = int(os.getenv("PORT", 7860)) |
| uvicorn.run(app, host="0.0.0.0", port=port) |