Entegrasyon API'si

Organizasyonunuzun kendi web sitesi, etkinliklerini, programını, konuşmacılarını, sponsorlarını ve ekibini EventStage'den çeker; tasarım sizin, veri buradan.

Başlarken

  1. Organizasyon sahibi portalda API erişimi sayfasından bir anahtar üretir. Anahtar bir kez gösterilir; güvenli bir yere kaydedin.
  2. Her isteği https://event.solstage.com/api/integration/v1 altına, anahtarla gönderin.
  3. Yanıtlar JSON'dur. Yalnızca okuma yapılır; API hiçbir şeyi değiştirmez.

Yalnızca yayınlanmış etkinlikler döner. Taslaklar, iptal edilenler, kayıtlı katılımcılar ve e-posta adresleri bu API'den hiçbir zaman çıkmaz. Konuşmacılarda yalnızca daveti kabul edenler, ekipte yalnızca "web sitesinde göster" işaretli üyeler görünür.

Kimlik doğrulama

Anahtarı iki başlıktan biriyle gönderin; ikisi de aynı işi görür:

Authorization: Bearer esk_xxxxxxxx…
X-Api-Key: esk_xxxxxxxx…

Anahtar tek bir organizasyona bağlıdır; hangi organizasyon olduğunu URL'de söylemezsiniz. Portalda iptal edilen anahtar bir sonraki istekte reddedilir. Askıya alınmış bir organizasyonun anahtarları, herkese açık sayfaları gibi, kapalıdır.

Tarayıcıdan mı, sunucudan mı?

Sunucudan (PHP, Node, .NET, bir statik site üreticisinin derleme adımı…): anahtar ziyaretçiye hiç görünmez. Portalda "izinli site adresleri" boş bırakılır. Tavsiye edilen yol budur.

Tarayıcıdan (sayfanızdaki JavaScript ile fetch): anahtar sayfa kaynağında görünür, yani herkese açıktır. Bu durumda portalda anahtarın izinli site adreslerine sitenizi yazın; API, başka bir sitenin sayfasından gelen istekleri o anahtarla reddeder. CORS bu uçlar için açıktır; tarayıcı isteğinde çerez kullanılmaz.

Önbellek ve sınırlar

  • Her yanıt bir ETag taşır. İkinci istekte If-None-Match gönderin; içerik değişmediyse gövdesiz 304 alırsınız.
  • Cache-Control: private, max-age=60: aynı yanıtı bir dakika boyunca yeniden istemeniz gerekmez.
  • Anahtar başına dakikada 600 istek kabul edilir. Aşınca 429 ve Retry-After döner. Sitenizde yanıtları sunucu tarafında birkaç dakika önbelleğe almanız yeterlidir; sayfa görüntülemesi başına istek atmayın.
  • Görsel adresleri kalıcıdır; görsel değişince adres de değişir. Süresiz önbelleğe alabilirsiniz.

Uçlar

Tüm yollar https://event.solstage.com/api/integration/v1 ile başlar.

Ne döner Parametreler
GET /organization Anahtarın ait olduğu organizasyonun herkese açık profili.
Nesne: Organizasyon
GET /team Ekip: portalda "web sitesinde göster" işaretli üyeler, sıra numarasına göre.
Liste: EkipÜyesi[]
GET /speakers Organizasyonun tüm konuşmacı profilleri, ada göre. Bir etkinliğe bağlı olup olmadıklarına bakılmaz.
Liste: Konuşmacı[]
GET /sponsors Organizasyonun tüm sponsorları, ada göre. Kademe etkinliğe ait olduğu için burada boştur.
Liste: Sponsor[]
GET /events Yayınlanmış etkinlikler, sayfa sayfa. Taslaklar, iptal edilenler ve askıya alınanlar hiç dönmez.
Sayfalı liste: items (EtkinlikÖzeti), page, pageSize, totalCount, hasMore.
timing
upcoming (varsayılan: henüz başlamamış), ongoing (şu an süren), past (bitmiş, en yeni önce) veya all.
page
1'den başlayan sayfa numarası.
pageSize
Sayfa başına kayıt; en fazla 100, varsayılan 20.
GET /events/{idVeyaSlug} Bir etkinliğin tamamı: bilgileri, programı konuşmacılarıyla, tüm konuşmacıları ve sponsorları. Bir etkinlik sayfası için gereken her şey tek istekte.
idVeyaSlug
Etkinliğin kimliği ya da bu organizasyon içindeki slug'ı (adresteki kısa ad).
GET /events/{idVeyaSlug}/sessions Etkinliğin programı: planlanmış oturumlar, sırayla, her biri konuşmacılarıyla.
Liste: Oturum[]
idVeyaSlug
Etkinliğin kimliği ya da slug'ı.
GET /events/{idVeyaSlug}/speakers Etkinlikte konuşan herkes, birer kez, program sırasıyla. Konuşmacılar oturumlara bağlandığı için programı olmayan bir etkinliğin konuşmacı listesi boştur.
Liste: Konuşmacı[]
idVeyaSlug
Etkinliğin kimliği ya da slug'ı.
GET /events/{idVeyaSlug}/sponsors Etkinliğin sponsorları, kademeleriyle, organizatörün belirlediği sırada.
Liste: Sponsor[]
idVeyaSlug
Etkinliğin kimliği ya da slug'ı.

