Inhalt
1. Authentifizierung
Basis-URL:https://sladu.net
Die API verwendet Bearer-Token (Laravel Sanctum). Token erhalten:
POST /api/auth/token
Content-Type: application/json
{ "email": "you@example.com", "password": "your-password" }
→ 200 OK
{ "token": "1|abc...xyz", "user": { "id": 42, "role": "advertiser" } }
Alle nachfolgenden Anfragen:
Authorization: Bearer 1|abc...xyz Accept: application/json
2. Kampagnen (advertiser)
Kampagnenliste
GET /api/adv/campaigns
→ 200 OK
{
"campaigns": [
{
"id": 7, "name": "Casino RU CPM",
"vertical": "gambling", "format": "native",
"bid_type": "cpm", "bid_micro_cents": 200000,
"status": "active",
"daily_budget_cents": 5000,
"daily_spent_cents": 1234,
"created_at": "2026-06-15T12:00:00Z"
}
]
}
Kampagne erstellen
POST /api/adv/campaigns
{
"name": "Casino RU CPM",
"vertical": "gambling",
"format": "native",
"bid_type": "cpm",
"bid_usd": 2.0,
"daily_budget_usd": 50,
"geo_include": ["ru","ua","kz"],
"languages": ["ru"]
}
→ 201 Created
{ "id": 8, "name": "Casino RU CPM", "status": "draft", ... }
Aktivieren / pausieren
POST /api/adv/campaigns/{id}/activate
POST /api/adv/campaigns/{id}/pause
3. Creatives
Kreativ hinzufügen
POST /api/adv/campaigns/{campaign_id}/creatives
Content-Type: multipart/form-data
title=Получи $50 бонус
body=Регистрация за 1 минуту...
landing_url=https://your-offer.com/?sub1={click_id}
image=@banner.jpg # файл, для не-video
video_url=https://cdn.../ad.mp4 # для video / floating_video
cta_text=Зарегистрироваться
orientation=vertical # для floating_video
→ 201 Created
{
"id": 42, "status": "pending_moderation",
"tracking_token": "tt_video_xyz",
"moderation_eta_seconds": 120
}
AI-Titelgenerierung (Claude)
POST /api/adv/campaigns/{id}/ai-generate
{
"offer": "Казино с бонусом 5000₽ на первый депозит",
"cta": "Зарегистрироваться",
"geo": "RU", "lang": "ru"
}
→ 200 OK
{
"variants": [
{ "title": "...", "body": "...", "hook_type": "fear" },
{ "title": "...", "body": "...", "hook_type": "curiosity" },
... (8 шт)
],
"image_prompts": [
{ "prompt": "...", "style": "photoreal" },
... (4 шт)
],
"usage": { "input_tokens": 350, "output_tokens": 1200 }
}
HeyGen AI-Video
POST /api/adv/heygen/generate
{
"campaign_id": 7,
"avatar_id": "Anna_public_3_20240108",
"voice_id": "...",
"script": "Привет! 👋 Если ты ищешь...",
"language": "ru",
"orientation": "vertical"
}
→ 200 OK
{ "ok": true, "job_id": 123, "status": "processing", "cost_cents": 100 }
GET /api/adv/heygen/status/{job_id}
→ 200 OK
{ "status": "completed", "video_url": "https://...", "duration_sec": 18 }
4. Sites (publisher)
Website hinzufügen
POST /api/pub/sites
{
"domain": "example.com",
"category": "adult_video", # см. /pub/sites/create - 29 категорий
"language": "ru",
"traffic_estimate_daily": 50000
}
→ 201 Created
{
"id": 42,
"domain": "example.com",
"verification_code": "SLADU-XYZ123ABC",
"status": "draft"
}
Eigentümerschaft verifizieren
POST /api/pub/sites/{id}/verify
→ 200 OK
{ "ok": true, "method": "meta", "status": "pending_review" }
# Если не нашли код - 422:
{ "ok": false, "error": "Не нашли verification code на странице..." }
5. Blöcke (Publisher)
Block erstellen
POST /api/pub/zones
{
"site_id": 42,
"name": "Главная боковая",
"format": "floating_video",
"fv_corner": "br", # br/bl/tr/tl
"fv_delay_sec": 3,
"fv_freq_cap_hours": 6,
"banner_width": 320,
"banner_height": 568
}
→ 201 Created
{
"id": 100,
"subid": "abc12345",
"widget_url": "https://sladu.net/w/abc12345.js",
"vast_url": "https://sladu.net/vast/abc12345.xml", # только для video
"status": "active"
}
6. Statistik
GET /api/adv/stats?from=2026-06-01&to=2026-06-23&group_by=day,campaign
→ 200 OK
{
"rows": [
{
"date": "2026-06-23", "campaign_id": 7,
"impressions": 12500, "clicks": 142, "ctr": 1.14,
"spent_cents": 2500, "conversions": 8,
"ecpa_cents": 312
},
...
]
}
Verfügbare Gruppierungen:day, hour, campaign, creative, geo, device, site, zone.
7. S2S-Postback – eingehend (von deinem Tracker zu uns)
Wenn in deinem Tracker (Voluum, BeMob, RedTrack, Keitaro) eine Conversion erfasst wird – gib diese URL mit Makros an:
POST https://sladu.net/postback/in
secret=ABC123&click_id={click_id}&payout=500&status=approved&txid={tx_id}
Parameter:
secret- von/cabinet/profile → «Postback secret»click_id- die UUID, die wir anlanding_urlüber Makro{click_id}payout- Konversionsbetrag inCent (500 = $5)status-approved/pending/rejectedtxid- eindeutige Transaktions-ID (Deduplizierung)sig(ОБЯЗАТЕЛЕН) - HMAC-подпись
HMAC-Signatur (Schutz vor Fälschungen)
Formel:
payload = "{click_id}|{payout}|{status}|{txid}"
sig = hash_hmac('sha256', payload, secret)
Beispiel (PHP):
$secret = 'ABC123';
$payload = $clickId . '|' . $payout . '|' . $status . '|' . $txid;
$sig = hash_hmac('sha256', $payload, $secret);
// POST, подпись обязательна
$body = http_build_query([
'secret' => $secret, 'click_id' => $clickId, 'payout' => $payout,
'status' => $status, 'txid' => $txid, 'sig' => $sig,
]);
$ch = curl_init('https://sladu.net/postback/in');
// Секрет и подпись можно передать заголовками — тогда они не попадут в логи:
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Sladu-Secret: ' . $secret,
'X-Sladu-Signature: ' . $sig,
]);
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true]);
$response = curl_exec($ch);
Без корректной подписи запрос отклоняется (401). Секрет подписи не заменяет: он лишь идентифицирует рекламодателя.
8. S2S Postback – ausgehend (von uns zu dir)
In/cabinet/profilegib ein URL-Muster an, zum Beispiel:
https://your-tracker.com/postback?cid={click_id}&payout={payout_cents}&status={status}&geo={geo}&device={device}
Verfügbare Makros:
{click_id}- Klick-UUID{payout_cents}- Konversionsbetrag{status}- approved/pending/rejected{geo}- ISO-Ländercode{device}- desktop/mobile/tablet{os},{browser},{vertical},{campaign_id}
يتم استدعاء البوست باك مع منطق إعادة المحاولة: حتى 5 محاولات مع التراجع الأسي (5 ثوانٍ، 30 ثانية، 5 دقائق، 30 دقيقة، ساعتان). إذا فشلت جميعها - يتم تمييز التحويل كـpostback_failed, zählen wir weiter in unseren Metriken.
9. OpenRTB 2.5 (für DSP-Partner)
Sladu fungiert alsSSPfür externe DSPs. Jeder Aufruf ist eine Auktion. Wenn du deinen DSP mit unseren Impressions verbinden möchtest – hier ist der Endpoint:
POST https://sladu.net/openrtb/bid
Content-Type: application/json
x-openrtb-version: 2.5
{
"id": "bid-request-uuid",
"imp": [{
"id": "1",
"bidfloor": 0.5,
"banner": { "w": 300, "h": 250 },
...
}],
"site": { "domain": "publisher.com", "cat": ["IAB7"] },
"device": { "ua": "...", "ip": "1.2.3.4", "geo": { "country": "RU" } },
"user": { "id": "hashed-cookie-id" }
}
← 200 OK
{
"id": "bid-request-uuid",
"seatbid": [{
"bid": [{
"id": "1",
"impid": "1",
"price": 1.5,
"adm": "...creative HTML...",
"nurl": "https://your-dsp/win-notify?...",
"crid": "creative-id"
}]
}]
}
Auction-Timeout – 200 ms. QPS-Limit ist individuell (standardmäßig 100 req/sec, wird nach bestandenen Integrationstests erhöht).
Zur Verbindung - schreibe andsp@sladu.net, wir stellen eine IP-Whitelist und einen Test-Endpoint bereit.
10. Widget-Endpunkte (für Entwickler)
Dies sind die Endpunkte, die unser JS-Widget auf den Websites der Webmaster aufruft. Wird benötigt, wenn du einen eigenen Client erstellen möchtest:
GET /w/{subid}.js— das Widget selbst (JavaScript)GET /imp?z={subid}&fp={fingerprint}⊥={signals}- Anfrage zur Anzeige, gibt JSON mit Creative zurückGET /c/{impression_id}/{tracking_token}?ttc=&x=&y=&focus=&fp=⊥=– Click-Tracking, Redirect zur Landing PageGET /vast/{subid}.xml- VAST 4.0 XML für das VideoformatPOST /push/subscribe- Web-Push-AbonnementGET /openrtb/imptracker/{imp_id}- VAST impression pixel
11. VAST 4.0
Vollständige VAST-Dokumentation –/docs/vast. Kurz: Für jeden Video-Block gibt es eine URL der Formhttps://sladu.net/vast/{subid}.xml, das von JW Player, video.js, IMA SDK und anderen unterstützt wird.
12. Rate Limits und Fehler
Rate limits
- Allgemeine API:60 req/minauf Token
- KI-Generierung von Creatives:1 alle 30 Sek.(Claude ist teuer)
- HeyGen generation: 1 in 5 Sek.pro Nutzer
- OpenRTB /bid: individuell, sieheAbschnitt 9
Überschreitung – HTTP 429 + HeaderRetry-Afterin Sekunden.
Antwort-Codes
200 OK– alles in Ordnung201 Created- Ressource erstellt400 Bad Request- Validierungsfehler, im Body{"errors": {...}}401 Unauthorized- Token ungültig / fehlt402 Payment Required– Guthaben aufgebraucht (für KI-Operationen)403 Forbidden- keine Rechte (fremde Ressource)404 Not Found- Ressource existiert nicht429 Too Many Requests- rate limit500 Internal Server Error- unser Fehler, schreib an den Support
API-Fragen — per Telegram @sladu_supportoder aufapi@sladu.net. Test bench / sandbox -sandbox.sladu.net (auf Anfrage).