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
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.
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..."}
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..."}