Veri şekilleri

Alan adları JSON'da küçük harfle başlar (fullName). "Boş olabilir" işaretli alanlar null gelebilir; diğerleri her zaman doludur. Tarihler ISO 8601'dir.

Zaman · Bir an, iki biçimde: hesaplamak için UTC, yazdırmak için mekânın duvar saati.
Alan Tür Açıklama
utc string ISO 8601, UTC. Örnek: 2026-10-05T06:00:00Z.
local string Aynı an, etkinliğin saat diliminde ve saat farkıyla. Örnek: 2026-10-05T09:00:00+03:00. Saat dilimi kütüphanesi olmadan doğrudan yazdırılabilir.
timeZoneId string local değerinin hesaplandığı IANA saat dilimi. Örnek: Europe/Istanbul.
Görsel · Sitenize doğrudan gömebileceğiniz bir görsel.
Alan Tür Açıklama
fileId string Dosyanın kimliği.
url string Mutlak adres. Görsel değiştirildiğinde yeni bir kimlik ve adres üretilir; bu adres süresiz önbelleğe alınabilir.
Organizasyon · Organizasyonun herkese açık profili.
Alan Tür Açıklama
id string Kimlik.
name string Ad.
slug string Adresteki kısa ad.
description string · boş olabilir Açıklama.
logo Görsel · boş olabilir Logo.
cover Görsel · boş olabilir Kapak görseli.
website string · boş olabilir Web sitesi.
email string · boş olabilir Herkese açık iletişim e-postası.
phone string · boş olabilir Telefon.
address string · boş olabilir Adres.
city string · boş olabilir Şehir.
country string · boş olabilir Ülke.
latitude number · boş olabilir Enlem.
longitude number · boş olabilir Boylam.
publicUrl string Organizasyonun EventStage'deki sayfası.
EkipÜyesi · Ekip sayfasındaki bir üyenin web sitesi profili. E-posta ya da hesap bilgisi içermez; ekipten çıkarılan kişi listeden hemen düşer.
Alan Tür Açıklama
id string Kimlik.
fullName string Ad soyad.
title string · boş olabilir Unvan, organizatörün yazdığı gibi.
bio string · boş olabilir Kısa özgeçmiş.
photo Görsel · boş olabilir Fotoğraf.
linkedInUrl string · boş olabilir LinkedIn adresi.
websiteUrl string · boş olabilir Web sitesi.
sortOrder number Sıra; küçük önce gelir. Liste zaten bu sırayla döner.
Konuşmacı · Bir konuşmacı profili.
Alan Tür Açıklama
id string Kimlik.
name string Ad soyad.
jobTitle string · boş olabilir Unvan.
company string · boş olabilir Kurum.
bio string · boş olabilir Kısa özgeçmiş.
photo Görsel · boş olabilir Fotoğraf.
linkedInUrl string · boş olabilir LinkedIn adresi.
gitHubUrl string · boş olabilir GitHub adresi.
websiteUrl string · boş olabilir Web sitesi.
Sponsor · Bir sponsor; havuzdan ya da bir etkinliğin listesinden.
Alan Tür Açıklama
id string Kimlik.
name string Ad.
description string · boş olabilir Açıklama.
logo Görsel · boş olabilir Logo.
websiteUrl string · boş olabilir Web sitesi.
tier string · boş olabilir Etkinlikteki kademe, organizatörün yazdığı gibi: "Altın", "Gümüş". Organizasyon genelindeki listede boştur.
sortOrder number Etkinlikteki sıra. Organizasyon genelindeki listede 0.
isOrganizationSponsor boolean Organizasyonun genel sponsoru mu; ana sayfanızdaki sponsor listesini bununla süzün.
Oturum · Programdaki bir oturum.
Alan Tür Açıklama
id string Kimlik.
name string Oturum adı.
description string · boş olabilir Açıklama.
room string · boş olabilir Salon.
start Zaman Başlangıç.
end Zaman Bitiş.
capacity number · boş olabilir Kontenjan; sınır yoksa boş.
speakers array Daveti kabul etmiş konuşmacılar (Konuşmacı), sırayla.
speakerNames string · boş olabilir Aynı konuşmacıların virgülle ayrılmış adları, fotoğrafa yer olmayan listeler için. Henüz onaylı konuşmacı yoksa boş.
EtkinlikÖzeti · Listelerdeki etkinlik.
Alan Tür Açıklama
id string Kimlik.
name string Ad.
slug string Bu organizasyon içindeki kısa ad; /events/{slug} ile detaya gidilir.
description string · boş olabilir Açıklama.
cover Görsel · boş olabilir Kapak görseli.
logo Görsel · boş olabilir Etkinlik logosu.
timing string upcoming, ongoing veya past; istek anındaki saate göre.
start Zaman Başlangıç.
end Zaman Bitiş.
venueName string · boş olabilir Mekân adı.
city string · boş olabilir Şehir.
country string · boş olabilir Ülke.
latitude number · boş olabilir Enlem.
longitude number · boş olabilir Boylam.
isRegistrationOpen boolean Şu an kayıt alınıyor mu.
sessionCount number Programdaki oturum sayısı.
publicUrl string Etkinliğin EventStage'deki sayfası; kayıt buradan ve mobil uygulamadan yapılır.
EtkinlikDetayı · Bir etkinliğin tamamı.
Alan Tür Açıklama
id string Kimlik.
name string Ad.
slug string Kısa ad.
description string · boş olabilir Açıklama.
cover Görsel · boş olabilir Kapak görseli.
logo Görsel · boş olabilir Etkinlik logosu.
timing string upcoming, ongoing veya past.
start Zaman Başlangıç.
end Zaman Bitiş.
venueName string · boş olabilir Mekân adı.
address string · boş olabilir Adres.
city string · boş olabilir Şehir.
country string · boş olabilir Ülke.
latitude number · boş olabilir Enlem.
longitude number · boş olabilir Boylam.
isRegistrationOpen boolean Şu an kayıt alınıyor mu.
registrationStart Zaman · boş olabilir Kayıt dönemi başlangıcı; belirlenmemişse boş.
registrationEnd Zaman · boş olabilir Kayıt dönemi bitişi; belirlenmemişse boş.
capacity number · boş olabilir Kontenjan; sınır yoksa boş.
publicUrl string Etkinliğin EventStage'deki sayfası.
sessions array Program (Oturum), sırayla.
speakers array Etkinlikteki tüm konuşmacılar (Konuşmacı), birer kez, program sırasıyla.
sponsors array Sponsorlar (Sponsor), kademeleriyle.

