İçeriğe geç
Stream EmberAPI
Platform Events / Ingest sözleşmesi (Chrome eklentisi)

Ingest sözleşmesi (Chrome eklentisi)

TikTok, YouTube, Twitch, Kick, Facebook, Instagram ve Trovo eventlerini ve hediye kataloglarını 14 dilde, tek ortak şemada listeler.

Betav3.0.0Güncelleme 2026-10-07JSON · GET, POSTGET herkese açık; POST ingest.php için X-Ingest-Token

Chrome eklentisi ve StreamEmber launcher her platform × öğe türü × dil için tek bir POST gönderir. Sunucu ham platform yanıtı kabul etmez; ayrıştırma eklentinin işidir. Platformun veri yapısı değişirse eklenti güncellenir, bu sözleşme aynı kalır. Sözleşme değişirse schema sürümü artırılır.

Uç nokta

AdresPOST https://api.streamember.com/platform-events/ingest.php
BaşlıklarContent-Type: application/json, X-Ingest-Token: <config.php'deki sabit UUID>
Sıkıştırmaİsteğe bağlı: Content-Encoding: gzip
Boyut sınırı8 MB (açılmış gövde)
ŞemaGET ingest.php?schema=1 → JSON Schema (token gerekmez)

Eklenti host_permissions ile https://api.streamember.com/* adresine erişir; CORS gerekmez. Sunucu yine de OPTIONS isteğine X-Ingest-Token başlığına izin veren bir yanıt döner.

Gövde

json
{
  "schema": "streamember.ingest/1",
  "platform": "tiktok",
  "item_type": "gift",
  "lang": "tr",
  "source": {
    "agent": "streamember-chrome-extension",
    "agent_version": "0.2.0",
    "captured_at": "2026-10-07T09:45:36Z",
    "platform_lang": "tr-TR",
    "streamer_region": "VN",
    "page_url": "https://www.tiktok.com/@ornek/live"
  },
  "items": [
    {
      "native_id": "5655",
      "name": "Gül",
      "description": null,
      "value": { "amount": 1, "unit": "tiktok_coin" },
      "icon": "https://p16-webcast.tiktokcdn.com/img/alisg/webcast-sg/…~tplv-obj.webp",
      "flags": { "community": false, "streakable": true },
      "attributes": {
        "tiktok.gift_type": 1,
        "tiktok.gift_sub_type": 0,
        "tiktok.gift_label_type": 0,
        "tiktok.is_global_gift": true,
        "tiktok.is_displayed_on_panel": true
      }
    }
  ]
}

Alanlar

