// bot api referansı

BOT API

Void bot platformunun tam teknik referansı: kimlik doğrulama, izin kapsamları, REST uç noktaları, gerçek zamanlı gateway, etkileşimler ve webhook’lar. Yeni başlıyorsan önce dostça anlatımlı botlar sayfasına göz at.

Temel adres ve kimlik

Bütün uç noktalar tek bir temel adresin altındadır. Her isteğe bot token’ını Authorization başlığında Bearer olarak eklersin. Token’lar void_app_ ile başlar.

base url
https://api.thevoidhub.com
httpkimlik başlığı
Authorization: Bearer void_app_XXXXXXXXXXXXXXXX

Token ve izin kapsamları

Bir token’ı masaüstü uygulamada Ayarlar > Geliştirici bölümünden bir uygulama oluşturarak alırsın. Token yalnızca BİR KEZ gösterilir, o an kopyala. Uygulamayı oluştururken hangi kapsamların (scope) olacağını seçersin. Bir eylem için hem token kapsamı hem de kurulum izni gerekir.

messages.read Bir kanaldaki mesajları okur.
messages.write Mesaj gönderir ve botun kendi mesajlarını düzenler.
messages.manage Mesajları siler (moderasyon).
reactions.write Mesajlara tepki ekler.
channels.read Sunucu ve kanal bilgisini okur.
channels.manage Kanal oluşturur, yeniden adlandırır, siler.
members.read Üyeleri listeler ve okur.
members.manage Üyeleri atar, banlar, susturur.
roles.manage Rolleri okur ve üyelere rol verir/alır.

Sunucuya kurulum

Bir bot, bir sunucuda (grupta) işlem yapabilmek için önce o sunucunun yöneticisi tarafından kurulmalıdır. Kurulum, botun o sunucudaki izinlerinin (bir alt kümesinin) verildiği yerdir. Her eylem hem token kapsamını hem de aşağıdaki kurulum izinlerinden ilgili olanı ister.

VIEW_CHANNELSEND_MESSAGESADD_REACTIONSMANAGE_MESSAGESKICK_MEMBERSBAN_MEMBERSMUTE_MEMBERSMANAGE_CHANNELSMANAGE_ROLES

İstek limitleri

Her yanıt X-RateLimit-Limit, X-RateLimit-Remaining ve X-RateLimit-Reset (saniye) başlıklarını taşır. HTTP 429 durumunda ayrıca Retry-After (saniye) gelir. Kovalar uygulama başına ve yetenek başına ayrıdır.

30 / min Mesaj ve tepki gönderme
20 / min Moderasyon (at / banla / sustur / rol / kanal)
60 / min Diğer her şey
httpyanıt başlıkları
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 42

# on HTTP 429 there is also:
Retry-After: 42

Hatalar

Her hata aynı biçimdedir: bir code ve okunabilir bir message taşıyan bir error nesnesi, ilgili HTTP durum koduyla birlikte.

jsonhata gövdesi
{
  "error": {
    "code": "missing_scope",
    "message": "This action needs the messages.write scope."
  }
}
400 validation_failed İstek gövdesi ya da alanlar geçersiz.
401 invalid_token Token eksik, hatalı ya da süresi dolmuş.
403 forbidden / missing_scope / not_installed Kapsam yok, izin yok ya da bot bu sunucuya kurulu değil.
404 not_found Kaynak bulunamadı.
410 deleted Kaynak silinmiş.
429 rate_limited Çok fazla istek. Retry-After kadar bekle.

REST uç noktaları

Aşağıdaki bütün yollar temel adrese eklenir. Yanıtlar ve gövdeler her iki dilde de aynıdır. { } içindeki parçalar senin doldurduğun değişkenlerdir.

Mesajlar

POST /bot/v1/channels/{channelId}/messages

gerekli messages.write + SEND_MESSAGES

Bir kanala mesaj gönderir. content 1-4000 karakter. replyTo ve components isteğe bağlıdır.

Yanıt bir MessageDto döner (id, channelId, authorId, body, createdAt ve fazlası).

jsonistek gövdesi
{
  "content": "Hello!",
  "replyTo": "b4d7e9a1-3c25-4f80-9d16-5e7a8b9c0d1e",
  "components": []
}
jsonyanıt
HTTP/1.1 201 Created

{
  "message": {
    "id": "b4d7e9a1-3c25-4f80-9d16-5e7a8b9c0d1e",
    "channelId": "3f9a1c02-8b7e-4d21-9a10-0c1d2e3f4a5b",
    "authorId": "bot_a1b2c3",
    "body": "Hello!",
    "createdAt": "2026-08-25T12:00:00.000Z"
  }
}
PATCH /bot/v1/channels/{channelId}/messages/{messageId}

gerekli messages.write

Botun KENDİ mesajını düzenler. content, components ya da ikisini birden gönder (en az biri). Bir alanı atlarsan değişmeden kalır; components: [] butonları temizler. Başarıda 204. Bot kendi mesajı değilse 403, mesaj silinmişse 410.

