HTTP API¶
Kaynakları okumak ve değiştirmek için HTTP API'yi kullanın. Her yol tek bir temel URL'nin altında bulunur:
Bu sayfalardaki yollar bu temele göre yazılmıştır; yani GET /channels/{channel_id}, GET https://tebhos.com/api/v1/channels/{channel_id} anlamına gelir. Temel URL'yi veya dağıtımın başka herhangi bir uç noktasını keşfetmesi gereken bir istemci önce /.well-known/tebhos adresini okur. Oradaki endpoints.api_public değeri API köküdür (/api ile biter) ve istemci /v1 ekini kendisi ekler.
Tek API sürümü v1 sürümüdür. Sürüm anlaşması için bir başlık ve geri dönülecek daha eski bir sürüm yoktur.
Ek sayısı, mesaj uzunluğu ve sunucu ifade sayısı gibi kaynak sınırları, örnek keşfinin sınır yapılandırmasında yayımlanır. Bu değerleri koda sabit yazmak yerine oradan okuyun.
Kurallar¶
Snowflake'ler¶
Her kimlik bir snowflake'tir: API'nin her zaman ondalık dize olarak serileştirdiği 64 bitlik bir tamsayı; örneğin "1501314428688998182". Kimlikleri geri gönderirken de dize olarak gönderin. Bir JavaScript istemcisi bir kimliği number olarak ayrıştırMAMALIDIR (MUST NOT), çünkü snowflake çift duyarlıklı kayan noktalı sayıya sığmaz.
Snowflake'ler oluşturulma zamanlarını içerir ve kronolojik olarak sıralanır; aşağıdaki imleç tabanlı sayfalama buna dayanır.
Zaman damgaları¶
Zaman damgaları UTC'de ISO 8601 / RFC 3339 dizeleridir; örneğin "2026-09-23T00:15:57.000Z". Gerçek zamanlı katmandan veya bir önbellekten gelen birkaç alan bunun yerine Unix zamanı taşır ve bunlar kendi sayfalarında belirtilir (örneğin OAuth2 introspection içindeki exp ve iat).
Alan gösterimi¶
Her kaynak sayfasındaki alan tabloları aynı gösterimi kullanır:
| Gösterim | Anlamı |
|---|---|
field? |
Alan isteğe bağlıdır: istekte gönderilmeyebilir veya yanıtta bulunmayabilir |
?type |
Değer null olabilir: alan bulunur ama null olabilir |
field? ile ?type |
Alan bulunmayabilir ve null da olabilir |
Alanlar zamanla eklendiğinden, bir istemci bilinmeyen bir yanıt alanını hata vermek yerine yokmuş gibi ele almak ZORUNDADIR (MUST).
Sayfalama¶
Sınırsız büyüyebilen liste yolları, snowflake'lerle imleç tabanlı sayfalanır. Bir yol destekliyorsa, bir snowflake kimliğiyle before, after veya around ve bir sayıyla limit gönderin; varsayılan ve en büyük limit değerini yolun sayfası belirtir. Küçük, sınırlı koleksiyonlar (örneğin bağlantılar veya bir kullanıcının sahip olduğu uygulamalar) bütün olarak döndürülür.
İstek biçimi¶
JSON gövdelerini Content-Type: application/json ile gönderin. Bir işlem aksini belirtmedikçe yanıtlar UTF-8 JSON'dur. İstisnalar kendi kaynak sayfalarında belirtilir:
- OAuth2 token, introspection ve iptal uçları
application/x-www-form-urlencodedgövde alır. - Mesaj oluşturma ve webhook çalıştırma, Mesajlar ve Webhook'lar sayfalarında açıklandığı gibi
multipart/form-datada kabul eder. - Dosya yüklemeleri önceden imzalanmış URL'ler kullanır; bkz. Ek yüklemeleri.
Geçerli JSON olmayan ya da biçimi işlemle uyuşmayan (eksik zorunlu alan, yanlış tür) bir gövde, işlem çalışmadan önce 400 ile reddedilir.
Bilinmeyen yollar boş gövdeyle 404 döndürür. Bilinen bir yol desteklemediği bir metotla çağrılırsa da 405 değil, boş gövdeyle 404 döndürür. Sondaki eğik çizgiler önemlidir: /users/@me/, /users/@me yolundan farklı bir yoldur.
Yalnızca genel medya yolları (/files/{key}, /avatars/..., /banners/..., /server-icons/... ve Medya vekili yolları bölümünde açıklanan diğer görsel yolları) HEAD isteğine yanıt verir. Diğer tüm yollarda HEAD, desteklenmeyen herhangi bir metot gibi ele alınır.
Kimlik doğrulama¶
Çoğu yol bir Authorization başlığı gerektirir. TEBHOS, REST API'de iki şema kabul eder:
| Şema | Örnek | Kullanan |
|---|---|---|
Bearer |
Authorization: Bearer <session token> |
Oturum açmış bir kullanıcı. Oturum token'ını giriş ve diğer oturum açma işlemleri döndürür |
Bot |
Authorization: Bot <application_id>.<secret> |
Bir bot hesabı. Token, uygulama oluşturulduğunda döndürülür |
Kullanıcı oturum token'ı Bearer öneki olmadan, yalın olarak da gönderilebilir. Kimlik doğrulama her iki kimlik bilgisini ayrıntılı olarak açıklar.
Her yol hangi kimlik bilgilerini kabul ettiğini belirtir. Kullanıcıya yönelik pek çok yol yalnızca kullanıcılar içindir: bir oturum token'ı okur ve geçerli bir bot token'ını 403 ACCESS_DENIED ile (geçersiz olanı 401 ile) reddeder. Botların kullandığı yollar (mesajlar, tepkiler, kanallar, sunucu okumaları vb.) ikisini de kabul eder. OAuth2 bearer erişim token'ları yalnızca bunları belgeleyen iki OAuth2 yolu (kullanıcı bilgileri ve geçerli yetkilendirme) ile eşleşen bir kapsam isteyen birkaç okuma yolu tarafından kabul edilir; OAuth2 erişim token'ları bunları listeler. Diğer tüm yollar geçerli bir erişim token'ını 403 ACCESS_DENIED ile yanıtlar.
Hassas hesap işlemleri ek olarak sudo kipi gerektirir: istek gövdesinde verilen ya da oturuma beş dakikalığına tanınan, parolanın, bir doğrulayıcı kodunun veya bir geçiş anahtarının (passkey) taze bir kanıtı.
Standart istek başlıkları¶
| Alan | Tür | Açıklama |
|---|---|---|
| Authorization? | string | Kabul edilen şemalardan birindeki kimlik bilgisi |
| Content-Type? | string | İstek gövdesinin medya türü; multipart gövdelerde sınır (boundary) değeri de |
| Accept-Language? | string | Yeni hesabın dilini belirlemek için kayıt tarafından okunur. Hata mesajları bu başlığa göre yerelleştirilmez |
| X-Captcha-Token? | string | CAPTCHA kapısı olan işlemlerde CAPTCHA çözümü (bkz. CAPTCHA işleme) |
| X-Captcha-Type? | string | Token'ı veren sağlayıcıyı seçen hcaptcha veya turnstile. Örneğin (instance) yapılandırılmış sağlayıcısını kullanmak için gönderilmez |
| X-Tebhos-Platform? | string | Yerel istemci platformu; masaüstü devri tarafından okunur. TEBHOS masaüstü uygulaması desktop gönderir |
| X-Tebhos-Features? | string | Virgülle ayrılmış istemci yetenekleri listesi. Şu anda yalnızca view_channel_members_permission tanınır; rol güncellemeleri tarafından |
| User-Agent? | string | Yeni bir kimlik doğrulama oturumuna kaydedilir ve oturum listesinde gösterilir. 255 karaktere kısaltılır |
Denetim kaydı nedeni başlığı yok
TEBHOS, denetim kaydı nedenini bir istek başlığından okumaz. Neden kaydeden işlemler bunu belgelenmiş istek alanlarından alır.
Standart yanıt başlıkları¶
| Alan | Tür | Açıklama |
|---|---|---|
| Content-Type? | string | Gövdenin medya türü; boş bir yanıtta bulunmaz |
| Cache-Control? | string | Gerektiren işlemler tarafından ayarlanır; örneğin örnek keşfinde no-cache, genel medyada public, max-age=31536000 |
| Retry-After? | string | Beklenecek tam saniye; her 429'da ve yavaş mod reddinde gönderilir |
| X-RateLimit-Limit? | string | Kova kapasitesi; bir yol kovasından gelen 429'da gönderilir |
| X-RateLimit-Remaining? | string | Bir yol kovasından gelen 429'da her zaman 0 |
| X-RateLimit-Reset? | string | Kovanın tamamen boşalacağı, saniye cinsinden Unix zamanı |
| X-RateLimit-Reset-After? | string | Kovanın sıfırlanmasına kalan, kesirli kısmı olan saniye |
| X-RateLimit-Bucket? | string | Kova adının 16 karakterlik kalıcı hash'i |
| X-RateLimit-Scope? | string | user, shared veya global; her 429'da gönderilir |
| X-RateLimit-Global? | string | Sabit true değeri; yalnızca genel bir 429'da gönderilir |
| X-Total-Count? | string | Toplam sayı; bunu bildiren işlemlerde (örneğin TEBHOS üye nesnesi altında anlatılan eski /servers/{guild_id}/members listesi) |
X-RateLimit-* başlıkları başarılı yanıtlarda değil, yalnızca bir hız sınırı reddinde gönderilir. Sözleşmenin tamamını Hız sınırları tanımlar.
Hız sınırları¶
Kimliği doğrulanmış her /api/v1 isteği, istemci başına saniyede 50 isteklik genel bir sınıra sayılır. İstemci Authorization başlığıyla, başlık göndermiyorsa IP adresiyle tanımlanır. Kimliği doğrulanmamış GET/HEAD istekleri, genel medya okumaları ve webhook çalıştırma genel sınırdan muaftır.
Çoğu yolun ayrıca her işlemde belgelenen kendi yol kovası vardır. İkisinden birinden gelen ret, RATE_LIMITED koduyla 429 döndürür:
{
"error": "429 Too Many Requests",
"code": "RATE_LIMITED",
"message": "...",
"global": false,
"retry_after": 1.25
}
retry_after kesirli kısmı olan saniye cinsindendir; Retry-After aynı değerin tam saniyeye yukarı yuvarlanmış hâlidir. Kovaları ve başlık sözleşmesini Hız sınırları listeler.
Çapraz kaynaklı istekler¶
Tarayıcı isteklerine TEBHOS web kaynaklarından (https://tebhos.com ve onun *.tebhos.com alt alan adları) izin verilir. İzin verilen bir Origin için yanıt, o kaynağa ayarlanmış Access-Control-Allow-Origin ve Access-Control-Allow-Credentials: true taşır. Başka herhangi bir kaynaktan gelen istekler Access-Control-Allow-Origin almaz; bu yüzden tarayıcı onları engeller.
Ön kontrol (preflight); GET, POST, PUT, PATCH, DELETE ve OPTIONS metotlarına ve Content-Type ile Authorization istek başlıklarına izin verir. Hız sınırı başlıkları ve Retry-After, Access-Control-Expose-Headers aracılığıyla betiklere açılır.
Genel medya yolları (avatarlar, simgeler, afişler ve /files/{key}) her kaynağa Access-Control-Allow-Origin: * ile yanıt verir; böylece görseller her yerden yüklenebilir.
Bir bot veya sunucu tarafı istemci tarayıcı değildir ve CORS'tan etkilenmez.
Hata yanıtı nesnesi¶
Başarısız bir istek, kalıcı bir hata kodu ve insanların okuyabileceği bir mesaj içeren JSON gövde döndürür.
Yapı¶
| Alan | Tür | Açıklama |
|---|---|---|
| error | string | HTTP durum satırı; örneğin "403 Forbidden" |
| code | string | Kalıcı, makinece okunabilir hata kodu |
| message | string | Hatanın insanların okuyabileceği açıklaması |
| errors? | array[doğrulama hatası nesnesi] | Alan ayrıntısı içeren bir INVALID_FORM_BODY yanıtında hatalı alanlar |
İstemci dallanmayı message değerine göre değil, her zaman code ve HTTP durumuna göre yapmak ZORUNDADIR (MUST). Mesajlar son kullanıcılar için yazılır, şu anda Türkçedir ve her an değişebilir.
Örnek¶
{
"error": "403 Forbidden",
"code": "FORBIDDEN",
"message": "Kendi yetkilerinizi değiştiremezsiniz"
}
Bazı işlemler yapılandırılmış ayrıntı içeren ek üst düzey üyeler ekler ve bunları belgeler. Örneğin giriş, ticket, email ve resend_available_in ile IP_AUTHORIZATION_REQUIRED döndürür; bir hız sınırı reddi de global ve retry_after taşır. İstemci tanımadığı üyeleri yok saymak ZORUNDADIR (MUST).
İki eski zarf biçimi
Birkaç hesap güvenliği yolu (MFA giriş tamamlamaları ve Kimlik doğrulama sayfasındaki oturum yolları) kendi hatalarını {"error": "<CODE>", "message": "..."} olarak bildirir; kod error içindedir ve code üyesi yoktur. OAuth2 yolları OAuth2 hata adını (invalid_grant, invalid_client, ...) message içine koyar. Her ikisi de kendi sayfalarında belirtilir.
Doğrulama hatası nesnesi¶
Her kayıt, doğrulamadan geçemeyen bir girdi alanını belirtir.
Yapı¶
| Alan | Tür | Açıklama |
|---|---|---|
| path | string | Hatalı istek alanı; embeds.0.title gibi noktayla birleştirilmiş bir yol olarak |
| code | string | Kalıcı, makinece okunabilir doğrulama kodu |
| message | string | Hatanın açıklaması |
Örnek¶
{
"error": "400 Bad Request",
"code": "INVALID_FORM_BODY",
"message": "Kanal sesli kanal olmalı",
"errors": [
{"path": "channel_id", "code": "CHANNEL_MUST_BE_VOICE", "message": "CHANNEL_MUST_BE_VOICE"}
]
}
Bir errors kaydında message şu anda code değerini tekrarlar. Pek çok doğrulama hatası yalnızca üst düzey bir message ile, errors dizisi olmadan INVALID_FORM_BODY döndürür. Kodları Hatalar listeler.
Kaynak sayfaları¶
| Sayfa | Kapsamı |
|---|---|
| Hatalar | Hata zarfı ve hata kodu kaydı |
| Dağıtım kullanılabilirliği | Örneğin (instance) nasıl yapılandırıldığına bağlı özellikler |
| Örnek (instance) | Örnek keşfi: uç noktalar, özellikler, sınırlar, genel yapılandırma |
| Kimlik doğrulama işlemleri | Kayıt, giriş, MFA tamamlama, geçiş anahtarları, SSO, parola kurtarma, IP yetkilendirme, oturumlar, masaüstü devri |
| Gateway | Botların Gateway URL'sini ve oturum başlangıç değerlerini keşfetmesi |
| OAuth2 | Yetkilendirme, onay, token değişimi, introspection, iptal, verilmiş yetkilendirmeler |
| Uygulamalar | Uygulamalar, bot hesapları, istemci gizli anahtarları, bot token'ları, genel sorgulama |
| Bağlantılar | Bağlı harici hesaplar: alan adları ve OAuth sağlayıcıları |
| Kullanıcılar | Kullanıcı nesnesi ve ortak kullanıcı numaralandırmaları |
| Geçerli kullanıcı | Geçerli hesap ve profili |
| Kullanıcı ayarları | Hesap, bildirim ve gizlilik ayarları |
| Kullanıcı ayarları Protobuf | Yapılandırılmış istemci tercih mesajları |
| E-posta ve parola değişiklikleri | Kodla doğrulanan kimlik bilgisi değişiklik akışları |
| Çok adımlı doğrulama | TOTP, yedek kodlar, geçiş anahtarları, sudo kipi |
| Telefon doğrulama | Telefon numarası doğrulama |
| İlişkiler | Arkadaşlar, arkadaşlık istekleri, engellemeler |
| Kullanıcı notları | Diğer kullanıcılar hakkında özel notlar |
| Özel kanallar | Doğrudan mesajlar ve grup DM'leri |
| Kullanıcı içerik koleksiyonları | Bahsetmeler, kaydedilen mesajlar, toplu silme |
| Hediye envanteri | Geçerli hesabın oluşturduğu hediye kodları |
| Veri toplama | Hesap verisi dışa aktarma |
| Okuma durumları | Okuma işaretleri ve bahsetme sayıları |
| Memeler | Kaydedilen medya koleksiyonu |
| GIF'ler | Örneğin (instance) sağlayıcısı üzerinden GIF arama |
| Temalar | Paylaşılabilir özel CSS temaları |
| Kanallar | Kanal nesneleri, alıcılar, izin geçersiz kılmaları |
| Aramalar | DM araması çaldırma ve denetimi |
| Yayınlar | Go Live yayınları ve önizlemeleri |
| Giriş sesleri | Ses kanalı giriş sesleri |
| Mesajlar | Mesajlar, ekler, gömmeler, sabitlemeler, tepkiler |
| Sunucular | Sunucu nesneleri ve yaşam döngüsü |
| Sunucu kanalları | Kanal listeleme, oluşturma, sıralama |
| Sunucu üyeleri | Üye nesneleri, roller, ses moderasyonu |
| Sunucu üye araması | Üye arama ve filtreleme |
| Sunucu moderasyonu | Yasaklamalar ve zaman aşımları |
| Sunucu emojileri | Özel emojiler |
| Sunucu çıkartmaları | Özel çıkartmalar |
| İfadeler | Sunucular genelinde emoji ve çıkartma sorgulamaları |
| Sunucu denetim kayıtları | Denetim kaydı girdileri ve filtreleri |
| Roller ve izinler | İzin bayrakları ve rol nesneleri |
| Keşif | Genel sunucu listeleri |
| Davetler | Davet sorgulama, oluşturma, kabul etme |
| Webhook'lar | Webhook yönetimi ve çalıştırma |
| Arama | Mesaj arama |
| Unfurl | Bağlantı önizlemesi çözümleme |
| Faturalandırma | Polar üzerinden ödeme |
| Premium | Premium planları ve abonelik durumu |
| Hediyeler | Hediye kodu sorgulama ve kullanma |
| Deneyler | Geçerli hesap için özellik bayrakları |