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
- Organizasyon sahibi portalda API erişimi sayfasından bir anahtar üretir. Anahtar bir kez gösterilir; güvenli bir yere kaydedin.
- Her isteği
https://event.solstage.com/api/integration/v1altına, anahtarla gönderin. - 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
ETagtaşır. İkinci istekteIf-None-Matchgönderin; içerik değişmediyse gövdesiz304alı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
429veRetry-Afterdö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.
| Uç | 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.
|
|
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.
Nesne: EtkinlikDetayı
|
|
GET /events/{idVeyaSlug}/sessions
|
Etkinliğin programı: planlanmış oturumlar, sırayla, her biri konuşmacılarıyla.
Liste: Oturum[]
|
|
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ı[]
|
|
GET /events/{idVeyaSlug}/sponsors
|
Etkinliğin sponsorları, kademeleriyle, organizatörün belirlediği sırada.
Liste: Sponsor[]
|
|
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.
| 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. |
| 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. |
| 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ı. |
| 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. |
| 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. |
| 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. |
| 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ş. |
| 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. |
| 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": "…" } } ]
}