AlanZorunluTürKural
schema✔metinTam olarak streamember.ingest/1
platform✔metintiktok, youtube, twitch, kick, facebook, instagram, trovo
item_type✔metinPlatformun desteklediği tür: TikTok/YouTube/Kick gift, Twitch power_up, Trovo spell
lang✔metin14 koddan biri, tam olarak (tr, zh-Hant; tr-TR değil). Bu alanda normalleştirme yapılmaz.
source.agent✔metinstreamember-chrome-extension, streamember-launcher ya da tikfinity-import
source.agent_version✔metinAnlamsal sürüm, ör. 0.2.0
source.captured_at✔metinListenin platformdan alındığı an, ISO 8601
source.platform_langmetinPlatform isteğinde kullanılan dil kodu (tr-TR, zh-Hant-TW)
source.streamer_regionmetinYayıncının ülkesi, ISO 3166-1 alpha-2. Katalogda regions alanına eklenir.
source.page_urlmetinListenin alındığı yayın sayfası (https://)
items✔dizi1–5000 öğe
items[].native_id✔metin1–128 karakter, [A-Za-z0-9_-]; sayı olsa da metin
items[].name✔metin1–200 karakter, lang dilinde
items[].descriptionmetin | nullEn fazla 1000 karakter
items[].value.amount✔tam sayı0 ya da daha büyük
items[].value.unit✔metintiktok_coin, youtube_jewel, twitch_bit, kick_kick, trovo_mana, trovo_elixir (platforma uygun olan)
items[].icon✔metinPlatformun verdiği tam https URL; sunucu olduğu gibi saklar
items[].flagsnesnecommunity, streakable (boolean). Eksik bayrak false.
items[].attributesnesneAnahtar {platform}.{alan}, değer skaler; en fazla 32 anahtar

Tanımlanmamış alanlar yok sayılır. Aynı gönderimde tekrar eden native_id reddedilir; eklenti listeyi göndermeden önce tekilleştirmelidir.

Platform eşleme rehberi

Deneme kayıtlarından (2026-10-07) çıkarılan eşleme. Sunucu yalnızca sözleşmeye bakar; bu tablo eklenti içindir.

AlanTikTok /webcast/gift/list/ → data.gifts[]YouTube get_panel → giftCollectionViewModel.giftItems[].giftItemViewModel
native_idid (metne çevrilir)giftId (ör. football)
namenamegiftName.content
value.amountdiamond_counttokenAmountMicros / 1 000 000
iconimage.url_list[0]unselectedGiftImage.sources içindeki en büyük, // → https://
flags.streakablecombokoleksiyondaki unlockGiftComboExperience
flags.communitybiz_extra içinde anchor_community_level varsa truefalse
attributestiktok.gift_type, tiktok.gift_sub_type, tiktok.gift_label_type, tiktok.is_global_gift, tiktok.is_displayed_on_panelyoutube.limited (sınırlı süre rozeti)
source.streamer_regiondata.pages[].region—

TikTok listesi aynı hediyeyi birden fazla kez içerebilir (deneme kaydında 677 satır, 673 benzersiz hediye); ilk görülen alınır.

Yanıt

json
{
  "ok": true,
  "submission_id": "sub_20261007T114856Z_34e910",
  "platform": "tiktok",
  "item_type": "gift",
  "lang": "tr",
  "received": 673,
  "created": 3,
  "updated": 12,
  "unchanged": 658,
  "rejected": [
    { "index": 41, "native_id": "99999", "errors": ["value.unit: tiktok için tiktok_coin olmalı"] }
  ]
}

Bütün isteğin reddedilmesine yalnızca zarf hataları yol açar. Öğe düzeyindeki hata sadece o öğeyi reddeder. received = created + updated + unchanged + rejected sayısı.

Hatalar

HTTPerrorNe zaman
400invalid_jsonGövde geçerli JSON değil ya da gzip açılamadı
401invalid_tokenX-Ingest-Token yok ya da yanlış
405method_not_allowedPOST dışı istek (?schema=1 hariç)
413payload_too_largeGövde 8 MB'ı aşıyor
415unsupported_media_typeContent-Type JSON değil ya da desteklenmeyen Content-Encoding
422invalid_envelopeZarf alanı geçersiz; ayrıntılar details dizisinde
429duplicate_submissionAynı içerik son 30 dakikada zaten alındı; hiçbir şey yazılmadı. Retry-After saniye cinsinden pencereyi verir.
500internal_errorSunucu tarafı hata (ör. storage/ yazılamıyor)

Aynı içerik penceresi

Aynı içerik en fazla 30 dakikada bir yazılır (config.php → ingest_duplicate_window_seconds, 0 = kapalı).

  • İçerik anahtarı: platform | item_type | lang | streamer_region | öğeler. Öğeler native_id sırasına göre dizilir; yalnız native_id, name, value.amount ve description hesaba katılır. captured_at, agent ve page_url anahtara girmez.
  • Böylece aynı ülkede ve aynı dilde aynı listeyi gören yüzlerce launcher yalnız bir kez yazar. Farklı ülke, dil ya da değişmiş liste ayrı içeriktir ve hemen kabul edilir.
  • İşaret storage/throttle/<sha1> dosyasında, flock altında tutulur. Eşzamanlı iki aynı gönderimden yalnız biri geçer, diğeri 429 alır.
  • Yazım 500 ile biterse işaret geri alınır; bir sonraki gönderim pencereyi beklemez.
  • Pencereden eski işaret dosyaları ara sıra (≈ her 200 gönderimde bir) silinir.

İstemci 429'u hata olarak göstermemeli. Launcher aynı lang + streamer_region için kendi tarafında da 30 dakika bekler.

Sunucunun yaptığı

  1. Token'ı, zarfı ve her öğeyi doğrular.
  2. Her öğe için:
    1. Katalogda yoksa oluşturur ve first_seen atar.
    2. Varsa dilden bağımsız alanları (value, icon, flags, attributes) son gönderimle günceller; eski değerleri storage/history/ altına yazar.
    3. Ad ve açıklamayı lang dilinin dosyasına yazar.
    4. last_seen, langs ve regions alanlarını günceller.
  3. Gönderimi özetiyle storage/submissions/ altına sıkıştırılmış olarak kaydeder.
  4. Hiçbir öğeyi silmez. tikfinity-import kaynağından gelen gönderim yalnızca eksikleri tamamlar.

Launcher

Launcher, gizli canlı yayın penceresinde sayfanın kendi GET /webcast/gift/list/ yanıtını CDP ile yakalar ve yukarıdaki TikTok eşlemesiyle gönderir:

  • source.agent: streamember-launcher, agent_version = uygulama sürümü.
  • lang: isteğin webcast_language / app_language parametresinden. zh-TW/zh-Hant → zh-Hant, zh* → zh-Hans, diğerleri ilk alt etiket. 14 kod dışında kalırsa gönderilmez.
  • source.platform_lang: ham dil parametresi. source.streamer_region: data.pages[].region.
  • source.page_url: yayın sayfası.
  • Gövde gzip ile gönderilir. Aynı lang + region için 30 dakikada en fazla bir istek atılır. Başarısız istek sessizce yok sayılır; yayın izlemeyi etkilemez.

Hediye listesi yalnız TikTok'a giriş yapılmış oturumda istenir. Böylece farklı ülkelerdeki launcher kullanıcıları kendi bölgelerinin listesini toplar.

Eklenti kontrol listesi

  • Platform yanıtını eklentide ayrıştır, sunucuya yalnızca bu şemayı gönder.
  • Her dil için ayrı istek; lang bizim kodumuz, platformun kodu source.platform_lang.
  • native_id her zaman metin; listeyi göndermeden önce tekilleştir.
  • Biliniyorsa yayıncının ülkesini source.streamer_region alanına ekle.
  • Platform istenen dili uygulamadıysa (ad listesi başka bir dilinkiyle aynıysa) o dili gönderme.
  • Yanıttaki rejected listesini kayıt ekranında göster.
Bu sayfa platform-events/INGEST.md dosyasından üretildi.Ham MarkdownManifest JSON