M Makroskop API canlı
REST · JSON · WebSocket

Makroskop API

Makroskop'un API merkezi. Bu sayfa hem doküman hem test arayüzü: her servisi buradan, gerçek sunucuya karşı deneyebilirsin. Mesajlar WebSocket (Phoenix Channels) üzerinden akar; geri kalan her şey REST.

Postman'a aktar Postman > Import ile dosyayı içe aktar; access_token değişkenini doldurman yeterli.
Base URL
https://mskop-api.gurerlabs.com
Sistem durumu
Kontrol ediliyor…
60 dk
Access token
imzalı · opak
90 gün
Refresh token
tek kullanımlık
UUID
Kimlikler
oda: slug
Hızlı başlangıç
# 1) Uygulama GlobalTrustID'den (OIDC + PKCE) aldığı kodu token'a çevirir
curl -X POST https://mskop-api.gurerlabs.com/api/auth/globaltrustid \
  -H "Content-Type: application/json" \
  -d '{"code": "GTID_KODU", "code_verifier": "PKCE_VERIFIER", "redirect_uri": "REDIRECT_URI"}'

# 2) Dönen access_token ile istek at
curl https://mskop-api.gurerlabs.com/api/me -H "Authorization: Bearer $ACCESS_TOKEN"

# 3) 401 token_expired gelince yenile (eski refresh token o an biter)
curl -X POST https://mskop-api.gurerlabs.com/api/auth/refresh \
  -H "Content-Type: application/json" \
  -d '{"refresh_token": "REFRESH_TOKEN"}'

Kimlik doğrulama

Korunan servisler Authorization: Bearer <access_token> başlığı ister. Giriş yalnızca GlobalTrustID ile yapılır; parola yoktur. Access token 1 saat yaşar, süresi dolunca refresh token ile yeni bir çift alınır.

  1. 1 Giriş

    Uygulama GlobalTrustID'ye karşı OIDC authorization code + PKCE akışını yürütür, dönen kodu POST /api/auth/globaltrustid'ye yollar; access + refresh token döner.

  2. 2 Rumuz

    İlk girişte account.username boştur. PUT /api/me/username ile seçilene kadar odalar ve socket 403 username_required döner.

  3. 3 Yenileme

    401 token_expired gelince POST /api/auth/refresh ile yeni çift alınır; eski refresh token o an biter.

  4. 4 Çıkış

    POST /api/auth/logout oturumu kapatır ve o cihaza push gönderimini durdurur.

🔐 Kimlik

Backend GlobalTrustID'den gelen kimliği saklamaz; hesabı yalnızca tek yönlü bir parmak iziyle bulur. Aynı kişi her cihazda aynı hesaba düşer: ilk giriş 201, sonrakiler 200 döner.

📱 Token saklama

Refresh token yanıt gövdesinde döner ve 90 gün geçerlidir; Keychain / Keystore gibi güvenli depoda saklanmalı. Her kullanımda yenisiyle değişir, eskisi tekrar kullanılamaz.

Hatalar

Tüm hatalar aynı biçimde döner. İstemci mantığı her zaman code alanına bakmalı; message insan için yazılmıştır ve değişebilir. fields yalnızca 422 validation_failed yanıtında bulunur. Her yanıtta x-request-id başlığı vardır; destek isterken bunu ilet.

{"error":{"code":"validation_failed","fields":{"slug":["lowercase letters, digits and '-' only"]},"message":"Some fields are invalid."}}
codeHTTPAnlamı
invalid_request 400 Eksik ya da geçersiz parametre
unauthorized 401 Authorization başlığı yok ya da geçersiz
token_expired 401 Access token'ın süresi dolmuş: /api/auth/refresh çağır
invalid_refresh_token 401 Refresh token geçersiz ya da kullanılmış; tekrar giriş gerekir
star_required 402 Oda yıldızla açılıyor
insufficient_stars 402 Yıldız bakiyesi yetmiyor
username_required 403 Önce rumuz seçilmeli (PUT /api/me/username)
not_member 403 Odanın üyesi değilsin
not_admin 403 Bu işlem odanın yöneticisine ait
not_allowed 403 Gereken oda yetkisi yok
banned 403 Bu odadan engellendin
dm_closed 403 Kişi birebir mesaja kapalı
not_found 404 Kayıt ya da yol yok
room_not_found 404 Oda yok
founder_protected 409 Kurucuya bu işlem uygulanamaz
validation_failed 422 Alanlar geçersiz; ayrıntı fields içinde
rate_limited 429 Hız sınırı aşıldı; biraz bekleyip tekrar dene
gtid_unavailable 502 GlobalTrustID'ye ulaşılamadı
internal_error 500 Beklenmeyen hata; x-request-id ile bildir

Rate limit

Limitler sabit pencereyle uygulanır ve aşılınca 429 rate_limited döner. Yanıtlarda X-RateLimit-* ya da Retry-After başlığı yoktur; 429 alan istemci birkaç saniye bekleyip tekrar denemelidir.