Hatalar

Her hata RFC 7807 biçiminde bir JSON gövdeyle gelir: status, title, detail ve programınızın dallanacağı errorCode.

HTTP errorCode Anlamı
401 API_KEY_INVALID Anahtar gönderilmemiş, tanınmıyor ya da iptal edilmiş. Portaldan yeni bir anahtar üretin.
403 ORGANIZATION_SUSPENDED Organizasyon askıya alınmış ya da kapatılmış. Verileri herkese açık sitede olduğu gibi burada da görünmez.
403 API_KEY_ORIGIN_NOT_ALLOWED İstek tarayıcıdan, anahtarın izin listesinde olmayan bir siteden geldi. Portalda adresi ekleyin ya da sunucudan çağırın.
404 EVENT_NOT_FOUND Böyle bir etkinlik yok ya da yayında değil.
400 BAD_REQUEST Bir parametre geçersiz; ayrıntı yanıttaki detail alanında.
429 RATE_LIMITED Bu anahtar dakikalık sınırını aştı. Retry-After başlığındaki saniye kadar bekleyin ve yanıtları önbelleğe alın.

Örnekler

curl

curl -H "Authorization: Bearer esk_…" \
  "https://event.solstage.com/api/integration/v1/events?timing=upcoming&pageSize=5"

Sunucu tarafı JavaScript (Node)

const response = await fetch("https://event.solstage.com/api/integration/v1/events/2026-devfest", {
  headers: { "X-Api-Key": process.env.EVENTSTAGE_API_KEY }
});
const event = await response.json();

for (const session of event.sessions) {
  const start = new Date(session.start.local);
  console.log(session.name, start.toLocaleTimeString("tr-TR"), session.speakers.map(s => s.name));
}

Örnek yanıt: GET /events/{slug} (kısaltılmış)

{
  "id": "0199…",
  "name": "DevFest Gaziantep 2026",
  "slug": "devfest-2026",
  "timing": "upcoming",
  "start": { "utc": "2026-11-14T06:00:00Z", "local": "2026-11-14T09:00:00+03:00", "timeZoneId": "Europe/Istanbul" },
  "end":   { "utc": "2026-11-14T15:00:00Z", "local": "2026-11-14T18:00:00+03:00", "timeZoneId": "Europe/Istanbul" },
  "cover": { "fileId": "0199…", "url": "https://event.solstage.com/media/0199…" },
  "isRegistrationOpen": true,
  "publicUrl": "https://event.solstage.com/o/gdg-gaziantep/e/devfest-2026",
  "sessions": [
    {
      "name": "Açılış",
      "room": "Ana salon",
      "start": { "utc": "2026-11-14T06:30:00Z", "local": "2026-11-14T09:30:00+03:00", "timeZoneId": "Europe/Istanbul" },
      "speakers": [ { "name": "Ada Lovelace", "jobTitle": "GDE", "photo": { "url": "…" } } ],
      "speakerNames": null
    }
  ],
  "speakers": [ { "name": "Ada Lovelace", "jobTitle": "GDE" } ],
  "sponsors": [ { "name": "Örnek A.Ş.", "tier": "Altın", "logo": { "url": "…" } } ]
}