jsonistek gövdesi
{
  "content": "new text",
  "components": []
}
DELETE /bot/v1/channels/{channelId}/messages/{messageId}

gerekli messages.manage + MANAGE_MESSAGES

Bir mesajı siler (moderasyon). Başarıda 204.

GET /bot/v1/channels/{channelId}/messages

gerekli messages.read

Bir kanaldaki son 50 mesajı okur.

jsonyanıt
{
  "messages": [
    {
      "id": "b4d7e9a1-3c25-4f80-9d16-5e7a8b9c0d1e",
      "authorId": "9e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b",
      "content": "gm",
      "createdAt": "2026-08-25T12:00:00.000Z"
    }
  ]
}

Tepkiler

POST /bot/v1/channels/{channelId}/reactions

gerekli reactions.write + ADD_REACTIONS

Bir mesaja tepki (emoji) ekler.

jsonistek gövdesi
{
  "messageId": "b4d7e9a1-3c25-4f80-9d16-5e7a8b9c0d1e",
  "emoji": "👍"
}

Butonlar ve menüler

PUT /bot/v1/channels/{channelId}/messages/{messageId}/components

gerekli messages.write

Botun kendi mesajındaki butonları ve menüleri değiştirir. components bir buton/menü nesneleri dizisidir; boş dizi ([]) hepsini temizler. Kullanıcı bir butona ya da menüye dokununca gateway üzerinden interaction.create (kind: component) gelir.

jsonistek gövdesi
{
  "components": []
}

Sunucular ve kanallar

GET /bot/v1/groups/{groupId}

gerekli sunucuya kurulu olmak

Sunucu bilgisini ve herkese açık kanallarını döner.

jsonyanıt
{
  "group": { "id": "7c2e5d18-1f4a-4b93-8e6c-2a9b0c1d3e4f", "name": "My Server" },
  "channels": [
    { "id": "3f9a1c02-8b7e-4d21-9a10-0c1d2e3f4a5b", "name": "general" }
  ]
}
POST /bot/v1/groups/{groupId}/channels

gerekli channels.manage + MANAGE_CHANNELS

Bir metin kanalı oluşturur.

jsonistek gövdesi
{
  "name": "announcements"
}
PATCH /bot/v1/channels/{channelId}

gerekli channels.manage + MANAGE_CHANNELS

Bir kanalı yeniden adlandırır.

jsonistek gövdesi
{
  "name": "new-name"
}
DELETE /bot/v1/channels/{channelId}

gerekli channels.manage + MANAGE_CHANNELS

Bir kanalı siler.

Üyeler

GET /bot/v1/groups/{groupId}/members

gerekli members.read

Üyeleri listeler (sayfalı). limit ve after (bir önceki sayfanın son userId’si) parametrelerini kullan. nextAfter null olana kadar devam et.

sorgu
GET /bot/v1/groups/{groupId}/members?limit=100&after=9e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b
jsonyanıt
{
  "members": [
    {
      "userId": "9e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b",
      "username": "ada",
      "displayName": "Ada",
      "role": "member",
      "isBot": false,
      "joinedAt": "2026-01-02T09:00:00.000Z"
    }
  ],
  "nextAfter": "9e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b"
}
GET /bot/v1/groups/{groupId}/members/{userId}

gerekli members.read

Tek bir üyeyi ve rol kimliklerini döner.

jsonyanıt
{
  "userId": "9e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b",
  "username": "ada",
  "displayName": "Ada",
  "role": "member",
  "isBot": false,
  "joinedAt": "2026-01-02T09:00:00.000Z",
  "roleIds": ["d2c3b4a5-6f70-4819-a2b3-c4d5e6f7a8b9", "e3d4c5b6-7081-492a-b3c4-d5e6f7a8b9c0"]
}

Roller

GET /bot/v1/groups/{groupId}/roles

gerekli roles.manage

Sunucunun rollerini listeler.

POST /bot/v1/groups/{groupId}/members/{userId}/roles

gerekli roles.manage + MANAGE_ROLES

Bir üyeye rol ekler. Bir bot yalnızca kendi grantı’nın alt kümesi izinlere sahip bir rolü atayabilir ve asla yetkililere (sahip/yönetici) rol veremez.

jsonistek gövdesi
{
  "roleId": "d2c3b4a5-6f70-4819-a2b3-c4d5e6f7a8b9"
}
DELETE /bot/v1/groups/{groupId}/members/{userId}/roles/{roleId}

gerekli roles.manage + MANAGE_ROLES

Bir üyeden rolü kaldırır.

Moderasyon

POST /bot/v1/groups/{groupId}/members/{userId}/kick

gerekli members.manage + KICK_MEMBERS

Bir üyeyi atar. Botlar yalnızca sıradan üyelere işlem yapabilir, asla sahip/yöneticiye değil.