/api/auth/*

IP başına dakikada 20 istek

GET /api/link-preview

Hesap başına dakikada 60 istek (önbellekten dönenler de sayılır)

POST /api/analytics/events

Hesap başına dakikada 30 paket

socket · message:new

Hesap başına 10 saniyede 20 mesaj; gövde en fazla 16 KB

socket · komutlar

Hesap + oda + komut başına dakikada 5 (/mute, /ban…)

PATCH /api/panel/organization

Slug değişikliği: organizasyon başına günde 10

Sağlık ve genel

GET /api/health

Servis durumu

Veritabanı (Postgres), Redis ve dosya deposunun (MinIO) durumunu döner. Postgres ya da Redis cevap vermezse 503 ve status: "degraded" döner; MinIO raporlanır ama tek başına hataya yol açmaz (sohbet medyasız da çalışır). Rate limit uygulanmaz; izleme ve yük dengeleyiciler için uygundur.

Yanıtlar
  • 200Postgres ve Redis çalışıyor
  • 503Postgres ya da Redis çalışmıyor (status: "degraded")
curl https://mskop-api.gurerlabs.com/api/health
Dene
GET /api/usernames/available

Rumuz kullanılabilir mi

Rumuz seçme ekranında yazarken çağrılır. Karşılaştırma büyük/küçük harf duyarsızdır. Geçersiz biçimdeki ya da ayrılmış (makroskop) rumuzlar için de available: false döner.

Parametreler
username string query zorunlu

Denenecek rumuz

Yanıtlar
  • 200Sonuç döndü
  • 400username verilmedi (invalid_request)
curl https://mskop-api.gurerlabs.com/api/usernames/available?username=osman
Dene

Kimlik doğrulama

Bu gruptaki tüm servisler IP başına dakikada 20 istekle sınırlıdır ve token istemez.

POST /api/auth/globaltrustid
⏱ IP başına 20/dk

GlobalTrustID ile giriş

Uygulama GlobalTrustID'ye karşı OIDC authorization code + PKCE akışını kendisi yürütür (scope=openid profile) ve dönen kodu buraya yollar. Backend kodu kendi client secret'ı ile token'a çevirir, id_token'ı GlobalTrustID'nin JWKS'i ile doğrular (imza, iss, aud, exp). Hesap yoksa açılır (201), varsa aynı hesaba girilir (200).

  • Kimlikten yalnızca birthdate ve gender saklanır; başka hiçbir claim tutulmaz.
  • İlk girişte account.username null gelir: uygulama rumuz seçme ekranına gitmeli.
Parametreler
code string body zorunlu

GlobalTrustID'nin döndürdüğü authorization code

redirect_uri string body zorunlu

Akışta kullanılan redirect URI; GlobalTrustID'de kayıtlı olanla aynı olmalı

code_verifier string body zorunlu

PKCE doğrulayıcısı

nonce string body isteğe bağlı

Akışta nonce gönderildiyse aynısı

Yanıtlar
  • 201Yeni hesap açıldı; token çifti + account
  • 200Var olan hesaba girildi; token çifti + account
  • 400code ya da redirect_uri yok (invalid_request)
  • 401Kod reddedildi (gtid_rejected) ya da id_token doğrulanamadı (invalid_id_token)
  • 429Rate limit
  • 502GlobalTrustID'ye ulaşılamadı (gtid_unavailable)
  • 503Sunucuda GlobalTrustID ayarlı değil (gtid_not_configured)
curl -X POST https://mskop-api.gurerlabs.com/api/auth/globaltrustid \
  -H "Content-Type: application/json" \
  -d '{"code":"GTID_KODU","code_verifier":"PKCE_VERIFIER","redirect_uri":"REDIRECT_URI"}'
Dene
POST /api/auth/refresh
⏱ IP başına 20/dk

Token yenile

Refresh token ile yeni bir access + refresh çifti alır. Refresh token tek kullanımlıktır: bu çağrıdan sonra eskisi çalışmaz, yanıttaki yenisi saklanmalı. Yanıtta account yoktur.

Parametreler
refresh_token string body zorunlu

Girişte ya da son yenilemede dönen refresh token

Yanıtlar
  • 200Yeni token çifti
  • 400refresh_token yok (invalid_request)
  • 401Geçersiz, süresi dolmuş ya da kullanılmış (invalid_refresh_token): tekrar giriş gerekir
  • 429Rate limit
curl -X POST https://mskop-api.gurerlabs.com/api/auth/refresh \
  -H "Content-Type: application/json" \
  -d '{"refresh_token":"REFRESH_TOKEN"}'
Dene
POST /api/auth/logout
⏱ IP başına 20/dk

Çıkış yap

Refresh token'ın ait olduğu oturumu kapatır ve o cihaza push gönderimini durdurur. Bilinmeyen ya da zaten kapanmış bir token için de 204 döner; yanıt token'ın varlığını sızdırmaz.

Parametreler
refresh_token string body zorunlu

Kapatılacak oturumun refresh token'ı

Yanıtlar
  • 204Her zaman; gövde boş
  • 429Rate limit
curl -X POST https://mskop-api.gurerlabs.com/api/auth/logout \
  -H "Content-Type: application/json" \
  -d '{"refresh_token":"REFRESH_TOKEN"}'
Dene

Hesap

Giriş yapmış kişinin kendi hesabı. Bu gruptaki servisler yalnız geçerli bir access token ister; rumuz seçilmemiş hesap da çağırabilir, çünkü rumuz seçme ekranı (onboarding) bunlarla çalışır. Hesap döndüren her uç (GET /api/me, rumuz ve profil güncellemesi) aynı tam nesneyi verir; istemcinin kısa bir yanıtı elindekiyle birleştirmesi gerekmez.

GET /api/me
🔒 Bearer token

Kendi hesabım

Token sahibinin hesabını; birincil profil fotoğrafı (avatar), takip sayıları (follows) ve yıldız bakiyesi (stars) ile birlikte döner. Uygulama açılışta ve girişten sonra çağırır; username null ise rumuz seçme ekranına gidilmelidir.

  • birth_date (YYYY-MM-DD) ve gender GlobalTrustID'nin doğruladığı değerlerdir ve yalnız burada döner; başkasının profil kartında hiçbir zaman yer almaz.
  • created_at ve avatar.created_at ISO-8601 metindir. avatar.url ve avatar.thumb_url 1 saat geçerli presigned linklerdir.
Yanıtlar
  • 200{account}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl https://mskop-api.gurerlabs.com/api/me \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/me/username
🔒 Bearer token

Rumuz seç ya da değiştir

Onboarding'in son adımı; rumuz sonradan da değiştirilebilir. Değer kırpılır (trim), büyük/küçük harf duyarsız olarak tekil olmalıdır. Rumuz seçilene kadar odalar, kişiler, yüklemeler ve socket bağlantısı 403 username_required döner; seçildiği an aynı token ile hepsi açılır.

  • Yazarken anlık kontrol için GET /api/usernames/available kullanın; kesin karar bu çağrının yanıtıdır (iki kişi aynı anda aynı rumuzu deneyebilir).
  • makroskop ayrılmış bir addır ve her yazımı is taken hatası verir.
Parametreler
username string body zorunlu

3–24 karakter: harf (Türkçe dahil), rakam, _ ya da . (^[\p{L}\p{N}_.]{3,24}$)

Yanıtlar
  • 200Rumuz kaydedildi; GET /api/me ile aynı {account}
  • 400username yok ya da metin değil (invalid_request)
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 422validation_failed: fields.username biçim hatası için "3-24 characters: letters, digits, '_' or '.'", alınmış ya da ayrılmış ad için "is taken"
curl -X PUT https://mskop-api.gurerlabs.com/api/me/username \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username":"osman"}'
DeneÖnce token gir: otomatik eklenir
PUT /api/me/profile
🔒 Bearer token

Profil ve gizlilik ayarları

Profilin kişiye ait kısmını günceller: biyografi, kimin birebir yazabileceği, fotoğrafı kimin göreceği ve ilgi alanına göre sponsorlu içerik. Bütün alanlar isteğe bağlıdır; gönderilmeyen alan olduğu gibi kalır. Yanıt GET /api/me ile aynı tam hesaptır.

  • personalized_ads false yapıldığı anda ilgi profili silinir, davranış olayları artık saklanmaz ve yalnız hedefsiz sponsorlu içerik gösterilir.
  • dm_policy ve dm_star_cost yalnız yeni açılacak birebir sohbetleri etkiler; var olan sohbete dönmek her zaman serbest ve ücretsizdir.
  • hidden_profile saklanır ama bugün hiçbir şeyi gizlemez (kullanıcı araması ucu henüz yok); arama geldiğinde ilk kuralı bu olacak.
Parametreler
bio string body isteğe bağlı

Profil yazısı; kırpıldıktan sonra en çok 200 karakter. null siler

dm_policy string body isteğe bağlı

Kim birebir sohbet açabilir: open (herkes) · closed (kimse) · paid (dm_star_cost yıldız karşılığında)

dm_star_cost integer body isteğe bağlı

Birebir sohbet açmanın yıldız bedeli, 0–100000. dm_policy paid ise 0'dan büyük olmalı

photo_visibility string body isteğe bağlı

Fotoğrafı kim görür: everyone (herkes) · followers (taraflardan biri diğerini takip ediyorsa) · nobody (yalnız kendisi)

hidden_profile boolean body isteğe bağlı

Aramalarda görünmeme tercihi (henüz etkisi yok)

personalized_ads boolean body isteğe bağlı

İlgi alanlarına göre sponsorlu içerik. null gönderilemez

Yanıtlar
  • 200Kaydedildi; GET /api/me ile aynı {account}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 422validation_failed: geçersiz değer, 200 karakteri aşan bio, paid iken 0 olan dm_star_cost ("must be more than 0 stars") ya da null personalized_ads
curl -X PUT https://mskop-api.gurerlabs.com/api/me/profile \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bio":"Fenerbahçe, kahve ve uzun yürüyüşler.","dm_policy":"paid","dm_star_cost":5,"photo_visibility":"followers"}'
DeneÖnce token gir: otomatik eklenir
GET /api/me/stars
🔒 Bearer token

Yıldız bakiyesi ve hareketleri

Yıldız bakiyesini ve son 50 hareketi (yeniden eskiye) döner. Bakiye, hareketlerin toplamıdır; delta pozitifse kazanç, negatifse harcamadır.

  • Bugün üretilen reason değerleri: dm_open (ücretli birebir sohbet açmak: açandan düşer, karşı tarafa yazılır) ve room_vanity_link (odaya kısa link almak; related_room o odadır). İstemci bilmediği bir reason'ı genel bir satır olarak göstermelidir.
  • created_at ISO-8601 metindir.
Yanıtlar
  • 200{balance, entries}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl https://mskop-api.gurerlabs.com/api/me/stars \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/me/rooms
🔒 Bearer token

Kurduğum ve yönettiğim gruplar

Profil sayfasındaki sekmeler için: kişinin kurduğu gruplar (founded) ve kurmadan yönettiği gruplar (administered). Her iki liste de ada göre sıralıdır ve yalnız grup odalarını içerir; birebir sohbetler burada yer almaz.

  • Her oda standart oda nesnesidir ve birincil fotoğrafı avatar alanında gelir (yoksa null). my_role, member_count gibi bağlama bağlı alanlar bu yanıtta yoktur.
Yanıtlar
  • 200{founded, administered}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl https://mskop-api.gurerlabs.com/api/me/rooms \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/me/followers
🔒 Bearer token

Takipçilerim

Beni takip edenler, en yeni takip başta. En çok 200 kişi döner; sayfalama yoktur. Toplam sayı için GET /api/me içindeki follows.followers kullanılır.

  • followed_at ISO-8601 metindir.
Yanıtlar
  • 200{people}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl https://mskop-api.gurerlabs.com/api/me/followers \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/me/following
🔒 Bearer token

Takip ettiklerim

Benim takip ettiklerim, en yeni takip başta. En çok 200 kişi döner; sayfalama yoktur. Toplam sayı için GET /api/me içindeki follows.following kullanılır.

Yanıtlar
  • 200{people}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl https://mskop-api.gurerlabs.com/api/me/following \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/me
🔒 Bearer token

Hesabı kalıcı olarak sil

Hesabı geri alınamaz biçimde kapatır. GlobalTrustID ile açılmış hesap, hâlâ kendisi olduğunu kanıtlamak için gövdede aynı kimlikten alınmış taze bir GlobalTrustID kodu göndermelidir (giriş akışı yeniden yürütülür). Silindiği an hesabın bütün cihazlarındaki socket bağlantıları düşürülür.

  • Gidenler: hesap, oturumları, fotoğrafları (dosyalarıyla), takip ilişkileri, oda üyelikleri ve yöneticilikleri, ifadeleri, görüldü kayıtları ve yıldız defteri.
  • Kurucusu olduğu gruplar devredilmez, üyeleriyle birlikte silinir: üyelere room:gone, odaya room:deleted gider.
  • Birebir sohbetler karşı tarafa devredilir ve onun listesinde kalır; karşıda kimse kalmamışsa sohbet silinir.
  • Başkalarının odalarında yazdığı mesajlar silinmez; yalnız sender.account_id null olur.
  • Geliştirici (dev) hesapları kimlik kanıtı istemez; gövdesiz çağrı yeterlidir.
Parametreler
code string body zorunlu

Aynı kimlik için yeniden yürütülen giriş akışından gelen authorization code

redirect_uri string body zorunlu

Akışta kullanılan redirect URI

code_verifier string body zorunlu

PKCE doğrulayıcısı

nonce string body isteğe bağlı

Akışta nonce gönderildiyse aynısı

Yanıtlar
  • 204Hesap silindi; gövde boş
  • 400code ya da redirect_uri yok (invalid_request)
  • 401Kod reddedildi (gtid_rejected), id_token doğrulanamadı ya da kod başka bir kimliğe ait (invalid_id_token), veya access token geçersiz (unauthorized / token_expired)
  • 502GlobalTrustID'ye ulaşılamadı (gtid_unavailable)
  • 503Sunucuda GlobalTrustID ayarlı değil (gtid_not_configured)
curl -X DELETE https://mskop-api.gurerlabs.com/api/me \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code":"GTID_KODU","code_verifier":"PKCE_VERIFIER","redirect_uri":"REDIRECT_URI"}'
DeneÖnce token gir: otomatik eklenir

Bu çağrı taze bir GlobalTrustID kodu ister ve hesabı geri dönüşü olmayan biçimde siler; sayfadan denenmez.

Profil fotoğrafları

Hesabın kare (1:1) fotoğrafları. Bir hesabın birden çok fotoğrafı olabilir, biri "yüz"dür (is_primary): GET /api/me ve başkalarının gördüğü profil kartı avatar alanında onu verir. Backend dosya baytı taşımaz; yükleme üç adımdır: (1) POST /api/me/avatars/presign iki presigned PUT linki verir: full (1:1 orijinal) ve thumb (cihazın önbelleğe alacağı küçük kopya); (2) uygulama kareyi kırpar, küçük kopyayı kendisi üretir ve iki dosyayı bu linklere doğrudan PUT eder (MinIO, 10 dakika geçerli, Authorization başlığı gönderilmez); (3) POST /api/me/avatars dönen iki key ile fotoğrafı kaydeder. Bu gruptaki servisler yalnız geçerli token ister; rumuz seçilmemiş hesap da fotoğraf yükleyebilir.

GET /api/me/avatars
🔒 Bearer token

Fotoğraflarım

Hesabın bütün fotoğraflarını döner: yüz olan başta, ardından yeniden eskiye. Fotoğraf yoksa liste boştur.

  • url ve thumb_url 1 saat geçerli presigned GET linkleridir. Uygulama küçük kopyanın baytını yerelde saklayıp önce onu çizmeli; süresi dolmuş link boş avatar değil, bir tazeleme demektir.
  • created_at ISO-8601 metindir.
Yanıtlar
  • 200{avatars}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl https://mskop-api.gurerlabs.com/api/me/avatars \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/me/avatars/presign
🔒 Bearer token

Fotoğraf yükleme linkleri al

Yüklemenin 1. adımı: aynı fotoğrafın orijinali ve küçük kopyası için iki presigned PUT linki üretir. Linkler 600 saniye geçerlidir; iki dosya da avatars/{account_id}/ altına, content_type'a uygun uzantıyla yazılır. Bu çağrı kayıt oluşturmaz: dosyalar yüklendikten sonra POST /api/me/avatars ile kaydedilmelidir.

  • Dosyayı PUT ederken Content-Type başlığını burada seçilen türle gönderin; MinIO isteğine Authorization başlığı eklenmez, imza URL'nin içindedir.
Parametreler
content_type string body isteğe bağlı

image/jpeg (varsayılan) · image/webp · image/png

Yanıtlar
  • 200{content_type, full, thumb}
  • 400Desteklenmeyen content_type (invalid_request)
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
curl -X POST https://mskop-api.gurerlabs.com/api/me/avatars/presign \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content_type":"image/jpeg"}'
DeneÖnce token gir: otomatik eklenir
POST /api/me/avatars
🔒 Bearer token

Yüklenen fotoğrafı kaydet

Yüklemenin 3. adımı: presign yanıtındaki full.key ve thumb.key ile fotoğrafı hesaba kaydeder. Hesabın ilk fotoğrafı ve primary: false denmeden eklenen her fotoğraf yüz olur; eski yüz aynı işlemde yüz olmaktan çıkar. Yeni fotoğraf yüz olduysa bağlı olan herkese socket üzerinden account:avatar duyurulur.

  • Anahtarlar bu hesabın kendi önekiyle (avatars/{account_id}/) başlamalıdır; başkasının dosyası kaydedilemez.
  • Sunucu dosyanın gerçekten yüklendiğini denetlemez: önce iki PUT tamamlanmalı, sonra bu çağrı yapılmalıdır.
Parametreler
key string body zorunlu

Presign yanıtındaki full.key

thumb_key string body zorunlu

Presign yanıtındaki thumb.key

content_type string body isteğe bağlı

image/jpeg (varsayılan) · image/webp · image/png

byte_size integer body isteğe bağlı

Orijinal dosyanın boyutu (bayt); 1 ile 8388608 (8 MiB) arası

size_px integer body isteğe bağlı

Karenin kenar uzunluğu (piksel); 1 ile 4096 arası

primary boolean body isteğe bağlı

Yüz yapılsın mı; varsayılan true. false ise mevcut yüz korunur (hesabın ilk fotoğrafı yine de yüz olur)

Yanıtlar
  • 201Kaydedildi; {avatar}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 422validation_failed: key/thumb_key eksik ya da bu hesabın değil ("must be this account's own upload"), desteklenmeyen content_type, sınır dışı byte_size/size_px
curl -X POST https://mskop-api.gurerlabs.com/api/me/avatars \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"byte_size":118432,"content_type":"image/jpeg","key":"avatars/f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21/c94e1b07-2d58-4a3f-8b6e-1f0a7d3c5e92.jpg","primary":true,"size_px":1024,"thumb_key":"avatars/f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21/c94e1b07-2d58-4a3f-8b6e-1f0a7d3c5e92-thumb.jpg"}'
DeneÖnce token gir: otomatik eklenir
PUT /api/me/avatars/{id}/primary
🔒 Bearer token

Yüz olacak fotoğrafı seç

Hesabın fotoğraflarından birini yüz yapar; önceki yüz aynı işlemde yüz olmaktan çıkar. Değişiklik bağlı olan herkese socket üzerinden account:avatar ile duyurulur, böylece sohbet listeleri ve mesaj satırları yeni fotoğrafı hemen çizer.

Parametreler
id uuid path zorunlu

Fotoğrafın id'si (GET /api/me/avatars)

Yanıtlar
  • 200{avatar} (artık is_primary: true)
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 404Fotoğraf yok, başka hesaba ait ya da id UUID değil (not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/me/avatars/e04b7d92-1a6c-4f58-b3e7-9d2c8a5f1b46/primary \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/me/avatars/{id}
🔒 Bearer token

Fotoğrafı sil

Fotoğrafı ve depodaki iki dosyasını (orijinal ve küçük kopya) siler. Silinen yüzse en yeni fotoğraf yüz olur; son fotoğraf silindiyse hesabın yüzü kalmaz. Ardından güncel yüz (ya da null) bağlı olan herkese account:avatar ile duyurulur.

Parametreler
id uuid path zorunlu

Silinecek fotoğrafın id'si

Yanıtlar
  • 204Silindi; gövde boş
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 404Fotoğraf yok, başka hesaba ait ya da id UUID değil (not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/me/avatars/e04b7d92-1a6c-4f58-b3e7-9d2c8a5f1b46 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Cihaz ve bildirim

Her oturum bir cihazdır: cihazın ne olduğu ve push adresi access token'ın taşıdığı oturuma yazılır, hesaba değil. Aynı kişinin iki telefonu iki ayrı kayıttır. Bu gruptaki servisler yalnız geçerli token ister; rumuz seçilmemiş hesap da çağırabilir.

PUT /api/me/device
🔒 Bearer token

Cihazı ve push token'ı kaydet

Cihaz kendini tanıtır ve (varsa) push adresini bildirir. Uygulama her açılışta, push token yenilendiğinde ve dil değiştiğinde gönderir; çağrı idempotenttir. Yalnız platform zorunludur: token alamayan cihaz (iOS simülatörü, bildirime izin vermeyen kullanıcı) da kendini tanıtabilir. Gönderilmeyen alan olduğu gibi kalır; push_token göndermemek "token'a dokunma" demektir, silmek DELETE /api/me/device'ın işidir.

  • Aynı push_token başka bir oturumda kayıtlıysa (yeniden kurulum, ağsız çıkış, aynı telefonda başka hesap) oradan alınıp bu oturuma taşınır; bir cihaz başka hesabın bildirimini almaz.
  • push_env gönderilmeden yeni bir push_token gelirse token production sayılır; önceki token'ın değeri taşınmaz.
  • Push içeriği gizlidir: FCM'e ve APNs'e yalnız {type, room_slug, message_id} gider (type: message ya da mention). Mesaj metni, oda adı ve gönderen Google'a ya da Apple'a gönderilmez; görünen metni uygulama kendi önbelleğinden üretir. Sessize alınmış odalar push üretmez.
  • Oturum kimliği taşımayan eski bir access token ile gelinirse 401 token_expired döner: token yenilenip çağrı tekrarlanmalıdır.
Parametreler
platform string body zorunlu

android · ios · web_app · web_integration. Push'un hangi servise gideceğini belirler: ios → APNs, diğerleri → FCM. Son ikisini bugün hiçbir istemci göndermez

push_token string body isteğe bağlı

Android: FCM registration token. iOS: APNs device token (hex). 1–4096 bayt; boş metin 400 döner

push_env string body isteğe bağlı

Yalnız iOS: sandbox (Xcode/simülatör derlemesi) · production (App Store, TestFlight). Varsayılan production

device_model string body isteğe bağlı

Android Build.MODEL, iOS makine kimliği (iPhone16,2). Kırpılır, en çok 64 karakter; boş metin "söylenmedi" sayılır

device_manufacturer string body isteğe bağlı

Android Build.MANUFACTURER, iOS Apple. Kırpılır, en çok 64 karakter

is_emulator boolean body isteğe bağlı

Emülatör/simülatör mü. Gerçek true/false olmalı; "true" metni 400 döner. Göndermemek false ile aynı değildir (söylenmedi)

language string body isteğe bağlı

Uygulamanın bu cihazda çalıştığı dil: tr · en. Duyurular dile göre gönderilir; oturumda tutulur, hesapta değil

app_version string body isteğe bağlı

Uygulama sürümü. Kırpılır, en çok 64 karakter

os_version string body isteğe bağlı

İşletim sistemi sürümü (Android 14, iOS 18.0). Kırpılır, en çok 64 karakter

Yanıtlar
  • 204Kaydedildi; gövde boş
  • 400platform yok ya da listede değil, veya herhangi bir alan geçersiz (invalid_request)
  • 401Token yok ya da geçersiz (unauthorized), süresi dolmuş ya da oturum kimliği taşımıyor (token_expired)
  • 404Token'ın oturumu artık yok, örneğin çıkış yapılmış (not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/me/device \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"app_version":"1.4.0 (52)","device_manufacturer":"Google","device_model":"Pixel 8","is_emulator":false,"language":"tr","os_version":"14","platform":"android","push_token":"FCM_TOKEN"}'
DeneÖnce token gir: otomatik eklenir
DELETE /api/me/device
🔒 Bearer token

Bu cihaza push'u kapat

Bu oturumun push token'ını siler; cihaz bildirim almayı bırakır, platform ve model bilgisi kalır. Kullanıcı bildirimleri kapattığında çağrılır. Çıkış (POST /api/auth/logout) bunu zaten yapar.

Yanıtlar
  • 204Her zaman (token zaten yoksa da); gövde boş
  • 401Token yok ya da geçersiz (unauthorized), süresi dolmuş ya da oturum kimliği taşımıyor (token_expired)
curl -X DELETE https://mskop-api.gurerlabs.com/api/me/device \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Kişiler ve birebir sohbet

Başka hesaplar: profil kartı, takip ilişkisi ve birebir sohbet (DM). Kişiler rumuzla adreslenir ve rumuz büyük/küçük harf duyarsızdır. Bu gruptaki servisler rumuz seçilmiş olmayı ister: rumuzu olmayan hesap 403 username_required alır.

GET /api/contacts
🔒 Bearer token

Kişi kartı listesi

Ataçtaki "kişi" ekinin seçim listesi: takip ettiklerim ve birebir sohbetim olan kişiler, rumuza göre sıralı, en çok 500 kişi. Bir kişi iki kaynakta da varsa bir kez, source: "following" ile gelir.

  • Cihazın telefon rehberi hiçbir zaman okunmaz ya da yüklenmez; kişi kartı yalnız bir Makroskop hesabını gösterir.
  • Henüz kimsenin yazmadığı, yalnız açılmış birebir sohbetin karşı tarafı da listede yer alır.
Yanıtlar
  • 200{people}; source: following ya da dm
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
curl https://mskop-api.gurerlabs.com/api/contacts \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/users/{username}
🔒 Bearer token

Profil kartı

Bir kişinin profil kartını, birlikte üye olduğumuz grupları (common_rooms, ada göre) ve aramızdaki birebir sohbeti (dm) döner. dm yalnız benim üyesi olduğum bir sohbet varsa doludur (biçimi POST /api/dm/{username} yanıtıyla aynı), yoksa null. Kişinin kendi ayarları (fotoğraf görünürlüğü, gizli profil, doğum tarihi, cinsiyet) burada dönmez.

  • avatar karşı tarafın photo_visibility ayarı izin veriyorsa doludur, yoksa null.
  • following: ben onu takip ediyor muyum; follows_me: o beni takip ediyor mu. follows onun takipçi/takip sayılarıdır.
  • dm_policy ve dm_star_cost "mesaj gönder" düğmesini gizlemek ya da fiyatını göstermek içindir.
Parametreler
username string path zorunlu

Kişinin rumuzu; büyük/küçük harf duyarsız

Yanıtlar
  • 200{user, common_rooms, dm}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Bu rumuzla hesap yok (not_found)
curl https://mskop-api.gurerlabs.com/api/users/ozum \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/users/{username}/follow
🔒 Bearer token

Takip et

Kişiyi takip etmeye başlar. İdempotenttir: zaten takip ediliyorsa yine 200 döner. Yanıttaki follows takip edilen kişinin güncel sayılarıdır.

Parametreler
username string path zorunlu

Kişinin rumuzu; büyük/küçük harf duyarsız

Yanıtlar
  • 200{following: true, follows}
  • 400Kendini takip etmeye çalıştın (invalid_request)
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Bu rumuzla hesap yok (not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/users/ozum/follow \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/users/{username}/follow
🔒 Bearer token

Takibi bırak

Kişiyi takip etmeyi bırakır. İdempotenttir: zaten takip edilmiyorsa da 200 ve following: false döner. Yanıttaki follows kişinin güncel sayılarıdır.

Parametreler
username string path zorunlu

Kişinin rumuzu; büyük/küçük harf duyarsız

Yanıtlar
  • 200{following: false, follows}
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Bu rumuzla hesap yok (not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/users/ozum/follow \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/users/{username}/followers
🔒 Bearer token

Kişinin takipçileri

Kişiyi takip edenler, en yeni takip başta. En çok 200 kişi döner; sayfalama yoktur. Toplam sayı profil kartındaki follows.followers alanındadır.

Parametreler
username string path zorunlu

Kişinin rumuzu; büyük/küçük harf duyarsız

Yanıtlar
  • 200{people}; followed_at ISO-8601
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Bu rumuzla hesap yok (not_found)
curl https://mskop-api.gurerlabs.com/api/users/ozum/followers \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/users/{username}/following
🔒 Bearer token

Kişinin takip ettikleri

Kişinin takip ettikleri, en yeni takip başta. En çok 200 kişi döner; sayfalama yoktur. Toplam sayı profil kartındaki follows.following alanındadır.

Parametreler
username string path zorunlu

Kişinin rumuzu; büyük/küçük harf duyarsız

Yanıtlar
  • 200{people}; followed_at ISO-8601
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Bu rumuzla hesap yok (not_found)
curl https://mskop-api.gurerlabs.com/api/users/ozum/following \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/dm/{username}
🔒 Bearer token

Birebir sohbet aç

Kişiyle birebir sohbet odasını döner; yoksa açar. Oda yalnız açanın listesine girer: karşı taraf ilk mesaj saklandığında odaya eklenir ve room:new olayını o zaman alır, o ana kadar onun profil kartında dm: null görünür. Karşı tarafın dm_policy değeri paid ise dm_star_cost yıldız açandan düşer ve karşı tarafa yazılır; ücret yalnız oda ilk açılırken bir kez alınır, var olan sohbete dönmek ücretsizdir.

  • Birebir sohbet bir sistem odasıdır: kind: "dm", yönetici yok, herkese kapalı (visibility: "closed"), aramada çıkmaz. name karşı tarafın rumuzudur ve peer onu (online ile) verir.
  • Slug iki hesap kimliğinden türer (dm- + her UUID'nin tiresiz ilk 12 karakteri, sıralı); aynı çift hep aynı odaya düşer.
  • Bu yanıtta member_count her zaman 2'dir; karşı taraf henüz eklenmemiş olsa bile.
  • Odada değiştirilebilen tek ayar duvar kağıdıdır (PATCH /api/rooms/{slug}, iki taraf da). Var olan sohbete karşı tarafın dm_policy ayarı sonradan closed olsa da dönülebilir.
Parametreler
username string path zorunlu

Sohbet açılacak kişinin rumuzu; büyük/küçük harf duyarsız

Yanıtlar
  • 200{room} (oda yeni açıldıysa da 200)
  • 400Kendinle sohbet açmaya çalıştın (invalid_request)
  • 401Token yok ya da geçersiz (unauthorized) veya süresi dolmuş (token_expired)
  • 402Karşı taraf ücretli ve bakiye yetmiyor (insufficient_stars)
  • 403Karşı taraf birebir sohbete kapalı (dm_closed) ya da rumuz seçilmemiş (username_required)
  • 404Bu rumuzla hesap yok (not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/dm/ozum \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Odalar

Oda döndüren her uç aynı oda nesnesini verir; bağlama göre üstüne my_role, member_count, is_member, my_permissions, avatar gibi alanlar eklenir. kind group (olağan grup) ya da dm (birebir sohbetin sistem odası: peer dolu, name karşı tarafın rumuzu) olur. Odalar slug ile anılır: 3–48 karakter, küçük harf, rakam ve tek tire (^[a-z0-9]+(-[a-z0-9]+)*$), birebir sohbette dm-<id>-<id>; visibility open ise bağlantı katılmaya yeter, closed ise kişiyi bir yönetici ekler.

GET /api/rooms
🔒 Bearer token

Odalarım

Üyesi olduğun bütün odalar (arşivdekiler dahil), sohbet listesinin çizdiği satır bilgileriyle: my_role, joined_at, archived, muted, pinned_to_top, last_message, unread, unread_mentions. Sıra: önce başa sabitlenenler (en yeni sabit üstte), sonra en son konuşulan oda; hiç konuşulmamış oda joined_at'e düşer, eşitliği oda kimliği bozar. Birebir sohbet karşı tarafın rumuzuyla gelir ve peer.online o anki çevrimiçi durumunu taşır.

  • last_message.body gövdenin ilk 120 karakteridir; tartışma yanıtları ve silinmiş mesajlar last_message sayılmaz. Oda hiç konuşmadıysa null.
  • unread okuma imlecinden (message:read) sonraki mesaj sayısıdır; kendi mesajların ve göremediğin admins satırları sayılmaz.
  • Birebir sohbette yönetici yoktur: iki tarafın my_role değeri de member gelir.
  • Listenin canlı hâli user:<account_id> hattındaki room:activity, room:new ve room:gone olaylarıdır; her mesajda bu ucu yeniden çağırmak gerekmez.
Yanıtlar
  • 200Odalar; hiç oda yoksa boş liste
curl https://mskop-api.gurerlabs.com/api/rooms \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms
🔒 Bearer token

Oda kur

Yeni bir grup kurar; kuran kişi aynı işlemde kurucu (founder) ve ilk üye olur. slug verilmezse addan türetilir (Kadıköy Koşu Kulübü → kadikoy-kosu-kulubu, Türkçe harfler sadeleşir, en çok 40 karakter); türetilen slug doluysa sonuna -a1b2c3 gibi rastgele bir ek gelir. Fotoğraf ayrı yüklenir (*Oda fotoğrafları*): oda baytlardan önce var olur.

  • Kendi verdiğin slug doluysa ek eklenmez, 422 döner (fields.slug: has already been taken).
  • star_gated: true olan odaya katılma şimdilik 402 star_required döner; yıldızla katılma henüz açık değil.
  • Diğer ayarlar (wallpaper, join_approval, show_members...) kurulumdan sonra PATCH /api/rooms/{slug} ile değişir.
Parametreler
name string body zorunlu

Oda adı; baştaki/sondaki boşluk kırpılır, 1–80 karakter

slug string body isteğe bağlı

3–48 karakter, küçük harf, rakam ve tek tire; küçük harfe çevrilir. Sonradan değiştirilemez

visibility string body isteğe bağlı

open (varsayılan; bağlantı yeter) ya da closed (yönetici ekler)

message_ttl_hours integer body isteğe bağlı

Mesajlar bu kadar saat sonra silinir; 1–8760, null = silinmez (varsayılan)

welcome_message string body isteğe bağlı

Yeni üyeye odanın yazdığı karşılama; en çok 500 karakter, {username} yerine katılanın rumuzu konur

star_gated boolean body isteğe bağlı

Katılmak yıldız ister (varsayılan false)

Yanıtlar
  • 201Oda kuruldu; my_role: "founder", member_count: 1
  • 422Alan hatası (validation_failed): name boş ya da 80'den uzun, slug biçimi bozuk ya da dolu, visibility bilinmiyor, message_ttl_hours aralık dışında, welcome_message 500'den uzun
curl -X POST https://mskop-api.gurerlabs.com/api/rooms \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message_ttl_hours":168,"name":"Kadıköy Koşu Kulübü","visibility":"open","welcome_message":"Aramıza hoş geldin {username}!"}'
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}
🔒 Bearer token

Oda detayı

Tek odanın tam nesnesi. Üye olmayan herkes de çağırabilir (davet bağlantısının açtığı kapı sayfası); kapalı gruplar dahil. is_member senin üye olup olmadığını, my_permissions bu odada yapabileceğin her şeyi söyler: istemci ataşı ve menüleri bu listeden çizmeli, kuralları kendisi türetmemelidir.

  • Üye değilsen my_permissions boş liste gelir.
  • pinned en yeni sabitlenen mesajdır (eski uygulamalar bunu okur), pins bütün sabitlerin listesidir (yeniden eskiye). Yalnız mesaj kimliği gelir; metni cihaz kendi kopyasından çizer.
  • member_denied odanın üyelerden geri aldığı yetkilerdir; members_can_pin aynı kuralın eski adıdır (group.can_pin_message).
  • Bu uçta my_role yoktur; rolü GET /api/rooms listesi ya da GET /api/rooms/{slug}/members verir.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200Oda
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PATCH /api/rooms/{slug}
🔑 oda yöneticisi

Oda ayarları

Odanın ayarlarını değiştirir; göndermediğin alan olduğu gibi kalır, bilinmeyen alanlar yok sayılır, slug hiç değişmez. Gönderilen her ayar adı odaya yalnız yöneticilerin gördüğü bir room_settings_changed satırı olarak yazılır (event.data.settings; değerler saklanmaz). Birebir sohbette iki taraf da çağırabilir ama yalnız wallpaper değişir ve orada wallpaper zorunludur.

  • Kurucu ve bütün yöneticiler çağırabilir; verilen anahtarlara (granted) bakılmaz.
  • members_can_pin gönderilirse member_denied içindeki group.can_pin_message de aynı yönde güncellenir.
  • visibility, wallpaper ve name için null gönderilemez (422); "message_ttl_hours": null otomatik silmeyi kapatır.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

name string body isteğe bağlı

Oda adı, 1–80 karakter

visibility string body isteğe bağlı

open ya da closed

welcome_message string body isteğe bağlı

Karşılama metni, en çok 500 karakter; {username} kullanılabilir

message_ttl_hours integer body isteğe bağlı

1–8760 saat; null = mesajlar silinmez

wallpaper string body isteğe bağlı

Sohbet duvar kâğıdı: adacayi, okyanus, lavanta, kum, gul, grafit

star_gated boolean body isteğe bağlı

Katılmak yıldız ister

members_can_pin boolean body isteğe bağlı

Üyeler mesaj sabitleyebilir

discussions_enabled boolean body isteğe bağlı

Mesajların altında tartışma açılabilir

join_approval boolean body isteğe bağlı

Katılma isteği yönetici onayı bekler (join → requested); açıkken visibility'ye bakılmaz

history_for_new_members boolean body isteğe bağlı

false ise yeni üyenin akışı katıldığı andan başlar

events_visibility string body isteğe bağlı

Oda satırlarını kim görür: all, admins ya da none

show_welcome boolean body isteğe bağlı

Yeni üyeye karşılama satırı yazılır

show_members boolean body isteğe bağlı

false ise yönetici olmayanlar üye listesinde yalnız kurucuyu ve yöneticileri görür

show_gifts boolean body isteğe bağlı

Grup sayfasında hediyeler sekmesi görünür

members_can_video boolean body isteğe bağlı

Üyeler görüntülü sohbet başlatabilir (Faz 2)

Yanıtlar
  • 200Güncel oda (GET /api/rooms/{slug} ile aynı biçim)
  • 403Yönetici değilsin; birebir sohbette üye değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
  • 422Alan hatası (validation_failed): bilinmeyen wallpaper / visibility / events_visibility, aralık dışı message_ttl_hours, uzun metin
curl -X PATCH https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message_ttl_hours":72,"name":"Fenerbahçe Taraftar Grubu","show_members":false,"wallpaper":"grafit"}'
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}
🔑 kurucu (for=everyone, grup)

Sohbeti sil / listemden kaldır

for=me sohbeti yalnız senin listenden düşürür: POST /api/rooms/{slug}/leave ile birebir aynıdır ve onun yanıtını döner (kurucuysan oda devredilir). for=everyone odayı temelli siler: üyeler, mesajlar, konular, banlar, fotoğraflar ve medya dosyaları gider; diğer üyelerin user: hattına room:gone, odanın kanalına room:deleted yayılır. Grupta bunu yalnız kurucu yapabilir, birebir sohbette iki taraftan biri; geri alınamaz.

  • for verilmezse (ya da tanınmayan bir değerse) birebir sohbette me, grupta everyone sayılır.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

for string query isteğe bağlı

everyone (odayı herkes için sil) ya da me (yalnız listemden kaldır)

Yanıtlar
  • 200for=me: ayrılma yanıtı (left, handed_over ya da room_gone)
  • 204for=everyone: oda silindi; gövde boş
  • 403for=everyone ve kurucu değilsin / birebir sohbetin üyesi değilsin (not_admin); for=me ve üye değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar?for=me \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/join
🔒 Bearer token

Odaya katıl

Odaya girer ve sonucu status ile, odanın güncel hâlini room ile döner. joined: üye oldun; odaya member:joined yayılır, member_joined satırı ve (açıksa) karşılama satırı yazılır. already_member: zaten üyesin, hiçbir şey değişmez. requested: oda onay istiyor (join_approval), isteğin yöneticilerin requests listesine düştü ve onaylanınca user: hattına room:new gelir.

  • Denetim sırası: üyelik → ban (403 banned) → yıldız (402 star_required) → onay kuyruğu (requested) → kapalı oda (403 room_closed). Kapalı ama kuyruklu oda istek alır.
  • Oda geçmişi yeni üyelerden gizliyorsa (history_for_new_members: false) akışın katıldığın andan başlar.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200status: joined, already_member ya da requested; yanında room
  • 402Oda yıldızla giriliyor; henüz açık değil (star_required)
  • 403Bu odadan engellendin (banned) ya da oda kapalı ve onay kuyruğu yok (room_closed)
  • 404Böyle bir oda yok (room_not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/join \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/leave
🔒 Bearer token

Odadan ayrıl

Odadan çıkarsın; odaya member:left yayılır ve member_left satırı yazılır. Kurucu da ayrılabilir: oda önce yöneticilerden, yoksa üyelerden odada en uzun süredir bulunana geçer, yanıt handed_over + founder_id olur, odaya founder_changed satırı yazılır ve yeni kurucunun user: hattına my_role: "founder" taşıyan room:new gider. Odada senden başka kimse kalmadıysa oda dosyalarıyla birlikte silinir (room_gone, odaya room:deleted).

  • Birebir sohbette kurucu yoktur: ayrılan çıkar, ikinci taraf da çıkınca oda silinir.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200status: left, handed_over (+ founder_id) ya da room_gone
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/leave \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/archive
🔒 Bearer token

Arşive al

Odayı yalnız kendi arşivine taşır; başka kimsenin listesi değişmez. Arşivdeki oda GET /api/rooms içinde archived: true ile gelmeye devam eder ve sıradan mesajlar için push göndermez; seni @rumuz ile anan mesajın push'u yine gelir. Zaten arşivdeyse de 204 döner.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 204Arşivlendi; gövde boş
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/archive \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/archive
🔒 Bearer token

Arşivden çıkar

Odayı arşivden ana listeye geri alır ve push'ları yeniden açar (sessize alınmadıysa). Arşivde değilse de 204 döner.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 204Arşivden çıktı; gövde boş
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/archive \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/pin
🔒 Bearer token

Listemde başa sabitle

Odayı yalnız senin sohbet listenin tepesine sabitler; odadaki başka kimsenin listesi kıpırdamaz. Sabitlenen odalar listede en yeni sabit üstte olacak şekilde önce gelir, pinned_to_top: true taşır. Odanın mesaj sabitlemesiyle (pinned, pins) ilgisi yoktur.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 204Sabitlendi; gövde boş
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/pin \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/pin
🔒 Bearer token

Baştan indir

Listedeki sabitlemeyi kaldırır; oda son konuşulma sırasındaki yerine döner. Sabit değilse de 204 döner.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 204İndirildi; gövde boş
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/pin \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/mute
🔒 Bearer token

Bildirimleri sessize al

Bu odadan sana push gelmez; başka hiçbir şey değişmez (mesajlar, rozet, liste aynen sürer). Arşivden farklı olarak @rumuz bahsetmeleri de sessize alınır. Oda nesnesinde muted: true görünür.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 204Sessize alındı; gövde boş
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/mute \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/mute
🔒 Bearer token

Bildirimleri aç

Sessize almayı kaldırır; push'lar yeniden gelir. Sessizde değilse de 204 döner. Bir yöneticinin seni susturmasıyla (members/{account_id}/mute) karıştırılmamalı.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 204Sesi açıldı; gövde boş
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/mute \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/stats
🔒 Bearer token

Grup istatistikleri

Grup sayfasının üst şeridi: ne zamandan beri var, kaç üye, kaç mesaj, ne kadar yıldız ve hediye almış. Yanıt stats nesnesine sarılıdır. message_count oda satırlarını (kind: "event") ve silinmiş mesajları saymaz.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200İstatistikler
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/stats \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/events
🔒 Bearer token

Grup hareketleri

Odanın kendi yazdığı son satırlar (katılma, ayrılma, atma, ban, susturma, ayar değişikliği...), yeniden eskiye. Her biri kind: "event" olan normal bir mesaj nesnesidir; event.type ne olduğunu, event.username kimin hakkında olduğunu, event.actor kimin yaptığını söyler. Yöneticiler audience: "admins" satırlarını da görür, üyeler görmez.

  • Arama odanın son 500 mesajı içinde yapılır; daha eski olaylar bu uçtan gelmez.
  • Olay tipleri: member_joined, member_left, member_kicked, member_banned, member_unbanned, member_muted, member_unmuted, score, welcome, founder_changed, room_settings_changed, member_permissions_changed, admin_permissions_changed, message_deleted, message_pinned, message_unpinned, discussion_closed, discussion_reopened.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

limit integer query isteğe bağlı

Kaç satır; 1–200 arasına sıkıştırılır, varsayılan 50

Yanıtlar
  • 200Olay satırları, en yeni başta
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/events?limit=20 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/topics
🔒 Bearer token

Konu (hashtag) şeridi

Odada kullanılan hashtag'ler, en son aktif olan başta, en çok 100 tane. Her mesaj taşıdığı her hashtag'in sayacını artırır; hashtag'siz mesajlar unknown konusunda sayılır (unknown: true). last_active ISO-8601 zamandır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200Konular
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/topics \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Oda yönetimi ve üyeler

Odada üç rol vardır: founder (kurucu; her yetkiyi her zaman taşır, kısıtlanamaz, atılamaz ve engellenemez), admin (yönetici; yalnız kendisine verilen anahtarları, granted, taşır) ve member (üye; odanın member_denied ile geri aldıkları ve yöneticiye özgü anahtarlar dışında her şeyi yapabilir). Üye anahtarları: send_message, edit_message, delete_message, update_tag, sub_chat.send_message, sub_chat.close_subject, group.can_open_discussion, group.can_pin_message, group.can_take_screen_shot, ayrıca her ek türü için send_message.<tür> ve sub_chat.send_message.<tür> (tür: photos, videos, files, musics, voice_messages, video_messages, gifs, surveys, links, reactions, locations, share_contact_cards, events, entries; musics ve video_messages henüz kullanılmıyor). Yönetici anahtarları: group.edit_informations, group.can_remove_message, group.can_ban_members, group.can_ban_administrators (yalnız kurucu verebilir), group.can_invite_members, group.can_create_invite_link, group.can_cancel_invite_link, group.can_pin_message, group.can_edit_member_tags, group.can_open_voice_calls, group_can_give_permissions (noktasız yazılır), group.can_edit_permissions, group.can_be_anonymous, group.can_take_screen_shot. Bazı uçlar anahtara değil yalnız yönetici olmaya bakar; her kartın rozeti neyin gerektiğini söyler, kişinin odadaki sonucu ise her zaman oda nesnesindeki my_permissions listesidir.

PUT /api/rooms/{slug}/admins/{account_id}
🔑 kurucu

Yönetici yap

Bir üyeyi yönetici yapar. Yeni yönetici hiçbir anahtarla başlamaz (granted: []); ne yapabileceğini ayrıca PUT …/admins/{account_id}/permissions ile verirsin. Kimin atadığı saklanır ve üye listesinde granted_by olarak döner. Zaten yöneticiyse hiçbir şey değişmez ve yine admin döner.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Yönetici yapılacak üyenin hesap kimliği

Yanıtlar
  • 200{status: "admin"}
  • 403Kurucu değilsin (not_admin) ya da hedef odanın üyesi değil (not_member)
  • 404Böyle bir oda yok (room_not_found)
  • 409Hedef kurucunun kendisi (founder_protected)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/admins/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/admins/{account_id}
🔑 kurucu

Yöneticiliği al

Yöneticiyi sıradan üyeye indirir; verilmiş bütün anahtarları (granted) silinir. Kişi odada kalır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Yöneticiliği alınacak hesabın kimliği

Yanıtlar
  • 200{status: "member"}
  • 403Kurucu değilsin (not_admin)
  • 404Oda yok (room_not_found) ya da hedef yönetici değil (not_found)
  • 409Hedef kurucunun kendisi (founder_protected)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/admins/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/admins/{account_id}/permissions
🔑 group_can_give_permissions

Yöneticiye yetki ver

Bir yöneticinin taşıdığı anahtarların tamamını yazar: liste her seferinde bütün gerçektir, içinde olmayan geri alınır. Bilinmeyen anahtarlar reddedilmez, sessizce düşer; liste tekilleştirilip sıralanır. Odaya yalnız yöneticilerin gördüğü bir admin_permissions_changed satırı yazılır (event.data.granted).

  • Kimse kendi anahtarlarını değiştiremez (403 cannot_grant_to_self).
  • group.can_ban_administrators yalnız kurucu verebilir; başka bir yönetici gönderirse çağrı reddedilmez, o anahtar listeden düşer. Yanıttaki granted gerçekte yazılandır.
  • Üyelerden geri alınmış bir anahtar (ör. send_message.links) yöneticiye ayrıca verilirse o yönetici için yasak kalkar.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Anahtarları yazılacak yöneticinin hesap kimliği

granted string[] body zorunlu

Verilecek anahtarların tam listesi; boş liste hepsini geri alır

Yanıtlar
  • 200{granted: [...]}: yazılan liste
  • 403Bu yetkin yok ya da hedef bir yönetici değil (not_admin); hedef kendinsin (cannot_grant_to_self)
  • 404Böyle bir oda yok (room_not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/admins/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83/permissions \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"granted":["group.can_ban_members","group.can_edit_member_tags","group.can_remove_message"]}'
DeneÖnce token gir: otomatik eklenir
PATCH /api/rooms/{slug}/permissions
🔑 group.can_edit_permissions

Üyelerden alınan yetkiler

Odanın üyelerden geri aldığı yetkileri (member_denied) yazar. Liste her seferinde bütün gerçektir: içinde olmayan her şey serbesttir; bilinmeyen anahtarlar sessizce düşer. Yasak yöneticileri de bağlar, onlara aynı anahtar ayrıca verilmediyse. Odaya yalnız yöneticilerin gördüğü bir member_permissions_changed satırı yazılır.

  • denied gönderilmezse ya da liste değilse boş liste sayılır ve bütün kısıtlar kalkar.
  • Bu uç members_can_pin alanını güncellemez; sabitleme kuralı için member_denied ve my_permissions esas alınmalı.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

denied string[] body zorunlu

Üyelerden alınacak anahtarların tam listesi; [] hepsini geri verir

Yanıtlar
  • 200Güncel oda (GET /api/rooms/{slug} ile aynı biçim)
  • 403Bu yetkin yok ya da üye değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
curl -X PATCH https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/permissions \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"denied":["group.can_pin_message","send_message.links","send_message.locations"]}'
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/members
🔒 Bearer token

Üyeler

Odanın üyeleri, katılma sırasına göre (en eski başta). Her satırda rol (founder, admin, member), odanın taktığı etiket (tag), yöneticinin anahtarları (granted), onu kimin atadığı (granted_by, rumuz) ve ne zamandan beri yönetici olduğu (admin_since) vardır. muted_until bir yöneticinin susturması sürerken ms epoch, bitince null; joined_at ve admin_since ISO-8601'dir.

  • Oda üyeleri gizliyorsa (show_members: false) kurucu ya da yönetici olmayan biri yalnız kurucuyu ve yöneticileri görür.
  • granted yalnız kurucuya ve yöneticilere dolu gelir; sıradan üye herkeste [] görür.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200Üyeler
  • 403Odanın üyesi değilsin (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/members \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/members/{account_id}
🔑 group.can_ban_members

Üyeyi çıkar

Kişiyi engellemeden odadan çıkarır (/kick komutunun REST ikizi); bağlantıyla yeniden katılabilir. Yöneticiyse yöneticiliği de gider. Odaya member_kicked satırı yazılır ve member:left yayılır, kişinin user: hattına room:gone gider. Hedef bir yöneticiyse ayrıca group.can_ban_administrators gerekir.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Çıkarılacak hesabın kimliği

Yanıtlar
  • 204Çıkarıldı; gövde boş
  • 403Bu yetkin yok: yönetici değilsen not_admin, yöneticisin ama group.can_ban_members verilmediyse ya da hedef bir yöneticiyse ve group.can_ban_administrators yoksa not_allowed
  • 403Hedef odanın üyesi değil (not_member)
  • 404Oda yok (room_not_found) ya da hesap yok (not_found)
  • 409Hedef kurucu (founder_protected)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/members/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/members/{account_id}/tag
🔑 group.can_edit_member_tags

Üyeye etiket tak

Odanın bir üyesine taktığı kısa kelime (ör. Kaptan); o kişinin bu odadaki her mesajında adının yanında çizilir, başka odada görünmez. Metin kırpılır ve 32 karakterden uzunsa kesilir; boş metin ya da null etiketi kaldırır. Odaya member:tagged {account_id, tag} yayılır, açık cihazlar listeyi yeniden istemeden çizer.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Etiketlenecek üyenin hesap kimliği

tag string body isteğe bağlı

Etiket, en çok 32 karakter; boş ya da null kaldırır

Yanıtlar
  • 200{account_id, tag}; kaldırıldıysa tag: null
  • 403Bu yetkin yok (not_admin) ya da hedef üye değil (not_member)
  • 404Böyle bir oda yok (room_not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/members/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83/tag \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tag":"Kaptan"}'
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/members/{account_id}/mute
🔑 group.can_ban_members

Üyeyi süreli sustur

Kişi odada kalır ama süre bitene kadar mesaj gönderemez; denerse socket muted hatası ve until döner (/mute komutunun REST ikizi, yönetim ekranı için). Odaya member_muted satırı yazılır (data.until ms, data.seconds verilen süre). Yeniden çağırmak süreyi baştan kurar.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Susturulacak üyenin hesap kimliği

minutes integer body isteğe bağlı

Süre (dakika); 1–525600 arasına sıkıştırılır, verilmezse ya da sayı değilse 60

Yanıtlar
  • 200{muted_until}: bitiş anı, ms epoch
  • 403Bu yetkin yok: yönetici değilsen not_admin, yöneticisin ama group.can_ban_members verilmediyse ya da hedef bir yöneticiyse ve group.can_ban_administrators yoksa not_allowed
  • 403Hedef odanın üyesi değil (not_member)
  • 404Oda yok (room_not_found) ya da hesap yok (not_found)
  • 409Hedef kurucu (founder_protected)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/members/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83/mute \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"minutes":60}'
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/members/{account_id}/mute
🔑 group.can_ban_members

Susturmayı kaldır

Kişinin sesini hemen geri verir ve odaya member_unmuted satırı yazar. Susturulmamış bir üye için de 204 döner (satır yine yazılır).

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Sesi açılacak üyenin hesap kimliği

Yanıtlar
  • 204Susturma kalktı; gövde boş
  • 403Bu yetkin yok: yönetici değilsen not_admin, yöneticisin ama group.can_ban_members verilmediyse ya da hedef bir yöneticiyse ve group.can_ban_administrators yoksa not_allowed
  • 403Hedef odanın üyesi değil (not_member)
  • 404Oda yok (room_not_found) ya da hesap yok (not_found)
  • 409Hedef kurucu (founder_protected)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/members/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83/mute \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/bans
🔑 oda yöneticisi

Engellenenler

Odanın engellediği hesaplar, en yeni başta. reason engellerken verilen sebeptir (yoksa null), banned_at ISO-8601'dir. Liste bans nesnesine sarılıdır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200Engellenenler
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/bans \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/bans/{account_id}
🔑 group.can_ban_members

Engelle

Kişiyi odadan çıkarır ve bir daha katılamaz (join → 403 banned); /ban komutunun REST ikizidir. Odaya member_banned satırı yazılır (data.reason), member:left yayılır ve kişinin user: hattına room:gone gider. Hedefin o anda üye olması gerekmez: odaya hiç girmemiş bir hesap da önceden engellenebilir.

  • Zaten engelliyse çağrı yine 204 döner; ilk sebep değişmez.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Engellenecek hesabın kimliği

reason string body isteğe bağlı

Sebep; engellenenler listesinde görünür

Yanıtlar
  • 204Engellendi; gövde boş
  • 403Bu yetkin yok: yönetici değilsen not_admin, yöneticisin ama group.can_ban_members verilmediyse ya da hedef bir yöneticiyse ve group.can_ban_administrators yoksa not_allowed
  • 404Oda yok (room_not_found) ya da hesap yok (not_found)
  • 409Hedef kurucu (founder_protected)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/bans/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Reklam ve spam"}'
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/bans/{account_id}
🔑 group.can_ban_members

Engeli kaldır

Engeli kaldırır ve odaya member_unbanned satırı yazar (/unban komutunun REST ikizi). Kişi üye olarak geri eklenmez; isterse bağlantıyla yeniden katılır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Engeli kaldırılacak hesabın kimliği

Yanıtlar
  • 204Engel kalktı; gövde boş
  • 403Bu yetkin yok: yönetici değilsen not_admin, yöneticisin ama group.can_ban_members verilmediyse ya da hedef bir yöneticiyse ve group.can_ban_administrators yoksa not_allowed
  • 404Oda ya da hesap yok (room_not_found, not_found) veya kişi engelli değil (not_found)
  • 409Hedef kurucu (founder_protected)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/bans/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/requests
🔑 oda yöneticisi

Katılma istekleri

Onay isteyen bir odada (join_approval: true) kapıda bekleyenler, en eski başta. requested_at ISO-8601'dir. Liste requests nesnesine sarılıdır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200Bekleyen istekler
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/requests \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/requests/{account_id}
🔑 oda yöneticisi

İsteği onayla

Bekleyen kişiyi üye yapar. Odaya member:joined yayılır, member_joined ve (açıksa) karşılama satırı yazılır; kişinin user: hattına room:new gider, odayı açık olmasa da listesinde görür.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Onaylanacak isteğin sahibi

Yanıtlar
  • 200{status: "joined"}
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Oda yok (room_not_found) ya da bu hesabın bekleyen isteği yok (not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/requests/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/requests/{account_id}
🔑 oda yöneticisi

İsteği reddet

Bekleyen isteği siler. Kişiye bildirim gitmez; yeniden istek gönderebilir. Bekleyen istek yoksa da 204 döner.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

account_id uuid path zorunlu

Reddedilecek isteğin sahibi

Yanıtlar
  • 204İstek silindi; gövde boş
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/requests/2b9d71c4-8e05-4a3f-b6d2-5c19e7a04f83 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Oda fotoğrafları

Oda fotoğrafları karedir (1:1); bir odanın birkaç fotoğrafı olabilir ama biri birincildir ve listelerde, başlıkta o görünür. Backend bayt taşımaz: önce presign ile iki yükleme adresi alınır, istemci asıl görüntüyü ve kendi ürettiği küçük kopyayı doğrudan depoya PUT eder, sonra anahtarları POST /api/rooms/{slug}/avatars ile kaydeder. url ve thumb_url 1 saatlik imzalı adreslerdir; küçük kopyanın baytını cihazda saklayıp önce onu çizmek, bayat adresi boş avatar yerine bir tazelemeye çevirir.

GET /api/rooms/{slug}/avatars
🔒 Bearer token

Oda fotoğrafları

Odanın bütün fotoğrafları: birincil başta, gerisi yeniden eskiye. Oda detayı gibi üye olmayanlar da çağırabilir. created_at ISO-8601'dir; adresler her çağrıda yeniden imzalanır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

Yanıtlar
  • 200Fotoğraflar; hiç yoksa boş liste
  • 404Böyle bir oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/avatars \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/avatars/presign
🔑 oda yöneticisi

Fotoğraf yükleme adresleri

Bir fotoğraf için iki imzalı PUT adresi verir: full (1:1 asıl görüntü) ve thumb (küçük kopya). İkisi aynı kimliği paylaşır ve 600 saniye geçerlidir. İstemci kareyi kırpar, küçük kopyayı kendisi üretir ve iki nesneyi de Content-Type başlığıyla bu adreslere yükler. Birebir sohbette iki taraf da çağırabilir.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

content_type string body isteğe bağlı

image/jpeg (varsayılan), image/webp ya da image/png

Yanıtlar
  • 200İki yükleme adresi
  • 400Desteklenmeyen content_type (invalid_request)
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/avatars/presign \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content_type":"image/jpeg"}'
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/avatars
🔑 oda yöneticisi

Yüklenen fotoğrafı kaydet

presign ile yüklenen iki nesneyi odanın fotoğrafı olarak kaydeder. Odanın ilk fotoğrafı ve primary: false denmeden eklenen her fotoğraf birincil olur; eski birincil aynı işlemde düşer. Sunucu nesnelerin gerçekten yüklendiğini denetlemez: iki PUT bitmeden bu uç çağrılmamalı.

  • key ve thumb_key bu odanın kendi önekiyle (room-avatars/<oda id>/) başlamalı; başka odanın ya da hesabın anahtarı 422 alır.
  • Birincil fotoğrafı yalnız JSON false değeri engeller; başka her değer (ya da alanın olmaması) birincil yapar.
Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

key string body zorunlu

presign yanıtındaki full.key

thumb_key string body zorunlu

presign yanıtındaki thumb.key

content_type string body isteğe bağlı

image/jpeg (varsayılan), image/webp ya da image/png

byte_size integer body isteğe bağlı

Asıl görüntünün boyutu (bayt); 1–8000000

size_px integer body isteğe bağlı

Karenin kenarı (piksel); 1–4096

primary boolean body isteğe bağlı

Birincil yap (varsayılan true)

Yanıtlar
  • 201Fotoğraf kaydedildi; {avatar}
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Böyle bir oda yok (room_not_found)
  • 422Alan hatası (validation_failed): key/thumb_key yok ya da odanın öneki değil, bilinmeyen content_type, byte_size ya da size_px aralık dışında
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/avatars \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"byte_size":118432,"content_type":"image/jpeg","key":"room-avatars/9b7e2c51-4d0a-4f6e-8a13-6e2d7c90b4f5/5d7c2e90-1a4b-4f36-8e02-b9c3d6a17f54.jpg","primary":true,"size_px":1024,"thumb_key":"room-avatars/9b7e2c51-4d0a-4f6e-8a13-6e2d7c90b4f5/5d7c2e90-1a4b-4f36-8e02-b9c3d6a17f54-thumb.jpg"}'
DeneÖnce token gir: otomatik eklenir
PUT /api/rooms/{slug}/avatars/{id}/primary
🔑 oda yöneticisi

Birincil fotoğrafı seç

Odanın listelerde ve başlıkta görünen fotoğrafını değiştirir; eski birincil aynı işlemde düşer. Fotoğraf bu odanın değilse ya da yoksa 404 döner.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

id uuid path zorunlu

Fotoğrafın kimliği (GET …/avatars listesinden)

Yanıtlar
  • 200Yeni birincil fotoğraf; {avatar}
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Oda yok (room_not_found) ya da fotoğraf yok (not_found)
curl -X PUT https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/avatars/8a61f4c2-0d39-4b7e-a5c8-e2f71b9d3064/primary \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/rooms/{slug}/avatars/{id}
🔑 oda yöneticisi

Fotoğrafı sil

Fotoğraf kaydını ve depodaki iki nesnesini (asıl ve küçük kopya) siler. Silinen birincilse en yeni fotoğraf birincil olur; başka fotoğraf yoksa odanın avatar alanı null kalır.

Parametreler
slug string path zorunlu

Oda slug'ı (büyük/küçük harf fark etmez)

id uuid path zorunlu

Silinecek fotoğrafın kimliği

Yanıtlar
  • 204Silindi; gövde boş
  • 403Odanın yöneticisi değilsin (not_admin)
  • 404Oda yok (room_not_found) ya da fotoğraf yok (not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/avatars/8a61f4c2-0d39-4b7e-a5c8-e2f71b9d3064 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Medya ve belgeler

Mesajların kendisi REST'ten değil WebSocket'ten gider (message:new). Bu gruptaki çağrılar dosyanın yolculuğunu yönetir: önce presign ile MinIO'ya doğrudan yüklenecek bir PUT linki alınır, dosya o linke yüklenir, sonra socket'te message:new içindeki attachment ile yalnızca dönen key'ler gönderilir. Yükleme linkleri 600 sn (10 dk), mesajlardaki indirme linkleri (url, thumb_url) 3600 sn (1 saat) geçerlidir; bayatlayan link buradaki uçlardan tazelenir. Hepsi yalnız oda üyelerine açıktır: oda yoksa 404 room_not_found, üye değilsen 403 not_member.

GET /api/rooms/{slug}/media
🔑 oda üyesi

Medya galerisi

Odanın fotoğraf ve video mesajlarını yeniden eskiye döner: grup sayfasındaki ve profildeki Medya sekmesi. GIF, çıkartma, tek gösterimlik ve silinmiş mesajlar listede yoktur; yöneticilere ayrılmış (audience: "admins") satırları yalnız yöneticiler, oda geçmişi kapalıysa (history_for_new_members: false) yeni üye yalnız katıldıktan sonrakileri görür. Her mesaj taze presigned linklerle (url, thumb_url, 1 saat) gelir.

  • Sayfalama zaman imleciyle yapılır: bir sonraki sayfa için son mesajın inserted_at değerini before olarak gönder. Karşılaştırma kesin (<) olduğundan aynı milisaniyede gönderilmiş iki medyadan biri sayfa sınırında atlanabilir.
  • Geçersiz from (UUID değil) ve sayı olmayan before / limit hata vermez, yok sayılır.
Parametreler
slug string path zorunlu

Oda slug'ı

from uuid query isteğe bağlı

Yalnız bu hesabın gönderdikleri (profildeki Medya sekmesi)

before ms query isteğe bağlı

Bu andan (ms epoch) önce gönderilenler; ilk sayfada verilmez

limit integer query isteğe bağlı

Sayfa boyu; varsayılan 60, 1–100 arasına çekilir

Yanıtlar
  • 200{media: [mesaj], has_more} — has_more: true ise daha eskisi var
  • 403Odanın üyesi değilsin (not_member)
  • 404Oda yok (room_not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/media?from=f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21&before=1791969600000&limit=30 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/media/{id}
🔑 oda üyesi

Medya için taze link

Tek bir fotoğraf, video, GIF ya da çıkartma mesajını yeni presigned linklerle döner. Mesajdaki linkler 1 saatte bayatlar; küçük kopyayı yerelde saklayan cihaz büyük dosyayı isterken buraya sorar. Metin, belge gibi başka türden bir mesaj ya da silinmiş mesaj 404 döner.

  • Tek gösterimlik (view_once: true) mesajda link ve anahtar hiç gelmez; o dosya yalnız socket'teki message:open_once ile, bir kez açılır.
Parametreler
slug string path zorunlu

Oda slug'ı

id uuid path zorunlu

Mesajın kimliği

Yanıtlar
  • 200{message} — taze url ve thumb_url ile
  • 403Odanın üyesi değilsin (not_member)
  • 404Oda yok (room_not_found), ya da mesaj yok, silinmiş ya da medya değil (not_found)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/media/3c7f1b2e-8a4d-4f6b-9e1c-0d2a5b7c9e81 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/media/presign
🔑 oda üyesi

Medya yükleme linkleri

Fotoğraf, video, GIF ya da çıkartma mesajı için iki presigned PUT linki verir: dosyanın kendisi (full) ve küçük kopyası (thumb). İstemci ikisini de dönen url'lere doğrudan PUT eder (10 dk içinde), sonra socket'te message:new ile attachment: {type, key, thumb_key, content_type, width, height, byte_size} gönderir. Anahtarlar bu odanın room-media/<oda kimliği>/ önekindedir; başka bir odada kullanılamaz.

  • content_type kabul edilenler: image/jpeg (varsayılan), image/png, image/webp, image/gif, video/mp4. Başkası 400.
  • thumb_content_type kabul edilenler: image/jpeg, image/png, image/webp. Verilmezse video ve GIF için image/jpeg, diğerlerinde dosyanın kendi türü. Saydamlığı korunması gereken çıkartmada image/png gönder.
  • Sınırlar message:new anında denetlenir (yükleme sırasında değil), aşılırsa socket invalid_attachment döner. Fotoğraf: image/jpeg, image/png, image/webp; en çok 8 MiB (8.388.608 bayt) ve kenar başına 1–8192 px.
  • Video: yalnız video/mp4; en çok 16 MiB (16.777.216 bayt), duration_ms 1–10.500. GIF: image/gif ya da image/webp; en çok 8 MiB. Çıkartma: image/webp, image/png ya da image/gif; en çok 2 MiB (2.097.152 bayt), isteğe bağlı pack_id ([A-Za-z0-9_.:-]{1,64}) ve emoji (1–8 karakter).
  • Tek gösterimlik (view_once: true, yalnız birebir sohbette, fotoğraf ya da video) mesajda thumb_key gönderilmez; thumb linki kullanılmadan bırakılır.
Parametreler
slug string path zorunlu

Oda slug'ı

content_type string body isteğe bağlı

Dosyanın türü: image/jpeg (varsayılan), image/png, image/webp, image/gif, video/mp4

thumb_content_type string body isteğe bağlı

Küçük kopyanın türü: image/jpeg, image/png, image/webp

Yanıtlar
  • 200{content_type, thumb_content_type, full, thumb}; her biri {method: "PUT", url, key, expires_in: 600}
  • 400Desteklenmeyen content_type ya da thumb_content_type (invalid_request)
  • 403Odanın üyesi değilsin (not_member)
  • 404Oda yok (room_not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/media/presign \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content_type":"image/jpeg"}'
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/docs/presign
🔑 oda üyesi

Belge yükleme linki

Bir belge için tek bir presigned PUT linki verir. İstemci dosyayı put.url'e yükler (10 dk içinde), sonra socket'te message:new ile attachment: {type: "document", key, name, content_type, byte_size} gönderir. Belge bir ödünçtür: dosya gönderildikten expires_in saniye (1 saat) sonra sunucudan silinir, mesaj satırı kalır.

  • Kabul edilen türler (uzantı): application/pdf (pdf), application/msword (doc), application/vnd.openxmlformats-officedocument.wordprocessingml.document (docx), application/vnd.ms-excel (xls), application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (xlsx), application/vnd.ms-powerpoint (ppt), application/vnd.openxmlformats-officedocument.presentationml.presentation (pptx), application/zip ve application/x-zip-compressed (zip).
  • En çok 10 MiB (10.485.760 bayt, yanıttaki max_bytes). Boyut message:new anında byte_size ile denetlenir; name orada boş olmamalı ve en çok 200 karakter olmalı, yoksa socket invalid_attachment döner.
  • İki süre karıştırılmamalı: put.expires_in (600) yükleme linkinin ömrü, üst düzeydeki expires_in (3600) belgenin gönderildikten sonra sunucuda kalacağı süre.
Parametreler
slug string path zorunlu

Oda slug'ı

content_type string body zorunlu

Belgenin MIME türü; yukarıdaki listeden biri

name string body zorunlu

Dosyanın görünen adı; burada yalnız varlığı denetlenir, anahtara girmez

Yanıtlar
  • 200{content_type, extension, max_bytes, expires_in, put}
  • 400Desteklenmeyen content_type ya da name yok (invalid_request)
  • 403Odanın üyesi değilsin (not_member)
  • 404Oda yok (room_not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/docs/presign \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content_type":"application/pdf","name":"Sezon Bütçesi 2026.pdf"}'
DeneÖnce token gir: otomatik eklenir
GET /api/rooms/{slug}/docs/{id}
🔑 oda üyesi

Belge için taze indirme linki

Belge mesajını, dosya hâlâ sunucudayken yeni bir indirme linkiyle döner. Link belgenin kalan ömrüyle (ttl_left saniye) sınırlıdır, belgeden uzun yaşayamaz. Belgenin saati dolduysa 410 document_expired döner: belge buradaydı, uygulama bunu "süresi doldu" diye göstermeli.

  • Socket'ten gelen ya da senkronlanan belge mesajında da expired ve ttl_left bulunur; süresi geçmiş kartta expired: true ve url: null olur, ad ve boyut kalır.
Parametreler
slug string path zorunlu

Oda slug'ı

id uuid path zorunlu

Belge mesajının kimliği

Yanıtlar
  • 200{message} — attachment.url taze
  • 403Odanın üyesi değilsin (not_member)
  • 404Oda yok (room_not_found), ya da mesaj yok, silinmiş ya da belge değil (not_found)
  • 410Belgenin 1 saati doldu, dosya silindi (document_expired)
curl https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/docs/6b1d9e4f-2a7c-4c3e-8f5b-9d0e1a2b3c4d \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/rooms/{slug}/messages/{id}/share
🔑 oda üyesi · makalenin yazarı

Makaleyi sözlüğe gönder

Yazar kendi makale mesajını (kind: "article") sözlüğün moderasyon kuyruğuna gönderir; gövde yoktur. Topic'i makalenin etiketi belirler: önce kartın kendi hashtag'i, yoksa mesajın ilk hashtag'i (# atılır, küçük harfe çevrilir). 201 yayımlandı değil kuyruğa alındı demektir: kararı bir moderatör verir, uygulama yazara bunu söylemeli.

  • Sözlük kendi kopyasını saklar (başlık + blokların düz metni): mesaj sonradan düzenlense ya da odanın otomatik silmesiyle gitse de kayıt kalır.
  • Etiketin henüz topic'i yoksa güncel konsol makaleyi reddetmez, bekleyen bir topic önerisi açar; bu durumda yanıttaki topic.status pending olur. topic konsol bilgi vermezse null gelebilir.
  • Yalnız Makroskop'un kendi odalarında çalışır; bir organizasyonun odasındaki makale 403 not_available_in_organization alır.
  • 503 sozluk_unavailable ret değil arızadır: yazara "tekrar dene" denmeli, "makalen reddedildi" değil.
Parametreler
slug string path zorunlu

Makalenin bulunduğu odanın slug'ı

id uuid path zorunlu

Makale mesajının kimliği

Yanıtlar
  • 201Kuyruğa alındı: {share: {entry_id, status: "pending", topic, message}}
  • 403Üye değilsin (not_member), makale senin değil (not_author), oda bir organizasyonun (not_available_in_organization) ya da yayın yasağın var (sozluk_author_banned; message moderatörün gerekçesidir)
  • 404Sunucuda sözlük ayarlı değil ya da mesaj yok / silinmiş (not_found); oda yok (room_not_found)
  • 409Bu makale kuyrukta zaten var (sozluk_already_shared)
  • 422Mesaj makale değil (not_an_article), makalenin etiketi yok (sozluk_tag_required) ya da eski konsollarda etiketin topic'i yok (sozluk_topic_not_found)
  • 503Sözlüğe ulaşılamadı ya da tanınmayan yanıt verdi (sozluk_unavailable)
curl -X POST https://mskop-api.gurerlabs.com/api/rooms/fenerbahce-taraftar/messages/d4a8c2e6-1b3f-4d5a-9e7c-8f0b2d4e6a1c/share \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Bağlantı önizleme ve analitik

Mesajdaki bir linkin altındaki kartı sunucu hazırlar: sayfayı telefon değil backend çeker, böylece linkteki site odada kimin okuduğunu görmez. Analitik ucu ise uygulamanın Keşfet'te yaptıklarını (topic, makale, kategori açılışları) yerel kuyruğundan toplu olarak yükler; olaylar yalnız sayılır, mesaj içeriği hiçbir zaman okunmaz. İkisi de rumuzu seçilmiş bir hesabın token'ını ister.

POST /api/analytics/events
🔒 Bearer token⏱ hesap başına 30 paket/dk

Keşfet davranış olayları (toplu)

Uygulamanın yerel kuyruğundaki Keşfet olaylarını tek pakette yükler; olaylar yalnız eklenir ve saatlik bir iş onları kişi başına bir ilgi profiline çevirir (istek anında hiçbir şey puanlanmaz). Geçersiz olaylar hata vermez, sessizce düşer ve ignored içinde sayılır; aynı id ikinci kez gelirse saklanmaz, duplicates olarak sayılır. Hesapta personalized_ads: false ise paket kabul edilir ama hiçbir şey saklanmaz: 200 {accepted: 0, duplicates: 0, ignored: n}.

  • Olay şekli: {id, type, at, topic?, category?, entry_id?, author_id?, source?, duration_ms?, platform?}.
  • id: istemcinin ürettiği kimlik (ör. UUID v4), 1–64 karakter, yalnız [A-Za-z0-9_-]. Tekilleştirme hesap + id üzerinden yapılır; paket içindeki tekrar da duplicates sayılır.
  • type ve zorunlu alanı: topic_open için topic; entry_open için entry_id; entry_read için entry_id ve duration_ms; category_open için category.
  • at: olayın anı, ms epoch; son 30 gün ile 5 dk ileri arasında olmalı, yoksa olay düşer.
  • topic küçük harfe çevrilir ve baştaki # atılır (en çok 120 karakter); category en çok 64 karakter; entry_id pozitif tam sayı; author_id UUID; source en çok 32 karakter (ör. topic_list, chat_card, my_entries, link); duration_ms 6 saatle sınırlanır. topic, category ve author_id ipucudur: iş kategoriyi sözlükten kendisi çözer.
  • platform oturumun platformundan (PUT /api/me/device) yazılır; oturum bildirmediyse olaydaki platform (android | ios) kullanılır.
  • Paket en çok 100 olay taşır (fazlası 413, rate limit'e sayılmaz). Dakikada 30 paket sınırı personalized_ads kapalıyken de işler.
  • Önerilen istemci davranışı: her 2xx'te paketi gönderildi say; 413 ve 429 dışındaki 4xx'te paketi at (asla geçmeyecek); 5xx, ağ hatası ve 429'da geri çekilerek tekrar dene.
Parametreler
events object[] body zorunlu

En çok 100 olay; şekil ve kurallar aşağıda

Yanıtlar
  • 200{accepted, duplicates, ignored} — yeni saklanan, zaten var olan ve düşen olay sayıları
  • 400Gövdede events listesi yok (invalid_request)
  • 413Pakette 100'den fazla olay var (too_many_events)
  • 429Hesap başına dakikada 30 paket aşıldı (rate_limited)
curl -X POST https://mskop-api.gurerlabs.com/api/analytics/events \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"events":[{"at":1791967272345,"category":"spor","id":"0b6f1c2e-7d4a-4e9b-8c3f-1a2b3c4d5e6f","source":"gundem","topic":"derbi","type":"topic_open"},{"at":1791967280112,"author_id":"f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","category":"spor","entry_id":7341,"id":"4e8a2d7c-1f3b-4c6e-9a0d-5b7c9e1f3a2d","source":"topic_list","topic":"derbi","type":"entry_open"},{"at":1791967334112,"author_id":"f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","category":"spor","duration_ms":54000,"entry_id":7341,"id":"9c3e5a1b-2d4f-4a6c-8e0b-7d9f1a3c5e7b","topic":"derbi","type":"entry_read"}]}'
DeneÖnce token gir: otomatik eklenir

Keşfet (sözlük)

Keşfet, sözlüğün uygulamadaki yüzüdür. Kategoriler, topic'ler ve makaleler (entry) yönetim konsolunun sözlüğünden okunur; backend bunlara yalnız kendisinin bildiklerini ekler: yazarın güncel rumuzu ve fotoğrafı, tepki sayıları, kaynak grubun tartışması, görüntülenme ve paylaşım sayaçları. Yalnız moderatörün yayımladığı topic ve makaleler görünür. Sunucuda sözlük ayarlı değilse bu gruptaki her uç 404 not_found döner; sözlüğe ulaşılamazsa ya da beklenmedik bir yanıt gelirse 503 sozluk_unavailable (ret değil arıza, tekrar denenebilir). Topic listesi ve etiket önerileri oturumun diliyle (PUT /api/me/device ile bildirilen language) süzülür; dili boş topic'ler her dilde, dil hiç bildirilmediyse tüm topic'ler görünür. Sayfalama limit/offset iledir: topic'ler ve Makalelerim varsayılan 30 (en çok 100), bir topic'in makaleleri varsayılan 20 (en çok 50); geçersiz değerler reddedilmez, sınıra çekilir. Makale kimlikleri tam sayıdır; tüm zamanlar ms epoch'tur.

GET /api/discover/categories
🔒 Bearer token

Kategoriler

Keşfet'in kategori çiplerini konsoldaki sırasıyla döner; arşivlenmiş kategoriler gelmez. Topic listesini süzmek için slug kullanılır.

Yanıtlar
  • 200{categories: [{slug, name}]}
  • 404Sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/categories \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/topics
🔒 Bearer token

Topic listesi

Yayımlanmış topic'leri makale sayısına göre çoktan aza döner. Her topic'in yanında share (bu süzgeçteki tüm yayımlanmış makalelerin yüzdesi, 2 hane) ve listedeki sırası rank (offset'ten devam eder) gelir. Oturumun diliyle süzülür.

Parametreler
category string query isteğe bağlı

Yalnız bu kategorinin topic'leri (kategori slug'ı)

limit integer query isteğe bağlı

Sayfa boyu; varsayılan 30, en çok 100

offset integer query isteğe bağlı

Atlanacak kayıt sayısı; varsayılan 0

Yanıtlar
  • 200{topics: [topic], total, has_more}
  • 404Sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/topics?category=spor&limit=30&offset=0 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/topics/suggest
🔒 Bearer token

Etiket önerisi

Makale yazarken hashtag alanının önerileri: etiketi ya da başlığının bir kelimesi q ile başlayan en çok 5 yayımlanmış topic, makale sayısına göre çoktan aza. q'nun başındaki # atılır; q boşsa en popüler 5 topic gelir. Oturumun diliyle süzülür.

Parametreler
q string query isteğe bağlı

Yazılan etiketin başı

Yanıtlar
  • 200{topics: [{tag, title, entry_count}]}, en çok 5
  • 404Sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/topics/suggest?q=der \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/topics/{tag}
🔒 Bearer token

Topic detayı

Tek bir yayımlanmış topic'i döner. Liste dışında sorulduğu için share her zaman 0.0, rank her zaman null'dır. Yayımlanmamış ya da bilinmeyen etiket 404 döner; bu uç dil süzgeci uygulamaz.

Parametreler
tag string path zorunlu

Topic'in etiketi (küçük harf, # olmadan)

Yanıtlar
  • 200{topic}
  • 404Topic yok ya da yayımlanmamış, veya sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/topics/derbi \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/topics/{tag}/entries
🔒 Bearer token

Topic'in makaleleri

Bir topic'in yayımlanmış makalelerini tam makale nesnesiyle döner. new (varsayılan) yayın tarihine göre yeniden eskiye, old tersi, top toplam tepki sayısına göre (eşitlikte yeni olan önce) sıralar; tanınmayan sort new sayılır. Yanıtta total yoktur, devamı has_more ile anlaşılır.

Parametreler
tag string path zorunlu

Topic'in etiketi

sort string query isteğe bağlı

new | old | top

limit integer query isteğe bağlı

Sayfa boyu; varsayılan 20, en çok 50

offset integer query isteğe bağlı

Atlanacak kayıt sayısı; varsayılan 0

Yanıtlar
  • 200{entries: [entry], has_more}
  • 404Topic yok ya da yayımlanmamış, veya sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/topics/derbi/entries?sort=new&limit=20&offset=0 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/entries/{id}
🔒 Bearer token

Makale

Tek bir yayımlanmış makaleyi döner; sohbetteki makale kartı ve sözlük linki buraya açılır. blocks makalenin grupta yazıldığı hâlidir; kaynak mesaj silinmişse null ve media: [] olur, uygulama o zaman body'yi çizer. discussion.available kaynak mesaj hâlâ odadaysa ve grup açıksa ya da okuyan üyeyse true olur.

  • reactions yalnız emoji başına sayıdır; kimin tepki verdiği hiçbir zaman dönmez.
  • author.avatar yazarın fotoğraf görünürlük ayarına uyar; gizliyse null. media ve avatar linkleri 1 saatlik presigned GET'lerdir.
  • reshare_count: kökü bu makalenin mesajı olan iletiler ile bu makalenin sohbet kartlarının toplamı (silinenler hariç).
  • stats_visible: okuyan yazarsa ya da kaynak grup açıksa true; GET /api/discover/entries/{id}/stats için.
Parametreler
id integer path zorunlu

Makalenin (entry) kimliği

Yanıtlar
  • 200{entry}
  • 404Makale yok ya da yayımlanmamış, veya sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/entries/7341 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/entries/{id}/discussion
🔒 Bearer token

Makalenin tartışması (salt okunur)

Kaynak gruptaki makale mesajının altındaki tartışmayı, gruba katılmadan okumak için döner: root makale mesajı, messages yanıtlar (eskiden yeniye), şekil socket'teki mesajla aynı. Grup açıksa herkes, kapalıysa yalnız üyeler okuyabilir. Üye olan uygulama tartışmaya her zamanki gibi socket'ten yazar; bu uç yalnız okumak içindir.

Parametreler
id integer path zorunlu

Makalenin (entry) kimliği

limit integer query isteğe bağlı

En çok kaç yanıt; varsayılan 100, 1–200

Yanıtlar
  • 200{room: {slug, name, visibility}, is_member, root, messages}
  • 403Kaynak grup kapalı ve üyesi değilsin (not_member)
  • 404Makale yok, kaynak oda ya da makale mesajı artık yok, veya sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/entries/7341/discussion?limit=100 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/discover/entries/{id}/view
🔒 Bearer token

Görüntülendi sayacı

Makale kartı ekranda yaklaşık 1 sn kalınca çağrılır. Kişi + makale + gün (UTC) başına bir kez sayılır; aynı gün tekrar çağırmak zararsızdır. Gövde yoktur; sözlüğe gidilmez ve makalenin varlığı denetlenmez, yalnız id'nin pozitif tam sayı olması istenir.

Parametreler
id integer path zorunlu

Makalenin (entry) kimliği

Yanıtlar
  • 204Sayıldı (ya da bugün zaten sayılmıştı); gövde boş
  • 404id pozitif tam sayı değil, ya da sunucuda sözlük ayarlı değil (not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/discover/entries/7341/view \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/discover/entries/{id}/share
🔒 Bearer token

Paylaşım sayacı

Makale bir sohbete iletildiğinde (forward) ya da linki kopyalandığında (link) çağrılır; her çağrı ayrı bir paylaşım olarak sayılır ve istatistikteki shares alanına yansır. Makalenin varlığı denetlenmez. İletinin kendisi socket'ten attachment: {type: "entry", entry_id} ile gider; bu uç yalnız sayaçtır.

Parametreler
id integer path zorunlu

Makalenin (entry) kimliği

via string body zorunlu

forward (sohbete iletme) | link (link kopyalama)

Yanıtlar
  • 204Sayıldı; gövde boş
  • 400via yok ya da forward / link değil (invalid_request)
  • 404id pozitif tam sayı değil, ya da sunucuda sözlük ayarlı değil (not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/discover/entries/7341/share \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"via":"link"}'
DeneÖnce token gir: otomatik eklenir
GET /api/discover/entries/{id}/stats
🔒 Bearer token

Makale istatistikleri

Makalenin sayılarını döner: görüntülenme (views toplam, viewers tekil kişi), tepkiler, tartışmadaki yanıtlar, yeniden paylaşımlar ve paylaşım sayaçları. Yazar her zaman görebilir; başkaları yalnız kaynak grup açıksa (makaledeki stats_visible). Kapalı grubun makalesi herkese açık okunur ama üyelerinin tepkisi grubun kendisinindir.

Parametreler
id integer path zorunlu

Makalenin (entry) kimliği

Yanıtlar
  • 200{views, viewers, reactions, reaction_breakdown, replies, reshares, shares: {forward, link}, published_at}
  • 403Yazar değilsin ve kaynak grup açık değil (forbidden)
  • 404Makale yok ya da yayımlanmamış, veya sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/entries/7341/stats \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/discover/me/entries
🔒 Bearer token

Makalelerim

Ben → Makalelerim: kişinin sözlüğe gönderdiği her makale, durumu ne olursa olsun (pending, published, rejected). Reddedilenlerde review_note moderatörün notudur. Yalnız published olanlar ayrıca excerpt, blocks, media ve reshare_count taşır; bekleyen ve reddedilende bu alanlar hiç yoktur.

Parametreler
limit integer query isteğe bağlı

Sayfa boyu; varsayılan 30, en çok 100

offset integer query isteğe bağlı

Atlanacak kayıt sayısı; varsayılan 0

Yanıtlar
  • 200{entries: [...], total}
  • 404Sunucuda sözlük ayarlı değil (not_found)
  • 503Sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/discover/me/entries?limit=30&offset=0 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Sponsorlu içerik

Sohbet listesindeki ve Keşfet'teki sponsorlu satırlar. Satırları organizasyonlar işletme panelinde yazar, konsolda onaylanınca yayına girer; uygulama gösterilebilecekleri buradan ister, nereye koyacağına kendisi karar verir ve olanı (gösterim, dokunma, gizleme) geri bildirir. Üç yerleşim vardır: chats (sohbet listesi), discover_topics (Keşfet topic listesi) ve discover_entries (topic'in makale listesi). Makroskop Premium hesaplarına hiçbir zaman satır gelmez. Hedefleme cihazın dili ve platformu (PUT /api/me/device) ile isteğe bağlı anonim bir kitledir; kitle bilgisi uygulamaya hiç dönmez.

Web paneli bağlama (QR)

İşletme paneli (mk-panel), uygulamadaki hesabın bir cihazı gibi çalışır. Kişi panele GlobalTrustID ile girer; bu giriş henüz bir hesaba bağlı değilse panel bir QR gösterir (app.gurerlabs.makroskop://panel-link?code=KOD). Uygulama QR'ı okutur, bu gruptaki uçlarla kimin bağlanmak istediğini gösterir ve kişiden onay alır. Ardından panel kendi oturumunu alır: telefondakiyle aynı türden bir token çifti (platform: "web_app"). Kod 180 saniye geçerlidir ve tek kullanımlıktır. Aynı GlobalTrustID girişi daha sonra QR istemeden doğrudan hesaba bağlanır. Bu uçları uygulama, kişinin kendi token'ıyla çağırır. Rumuz seçilmiş olmalıdır (403 username_required).

GET /api/me/panels
🔒 Bearer token

Bağlı panellerim

Hesaba bağlı web panellerini en yenisi başta olacak şekilde listeler. Uygulamadaki "Bağlı cihazlar" ekranı bu listeyle çizilir. Kişi buradan bir paneli seçip bağını koparabilir.

  • linked_at ve last_used_at ms epoch değerleridir. last_used_at, panelin bu bağla en son oturum açtığı anı gösterir; panel henüz oturum almadıysa null olabilir.
  • label, bağlanırken bildirilen tarayıcıdır (en çok 64 karakter) ve null olabilir.
Yanıtlar
  • 200Liste döndü (bağlı panel yoksa boş dizi)
  • 401Token geçersiz (unauthorized) ya da süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
curl https://mskop-api.gurerlabs.com/api/me/panels \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
DELETE /api/me/panels/{id}
🔒 Bearer token

Panel bağını kopar

Paneli hesaptan ayırır. O panelin bütün oturumları aynı anda silinir. Panelin elindeki access token'ın süresi dolmamış olsa bile, /api/panel/* uçlarına yapacağı bir sonraki istek 401 alır; refresh token'ı da artık çalışmaz. Aynı GlobalTrustID girişiyle yeniden bağlanmak için QR adımı baştan yapılmalıdır.

Parametreler
id uuid path zorunlu

GET /api/me/panels listesindeki id

Yanıtlar
  • 204Bağ koparıldı; gövde boş
  • 401Token geçersiz (unauthorized) ya da süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Böyle bir panel yok, bu hesaba ait değil ya da id UUID değil (not_found)
curl -X DELETE https://mskop-api.gurerlabs.com/api/me/panels/c11debb6-9789-4fdb-ab77-fad368336eac \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

İşletme paneli

Bu uçlar işletme panelinin (mk-panel) kendi API'sidir. Her istek, panel bağlamayla alınmış oturumun access token'ını taşır (Authorization: Bearer ACCESS_TOKEN); token'ın süresi dolunca POST /api/auth/refresh ile yenilenir. Sunucu her istekte oturumun hâlâ var olup olmadığına bakar. Kişi uygulamadan panelin bağını koparırsa, token'ın süresi dolmamış olsa bile bir sonraki istek hemen 401 unauthorized alır. Rumuz seçilmiş olmalıdır (403 username_required). Organizasyon gerektiren uçlar, kişinin organizasyonu yoksa 404 no_organization döner. Organizasyonu owner ve admin rolleri yönetir; sponsorlu içeriği owner, admin ve ads rolleri yapar. Bu rollerin dışında kalanlar 403 not_allowed alır. Bu gruptaki bütün zamanlar ms epoch'tur.

GET /api/panel/me
🔒 Bearer token

Panel başlangıç verisi

Panelin bütün sayfaları bu tek yanıttan beslenir. Yanıtta kimin oturum açtığı, organizasyonu ve oradaki rolü, organizasyonun paketi ve kalan kredileri bulunur. Formların seçim listeleri (catalog) ve satın alınabilecek paketler (products) de lang diliyle adlandırılmış olarak gelir.

  • Kişinin organizasyonu yoksa organization ve role alanları null gelir. Panel bu durumda organizasyon kurma formunu göstermelidir.
  • billing yalnız şirket organizasyonlarında ve yalnız owner ya da admin rolüne gelir; diğer durumlarda null olur.
  • slug_editable, organizasyonun hiç odası yokken true olur. İlk oda kurulunca önek (slug) kilitlenir.
  • subscription yürürlükteki pakettir, yoksa null olur. pending_request, konsolun onayını bekleyen paket isteğidir, yoksa null olur. balances alanında her sayaç (message, ai, impression, verification) her zaman bulunur.
  • Paket fiyatı KDV ayarına göre bölünür: price_cents girilen fiyattır; net_cents ve vat_cents faturada yazacak tutarlardır. Bir çeviri eksikse önce İngilizcesi, o da yoksa Türkçesi gösterilir.
Parametreler
lang string query isteğe bağlı

tr ya da en. Verilmezse ya da başka bir değerse tr kullanılır

Yanıtlar
  • 200Başlangıç verisi döndü
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
curl https://mskop-api.gurerlabs.com/api/panel/me?lang=tr \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/organization
🔒 Bearer token

Organizasyon kur

Kişinin organizasyonunu kurar ve kişiyi organizasyonun sahibi (owner) yapar. Bir kişinin en fazla bir organizasyonu olabilir. Organizasyon iki türlü kurulur: individual (bireysel) ya da company (şirket). Örnek gövde bir şirket içindir; bireysel kurulumun gövdesi aşağıdaki notlardadır.

  • Bireysel kurulum: {"kind": "individual", "display_name": "Ayşe Yılmaz Tasarım", "purpose": "Müşterilerime iş takibi ve duyuru", "position_id": "POSITION_ID"}. Bireysel organizasyonda type_id, team_size ve billing alanlarına bakılmaz.
  • Şirket kurulumunda type_id ve billing zorunludur. billing alanlarından legal_name, tax_office, tax_id, address, city ve country (ISO-2, ör. TR) zorunludur; district, region, postal_code ve contact_phone isteğe bağlıdır. Her alan kırpılır ve en çok 200 karaktere kısaltılır.
  • Türkiye'de tax_id ya kontrol basamağı tutan 10 haneli bir VKN ya da şahıs şirketi için 11 haneli bir TCKN olmalıdır; aksi hâlde 422 invalid_tax_id döner. Başka ülkelerde 2–32 harf ve rakamdan oluşmalıdır. contact_phone içindeki boşluk, parantez, nokta ve tire atılır; kalan kısım 7–20 rakam olmalıdır (başta + olabilir).
  • slug (organizasyon öneki) Makroskop genelinde tekildir. Önce kırpılır ve küçük harfe çevrilir, sonra ^[a-z0-9]+(-[a-z0-9]+)*$ biçimine uyan 3–48 karakter olmalıdır. Ayrılmış kelimeler (admin api app console destek help konsol official panel resmi root sozluk support system www) ve makroskop ile başlayan önekler 422 invalid_slug alır. Önek boş bırakılırsa görünen addan üretilir; o önek alınmışsa sonuna -2, -3 eklenir.
  • Yeni organizasyonun paketi yoktur ve bütün kredileri 0'dır. Paket POST /api/panel/organization/package ile istenir.
Parametreler
lang string query isteğe bağlı

Yanıttaki paket adlarının dili: tr (varsayılan) ya da en

kind string body zorunlu

individual ya da company. Sonradan değiştirilemez

display_name string body zorunlu

Görünen ad, 2–80 karakter (kırpılır)

purpose string body zorunlu

Organizasyonun ne için kullanılacağı, en çok 1000 karakter

position_id uuid body isteğe bağlı

Yalnız individual için: catalog.positions listesindeki bir id

type_id uuid body isteğe bağlı

company için zorunlu: catalog.organization_types listesindeki bir id

team_size integer body isteğe bağlı

Yalnız company için: ekip büyüklüğü, 1–20

billing object body isteğe bağlı

company için zorunlu: fatura bilgileri (alanlar notlarda)

slug string body isteğe bağlı

Organizasyon öneki, 3–48 karakter; verilmezse görünen addan üretilir

Yanıtlar
  • 201Kuruldu; organization ve role: "owner" döner (GET /api/panel/me ile aynı şekil)
  • 400Zorunlu bir alan eksik ya da geçersiz: bilinmeyen kind, katalogda olmayan type_id/position_id, aralık dışında team_size, bozuk country ya da contact_phone (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 409Kişinin zaten bir organizasyonu var (already_in_organization) ya da önek başkasında (slug_taken)
  • 422Vergi numarası geçersiz (invalid_tax_id) ya da önek kurallara uymuyor (invalid_slug)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/organization \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"billing":{"address":"Caferağa Mah. Moda Cad. No: 12","city":"İstanbul","contact_phone":"+90 216 555 01 01","country":"TR","district":"Kadıköy","legal_name":"Kargo Lojistik Anonim Şirketi","postal_code":"34710","tax_id":"4829157365","tax_office":"Kadıköy"},"display_name":"Kargo A.Ş.","kind":"company","purpose":"Müşterilerimize gönderilerinin durumunu anında bildirmek ve kampanyalarımızı duyurmak.","team_size":5,"type_id":"870ce7d4-33be-4603-b23c-c5aa9d6e123d"}'
DeneÖnce token gir: otomatik eklenir
PATCH /api/panel/organization
🔑 owner · admin⏱ organizasyon başına günde 10 önek değişikliği

Organizasyonu düzenle

Organizasyonun kendisi hakkında söylediklerini değiştirir. Alanlar kuruluştakilerle aynıdır ve hepsi isteğe bağlıdır; gönderilmeyen alan olduğu gibi kalır. kind hiçbir zaman değişmez. Şirket organizasyonunda billing içinde gönderilen alanlar eskilerinin yerine yazılır; diğer fatura alanları korunur.

  • Önek (slug) yalnız slug_editable iken, yani organizasyonun hiç odası yokken değiştirilebilir. Odası varken farklı bir önek göndermek 409 slug_locked döner. Organizasyonun zaten sahip olduğu öneki göndermek değişiklik sayılmaz.
  • Yeni bir önek denemek organizasyon başına günde en çok 10 kez yapılabilir; sınır aşılınca 429 rate_limited döner. Böylece başkalarının hangi önekleri aldığı tek tek denenerek bulunamaz.
  • position_id ya da type_id için boş metin ya da null göndermek o alanı temizler.
Parametreler
lang string query isteğe bağlı

Yanıttaki paket adlarının dili: tr (varsayılan) ya da en

display_name string body isteğe bağlı

Görünen ad, 2–80 karakter

purpose string body isteğe bağlı

En çok 1000 karakter

position_id uuid body isteğe bağlı

Yalnız individual için; catalog.positions listesinden

type_id uuid body isteğe bağlı

Yalnız company için; catalog.organization_types listesinden

team_size integer body isteğe bağlı

Yalnız company için; 1–20

billing object body isteğe bağlı

Yalnız company için; değişecek fatura alanları

slug string body isteğe bağlı

Yeni önek; kurallar kuruluştakiyle aynı

Yanıtlar
  • 200Güncellendi; organization ve role döner
  • 400Bir alan geçersiz (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol owner ya da admin değil (not_allowed), ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
  • 409Organizasyonun odası var, önek kilitli (slug_locked), ya da önek başkasında (slug_taken)
  • 422Önek kurallara uymuyor (invalid_slug) ya da vergi numarası geçersiz (invalid_tax_id)
  • 429Günlük önek denemesi hakkı doldu (rate_limited)
curl -X PATCH https://mskop-api.gurerlabs.com/api/panel/organization \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"billing":{"address":"Rasimpaşa Mah. İskele Sok. No: 4","postal_code":"34716"},"team_size":8}'
DeneÖnce token gir: otomatik eklenir
POST /api/panel/organization/package
🔑 owner · admin

Paket iste

Organizasyon için bir paket ister. Ücretsiz paket hemen açılır: yürürlükteki paket biter ve sayaçlar yeni paketin kotalarına ayarlanır (üstüne eklenmez). Ücretli paket ödeme altyapısı olmadığı için konsolun onayını bekler; bu sürede pending_request alanında görünür. Yeniden paket istemek önceki bekleyen isteğin yerine geçer.

Parametreler
lang string query isteğe bağlı

Yanıttaki paket adlarının dili: tr (varsayılan) ya da en

product_id uuid body zorunlu

products listesindeki bir paketin id'si

Yanıtlar
  • 200İstek alındı (ya da ücretsiz paket açıldı); organization ve role döner
  • 400product_id gönderilmedi (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol owner ya da admin değil (not_allowed), ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization), ya da paket bilinmiyor veya satışta değil (not_found)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/organization/package \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"44b16db2-bbff-46d1-903f-c5682075a8a6"}'
DeneÖnce token gir: otomatik eklenir
GET /api/panel/usage
🔒 Bearer token

Kullanım ve krediler

Organizasyonun her sayaçta kalan kredisini ve kredi hareketlerinin en yeni 50 kaydını döner. Paketten ya da konsoldan gelen krediler pozitif, harcamalar negatif quantity ile yazılır. Bakiye hızlı cevaptır; asıl kayıt hareketlerdir.

  • source değerleri: grant:package (paket açıldı; note paketin slug'ı), grant:manual (konsoldan ek kredi), impression (bir sponsorlu gösterim için harcanan kredi).
  • Sayaçlar: message, ai, impression, verification.
Yanıtlar
  • 200Bakiyeler ve hareketler döndü
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
curl https://mskop-api.gurerlabs.com/api/panel/usage \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
GET /api/panel/groups
🔒 Bearer token

Gruplarım

Kişinin kurduğu (founded) ve yönettiği (administered) grupları döner. Her grup, uygulamadaki oda nesnesiyle aynı şekildedir; ek olarak panelde seçilen grup türünü taşıyan group_type_id alanı vardır. Uygulamadan kurulmuş gruplarda bu alan null gelir. Bu uç organizasyon istemez.

Yanıtlar
  • 200Gruplar döndü
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
curl https://mskop-api.gurerlabs.com/api/panel/groups \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/groups
🔒 Bearer token

Grup kur

Panelden yeni bir grup kurar; kurucusu oturumu açan kişidir. Uygulamadaki oda kurmanın aynısıdır, ancak burada grup türü (group_type_id) zorunludur. Grup kurulunca uygulamada da kişinin oda listesinde görünür.

  • slug verilmezse addan üretilir; üretilen slug alınmışsa sonuna rastgele bir ek konur. Açıkça verilen bir slug alınmışsa 422 validation_failed döner (fields.slug).
Parametreler
name string body zorunlu

Grup adı, 1–80 karakter

group_type_id uuid body zorunlu

catalog.group_types listesindeki bir id

slug string body isteğe bağlı

3–48 karakter, ^[a-z0-9]+(-[a-z0-9]+)*$

visibility string body isteğe bağlı

open (varsayılan: bağlantıyı bilen katılır) ya da closed (kişiyi bir yönetici ekler)

welcome_message string body isteğe bağlı

Yeni üyeye odanın yazacağı karşılama metni, en çok 500 karakter; {username} rumuzla değiştirilir

Yanıtlar
  • 201Kuruldu; room döner (my_role: "founder", member_count: 1, group_type_id)
  • 400group_type_id yok ya da katalogda değil (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 422Ad, slug ya da diğer alanlar geçersiz (validation_failed)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/groups \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"group_type_id":"3b9f6c0e-5d21-4a8e-9c47-1e2f8a6b7d30","name":"Kargo Destek","visibility":"open","welcome_message":"Hoş geldin {username}! Gönderi numaranı yaz, hemen bakalım."}'
DeneÖnce token gir: otomatik eklenir
GET /api/panel/sponsored
🔒 Bearer token

Sponsorlu içeriklerim

Organizasyonun bütün sponsorlu satırlarını, en yenisi başta olacak şekilde döner. Her satırın durumu, bütçesi, gösterim ve tıklama sayıları ve hedef kitlesi yanıtta bulunur. Görsel linkleri kısa ömürlü, imzalı GET adresleridir.

  • Durumlar: draft (taslak), review (konsolun onayını bekliyor), live (yayında), paused (duraklatıldı), rejected (reddedildi; sebep reject_reason alanında), ended (bütçe doldu).
  • budget satırın en çok kaç gösterim alacağıdır. Gösterim sayısı bütçeye ulaşınca satır ended olur. Organizasyonun impression kredisi biterse yayındaki bütün satırları paused olur.
  • audience her zaman bir nesnedir. Hedefsiz bir satırda {"interests": [], "activity": "any", "segments": []} gelir.
Yanıtlar
  • 200Liste döndü
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rumuz henüz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
curl https://mskop-api.gurerlabs.com/api/panel/sponsored \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/sponsored
🔑 owner · admin · ads

Sponsorlu taslak oluştur

Yeni bir sponsorlu satırı taslak (draft) olarak oluşturur. Taslak yayına kendiliğinden çıkmaz: önce submit ile incelemeye gönderilir, konsol onaylayınca yayına girer. Organizasyonun paketinde sponsored özelliği bulunmalı ve organizasyon askıya alınmamış olmalıdır.

  • Hedef türleri: url yalnız https:// adresi olabilir (kullanıcı bilgisi içermemeli, alan adında nokta olmalı). room var olan bir grubun slug'ı olmalıdır. deeplink şema://… biçiminde olmalıdır; javascript, data, file, content, intent, about, blob ve vbscript şemaları yasaktır. target en çok 500 karakterdir.
  • Görsel önce POST /api/panel/sponsored/media ile yüklenir; dönen key burada image_key, küçük kopyanınki thumb_key olarak verilir. Anahtar organizasyonun kendi sponsored/ORG_ID/ önekinde olmalıdır.
  • audience: interests sözlüğün kategori slug'larıdır (en çok 20); kişinin ilgi alanlarından herhangi biri eşleşmelidir. activity en düşük etkinlik seviyesidir (any, low, medium, high). segments listesindeki bütün segmentler kişide bulunmalıdır. Hepsi boşsa hedefleme yapılmaz ve satır herkese gösterilir. Seçenekler GET /api/panel/sponsored/audience-options ile alınır.
  • languages ve platforms boş bırakılırsa satır bütün dillerde ve platformlarda gösterilir. starts_at ve ends_at ms epoch'tur; ends_at, starts_at'ten sonra olmalıdır.
  • Metinlerdeki fazla boşluklar teke indirilir. Satırın budget değeri gönderilmezse 0 kalır; bu durumda submit reddedilir.
Parametreler
title string body zorunlu

Başlık, 2–60 karakter

body string body zorunlu

Metin, 2–140 karakter

target_kind string body zorunlu

url, room ya da deeplink

target string body zorunlu

Hedef: https adresi, grup slug'ı ya da derin bağlantı; en çok 500 karakter

image_key string body isteğe bağlı

sponsored/media yanıtındaki key

thumb_key string body isteğe bağlı

Küçük kopyanın key değeri

languages string[] body isteğe bağlı

tr, en; boş liste bütün diller demektir

platforms string[] body isteğe bağlı

android, ios; boş liste bütün platformlar demektir

budget integer body isteğe bağlı

En çok gösterim sayısı, 100–10.000.000

starts_at ms body isteğe bağlı

Yayın başlangıcı (ms epoch) ya da null

ends_at ms body isteğe bağlı

Yayın bitişi (ms epoch) ya da null; başlangıçtan sonra olmalı

audience object body isteğe bağlı

Hedef kitle {interests, activity, segments}; null herkes demektir

Yanıtlar
  • 201Taslak oluştu; item döner
  • 400Bir alan eksik, aralık dışında ya da hedef geçersiz; görsel anahtarı başka bir organizasyonun ya da bitiş başlangıçtan önce (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed), pakette sponsored özelliği yok (feature_unavailable), organizasyon askıda (organization_suspended), ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
  • 422Bilinmeyen kategori, segment ya da etkinlik seviyesi, veya 20'den fazla ilgi alanı (invalid_audience)
  • 503Kategorileri doğrulamak için sözlüğe ulaşılamadı (sozluk_unavailable)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/sponsored \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"audience":{"activity":"medium","interests":["teknoloji","ekonomi"],"segments":["group_active"]},"body":"Gönderi numaranı Kargo Destek grubuna yaz, durumunu saniyeler içinde söyleyelim.","budget":5000,"ends_at":1795132800000,"image_key":"sponsored/e5b8ec80-e426-4e4f-b6e4-dea3da782ba5/5705db63-17b2-4109-88fa-c367bb9c3111.webp","languages":["tr"],"starts_at":1792454400000,"target":"kargo-destek","target_kind":"room","thumb_key":"sponsored/e5b8ec80-e426-4e4f-b6e4-dea3da782ba5/961cb17c-f383-413b-9a36-bc720cf19a2d.webp","title":"Kargon nerede, anında öğren"}'
DeneÖnce token gir: otomatik eklenir
POST /api/panel/sponsored/media
🔑 owner · admin · ads

Sponsorlu görsel yükle

Sponsorlu satırın görselini sunucuya yükler. İstek gövdesi JSON değildir; doğrudan resmin baytlarıdır ve türü Content-Type başlığında bildirilir. Her satır için iki kez çağrılır: biri asıl görsel, diğeri küçük kopya (yaklaşık 160 px, kare). Dönen key değerleri taslağın image_key ve thumb_key alanlarına yazılır.

  • Kabul edilen türler image/jpeg, image/png ve image/webp'tir; boyut en çok 2 MB olabilir. Sunucu baytların gerçekten bildirilen türde olup olmadığını kontrol eder. Uyuşmazsa, dosya boşsa ya da 2 MB'ı aşıyorsa 422 invalid_media döner.
  • Dosya organizasyonun sponsored/ORG_ID/ önekine rastgele bir adla kaydedilir. Hiçbir taslağa bağlanmayan dosya kendiliğinden silinmez.
  • Pakette sponsored özelliği bulunmalı ve organizasyon askıda olmamalıdır.
Yanıtlar
  • 201Kaydedildi; {key, content_type, byte_size} döner
  • 400Gövde alınırken bağlantı koptu ya da zaman aşımı oldu (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed), pakette sponsored özelliği yok (feature_unavailable), organizasyon askıda (organization_suspended), ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
  • 422Desteklenmeyen tür, boş ya da 2 MB'tan büyük dosya, veya bildirilen türle uyuşmayan baytlar (invalid_media)
  • 503Dosya deposuna yazılamadı (storage_unavailable)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/sponsored/media \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: image/webp" \
  --data-binary @gorsel.webp
DeneÖnce token gir: otomatik eklenir

Bu uç gövde olarak resmin ham baytlarını bekler. Sayfadaki form yalnız JSON gönderebildiği için buradan denenemez; örnekteki curl --data-binary komutunu kullan.

GET /api/panel/sponsored/audience-options
🔑 owner · admin · ads

Hedef kitle seçenekleri

Sponsorlu formundaki hedef kitle seçeneklerini döner. İlgi alanları sözlüğün kategorileridir. Segmentler ve etkinlik seviyeleri hem Türkçe hem İngilizce etiketle gelir. Reklamveren tek bir kişiyi değil, yalnız anonim bir kitleyi hedefleyebilir.

Yanıtlar
  • 200Seçenekler döndü
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed) ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
  • 503Kategoriler için sözlüğe ulaşılamadı (sozluk_unavailable)
curl https://mskop-api.gurerlabs.com/api/panel/sponsored/audience-options \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/sponsored/audience-estimate
🔑 owner · admin · ads

Kitle tahmini

Bir hedef kitlenin yaklaşık kaç kişiye ulaşacağını tahmin eder. Hedefli kitle, kişiselleştirilmiş reklamı kapatmamış hesapların ilgi profillerinden sayılır. Hedefsiz kitle ise sponsorlu satır görebilen herkesten sayılır; Premium hesaplar ve sistem hesabı bu sayıya girmez. languages ya da platforms verilirse yalnız o dilde ya da platformda oturumu olan kişiler sayılır.

  • 50 kişinin altındaki kitle için hiçbir zaman sayı verilmez: {"estimate": null, "label": "50'den az"} döner.
  • 50 ve üstü yuvarlanır: 1.000'e kadar 10'a, 10.000'e kadar 100'e, daha büyük sayılar 1.000'e yuvarlanır. Örnek: {"estimate": 1200, "label": "≈ 1.200"}.
Parametreler
audience object body isteğe bağlı

{interests, activity, segments}; null ya da boş bırakılırsa herkes

languages string[] body isteğe bağlı

tr, en

platforms string[] body isteğe bağlı

android, ios

Yanıtlar
  • 200Tahmin döndü
  • 400languages ya da platforms liste değil ya da bilinmeyen değer içeriyor (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed) ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization)
  • 422Hedef kitle geçersiz (invalid_audience)
  • 503Kategorileri doğrulamak için sözlüğe ulaşılamadı (sozluk_unavailable)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/sponsored/audience-estimate \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"audience":{"activity":"medium","interests":["teknoloji","ekonomi"],"segments":[]},"languages":["tr"]}'
DeneÖnce token gir: otomatik eklenir
PATCH /api/panel/sponsored/{id}
🔑 owner · admin · ads

Sponsorlu satırı düzenle

Bir sponsorlu satırın alanlarını değiştirir. Alanlar oluşturmadakilerle aynıdır ve hepsi isteğe bağlıdır. Yayındaki, duraklatılmış ya da reddedilmiş bir satırda herhangi bir alan değişirse (hedef kitle dahil) satır taslağa (draft) döner, çünkü onaylanan içerik artık aynı değildir. Bu durumda yeniden submit gerekir.

  • review ve ended durumundaki satırlar düzenlenemez (409 not_editable).
  • audience: null hedeflemeyi kaldırır ve satır herkese gösterilir. image_key, thumb_key, starts_at ya da ends_at için null göndermek o alanı temizler.
  • Bu çağrı satırdaki eski reject_reason değerini siler.
Parametreler
id uuid path zorunlu

Sponsorlu satırın id'si

title string body isteğe bağlı

2–60 karakter

body string body isteğe bağlı

2–140 karakter

target_kind string body isteğe bağlı

url, room ya da deeplink; target ile birlikte gönderilir

target string body isteğe bağlı

Yeni hedef; target_kind ile birlikte gönderilir

budget integer body isteğe bağlı

100–10.000.000 gösterim

ends_at ms body isteğe bağlı

Yayın bitişi (ms epoch) ya da null

audience object body isteğe bağlı

Yeni hedef kitle ya da null

Yanıtlar
  • 200Güncellendi; item döner
  • 400Bir alan geçersiz (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed) ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization), ya da satır yok veya bu organizasyonun değil (not_found)
  • 409Satır review ya da ended durumunda (not_editable)
  • 422Hedef kitle geçersiz (invalid_audience)
  • 503Kategorileri doğrulamak için sözlüğe ulaşılamadı (sozluk_unavailable)
curl -X PATCH https://mskop-api.gurerlabs.com/api/panel/sponsored/42aff321-6614-4a11-921c-eb401d18eb46 \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"audience":{"activity":"any","interests":["teknoloji"],"segments":[]},"budget":8000}'
DeneÖnce token gir: otomatik eklenir
DELETE /api/panel/sponsored/{id}
🔑 owner · admin · ads

Sponsorlu satırı sil

Taslak (draft) ya da reddedilmiş (rejected) bir satırı ve görsellerini siler. Yayında olan, duraklatılmış, incelemedeki ya da bitmiş bir satır silinemez. Böyle bir satırı yayından kaldırmak için pause kullanılır.

Parametreler
id uuid path zorunlu

Sponsorlu satırın id'si

Yanıtlar
  • 204Silindi; gövde boş
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed) ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization), ya da satır yok (not_found)
  • 409Satır taslak ya da reddedilmiş değil (not_editable)
curl -X DELETE https://mskop-api.gurerlabs.com/api/panel/sponsored/42aff321-6614-4a11-921c-eb401d18eb46 \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/sponsored/{id}/submit
🔑 owner · admin · ads

İncelemeye gönder

Taslak ya da reddedilmiş bir satırı konsolun incelemesine (review) gönderir. Konsoldaki editör onaylarsa satır yayına (live) girer; reddederse rejected olur ve sebebi reject_reason alanına yazılır. Satırın bütçesi 0'dan büyük olmalı ve organizasyonun gösterim (impression) kredisi bulunmalıdır.

Parametreler
id uuid path zorunlu

Sponsorlu satırın id'si

Yanıtlar
  • 200İncelemeye gönderildi; item (status: "review") döner
  • 400Satırın bütçesi yok (budget 0) (invalid_request)
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 402Organizasyonun gösterim kredisi kalmamış (insufficient_credits)
  • 403Rol yetmiyor (not_allowed), pakette sponsored yok (feature_unavailable), organizasyon askıda (organization_suspended), ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization), ya da satır yok (not_found)
  • 409Satır taslak ya da reddedilmiş değil (not_editable)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/sponsored/42aff321-6614-4a11-921c-eb401d18eb46/submit \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/sponsored/{id}/pause
🔑 owner · admin · ads

Yayını duraklat

Yayındaki (live) bir satırı duraklatır (paused). Duraklatılan satır uygulamalarda gösterilmez ve gösterim kredisi harcamaz. Satırın onayı korunur; satır düzenlenmediği sürece resume ile yeniden incelemeye gitmeden yayına döner.

Parametreler
id uuid path zorunlu

Sponsorlu satırın id'si

Yanıtlar
  • 200Duraklatıldı; item (status: "paused") döner
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 403Rol yetmiyor (not_allowed) ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization), ya da satır yok (not_found)
  • 409Satır yayında değil (not_editable)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/sponsored/42aff321-6614-4a11-921c-eb401d18eb46/pause \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir
POST /api/panel/sponsored/{id}/resume
🔑 owner · admin · ads

Yayına devam et

Duraklatılmış (paused) ve daha önce konsolca onaylanmış bir satırı yeniden yayına (live) alır. Organizasyonun gösterim kredisi bulunmalı ve satır bütçesini doldurmamış olmalıdır. Kredi bittiği için sunucunun kendiliğinden duraklattığı satırlar, konsol kredi ekledikten sonra bu çağrıyla yeniden başlatılır.

Parametreler
id uuid path zorunlu

Sponsorlu satırın id'si

Yanıtlar
  • 200Yeniden yayında; item (status: "live") döner
  • 401Token geçersiz ya da panel bağı koparılmış (unauthorized), ya da token'ın süresi dolmuş (token_expired)
  • 402Gösterim kredisi kalmamış ya da satır bütçesini doldurmuş (insufficient_credits)
  • 403Rol yetmiyor (not_allowed) ya da rumuz seçilmemiş (username_required)
  • 404Kişinin organizasyonu yok (no_organization), ya da satır yok (not_found)
  • 409Satır duraklatılmış değil ya da hiç onaylanmamış (not_editable)
curl -X POST https://mskop-api.gurerlabs.com/api/panel/sponsored/42aff321-6614-4a11-921c-eb401d18eb46/resume \
  -H "Authorization: Bearer $ACCESS_TOKEN"
DeneÖnce token gir: otomatik eklenir

Gerçek zamanlı (WebSocket)

Mesajlar, okundu bilgileri, tepkiler, yazıyor göstergesi ve çevrimiçi durumu Phoenix Channels üzerinden akar. Adres wss://mskop-api.gurerlabs.com/socket/websocket?token=ACCESS_TOKEN&vsn=2.0.0 şeklindedir. Token başlıkta değil, sorgu dizesinde gönderilir. Long-polling kapalıdır; yalnız WebSocket kullanılır. Her frame bir JSON dizisidir: [join_ref, ref, topic, event, payload]. İstemcinin gönderdiği bir olayın yanıtı aynı ref ile phx_reply olarak gelir: {"status": "ok" | "error", "response": {...}}. Hata yanıtında response.reason bulunur; olaya özgü sebepler kartların notlarındadır. Kimlik her zaman token'dan alınır; payload'daki account_id yok sayılır. Sınırlar: message:new hesap başına 10 saniyede 20 mesajdır, gövde en çok 16 KB olabilir. Tepkiler aynı sınırla ayrı bir kovadan sayılır. Eğik çizgili komutlar hesap, oda ve komut başına dakikada 5 kez çalıştırılabilir. Bilinmeyen bir olay ya da biçimi tutmayan bir payload genellikle unknown_event alır. Hazır istemciler: web için phoenix (npm), Android için JavaPhoenixClient, iOS için SwiftPhoenixClient.

WS /socket/websocket?token={token}&vsn=2.0.0
🔒 Bearer token

Bağlantı aç

Uygulama açıkken tek bir WebSocket bağlantısı tutulur; oda ve kişi kanallarına bu bağlantı üzerinden katılınır. Token yalnız bağlanırken doğrulanır. Açık bağlantı, token'ın süresi dolsa da sürer. Bağlantı koparsa istemci, gerekirse önce token'ı yeniler, sonra taze token'la yeniden bağlanır.

  • Token geçersizse, süresi dolmuşsa ya da hesabın rumuzu henüz seçilmemişse bağlantı HTTP 403 ile reddedilir. Bu durumda gövdede hata kodu gelmez; istemci önce POST /api/auth/refresh ile yeni token almayı denemelidir.
  • Heartbeat: istemci 30 saniyede bir [null, "hb", "phoenix", "heartbeat", {}] gönderir. Sunucu 60 saniye boyunca hiç frame almazsa bağlantıyı kapatır.
  • Tarayıcıdan bağlanan istemciler API'nin kendi alan adından gelmelidir (Origin kontrolü). Mobil uygulamalar Origin göndermez ve her zaman kabul edilir.
  • Sunucu bir hesabın bütün bağlantılarını tek seferde kapatabilir. Bu, örneğin hesap silindiğinde olur.
Parametreler
token string query zorunlu

Geçerli access token (Bearer öneki olmadan)

vsn string query zorunlu

Frame biçimi; dizi biçimi için 2.0.0 olmalıdır

Yanıtlar
  • 101Bağlantı kuruldu (Switching Protocols)
  • 403Token geçersiz ya da süresi dolmuş, rumuz seçilmemiş, veya tarayıcının Origin değeri kabul edilmedi
websocat "wss://mskop-api.gurerlabs.com/socket/websocket?token=$ACCESS_TOKEN&vsn=2.0.0"

# 30 saniyede bir heartbeat:
→ [null,"hb","phoenix","heartbeat",{}]
← [null,"hb","phoenix","phx_reply",{"status":"ok","response":{}}]

# Phoenix JS istemcisi (vsn'yi kendisi ekler):
const socket = new Socket("wss://mskop-api.gurerlabs.com/socket", {params: {token: accessToken}})
socket.connect()
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → phx_join
🔒 Bearer token

Odaya katıl

Bir odanın kanalına katılır. Yalnız odanın üyeleri katılabilir. Katılma yanıtında oda nesnesi gelir (REST'teki oda yüküyle aynı şekil, ek olarak member_count, is_member, avatar, peer ve muted). Ardından sunucu yalnız bu bağlantıya önce presence_state, sonra message:sync gönderir.

  • Hata sebepleri: room_not_found (böyle bir oda yok), not_member (oda var ama kişi üyesi değil).
  • Senkron modeli: odadaki her mesajın tek yönde artan bir seq imleci vardır. Düzenleme, silme, tepki, etkinlik yanıtı ve tartışma sayacı da imleci ileri taşır. Cihaz elindeki son latest_seq değerini since olarak gönderir ve o imleçten sonra değişen her satırı en eskisi önce, 100'erli paketler hâlinde alır. has_more true ise message:sync {since: latest_seq} ile devam eder.
  • since verilmezse ya da 0 ise cihaz yeni sayılır ve en yeni 100 mesaj gelir. Daha eskileri message:history ile istenir.
  • Paket seq sırasıyla gelir ama akış inserted_at sırasıyla çizilir. Cihaz mesajı id ile günceller, seq = max(eski, yeni) olarak saklar ve listeyi yeniden sıralamaz.
  • Birebir sohbette room.peer alanı {account_id, username, online} taşır. Karşı tarafın durumu değişince peer:presence gelir.
  • show_members: false olan bir odada sıradan üyeler, kurucu ve yöneticiler dışındaki kişileri presence içinde hidden-… takma kimlikleriyle ve rumuzsuz görür.
Parametreler
slug string path zorunlu

Odanın slug'ı; topic room:SLUG olur

since integer payload isteğe bağlı

Cihazın sakladığı son latest_seq; 0 ya da yoksa yeni cihaz

→ ["1","1","room:fenerbahce-taraftar","phx_join",{"since":418}]
← ["1","1","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"room":{"id":"3c8f1a2e-7b64-4d09-a5e1-6f2b9c0d4e17","slug":"fenerbahce-taraftar","…":"…"}}}]
← ["1",null,"room:fenerbahce-taraftar","presence_state",{"0c4e8a92-51d7-4b3f-a6e2-9d18f7c3b456":{"metas":[{"state":"online","username":"ayse","online_at":1791969100,"phx_ref":"F5xQ2k8pT0s"}]}}]
← ["1",null,"room:fenerbahce-taraftar","message:sync",{"since":418,"latest_seq":421,"has_more":false,"messages":[…]}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:new
🔑 send_message (tartışmada sub_chat.send_message)⏱ hesap başına 10 sn'de 20

Mesaj gönder

Odaya mesaj gönderir. Mesaj sunucuda oda anahtarıyla şifreli saklanır. Gönderen mesajı yalnız yanıt olarak alır; odadaki diğer herkese message:new olarak yayılır. Gövde / ile başlıyor ve ek yoksa mesaj yazılmaz, komut çalıştırılır.

  • Hata sebepleri: invalid_payload (body metin değil), read_only (Makroskop'un resmi duyuru sohbeti), empty_body (ek yok ve gövde boş), not_allowed (konuşma yetkisi yok; ek türü yasaksa permission alanıyla, ör. send_message.photos), body_too_large (16 384 bayttan uzun), rate_limited, invalid_parent (birebir sohbet, tartışmalar kapalı, kök bu odada değil ya da tartışma sonlandırılmış), muted (until ms ile), invalid_forward, not_available_in_organization (Keşfet kartı Makroskop dışı bir odaya), invalid_attachment.
  • Ek türleri (attachment.type; yoksa image): image {key, thumb_key, content_type, width, height, byte_size?}. Türü jpeg, png ya da webp olmalı; en çok 8 MB ve 8192 px; anahtar odanın room-media/ROOM_ID/ önekinde olmalı. video mp4, en çok 16 MB, duration_ms en çok 10 500. gif image/gif ya da image/webp. sticker webp, png ya da gif, en çok 2 MB; pack_id? ve emoji? alabilir.
  • Diğer ek türleri: contact {account_id} (rumuzu sunucu doldurur). location {lat, lng, label?}. article {title (≤200), hashtag?, blocks (≤200; p, h, li, quote; her biri ≤4000 karakter), media (≤20 fotoğraf)}. document {key, name, content_type, byte_size (≤10 MB)}; dosya 1 saat sonra silinir. happening {title, starts_at, ends_at?, location?, description?, media?}. entry {entry_id}; yalnız Makroskop odalarında kullanılabilir.
  • Tek gösterimlik ek: view_once: true. Yalnız birebir sohbette, image ya da video ile ve thumb_key olmadan gönderilir.
  • hashtags gönderilmezse gövdeden çıkarılır. Yanıttaki topics alanında mesajın düştüğü konular bulunur; hashtag yoksa ["unknown"] olur. reply_to.sender en çok 40, snippet en çok 120 karakter olarak saklanır.
  • parent_id verilirse mesaj o tartışmanın içine düşer. Bu durumda yanıttaki parent_thread_count, parent_seq ve parent_thread_participants kök mesajın yeni hâlini taşır; tartışma dışındaki mesajlarda bu alanlar null olur.
  • Komutlar: /mute @rumuz [5m|2h|1d], /unmute @rumuz, /ban @rumuz [sebep], /unban @rumuz, /kick @rumuz, /score [daily|weekly|monthly|all]. Yanıtı {command, target: {account_id, username}, …} biçimindedir (/mute için until ms). Komutlar hesap, oda ve komut başına dakikada 5 kez çalıştırılabilir. Komut hataları: not_admin, user_not_found, unknown_command, bad_duration, bad_window, founder_protected, not_member, rate_limited.
  • Birebir sohbette ilk mesaj karşı tarafı odaya ekler; karşı tarafın user: kanalına room:new gider.
Parametreler
body string payload zorunlu

Mesaj metni, en çok 16 KB; ek varsa boş olabilir

client_ref string payload isteğe bağlı

İstemcinin kendi kimliği; yanıtta ve yayında aynen döner

hashtags string[] payload isteğe bağlı

Ayrıca gönderilen etiketler; yoksa gövdeden çıkarılır

reply_to object payload isteğe bağlı

Alıntı {id, sender, snippet}

attachment object payload isteğe bağlı

Ek; türler notlarda

parent_id uuid payload isteğe bağlı

Tartışmanın kök mesajı

forward_of object payload isteğe bağlı

İletilen mesajın kaynağı {room, message_id}

→ ["1","2","room:fenerbahce-taraftar","message:new",{"body":"Maç ne oldu? #fb-maçı","client_ref":"c-1"}]
← ["1","2","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","seq":422,"…":"…"}}]

# Susturulmuş üye:
← ["1","2","room:fenerbahce-taraftar","phx_reply",{"status":"error","response":{"reason":"muted","until":1791969602000}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:ack
🔒 Bearer token

Aldım bildirimi

Cihaz mesajları aldığını ve yerel veritabanına yazdığını bildirir. Gönderen dışındaki birinden gelen ilk ack, odaya message:delivered {id} olarak yayılır; gönderen bunu çift tik olarak gösterir. Yanıt gelmez.

  • Tek seferde en çok 200 kimlik işlenir; fazlası atılır.
  • Biçimi tutmayan payload (id metin değil, ids liste değil) unknown_event alır.
Parametreler
id uuid payload isteğe bağlı

Tek mesaj; ya bu ya ids gönderilir

ids uuid[] payload isteğe bağlı

Mesaj kimlikleri, en çok 200

→ ["1","3","room:fenerbahce-taraftar","message:ack",{"ids":["a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"]}]
← [null,null,"room:fenerbahce-taraftar","message:delivered",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:sync
🔒 Bearer token

Senkronu sürdür

Katılma sırasında gelen senkron paketinin devamını ister. since imlecinden sonra değişen satırlar en eskisi önce, en çok 100'er gelir. Yanıttaki has_more true ise yanıttaki latest_seq değeriyle yeniden istenir.

  • Silinmiş mesajlar deleted: true ve boş gövdeyle, düzenlenmişler dolu edited_at ve yeni gövdeyle gelir. Tepki alan mesajlar reactions alanının yeni hâliyle satırın tamamı olarak gelir.
  • audience: "admins" olan oda satırları (yönetici kaydı) sıradan üyelerin senkronuna girmez.
  • since negatif ya da tam sayı değilse unknown_event döner.
Parametreler
since integer payload zorunlu

Son işlenen latest_seq (0 ya da daha büyük)

→ ["1","4","room:fenerbahce-taraftar","message:sync",{"since":421}]
← ["1","4","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"since":421,"latest_seq":422,"has_more":false,"messages":[…]}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:history
🔒 Bearer token

Eski mesajlar

Yukarı kaydırırken cihazda bulunmayan eski mesajları getirir. before anından eski en yeni limit mesaj, eskiden yeniye sıralı gelir. before_id ekrandaki en eski mesajın kimliğidir; aynı milisaniyede yazılmış mesajların atlanmamasını sağlar.

  • before tam sayı değilse unknown_event döner. limit geçersizse 50 kullanılır.
  • Yeni üyelere geçmiş kapalı olan odalarda (history_for_new_members: false) kişinin katıldığı andan öncesi verilmez.
Parametreler
before ms payload zorunlu

Ekrandaki en eski mesajın inserted_at değeri

before_id uuid payload isteğe bağlı

Ekrandaki en eski mesajın id'si

limit integer payload isteğe bağlı

Varsayılan 50, en çok 100

→ ["1","5","room:fenerbahce-taraftar","message:history",{"before":1791969153000,"before_id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","limit":50}]
← ["1","5","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"messages":[…],"has_more":true}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:thread
🔒 Bearer token

Tartışmayı aç

Bir mesajın altındaki tartışmanın tamamını getirir: üstte kök mesaj (root), altında yanıtlar (messages, eskiden yeniye, en çok 200). Tartışma yanıtları odanın kendi akışında görünmez; bu yüzden onları okumanın tek yolu bu olaydır.

  • Hata sebebi: not_found (bu odada böyle bir kök mesaj yok). id metin değilse unknown_event döner.
Parametreler
id uuid payload zorunlu

Kök mesajın id'si

→ ["1","6","room:fenerbahce-taraftar","message:thread",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"}]
← ["1","6","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"root":{…},"messages":[…]}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:thread:close
🔑 kök mesajın yazarı ya da oda yöneticisi

Tartışmayı sonlandır / yeniden aç

Bir tartışmayı bitmiş olarak işaretler (closed: true) ya da yeniden açar. Kapalı tartışma okunabilir ama yeni yanıt almaz. Durum değişirse odaya message:thread:closed {id, closed, seq} yayılır ve odaya discussion_closed ya da discussion_reopened satırı yazılır.

  • Tartışma zaten istenen durumdaysa hiçbir şey yayılmaz ve yanıtta seq bulunmaz.
  • Hata sebepleri: not_allowed, not_found, invalid_payload (closed boolean değil).
Parametreler
id uuid payload zorunlu

Kök mesajın id'si

closed boolean payload zorunlu

true sonlandırır, false yeniden açar

→ ["1","7","room:fenerbahce-taraftar","message:thread:close",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","closed":true}]
← ["1","7","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","closed":true,"seq":431}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:rsvp
🔒 Bearer token

Etkinliğe yanıt ver

Bir etkinlik kartına (kind: "happening") katılım yanıtı verir. Her kişinin tek bir yanıtı vardır; fikir değişince yeni yanıt eskisinin yerine geçer. Yeni sayılar odadaki herkese message:rsvp {id, rsvps, seq} olarak yayılır.

  • Yanıt öncekiyle aynıysa seq null döner.
  • Hata sebepleri: not_an_event, event_over (bitiş zamanı geçti), not_found, invalid_payload (answer geçersiz).
Parametreler
id uuid payload zorunlu

Etkinlik mesajının id'si

answer string payload zorunlu

going, maybe ya da no

→ ["1","8","room:fenerbahce-taraftar","message:rsvp",{"id":"7c2e9f14-3a8b-4d61-b5e0-2f9a6c1d8e43","answer":"going"}]
← ["1","8","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"id":"7c2e9f14-3a8b-4d61-b5e0-2f9a6c1d8e43","rsvps":{…},"seq":433}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:read
🔒 Bearer token

Okundu imleci

"Buraya kadar okudum" bildirimidir. Oda listesindeki okunmamış rozeti bu imleçten sonraki mesajları sayar; böylece rozet hesabın bütün cihazlarında aynı olur. İmleç hiçbir zaman geri gitmez: daha küçük bir seq göndermek bir şey değiştirmez.

  • seq negatif ya da tam sayı değilse unknown_event döner.
Parametreler
seq integer payload zorunlu

Okunan son mesajın seq değeri

→ ["1","9","room:fenerbahce-taraftar","message:read",{"seq":422}]
← ["1","9","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"seq":422}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:react
🔒 Bearer token⏱ hesap başına 10 sn'de 20 (ayrı kova)

Tepki bırak / geri al

Bir mesaja tepki ekler ya da (on: false) geri alır. Yalnız iki uygulamada da bulunan yedi emoji kabul edilir: ❤️ 👍 😂 😮 😢 🙏 🔥. Tepki mesajın imlecini ilerletir; odadaki diğer kişilere message:reaction olarak yayılır, tepkiyi bırakan cihaz yeni seq değerini yanıtta alır.

  • Mesaj başına tepki sınırı ücretsiz hesapta 1, Premium hesapta 3'tür. Sınır aşılınca reaction_limit ve limit alanı döner.
  • Hiçbir şey değişmediyse (aynı tepki ikinci kez ya da olmayan bir tepkiyi geri alma) seq null döner.
  • Hata sebepleri: invalid_payload (id UUID değil), unknown_emoji, rate_limited, reaction_limit.
Parametreler
id uuid payload zorunlu

Mesajın id'si

emoji string payload zorunlu

❤️ 👍 😂 😮 😢 🙏 🔥 emojilerinden biri

on boolean payload isteğe bağlı

false tepkiyi geri alır; varsayılan true

→ ["1","10","room:fenerbahce-taraftar","message:react",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","emoji":"🔥"}]
← ["1","10","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"seq":434}}]

# Sınır doluysa:
← ["1","10","room:fenerbahce-taraftar","phx_reply",{"status":"error","response":{"reason":"reaction_limit","limit":1}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:seen
🔒 Bearer token

Görüldü bildirimi

"Bu mesajlar ekranımda" bildirimidir. Sunucu kimin neyi gördüğünü kaydeder; bu kayıt mesajın "Görüntüleyenler" listesini ve views sayacını besler. Odadaki diğer kişilere message:seen {ids, account_id, username} yayılır. Yanıt gelmez.

  • UUID olmayan kimlikler atılır; tek seferde en çok 200 kimlik işlenir.
  • Üyelerini gizleyen bir odada, sıradan üyelere giden yayında görenin account_id ve username alanları null olur.
Parametreler
ids uuid[] payload zorunlu

Ekranda görünen mesajlar, en çok 200

→ ["1","11","room:fenerbahce-taraftar","message:seen",{"ids":["a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"]}]
← [null,null,"room:fenerbahce-taraftar","message:seen",{"ids":["a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"],"account_id":"f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","username":"osmangurer"}]   (diğer cihazlara)
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:open_once
🔒 Bearer token

Tek gösterimlik dosyayı aç

Birebir sohbette tek gösterimlik bir fotoğrafı ya da videoyu açar. Yanıttaki url 60 saniye geçerli, tek bir imzalı GET adresidir ve yalnız bir kez verilir. Açılış odaya message:opened {id, seq, opened_at} olarak yayılır; iki taraf da baloncuğu "Açıldı" yapar. Dosya açıldıktan yaklaşık 90 saniye sonra silinir.

  • Hata sebepleri: not_allowed (gönderen kendi dosyasını açamaz), already_opened (dosya başka bir cihazdan da olsa zaten açılmış), gone (dosya silinmiş), not_view_once (mesaj tek gösterimlik değil ya da oda birebir sohbet değil), not_found.
Parametreler
id uuid payload zorunlu

Tek gösterimlik mesajın id'si

→ ["2","12","room:dm-0c4e8a9251d7-f6cad4623b1e","message:open_once",{"id":"b3d71f0e-6c2a-4e95-8a14-0f7e2d9c5b36"}]
← ["2","12","room:dm-0c4e8a9251d7-f6cad4623b1e","phx_reply",{"status":"ok","response":{"url":"https://mskop-api.gurerlabs.com/makroskop-media/…","seq":57,"opened_at":1791969302000}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:state
🔒 Bearer token

Tepki ve görüntülenme durumu

Cihazda zaten bulunan mesajların güncel tepkilerini ve görüntülenme sayılarını toplu olarak getirir. Mesajın tamamını yeniden indirmeden bu iki bilgiyi tazelemek için kullanılır. UUID olmayan kimlikler atılır; en çok 200 kimlik işlenir.

  • ids liste değilse unknown_event döner.
Parametreler
ids uuid[] payload zorunlu

Mesaj kimlikleri, en çok 200

→ ["1","13","room:fenerbahce-taraftar","message:state",{"ids":["a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"]}]
← ["1","13","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"messages":[…]}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:viewers
🔒 Bearer token

Görüntüleyenler

Mesaj menüsündeki "Görüntüleyenler" listesini getirir: mesajı kimin, ne zaman gördüğü ve varsa bıraktığı tepki. Liste görülme sırasına göre, en eskisi başta gelir. seen_at ISO-8601 biçimindedir.

  • Üyelerini gizleyen bir odada sıradan üyeler yalnız kurucuyu ve yöneticileri adıyla görür; diğerleri yalnız hidden sayısına eklenir.
  • id UUID değilse liste boş döner; id metin değilse unknown_event döner.
Parametreler
id uuid payload zorunlu

Mesajın id'si

→ ["1","14","room:fenerbahce-taraftar","message:viewers",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"}]
← ["1","14","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","viewers":[…],"hidden":0}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:edit
🔑 yalnız yazarı (edit_message)

Mesajı düzenle

Kişi kendi mesajının gövdesini değiştirir; sunucudaki şifreli kopya da güncellenir. Hashtag'ler ve bahsetmeler yeni gövdeden yeniden çıkarılır. Odaya message:edited {id, body, account_id, hashtags, mentions, edited_at, seq} yayılır; edited_at ms epoch'tur. Yanıt boş bir ok'tur.

  • Hata sebepleri: not_allowed (permission: "edit_message"; oda bu yetkiyi üyelerden almış), empty_body, body_too_large, not_author, not_found. id ya da body metin değilse unknown_event döner.
Parametreler
id uuid payload zorunlu

Mesajın id'si

body string payload zorunlu

Yeni gövde, en çok 16 KB

→ ["1","15","room:fenerbahce-taraftar","message:edit",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","body":"Maç 2-1 bitti #fb-maçı"}]
← ["1","15","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{}}]
← [null,null,"room:fenerbahce-taraftar","message:edited",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","body":"Maç 2-1 bitti #fb-maçı","account_id":"0c4e8a92-51d7-4b3f-a6e2-9d18f7c3b456","hashtags":["#fb-maçı"],"mentions":[],"edited_at":1791969302000,"seq":435}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → message:delete
🔑 yazarı (delete_message) ya da group.can_remove_message

Mesajı sil

Kişi kendi mesajını geri alır ya da yetkili biri başkasının mesajını kaldırır. Gövde sunucudan silinir, yerinde bir iz kalır; böylece o sırada bağlı olmayan cihazlar da silindiğini öğrenir. Ekli dosyalar hemen silinir. Odaya message:deleted yayılır ve yöneticilere görünen bir message_deleted satırı yazılır.

  • Silinen mesaj bir tartışma yanıtıysa yayında parent_id, parent_thread_count, parent_seq ve parent_thread_participants alanları kökün yeni hâliyle gelir.
  • Hata sebepleri: not_allowed, not_author, not_found. id metin değilse unknown_event döner.
Parametreler
id uuid payload zorunlu

Mesajın id'si

→ ["1","16","room:fenerbahce-taraftar","message:delete",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"}]
← ["1","16","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{}}]
← [null,null,"room:fenerbahce-taraftar","message:deleted",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","account_id":"0c4e8a92-51d7-4b3f-a6e2-9d18f7c3b456","seq":436,"parent_id":null,"parent_thread_count":null,"parent_seq":null,"parent_thread_participants":null}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → room:pin
🔑 group.can_pin_message

Mesaj sabitle

Bir mesajı odanın sabitlenenler listesinin başına ekler. Mesaj zaten sabitliyse başa taşınır. id: null göndermek bütün sabitleri bir kerede kaldırır. Odaya room:pinned {message_id, account_id, at, pins} yayılır ve odaya message_pinned ya da message_unpinned satırı yazılır.

  • message_id, account_id ve at en yeni sabiti anlatır; pins listenin tamamıdır ve en yenisi başta gelir. Son sabit de kalkınca message_id null olur ve pins boş gelir. at ISO-8601 biçimindedir.
  • members_can_pin açık olan odalarda sıradan üyeler de sabitleyebilir.
  • Hata sebepleri: not_admin, not_found (mesaj bu odada yok), invalid_payload.
Parametreler
id uuid payload zorunlu

Sabitlenecek mesaj; null bütün sabitleri kaldırır

→ ["1","17","room:fenerbahce-taraftar","room:pin",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"}]
← ["1","17","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{}}]
← [null,null,"room:fenerbahce-taraftar","room:pinned",{"message_id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","account_id":"0c4e8a92-51d7-4b3f-a6e2-9d18f7c3b456","at":"2026-10-14T09:15:02.418903Z","pins":[{"message_id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","account_id":"0c4e8a92-51d7-4b3f-a6e2-9d18f7c3b456","at":"2026-10-14T09:15:02.418903Z"}]}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → room:unpin
🔑 group.can_pin_message

Sabiti kaldır

Sabitlenenler listesinden tek bir mesajı kaldırır; diğerleri yerinde kalır. Birden fazla sabit varken "bunu kaldır" ile "hepsini kaldır" farklı isteklerdir; hepsini kaldırmak için room:pin {id: null} kullanılır. Odaya güncel listeyle room:pinned yayılır.

  • Sabit olmayan bir mesajın kimliğini göndermek hata vermez; liste değişmeden yeniden yayılır.
  • Hata sebepleri: not_admin, invalid_payload (id yok ya da metin değil).
Parametreler
id uuid payload zorunlu

Kaldırılacak sabit mesaj

→ ["1","18","room:fenerbahce-taraftar","room:unpin",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71"}]
← ["1","18","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{}}]
← [null,null,"room:fenerbahce-taraftar","room:pinned",{"message_id":null,"account_id":null,"at":null,"pins":[]}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → typing
🔒 Bearer token⏱ hesap ve oda başına 2 sn'de 1 yayın

Yazıyor

Kişinin yazmakta olduğunu odaya bildirir. Sunucu aynı hesap ve oda için 2 saniyede en çok bir kez typing {account_id, username} yayar; aradaki istekler sessizce düşer. Yayın gönderene gelmez. Yanıt gelmez.

→ ["1","19","room:fenerbahce-taraftar","typing",{}]
← [null,null,"room:fenerbahce-taraftar","typing",{"account_id":"f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","username":"osmangurer"}]   (diğer üyelere)
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} → presence:set
🔒 Bearer token

Çevrimiçi durumu

Uygulamanın ön planda (online) ya da arka planda (background) olduğunu bildirir. Değişiklik odaya presence_diff olarak gider: aynı anahtar leaves içinde eski durumuyla, joins içinde yeni durumuyla görünür. Bağlantının kapanması, kişinin listeden düşmesi demektir.

  • Uygulamalardaki renkler: listede ve online ise yeşil, listede ve background ise sarı, listede yoksa gri.
  • online durumundaki kişilere o odanın push bildirimi gönderilmez; mesajı canlı olarak alırlar.
  • Hata sebebi: invalid_state.
Parametreler
state string payload zorunlu

online ya da background

→ ["1","20","room:fenerbahce-taraftar","presence:set",{"state":"background"}]
← ["1","20","room:fenerbahce-taraftar","phx_reply",{"status":"ok","response":{}}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS room:{slug} ← sunucu olayları
🔒 Bearer token

Odadan gelen olaylar

Sunucunun oda kanalına kendiliğinden gönderdiği olaylardır. Cihaz her olayı kendi yerel kopyasına uygular. seq taşıyan olaylarda satırın ve senkron imlecinin seq değerini de ilerletir; aksi hâlde aynı satır bir sonraki senkronda yeniden gelir.

  • message:new — mesaj nesnesi (senkrondakiyle aynı şekil) ve ek olarak topics, client_ref, parent_thread_count, parent_seq, parent_thread_participants. Gönderen kendi mesajını yayın olarak almaz. parent_id doluysa mesaj bir tartışma yanıtıdır ve akışa değil, tartışma penceresine girer. Odanın kendi satırları (kind: "event", gönderen null) da bu olayla gelir. event.type şunlardan biridir: member_joined, member_left, member_kicked, member_banned, member_unbanned, member_muted, member_unmuted, score, welcome, founder_changed, room_settings_changed, member_permissions_changed, admin_permissions_changed, message_deleted, message_pinned, message_unpinned, discussion_closed, discussion_reopened.
  • message:sync {since, messages, latest_seq, has_more} — katılınca yalnız bu bağlantıya. message:delivered {id} — gönderen dışından biri mesajı aldı (çift tik).
  • message:edited {id, body, account_id, hashtags, mentions, edited_at, seq} — edited_at ms epoch. message:deleted {id, account_id, seq, parent_id, parent_thread_count, parent_seq, parent_thread_participants}.
  • message:reaction {id, emoji, account_id, username, on, seq}. message:seen {ids, account_id, username}. message:rsvp {id, rsvps, seq}. message:opened {id, seq, opened_at} — opened_at ms epoch. message:thread:closed {id, closed, seq}.
  • room:pinned {message_id, account_id, at, pins} — at ISO-8601. typing {account_id, username}.
  • presence_state {ACCOUNT_ID: {metas: [{state, username, online_at, phx_ref}]}} — katılınca tam liste; online_at saniye cinsinden epoch. presence_diff {joins, leaves} — değişiklikler. Üyelerini gizleyen odada sıradan üyeler hidden-… kimlikleri görür.
  • member:joined {account_id, username} (biri REST ile katıldı), member:left {account_id}, member:tagged {account_id, tag}. Gizli üyelerin giriş ve çıkışları sıradan üyelere gönderilmez.
  • room:removed {} — kişi odadan ayrıldı ya da çıkarıldı (başka bir cihazdan da olabilir); ardından kanal phx_close ile kapanır. room:deleted {slug} — oda silindi.
  • peer:presence {account_id, online} — yalnız birebir sohbette: karşı taraf bağlandı ya da bağlantısı koptu.
← [null,null,"room:fenerbahce-taraftar","message:new",{"id":"e2c6a1f9-4b7d-4380-9e15-8a3f0d6c2b71","seq":437,"kind":"text","body":"Kadıköy'de buluşalım mı?","sender":{"account_id":"fdea3b17-2c9e-4a61-8d40-7b5e1c9a2f08","username":"mehmet","tag":null,"role":"member"},"inserted_at":1791969420000,"topics":["unknown"],"client_ref":"c-88","…":"…"}]
← [null,null,"room:fenerbahce-taraftar","message:reaction",{"id":"a9ea1c52-7d3b-4e0f-9b18-5c2e6f4d8a71","emoji":"🔥","account_id":"fdea3b17-2c9e-4a61-8d40-7b5e1c9a2f08","username":"mehmet","on":true,"seq":438}]
← [null,null,"room:fenerbahce-taraftar","presence_diff",{"joins":{"fdea3b17-2c9e-4a61-8d40-7b5e1c9a2f08":{"metas":[{"state":"background","username":"mehmet","online_at":1791969100,"phx_ref":"F5xQ9mZ1aB4"}]}},"leaves":{"fdea3b17-2c9e-4a61-8d40-7b5e1c9a2f08":{"metas":[{"state":"online","username":"mehmet","online_at":1791969100,"phx_ref":"F5xQ2k8pT0s"}]}}}]
← [null,null,"room:fenerbahce-taraftar","member:joined",{"account_id":"9d2b7e40-1c6f-4a85-b3e9-5f0a8c2d7e16","username":"zeynep"}]
← ["1",null,"room:fenerbahce-taraftar","room:removed",{}]
← ["1","1","room:fenerbahce-taraftar","phx_close",{}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

WS user:{account_id} → phx_join
🔒 Bearer token

Kişinin kendi kanalı

Uygulama açılışta odaların yanı sıra kendi kanalına da katılır. Bu kanal sunucunun bir odaya değil kişiye ulaştığı yoldur: oda listesi açık kanal olmadan da güncel kalır. Katılmak hesabı genel çevrimiçi listesine de yazar; bu liste yalnız birebir sohbetin karşı tarafına durum göstermek için kullanılır.

  • Yalnız kendi account_id'nle katılabilirsin; başka bir kimlik forbidden alır. Bu kanala gönderilen her istemci olayı unknown_event alır.
  • room:new {room} — biri seninle birebir sohbete ilk mesajı yazdı ya da bir yönetici katılma isteğini onayladı; uygulama odayı listeye hemen ekler.
  • room:gone {slug} — odadan çıkarıldın, engellendin, ayrıldın (başka cihazdan da olabilir) ya da oda silindi.
  • room:activity {slug, seq, last_message, mentioned} — üyesi olduğun bir odaya mesaj düştü (gönderene gelmez). last_message, GET /api/rooms listesindeki nesneyle aynıdır: {id, seq, kind, audience, sender, body (ilk 120 karakter), event, inserted_at}. mentioned, mesajın seni @rumuz ile anıp anmadığını söyler. Okunmamış sayısı gönderilmez; cihaz rozeti kendisi bir artırır. Tartışma yanıtları ve odanın kendi satırları bu olayı tetiklemez.
  • peer:presence {account_id, online} — birebir sohbet ettiğin biri bağlandı ya da bağlantısı koptu; o sohbetin açık olması gerekmez.
  • account:avatar {account_id, avatar} — biri profil fotoğrafını değiştirdi. Son fotoğraf silindiyse avatar: null gelir. Bağlı olan herkese, kişinin kendisine de gider.
Parametreler
account_id uuid path zorunlu

Kendi hesap kimliğin; topic user:ACCOUNT_ID olur

→ ["3","21","user:f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","phx_join",{}]
← ["3","21","user:f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","phx_reply",{"status":"ok","response":{}}]
← [null,null,"user:f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","room:activity",{"slug":"gece-kulubu","seq":421,"mentioned":false,"last_message":{"id":"b0127e5c-3f9a-4d28-8c61-e4a7b2d90f35","seq":421,"kind":"text","audience":"all","sender":{"account_id":"fdea3b17-2c9e-4a61-8d40-7b5e1c9a2f08","username":"mehmet"},"body":"Bu akşam kaçta?","event":null,"inserted_at":1791969420000}}]
← [null,null,"user:f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","peer:presence",{"account_id":"0c4e8a92-51d7-4b3f-a6e2-9d18f7c3b456","online":true}]
← [null,null,"user:f6cad462-3b1e-4d6a-9a77-2c1e0b8f4d21","room:gone",{"slug":"gece-kulubu"}]
DeneÖnce token gir: otomatik eklenir

WebSocket bağlantısı bu sayfadan denenemez; örnekteki websocat komutunu ya da Phoenix istemcisini kullan.

© Makroskop · Gürer Labs Durum LexerLang ile yazıldı https://mskop-api.gurerlabs.com

Access token

Korunan servisleri denemek için access token'ı yapıştır. Yalnızca bu sekmede tutulur, sekme kapanınca silinir. Giriş yanıtı dönen "Dene" istekleri token'ı kendiliğinden buraya yazar.