AI Stylist API Docs

Backend endpointleri, amaçları ve örnek başarılı/başarısız response gövdeleri.

Swagger UI OpenAPI JSON Docs JSON Auth header: Authorization: Bearer ACCESS_TOKEN

Fashly Backend Completion

Mobil redesign icin tamamlanan ek backend kontratlari: visual assets, wardrobe bulk/detail/share, outfit aliases, virtual try-on results ve tracker aksiyonlari.

GET

/api/v1/app/visual-assets

Public

Splash, auth, onboarding ve empty-state ekranlarinda kullanilacak visual asset anahtarlarini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"key":"splash.hero","assetPath":"assets/images/onboarding/splash_hero.png"}],"message":"OK","traceId":null}
Başarısız Response
Service unavailable
POST

/api/v1/wardrobe/items/bulk

JWT gerekli

Toplu gardirop kaydi olusturur ve gardirop limitini tek seferde kontrol eder.

Request
{"items":[{"name":"White Shirt","category":"top","subcategory":"shirt","primaryColorFamily":"white","temperatureMinCelsius":10,"temperatureMaxCelsius":28}]}
Başarılı Response
{"success":true,"data":{"requestedCount":1,"createdCount":1,"items":[{"id":"019e...","name":"White Shirt"}]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/wardrobe/items/{itemId}/detail

JWT gerekli

Kiyafet detayini metadata ve share linkleriyle tek response olarak dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"item":{"id":"019e...","name":"White Shirt"},"metadata":null,"shareLinks":[]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
PUT

/api/v1/wardrobe/items/{itemId}/metadata-corrections

JWT gerekli

Kullanicinin duzelttigi metadata bilgisini profil ve item uzerine uygular.

Request
{"name":"Oversize white shirt","primaryColorFamily":"white","styleTags":["minimal"],"correctionReason":"wrong title"}
Başarılı Response
{"success":true,"data":{"primaryColorFamily":"white","styleTags":["minimal"],"source":"gemini+user"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/wardrobe/items/{itemId}/share-links

JWT gerekli

Tek kiyafetin paylasilabilir linkini olusturur.

Request
{"expiresAt":null}
Başarılı Response
{"success":true,"data":{"token":"abc","shareUrl":"/shared/wardrobe/items/abc","isActive":true},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
DELETE

/api/v1/wardrobe/items/{itemId}/share-links/{token}

JWT gerekli

Kiyafet paylasim linkini pasiflestirir.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"token":"abc","isActive":false},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/outfits/create

JWT gerekli

Studio outfit collection olusturmak icin mobil dostu alias route.

Request
{"name":"Weekend","styleIntent":"casual","items":[{"clothingItemId":"019e...","slot":"top","sortOrder":1}],"canvasLayout":{"mode":"flatlay"},"visibility":"private"}
Başarılı Response
{"success":true,"data":{"id":"019e...","name":"Weekend"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/outfits/{id}/style-with-ai

JWT gerekli

Kayitli studio kombinine AI styling notu ekler.

Request
{"intent":"smart"}
Başarılı Response
{"success":true,"data":{"aiStylingNotes":["Kombin temel slotlar acisindan dengeli gorunuyor."]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/outfits/{id}/wear

JWT gerekli

Kayitli studio kombinini giyildi isaretler ve tracker aktivitesi olusturur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"id":"019e...","wornAt":"2026-07-09T12:00:00Z"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/outfits/{id}/render

JWT gerekli

Studio collection icin stabil render kontrati dondurur; provider baglaninca ayni route renderUrl dondurecek.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"outfitCollectionId":"019e...","status":"ready","renderUrl":null,"renderMetadata":{"mode":"studio_collection_preview"}},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/virtual-try-on/jobs

JWT gerekli

Virtual Try-On job olusturmak icin mobil dostu alias route.

Request
{"personImageUrl":"https://cdn/person.jpg","garmentImageUrl":"https://cdn/item.jpg","clothingItemIds":["019e..."],"mode":"wardrobe","options":{"quality":"preview"}}
Başarılı Response
{"success":true,"data":{"id":"019e...","status":"failed","error":"virtual_try_on_provider_not_configured"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/virtual-try-on/jobs/{jobId}

JWT gerekli

Virtual Try-On job durumunu okur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"id":"019e...","status":"completed","result":{}},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/virtual-try-on/results

JWT gerekli

Tamamlanan veya kontrollu fail olan Virtual Try-On sonuclarini listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"id":"019e...","status":"completed"}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
DELETE

/api/v1/virtual-try-on/results/{id}

JWT gerekli

Virtual Try-On sonucunu kullanici hesabindan siler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"resultId":"019e...","deleted":true},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/tracker/forgotten-items

JWT gerekli

Sustainability Tracker unutulan parca listesini ayri endpoint olarak dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"clothingItemId":"019e...","actionLabel":"Yeniden Kombinle"}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/tracker/active-items

JWT gerekli

Sustainability Tracker cok kullanilan parca listesini ayri endpoint olarak dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"clothingItemId":"019e...","actionLabel":"Alternatif Dene"}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/tracker/items/{id}/restyle

JWT gerekli

Unutulan veya aktif parca icin restyle aksiyonu olusturur ve puan event'i yazar.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"status":"created","pointsAwarded":6},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized

Auth

Kullanıcı oturumu, JWT access token ve refresh token akışları.

POST

/api/v1/auth/register

Public

Yeni kullanıcı oluşturur ve access/refresh token döner.

Request
{"email":"demo@example.com","password":"DemoPass123!","displayName":"Demo User","city":"Istanbul","country":"TR"}
Başarılı Response
{"success":true,"data":{"userId":"019e...","email":"demo@example.com","displayName":"Demo User","accessToken":"eyJ...","refreshToken":"raw-refresh-token","accessTokenExpiresAt":"2026-06-04T12:00:00Z"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Bu e-posta ile kayıtlı bir hesap zaten var.","traceId":"0HNM..."}
POST

/api/v1/auth/login

Public

E-posta ve şifreyle oturum açar.

Request
{"email":"demo@example.com","password":"DemoPass123!","deviceName":"Pixel 9"}
Başarılı Response
{"success":true,"data":{"accessToken":"eyJ...","refreshToken":"raw-refresh-token"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"E-posta veya şifre hatalı.","traceId":"0HNM..."}
POST

/api/v1/auth/refresh

Public

Refresh token ile yeni access token üretir.

Request
{"refreshToken":"raw-refresh-token","deviceName":"Pixel 9"}
Başarılı Response
{"success":true,"data":{"accessToken":"eyJ...","refreshToken":"next-refresh-token"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Oturum süresi dolmuş. Lütfen tekrar giriş yap.","traceId":"0HNM..."}

Wardrobe

Kullanıcının gerçek gardırop verisi, görsel upload, metadata ve kıyafet davranışları.

GET

/api/v1/wardrobe/items

JWT gerekli

Kullanıcının kıyafetlerini listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"id":"019e...","name":"White Shirt","category":"Top","careState":"Clean","wearCount":0,"media":[]}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/wardrobe/items

JWT gerekli

Yeni kıyafet kaydı oluşturur. Free/Premium gardırop limitini kontrol eder.

Request
{"name":"White Shirt","category":"top","subcategory":"shirt","primaryColorFamily":"white","temperatureMinCelsius":10,"temperatureMaxCelsius":28}
Başarılı Response
{"success":true,"data":{"id":"019e...","name":"White Shirt","category":"Top"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Bu paketteki kullanım limitine ulaştın. Devam etmek için Premium gerekli.","traceId":"0HNM..."}
POST

/api/v1/wardrobe/items/{itemId}/media

JWT gerekli

Kıyafet görselini MinIO'ya yükler ve metadata extraction job kuyruğa alır.

Request
multipart/form-data: file
Başarılı Response
{"success":true,"data":{"media":{"id":"019e...","storageKey":"wardrobe/...jpg","width":1024,"height":1024},"metadataJobId":"019e..."},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Sadece JPG, PNG veya WEBP görsel yükleyebilirsin.","traceId":"0HNM..."}
GET

/api/v1/wardrobe/items/{itemId}/metadata

JWT gerekli

Worker tarafından çıkarılan kıyafet metadata profilini okur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"primaryColorFamily":"white","styleTags":["classic","minimal"],"formality":4},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Bu kıyafet için metadata henüz hazır değil.","traceId":"0HNM..."}
POST

/api/v1/wardrobe/items/{itemId}/worn

JWT gerekli

Kıyafeti giyildi işaretler, wearCount artırır ve activity event üretir.

Request
{"wornAt":null}
Başarılı Response
{"success":true,"data":{"id":"019e...","wearCount":1,"careState":"Clean"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kıyafet bulunamadı.","traceId":"0HNM..."}
POST

/api/v1/wardrobe/items/{itemId}/favorite/toggle

JWT gerekli

Kıyafetin favori durumunu değiştirir.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"id":"019e...","isFavorite":true},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kıyafet bulunamadı.","traceId":"0HNM..."}
PATCH

/api/v1/wardrobe/items/{itemId}/care-state

JWT gerekli

Kıyafetin durumunu Clean, Laundry veya Archived yapar.

Request
{"careState":"laundry"}
Başarılı Response
{"success":true,"data":{"id":"019e...","careState":"Laundry"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kıyafet durumu geçersiz.","traceId":"0HNM..."}

Daily Outfits

Metadata profillerinden deterministik skorlamayla günlük kombin üretimi.

POST

/api/v1/outfits/daily/generate

JWT gerekli

5'e kadar günlük kombin üretir; bugün zaten üretildiyse limit tüketmeden mevcut kombinleri döndürür.

Request
{"occasion":"casual","temperatureCelsius":20,"count":5}
Başarılı Response
{"success":true,"data":[{"id":"019e...","name":"Casual kombin","score":87,"items":[{"clothingItemId":"019e...","role":"top"}]}],"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kombin önermek için en az iki üst, iki alt ve bir ayakkabı ya da en az iki elbise ve bir ayakkabı metadata profili gerekli.","traceId":"0HNM..."}
GET

/api/v1/outfits/daily

JWT gerekli

Bugünün üretilmiş kombinlerini listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"id":"019e...","score":87,"reason":"Casual stilinde..."}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/outfits/{outfitId}/feedback

JWT gerekli

Kombin beğeni/kayıt/gizleme feedbacki ve activity event üretir.

Request
{"action":"saved","reason":"Looks good"}
Başarılı Response
{"success":true,"data":{"id":"019e...","action":"Saved","activity":{"eventType":"outfit.feedback_submitted"}},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Geri bildirim tipi geçersiz.","traceId":"0HNM..."}
POST

/api/v1/outfits/{outfitId}/hero-render

JWT gerekli

Günün hero kombini için tek AI görsel üretir; hazır görsel varsa tekrar kredi tüketmeden mevcut URL'i döndürür.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"outfitId":"019e...","status":"ready","heroRenderUrl":"https://cdn.example/outfits/hero.webp","fallbackMode":"none","error":null,"renderedAt":"2026-06-16T09:15:00Z"},"message":"OK","traceId":null}
Başarısız Response
{"success":true,"data":{"outfitId":"019e...","status":"failed","heroRenderUrl":null,"fallbackMode":"item_collage","error":"hero_render_provider_unavailable","renderedAt":null},"message":"OK","traceId":null}

Try Before Buy

Ürün linkinden ürün keşfi ve gardıropla uyum analizi.

POST

/api/v1/try-before-buy/discover

JWT gerekli

Ürün linkinden ad, doğru fiyat, görsel, marka ve dinamik ürün bilgilerini çıkarır.

Request
{"url":"https://shop.example.com/products/white-shirt"}
Başarılı Response
{"success":true,"data":{"id":"019e...","productName":"White Shirt","priceText":"899.90 TL","imageCandidates":["https://...jpg"],"extractedFacts":{"Kumaş":"Pamuk","Kalıp":"Regular fit"},"status":"Discovered"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Bu linkten yeterince güvenilir ürün bilgisi çıkaramadım.","traceId":"0HNM..."}
POST

/api/v1/try-before-buy/analyses/{analysisId}/compatibility

JWT gerekli

Keşfedilen ürünü kullanıcının gardırobuyla eşleştirir ve 3 fikir döndürür.

Request
{"occasion":"casual","temperatureCelsius":20}
Başarılı Response
{"success":true,"data":{"status":"CompatibilityReady","compatibilityScore":90,"outfitIdeas":[{"title":"White Shirt için 2 parçalı fikir","score":91,"clothingItemIds":["019e..."]}]},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Dolap uyumu için metadata profili hazır en az iki kıyafet gerekli.","traceId":"0HNM..."}
GET

/api/v1/try-before-buy/analyses

JWT gerekli

Son Dene-Al analizlerini listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"id":"019e...","productName":"White Shirt","status":"CompatibilityReady"}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized

Activities

Profil hareket geçmişi ve ileride öneri modelini besleyecek kullanıcı davranış eventleri.

GET

/api/v1/activities/recent

JWT gerekli

Son 50 kullanıcı activity eventini listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"eventType":"clothing.worn","subjectType":"clothing_item","metadata":{"wearCount":"1"}}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized

Analytics

Mobil profil ve stil trendleri icin kullaniciya ozel gardirop/aktivite ozeti.

GET

/api/v1/me/analytics

JWT gerekli

Kullanicinin gardirop sayilarini, giyilme istatistiklerini, favorileri, top renk/kategori dagilimini ve son aktivitelerini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"wardrobeItemCount":12,"favoriteItemCount":3,"wornItemCount":5,"totalWearCount":9,"topColors":[{"name":"black","count":4}],"recentActivities":[]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized

MVP Completion

Profil, subscription, job progress, event batch, seyahat bavulu ve sosyal MVP endpointleri.

GET

/api/v1/me

JWT gerekli

Kullanici profilini ve tercihlerini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"email":"demo@example.com","displayName":"Demo","subscriptionTier":"Free","preferences":{"styleTags":["minimal"]}},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
PATCH

/api/v1/me/preferences

JWT gerekli

Onboarding ve ayarlar ekranindan stil, beden, bildirim ve veri izinlerini gunceller.

Request
{"styleTags":["minimal","classic"],"sizeProfile":{"top":"M"},"visibility":"private","notificationSettings":{"dailyOutfit":true},"allowsPersonalization":true,"allowsModelTraining":false}
Başarılı Response
{"success":true,"data":{"preferences":{"styleTags":["minimal","classic"]}},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/jobs/{jobId}

JWT gerekli

Upload/AI job progress bilgisini status, yuzde, sonuc ve hata detaylariyla okur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"id":"019e...","status":"Completed","attemptCount":1,"progressPercentage":100,"result":{"extractionProvider":"gemini","productImageStatus":"created"}},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Job bulunamadi.","traceId":"0HNM..."}
POST

/api/v1/events/batch

JWT gerekli

Mobil analitik ve kisisellestirme eventlerini batch olarak kabul eder.

Request
{"events":[{"eventType":"screen_view","subjectType":"screen","metadata":{"name":"home"}}]}
Başarılı Response
{"success":true,"data":{"acceptedCount":1},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/subscription/plans

Public

Free ve Premium planlarini ve entitlement limitlerini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"code":"free","tier":"Free","entitlements":[{"featureCode":"wardrobe.items","limitValue":25}]}],"message":"OK","traceId":null}
Başarısız Response
Service unavailable
GET

/api/v1/subscription/me

JWT gerekli

Kullanicinin paketi ve kullanilmis limitlerini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"tier":"Free","usage":[{"featureCode":"outfit.daily","used":1,"limitValue":1}]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/travel/trips

JWT gerekli

Seyahat sehir/tarih/amac/bagaj bilgisiyle trip kaydi olusturur.

Request
{"destinationCity":"Izmir","destinationCountry":"TR","startDate":"2026-07-01","endDate":"2026-07-04","purpose":"holiday","luggageType":"carry_on","laundryAvailable":false}
Başarılı Response
{"success":true,"data":{"id":"019e...","destinationCity":"Izmir"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/travel/trips/{tripId}/packing-plan

JWT gerekli

Metadata hazir gardiroptan kapsul bavul ve gunluk kombin planlari uretir.

Request
{"temperatureCelsius":28}
Başarılı Response
{"success":true,"data":{"score":86,"itemIds":["019e..."],"dailyOutfits":[{"date":"2026-07-01","itemIds":["019e..."]}]},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Seyahat bavulu icin en az ust-alt veya elbise ve bir ayakkabi metadata profili gerekli.","traceId":"0HNM..."}
GET

/api/v1/social/feed

JWT gerekli

Kesfet feedini populerlik, tazelik ve moderasyon durumuyla listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"caption":"Summer look","creatorUsername":"stil_editor","likeCount":3,"isLikedByMe":false,"isSavedByMe":true,"hashtags":["summer"]}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/social/feed/page?cursor={cursor}&take=24

JWT gerekli

Cursor tabanli kisilesmis Kesfet feedini rankingVersion, guardrailVersion ve nextCursor ile dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"items":[{"caption":"Summer look","creatorUsername":"stil_editor"}],"nextCursor":"eyJ...","feedSessionId":"019e...","rankingVersion":"discover-rank-v1","guardrailVersion":"discover-guardrails-v1"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/social/search?query={query}&take=30

JWT gerekli

Post, stil etiketi, renk ve creator sinyalleriyle tam ekran Kesfet aramasi yapar.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"id":"019e...","caption":"Sade ofis gorunumu","media":[{"displayUrl":"https://cdn/look.webp","aspectRatio":0.8}]}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/social/search/suggestions?query={query}

JWT gerekli

Arama yazilirken creator, stil, renk ve parca onerilerini agirlikli olarak dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"type":"style","value":"minimal","weight":8}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/social/posts/{postId}

JWT gerekli

Paylasim detayini postId ile yeniden yukler ve kullanici interaction durumlarini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"caption":"Summer look","creatorUsername":"stil_editor","isLikedByMe":true,"isSavedByMe":false},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Paylaşım bulunamadı.","traceId":"0HNM..."}
GET

/api/v1/social/posts/{postId}/related?cursor={cursor}&take=16

JWT gerekli

Post detayindaki Kesfedilebilecek daha fazla fikir alanini ayri cursor ile yukler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"items":[{"caption":"Benzer fikir"}],"nextCursor":"eyJ...","anchorPostId":"019e...","rankingVersion":"discover-rank-v1","guardrailVersion":"discover-guardrails-v1"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Paylaşım bulunamadı.","traceId":"0HNM..."}
POST

/api/v1/social/posts/media

JWT gerekli

Paylasim gorselini object storage'a yukler; mobil kullanicidan gorsel URL'si istemez.

Request
multipart/form-data: file
Başarılı Response
{"success":true,"data":{"imageUrl":"http://localhost:9000/aistylist-media/social/...jpg","storageKey":"social/...jpg"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Sadece JPG, PNG veya WEBP gorsel yukleyebilirsin.","traceId":"0HNM..."}
POST

/api/v1/social/posts/drafts

JWT gerekli

Bir ile alti yuklenmis medyadan idempotent post taslagi olusturur; henuz public feed'e girmez.

Request
{"caption":"Bugunun dengeli gorunumu.","visibility":"public","commentsPolicy":"everyone","clientRequestId":"mobile-019e...","media":[{"storageKey":"social/...webp","displayUrl":"https://cdn/...webp","thumbnailUrl":"https://cdn/...webp","width":1200,"height":1500,"contentHash":"abc...","sortOrder":0}]}
Başarılı Response
{"success":true,"data":{"id":"019e...","status":"draft","visibility":"public","media":[{"sortOrder":0,"aspectRatio":0.8}]},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Paylasim icin 1 ile 6 medya gerekli.","traceId":"0HNM..."}
PATCH

/api/v1/social/posts/drafts/{postId}

JWT gerekli

Sahibine ait draft postun aciklama, gorunurluk ve yorum politikasini gunceller.

Request
{"caption":"Yeni aciklama","visibility":"public","commentsPolicy":"everyone"}
Başarılı Response
{"success":true,"data":{"id":"019e...","status":"draft","caption":"Yeni aciklama"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Yalniz taslak paylasim guncellenebilir.","traceId":"0HNM..."}
POST

/api/v1/social/posts/drafts/{postId}/publish

JWT gerekli

Draft postu processing durumuna tasir ve icerik zekasi worker jobunu kuyruga yazar.

Request

Request body yok.

Başarılı Response
202 Accepted: {"success":true,"data":{"postId":"019e...","jobId":"019e...","status":"processing"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Paylasim bulunamadi.","traceId":"0HNM..."}
GET

/api/v1/social/posts/{postId}/processing

JWT gerekli

Post analiz, moderasyon ve yayin durumunu polling icin dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"postId":"019e...","status":"published","moderationStatus":"approved","analysisVersion":"social-profile-v2","publishedAt":"2026-07-17T16:00:00Z"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Paylasim bulunamadi.","traceId":"0HNM..."}
POST

/api/v1/social/posts

JWT gerekli

Yuklenen gorsel URL'si ve aciklamayla sosyal paylasim olusturur.

Request
{"caption":"Bugunun sade kombini.","imageUrl":"http://localhost:9000/aistylist-media/social/...jpg","hashtags":["minimal"]}
Başarılı Response
{"success":true,"data":{"id":"019e...","caption":"Bugunun sade kombini.","isLikedByMe":false,"isSavedByMe":false},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Gorsel zorunlu.","traceId":"0HNM..."}
POST

/api/v1/social/posts/{postId}/hide

JWT gerekli

Paylasimi kullanicinin feedinden idempotent olarak gizler ve ranking negatif sinyali uretir.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"id":"019e...","caption":"Summer look"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Paylaşım bulunamadı.","traceId":"0HNM..."}
POST

/api/v1/social/events/batch

JWT gerekli

Sosyal impression/dwell/detail/like/save/hide/report eventlerini clientEventId ve exposureId ile idempotent olarak alir.

Request
{"events":[{"clientEventId":"evt-1","exposureId":"exp-1","eventType":"social_impression","subjectType":"post","subjectId":"019e...","feedSessionId":"019e...","shownRank":1}]}
Başarılı Response
{"success":true,"data":{"acceptedCount":1,"duplicateCount":0},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"clientEventId boş olamaz.","traceId":"0HNM..."}
GET

/api/v1/social/style-decks?take=18

JWT gerekli

Public like uretmeden kullanicinin stil hafizasini netlestiren karar destesini dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"deckSessionId":"019e...","items":[{"id":"019e...","caption":"Katmanli gorunum"}]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/social/style-decks/{postId}/decision

JWT gerekli

more_like_this, less_like_this, remember veya skip kararini idempotent stil sinyali olarak kaydeder.

Request
{"action":"more_like_this","clientEventId":"decision-019e...","deckSessionId":"019e..."}
Başarılı Response
{"success":true,"data":{"postId":"019e...","action":"more_like_this"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Stil karari gecersiz.","traceId":"0HNM..."}
POST

/api/v1/social/users/{blockedUserId}/block

JWT gerekli

Creator'i butun feed, arama ve related retrieval yollarindan kaldirir.

Request
{"reason":"not_relevant"}
Başarılı Response
{"success":true,"data":true,"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kendini engelleyemezsin.","traceId":"0HNM..."}
GET

/api/v1/social/posts/{postId}/comments

JWT gerekli

Paylasim yorumlarini onayli ve silinmemis kayitlarla listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"creatorUsername":"stil_editor","text":"Bu oran gercekten temiz duruyor.","parentCommentId":null}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/social/posts/{postId}/comments

JWT gerekli

Paylasima yorum veya ayni paylasima ait yoruma yanit ekler.

Request
{"text":"Ben bunu ince kemerle de denerdim.","parentCommentId":null}
Başarılı Response
{"success":true,"data":{"text":"Ben bunu ince kemerle de denerdim."},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Yorum bos olamaz.","traceId":"0HNM..."}
POST

/api/v1/social/polls

JWT gerekli

Free icin 2, Premium icin 4 secenege kadar anket olusturur.

Request
{"question":"Hangisi daha iyi?","options":[{"title":"A"},{"title":"B"}]}
Başarılı Response
{"success":true,"data":{"question":"Hangisi daha iyi?","options":[{"voteCount":0}]},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Bu kadar anket secenegi icin Premium gerekli.","traceId":"0HNM..."}
POST

/api/v1/social/polls/{pollId}/vote

JWT gerekli

Ankete oy verir; kullanici tekrar oy verirse oyunu yeni secenege tasir.

Request
{"optionId":"019e..."}
Başarılı Response
{"success":true,"data":{"id":"019e...","creatorUsername":"stil_editor","options":[{"id":"019e...","voteCount":4,"isVotedByMe":true}]},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Anket secenegi bulunamadi.","traceId":"0HNM..."}

Fashly Foundation

Yeni Fashly tasarimi icin app config, onboarding, Stil Studyosu, Virtual Try-On, image based Dene-Al ve Tracker endpointleri.

GET

/api/v1/app/config

Public

Mobilin splash/auth/onboarding gorsel asset anahtarlarini, feature flagleri ve premium kurallarini okur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"appName":"Fashly","designSystemVersion":"fashly-minimal-v1","visualAssets":[{"key":"splash.hero","assetPath":"assets/images/onboarding/splash_hero.png"}],"featureFlags":{"onboarding.enabled":true}},"message":"OK","traceId":null}
Başarısız Response
Service unavailable
GET

/api/v1/onboarding/me

JWT gerekli

Kullanicinin onboarding profilini okur; yoksa draft profil olusturur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"displayName":"Bağış","ageRange":"23-27","styleGoals":["dolabimi_daha_iyi_kullanmak"],"completionStatus":"draft"},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
PUT

/api/v1/onboarding/me

JWT gerekli

Onboarding cevaplarini draft olarak kaydeder.

Request
{"displayName":"Bağış","ageRange":"23-27","city":"Istanbul","country":"TR","styleGoals":["new_outfits"],"styleProblems":["same_outfits"],"sustainabilityLevel":"mindful","bodyFitPreference":{"fit":"regular"},"preferredStyles":["minimal","streetwear"]}
Başarılı Response
{"success":true,"data":{"completionStatus":"draft","preferredStyles":["minimal","streetwear"]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/onboarding/complete

JWT gerekli

Onboarding'i tamamlar, profil/preference alanlarini senkronlar.

Request
{"summaryOverrides":{"source":"first_run"}}
Başarılı Response
{"success":true,"data":{"completionStatus":"completed","completedAt":"2026-07-09T04:00:00Z"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kullanıcı bulunamadı.","traceId":"0HNM..."}
GET

/api/v1/studio/outfits

JWT gerekli

Kullanicinin kaydedilmis Create Outfit koleksiyonlarini listeler.

Request

Request body yok.

Başarılı Response
{"success":true,"data":[{"id":"019e...","name":"Hafta sonu kombini","items":[{"clothingItemId":"019e...","slot":"top"}]}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/studio/outfits

JWT gerekli

Premium Create Outfit canvas kombinini kaydeder; yalniz kullanicinin kendi gardirobundaki parcalar kabul edilir.

Request
{"name":"Hafta sonu","styleIntent":"casual","items":[{"clothingItemId":"019e...","slot":"top","sortOrder":1}],"canvasLayout":{"mode":"flatlay"},"visibility":"private"}
Başarılı Response
{"success":true,"data":{"name":"Hafta sonu","styleIntent":"casual"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Bu paketteki kullanım limitine ulaştın. Devam etmek için Premium gerekli.","traceId":"0HNM..."}
POST

/api/v1/studio/outfits/{collectionId}/style-with-ai

JWT gerekli

Kayitli kombin icin AI styling notlari uretir; provider yoksa deterministik guvenli not doner.

Request
{"intent":"smart"}
Başarılı Response
{"success":true,"data":{"aiStylingNotes":["Kombin temel slotlar açısından dengeli görünüyor."]},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Kombin koleksiyonu bulunamadı.","traceId":"0HNM..."}
POST

/api/v1/studio/virtual-try-on/jobs

JWT gerekli

Virtual Try-On job kaydi olusturur; provider bagli degilse kontrollu failed status doner.

Request
{"personImageUrl":"https://cdn/person.jpg","garmentImageUrl":"https://cdn/item.jpg","clothingItemIds":["019e..."],"mode":"wardrobe","options":{"quality":"preview"}}
Başarılı Response
{"success":true,"data":{"id":"019e...","status":"failed","error":"virtual_try_on_provider_not_configured"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Virtual Try-On için kişi fotoğrafı gerekli.","traceId":"0HNM..."}
GET

/api/v1/tracker/summary

JWT gerekli

Sustainability Tracker ozetini, unutulan/aktif parcalari ve son aktiviteleri dondurur.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"totalPoints":42,"forgottenItemCount":3,"activeItems":[{"name":"Siyah tişört","actionLabel":"Alternatif Dene"}]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
POST

/api/v1/try-before-buy/image-analyses

JWT gerekli

URL yerine kullanicinin yukledigi urun gorseli/screenshot icin Dene-Al analizi olusturur.

Request
{"imageUrl":"https://cdn/product.jpg","productName":"Siyah blazer","metadata":{"color":"black","category":"outerwear"}}
Başarılı Response
{"success":true,"data":{"status":"created","productName":"Siyah blazer"},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Ürün görseli zorunlu.","traceId":"0HNM..."}
POST

/api/v1/try-before-buy/image-analyses/{analysisId}/compatibility

JWT gerekli

Gorsel urun analizini kullanicinin gardirobuyla eslestirir.

Request
{"occasion":"daily","temperatureCelsius":22}
Başarılı Response
{"success":true,"data":{"status":"compatibility_ready","compatibilityScore":78},"message":"OK","traceId":null}
Başarısız Response
{"success":false,"data":null,"message":"Dolap uyumu için metadata profili hazır en az birkaç parça gerekiyor.","traceId":"0HNM..."}

Admin

Admin paneli ve operasyon ekibi icin API sagligi, job, aktivite ve audit gorunumu.

GET

/api/v1/admin/overview

Public

Sistem geneli kullanici, premium, gardirop, kombin, Dene-Al, activity ve AI job sayilarini dondurur.

Request
Header: X-Admin-Key: development-admin-key-change-me
Başarılı Response
{"success":true,"data":{"userCount":120,"premiumUserCount":18,"wardrobeItemCount":2400,"aiJobsByStatus":[{"name":"Completed","count":900}]},"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/admin/ai-jobs/recent?take=50

Public

Son AI job kayitlarini status, hata ve zaman bilgileriyle listeler.

Request
Header: X-Admin-Key: development-admin-key-change-me
Başarılı Response
{"success":true,"data":[{"id":"019e...","jobType":"clothing.metadata_extraction","status":"Completed","attemptCount":1}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/admin/activities/recent?take=50

Public

Tum kullanicilar icin son activity eventlerini operasyon gorunumu olarak listeler.

Request
Header: X-Admin-Key: development-admin-key-change-me
Başarılı Response
{"success":true,"data":[{"eventType":"clothing.worn","subjectType":"clothing_item","occurredAt":"2026-06-04T12:00:00Z"}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized
GET

/api/v1/admin/audit-logs/recent?take=50

Public

Admin endpoint erisim audit kayitlarini listeler.

Request
Header: X-Admin-Key: development-admin-key-change-me
Başarılı Response
{"success":true,"data":[{"actor":"admin-api-key","action":"admin.overview.read","metadata":{"path":"/api/v1/admin/overview"}}],"message":"OK","traceId":null}
Başarısız Response
401 Unauthorized

System

Sağlık ve sistem bilgisi endpointleri.

GET

/health

Public

Container health check endpointi.

Request

Request body yok.

Başarılı Response
Healthy
Başarısız Response
Service unavailable
GET

/api/v1/system/info

Public

API adı, sürüm ve environment bilgisini döner.

Request

Request body yok.

Başarılı Response
{"success":true,"data":{"serviceName":"AIStylist.Api","version":"0.1.0","environment":"Development"},"message":"OK","traceId":null}
Başarısız Response
Service unavailable