POST /bot/v1/groups/{groupId}/members/{userId}/ban

gerekli members.manage + BAN_MEMBERS

Bir üyeyi banlar. reason isteğe bağlı; durationDays isteğe bağlı (kalıcı ban için boş bırak).

jsonistek gövdesi
{
  "reason": "spam",
  "durationDays": 7
}
DELETE /bot/v1/groups/{groupId}/members/{userId}/ban

gerekli members.manage + BAN_MEMBERS

Bir üyenin banını kaldırır.

POST /bot/v1/groups/{groupId}/members/{userId}/timeout

gerekli members.manage + MUTE_MEMBERS

Bir üyeyi belirtilen dakika kadar susturur.

jsonistek gövdesi
{
  "minutes": 10
}
DELETE /bot/v1/groups/{groupId}/members/{userId}/timeout

gerekli members.manage + MUTE_MEMBERS

Bir üyenin susturmasını kaldırır.

Slash komutları

PUT /bot/v1/commands

gerekli hepsini değiştir, en fazla 25

Slash komutlarını kaydeder (hepsini değiştirir, en fazla 25). Bir kullanıcı, botun kurulu olduğu bir kanalda /ping yazınca bota gateway üzerinden interaction.create gelir.

jsonistek gövdesi
{
  "commands": [
    { "name": "ping", "description": "Check the bot is alive" }
  ]
}

Gerçek zamanlı gateway

Olayları anlık almak için gateway’e bir WebSocket bağlantısı açarsın. Bot token’ını ya Bearer başlığıyla ya da bearer.<token> WebSocket alt protokolüyle gönder. Bağlanınca bir hello mesajı alırsın, ardından olaylar akmaya başlar. Olaylar yalnızca botun kurulu olduğu sunuculara ve görebildiği kanallara göredir.

wssbağlantı
wss://api.thevoidhub.com/bot/v1/gateway?intents=messages,reactions,members
httpiki kimlik seçeneği
# 1) Bearer header on the upgrade request
Authorization: Bearer void_app_YOUR_TOKEN

# 2) or the WebSocket subprotocol
Sec-WebSocket-Protocol: bearer.void_app_YOUR_TOKEN
jsongelen mesajlar
{ "t": "hello", "d": {} }

{ "t": "message.create", "d": { "id": "b4d7e9a1-3c25-4f80-9d16-5e7a8b9c0d1e", "channelId": "3f9a1c02-8b7e-4d21-9a10-0c1d2e3f4a5b" } }

Alabileceğin olaylar:

message.create Yeni mesaj gönderildi.
message.update Bir mesaj düzenlendi.
message.delete Bir mesaj silindi.
reaction.add Bir tepki eklendi.
reaction.remove Bir tepki kaldırıldı.
member.join Bir üye sunucuya katıldı.
member.leave Bir üye sunucudan ayrıldı.
interaction.create Slash komut, buton/menü ya da modal gönderimi (kind: command | component | modal_submit).

! Şu an devam/tekrar (resume/replay) YOK

Bağlantı düşerse, kopukluk sırasındaki olaylar kaçırılır. Tekrar bağlan ve kaldığın yerden devam et. Kritik durumu REST ile de tarayarak doğrula.

Etkileşimler

Bir kullanıcı slash komut çalıştırdığında ya da bir butona/menüye dokunduğunda, bot gateway üzerinden bir interactionId taşıyan interaction.create alır. Bot buna REST API ile yanıt verir: kanala bir mesaj gönderir ve/veya bir modal açar. Bot çevrimdışıysa kullanıcıya "bu bot yanıt vermiyor" denir.

jsoninteraction.create
{
  "t": "interaction.create",
  "d": {
    "interactionId": "int_9x2",
    "kind": "command"
  }
}

Bir modal açmak:

httpmodal aç
POST /bot/v1/interactions/{interactionId}/modal

{
  "modal": {
    "customId": "feedback",
    "title": "Send feedback",
    "fields": [
      { "customId": "summary", "label": "Summary", "style": "short", "required": true },
      { "customId": "details", "label": "Details", "style": "paragraph", "required": false }
    ]
  }
}

Gelen webhook’lar

Bot gerektirmeyen en basit yol. Bir sunucu yöneticisi Sunucu Ayarları > Webhooks bölümünü açar, bir metin kanalına bağlı bir webhook oluşturur ve adresini kopyalar (https://api.thevoidhub.com/hooks/{id}/{token} gibi görünür). Herhangi bir dış sistem o adrese { "text": "..." } gönderince kanala mesaj düşer. Token başlığı yok, kurulum yok; gizli bilgi adresin içindedir.

bashwebhook
curl -X POST https://api.thevoidhub.com/hooks/ID/TOKEN \
  -H "Content-Type: application/json" \
  -d '{"text":"Build finished ✅"}'

Yardım mı lazım

Botlar sayfasındaki hızlı başlangıç ile ilk mesajını 3 adımda gönder.