Μετάβαση στο κύριο περιεχόμενο
D1 Arena

D1 Arena

Loading...

D1 Arena

API προγραμματιστών

Κοινότητα

API προγραμματιστών

Δημιουργήστε bots, επικαλύψεις, εργαλεία ροής και ενσωματώσεις με δεδομένα D1Arena.

Έλεγχος ταυτότητας

Όλα τα αιτήματα API απαιτούν ένα κλειδί API που διαβιβάζεται στην κεφαλίδα X-API-Key / Authorization: Bearer.

# Example request curl -H "X-API-Key: d1_your_api_key_here" \ https://d1arena.com/api/v1/streams

Για να δημιουργήσετε ένα κλειδί API, μεταβείτε στο Ρυθμίσεις προγραμματιστή στον πίνακα ελέγχου σας. Μπορείτε να έχετε έως και 5 κλειδιά.

Τα αιτήματα API περιορίζονται σε ρυθμό ανά κλειδί API. Όταν υπερβείτε το όριο, τα αιτήματα επιστρέφουν 429 Too Many Requests με κεφαλίδα Retry-After.

Βασική διεύθυνση URL

https://d1arena.com/api/v1

Όλα τα τελικά σημεία επιστρέφουν JSON. Τα σελιδοποιημένα τελικά σημεία περιλαμβάνουν ένα αντικείμενο meta με current_page, last_page και total.

Ρεύματα

GET /streams
Καταχωρίστε τις τρέχουσες ζωντανές ροές. Υποστηρίζει σελιδοποίηση και φιλτράρισμα κατηγοριών.
ΠαράμετροςΤύποςΠεριγραφή
category_idintegerΦιλτράρισμα κατά αναγνωριστικό παιχνιδιού/κατηγορίας
limitintegerΑποτελέσματα ανά σελίδα (προεπιλογή: 20)
pageintegerΑριθμός σελίδας
Απάντηση
{ "data": [ { "id": 42, "name": "ProGamer99", "user_slug": "progamer99", "profile_img": "profile/abc123.jpg", "stream_title": "Ranked Grind - Road to Champion", "stream_category_id": 5, "is_vertical_stream": false, "platform_tier": "pro" } ], "meta": { "current_page": 1, "last_page": 1, "total": 3 } }
GET /streams/{slug}
Λάβετε τη ζωντανή κατάσταση ενός μεμονωμένου streamer και μεταδώστε λεπτομέρειες ροής ανά όνομα χρήστη ή γυμνοσάλιαγκ.
Απάντηση
{ "data": { "user_id": 42, "name": "ProGamer99", "slug": "progamer99", "is_live": true, "stream_title": "Ranked Grind", "category_id": 5, "is_vertical": false, "platform_tier": "pro", "profile_img": "profile/abc123.jpg" } }

Κατηγορίες

GET /categories
Καταχωρίστε όλες τις κατηγορίες παιχνιδιών. Υποστηρίζει αναζήτηση και σελιδοποίηση.
ΠαράμετροςΤύποςΠεριγραφή
searchstringΦιλτράρισμα κατηγοριών με βάση το όνομα
limitintegerΑποτελέσματα ανά σελίδα (προεπιλογή: 50)
Απάντηση
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Χρήστες

GET /users/{slug}
Λάβετε το δημόσιο προφίλ ενός παίκτη και τα ανταγωνιστικά στατιστικά με όνομα χρήστη ή γυμνοσάλιαγκα.
Απάντηση
{ "data": { "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99", "profile_img": "profile/abc.jpg", "bio": "Competitive FPS player", "platform_tier": "pro", "is_live": "1", "stream_title": "Ranked", "gold": 3, "silver": 1, "bronze": 0 }, "stats": { "elo_rating": 1842, "total_tournaments": 27, "win_rate": 64.5, "total_earnings": 1250.00 } } }

Κλιπ

GET /clips
Λίστα δημόσιων κλιπ. Υποστηρίζει φιλτράρισμα ανά streamer και κατηγορία.
ΠαράμετροςΤύποςΠεριγραφή
streamer_idintegerΦιλτράρετε τα κλιπ κατά το αναγνωριστικό χρήστη του streamer
category_idintegerΦιλτράρισμα κατά αναγνωριστικό παιχνιδιού/κατηγορίας
limitintegerΑποτελέσματα ανά σελίδα (προεπιλογή: 20)
Απάντηση
{ "data": [ { "id": 99, "streamer_id": 42, "stream_category_id": 5, "title": "Insane 1v4 clutch", "slug": "insane-1v4-clutch-abc", "duration": 28, "view_count": 412, "is_auto_clip": false, "created_at": "2026-03-15T18:30:00.000000Z", "streamer": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 156 } }
GET /clips/{slug}
Λάβετε τις λεπτομέρειες ενός μόνο κλιπ με γυμνοσάλιαγκα.
Απάντηση
{ "data": { "id": 99, "title": "Insane 1v4 clutch", "slug": "insane-1v4-clutch-abc", "description": "Final round comeback", "duration": 28, "view_count": 412, "streamer": { "id": 42, "name": "ProGamer99" }, "creator": { "id": 55, "name": "ClipMaster" }, "stream_category": { "id": 5, "name": "Call of Duty" } } }

Τουρνουά

GET /tournaments
Λίστα τουρνουά. Υποστηρίζει φιλτράρισμα κατά κατάσταση και πρωτάθλημα.
ΠαράμετροςΤύποςΠεριγραφή
statusstringΦιλτράρισμα κατά κατάσταση (π.χ. open, in_progress, completed)
league_idintegerΦιλτράρισμα κατά αναγνωριστικό πρωταθλήματος
limitintegerΑποτελέσματα ανά σελίδα (προεπιλογή: 20)
Απάντηση
{ "data": [ { "id": 15, "title": "Friday Night Frenzy", "tournament_type": "single_elimination", "status": "open", "registration_fee": "5.00", "no_player": 32, "team": 0, "category": { "id": 5, "name": "Call of Duty" }, "start_date": "2026-03-28T20:00:00.000000Z" } ], "meta": { "current_page": 1, "last_page": 2, "total": 24 } }
GET /tournaments/{id}
Λάβετε λεπτομέρειες τουρνουά και αριθμό συμμετεχόντων.
Απάντηση
{ "data": { "id": 15, "title": "Friday Night Frenzy", "tournament_type": "single_elimination", "status": "open", "registration_fee": "5.00", "no_player": 32, "team": 0 }, "meta": { "participant_count": 18 } }

Κατάταξη ELO

GET /elo/leaderboard
Αποκτήστε τον πίνακα κατάταξης ELO. Προαιρετικά φιλτράρισμα ανά κατηγορία παιχνιδιού.
ΠαράμετροςΤύποςΠεριγραφή
category_idintegerΦιλτράρισμα κατά αναγνωριστικό παιχνιδιού/κατηγορίας
limitintegerΑριθμός αποτελεσμάτων (προεπιλογή: 50)
Απάντηση
{ "data": [ { "rank": 1, "user_id": 42, "name": "ProGamer99", "user_slug": "progamer99", "elo_rating": 2150, "wins": 45, "losses": 12, "win_rate": 78.9, "profile_img": "profile/abc123.jpg" } ], "meta": { "total": 312 } }

Πρωταθλήματα

GET /leagues
Καταχωρίστε πρωταθλήματα με προαιρετικά φίλτρα κατάστασης και κατηγορίας.
ΠαράμετροςΤύποςΠεριγραφή
statusstringΦιλτράρισμα κατά κατάσταση πρωταθλήματος
category_idintegerΦιλτράρισμα κατά αναγνωριστικό παιχνιδιού/κατηγορίας
limitintegerΑποτελέσματα ανά σελίδα (προεπιλογή: 20)
Απάντηση
{ "data": [ { "id": 3, "name": "Spring 2026 Pro League", "status": "active", "category": { "id": 5, "name": "Call of Duty" }, "total_participants": 48, "start_date": "2026-03-01", "end_date": "2026-05-31" } ], "meta": { "current_page": 1, "last_page": 1, "total": 6 } }
GET /leagues/{id}/standings
Λάβετε τη βαθμολογία του πρωταθλήματος (κατάταξη παικτών ανά πόντους).
Απάντηση
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Απαντήσεις σφαλμάτων

Όλα τα σφάλματα επιστρέφουν έναν συνεπή φάκελο JSON. Το αντικείμενο error περιέχει πάντα ένα αναγνώσιμο από μηχανή code και ένα αναγνώσιμο από τον άνθρωπο message.

Μορφή απόκρισης σφάλματος
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Μορφή σφάλματος επικύρωσης (422)
{ "success": false, "error": { "code": "validation_error", "message": "The given data was invalid.", "errors": { "category_id": ["The category id must be an integer."], "limit": ["The limit must not be greater than 100."] } } }

Κωδικοί κατάστασης

200
ΟΚ — Το αίτημα πέτυχε. Η απάντηση περιέχει τα ζητούμενα δεδομένα.
400
Κακό αίτημα — Το αίτημα έχει λανθασμένη μορφή ή λείπουν οι απαιτούμενες παράμετροι. Ελέγξτε το error.message για λεπτομέρειες.
401
Μη εξουσιοδοτημένο — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Απαγορευμένο — Το κλειδί API σας έχει απενεργοποιηθεί ή δεν έχει άδεια για αυτόν τον πόρο. Ελέγξτε το δικό σας Ρυθμίσεις προγραμματιστή.
404
Δεν βρέθηκε — Ο πόρος που ζητήθηκε δεν υπάρχει. Επαληθεύστε τη διαδρομή γυμνοσάλιαγκας, αναγνωριστικού ή τελικού σημείου.
422
Σφάλμα επικύρωσης — Αποτυχία επικύρωσης παραμέτρων αιτήματος. Το αντικείμενο error.errors αντιστοιχίζει τα ονόματα πεδίων στα συγκεκριμένα ζητήματά του.
429
Rate Limited — Πάρα πολλά αιτήματα. Η κεφαλίδα Retry-After υποδεικνύει πόσα δευτερόλεπτα να περιμένετε πριν προσπαθήσετε ξανά.
500
Σφάλμα διακομιστή — Προέκυψε ένα απροσδόκητο σφάλμα στο άκρο μας. Εάν αυτό επιμείνει, επικοινωνήστε με την υποστήριξη.

Αναφορά κωδικών σφάλματος

ΚωδικόςΚατάσταση HTTPΠεριγραφή
invalid_api_key401Το κλειδί API λείπει, έχει κακή μορφή ή δεν υπάρχει
api_key_disabled403Το κλειδί API έχει ανακληθεί ή απενεργοποιηθεί
not_found404Δεν ήταν δυνατή η εύρεση του ζητούμενου πόρου
validation_error422Μία ή περισσότερες παράμετροι αιτήματος δεν είναι έγκυρες
rate_limited429Υπέρβαση του ορίου ποσοστού αιτήματος για αυτό το κλειδί API
server_error500Σφάλμα εσωτερικού διακομιστή — δοκιμάστε ξανά ή επικοινωνήστε με την υποστήριξη

Όρια ποσοστού

Τα αιτήματα API περιορίζονται σε ρυθμό ανά κλειδί API. Όταν υπερβείτε το όριο, τα αιτήματα επιστρέφουν 429 Too Many Requests με κεφαλίδα Retry-After.

Όρια κατά Βαθμίδα

ΕπίπεδοΑιτήματα / Λεπτό (Προεπιλογή)Max Keys
Μίζα (Δωρεάν)605
PRO605
Απόλυτο605
Συνεργάτης605

Κεφαλίδες ορίου ποσοστού

Τα αιτήματα API περιορίζονται σε ρυθμό ανά κλειδί API. Όταν υπερβείτε το όριο, τα αιτήματα επιστρέφουν 429 Too Many Requests με κεφαλίδα Retry-After.

ΚεφαλίδαΠεριγραφή
Retry-AfterΔευτερόλεπτα αναμονής πριν από την επανάληψη (υπάρχει μόνο σε 429 απαντήσεις)

Βέλτιστες Πρακτικές

Συμβουλές για να μείνετε εντός ορίων:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Εγγραφείτε στο webhooks για συμβάντα σε πραγματικό χρόνο αντί για τα τελικά σημεία δημοσκοπήσεων.
  • Μαζικά αιτήματα όπου είναι δυνατόν — χρησιμοποιήστε παραμέτρους φίλτρου για να λάβετε ακριβώς αυτό που χρειάζεστε σε λιγότερες κλήσεις.

Webhooks (EventSub)

Εγγραφείτε σε ειδοποιήσεις push σε πραγματικό χρόνο αντί για ψηφοφορίες. Όταν συμβαίνει ένα συμβάν, το D1Arena στέλνει ένα HTTP POST στη διεύθυνση URL επιστροφής κλήσης με ένα ωφέλιμο φορτίο JSON υπογεγραμμένο με το HMAC-SHA256.

Ρύθμιση

Δημιουργήστε συνδρομές webhook στο Ρυθμίσεις προγραμματιστή. Κάθε συνδρομή απαιτεί:

  • URL επιστροφής κλήσης — Ένα δημόσια προσβάσιμο τελικό σημείο HTTPS στον διακομιστή σας.
  • Εκδηλώσεις — Ένας ή περισσότεροι τύποι συμβάντων για εγγραφή.

You'll receive a whsec_ signing secret upon creation. Store it securely — it's shown only once.

Μορφή ωφέλιμου φορτίου

Κάθε παράδοση webhook στέλνει ένα σώμα JSON με αυτήν τη δομή:

{ "id": "evt_a1b2c3d4e5f6", "event": "stream.online", "created_at": "2026-03-23T14:30:00Z", "data": { // Event-specific fields (see examples below) } }

Κεφαλίδες

Κάθε παράδοση περιλαμβάνει τις ακόλουθες κεφαλίδες για δρομολόγηση και επαλήθευση:

ΚεφαλίδαΠεριγραφή
Content-Typeapplication/json
X-D1Arena-EventΤύπος συμβάντος (π.χ. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hex digest του ακατέργαστου σώματος αιτήματος
X-D1Arena-Signature-VersionΜορφή κλειδιού υπογραφής: v2 για τρέχουσες συνδρομές ή v1-hashed-secret για συνδρομές παλαιού τύπου
X-D1Arena-Delivery-IdΜοναδικό UUID παράδοσης — χρήση για αντιγραφή
X-D1Arena-TimestampΧρονική σήμανση Unix για την αποστολή του συμβάντος

Επαλήθευση υπογραφών

Επαληθεύετε πάντα την κεφαλίδα X-D1Arena-Signature πριν επεξεργαστείτε ένα webhook. Η υπογραφή υπολογίζεται ως HMAC-SHA256(raw_body, webhook_secret).

Για παραδόσεις v2, χρησιμοποιήστε το μυστικό whsec_ που εμφανίστηκε όταν δημιουργήθηκε η συνδρομή. Για μια παράδοση προ-αναβάθμισης v1-hashed-secret, πρώτα υπολογίστε SHA256(whsec_secret) από αυτό το αρχικό μυστικό και χρησιμοποιήστε το προκύπτον πεζό εξάγωνο σύνοψη ως το κλειδί HMAC. Δημιουργήστε ξανά τη συνδρομή όταν είναι πρακτικό για να μετακινηθείτε στο v2.

PHP
// Get the raw body and signature header $payload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_D1ARENA_SIGNATURE'] ?? ''; // Compute expected signature $expected = hash_hmac('sha256', $payload, $webhookSecret); // Constant-time comparison to prevent timing attacks if (!hash_equals($expected, $signature)) { http_response_code(401); exit('Invalid signature'); } $event = json_decode($payload, true);
Node.js
const crypto = require('crypto'); app.post('/webhook', (req, res) => { const payload = req.rawBody; // Ensure raw body is available const signature = req.headers['x-d1arena-signature']; const expected = crypto .createHmac('sha256', WEBHOOK_SECRET) .update(payload) .digest('hex'); if (!crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) )) { return res.status(401).send('Invalid signature'); } const event = JSON.parse(payload); // Process event... res.status(200).send('OK'); });
Python
import hmac, hashlib, json def handle_webhook(request): payload = request.body signature = request.headers.get('X-D1Arena-Signature', '') expected = hmac.new( WEBHOOK_SECRET.encode(), payload, hashlib.sha256 ).hexdigest() if not hmac.compare_digest(expected, signature): return HttpResponse(status=401) event = json.loads(payload) # Process event... return HttpResponse(status=200)

Διαθέσιμες εκδηλώσεις

ΕκδήλωσηΠεριγραφή
stream.onlineΈνας streamer βγήκε ζωντανά
stream.offlineΈνας streamer βγήκε εκτός σύνδεσης
channel.followΈνας χρήστης ακολούθησε ένα κανάλι
channel.subscribeΝέα εγγραφή υποστηρικτών σε κανάλι
channel.tipΣτάλθηκε μια συμβουλή σε έναν streamer
tournament.startedΈνας αγώνας τουρνουά ξεκίνησε
tournament.endedΈνα τουρνουά ολοκληρώθηκε
tournament.match.completedΚαταγράφηκε αποτέλεσμα αγώνα
clip.createdΈνα νέο κλιπ δημιουργήθηκε από μια ζωντανή ροή
overdrive.startedΤο D1 Frenzy ξεκίνησε σε ένα κανάλι
overdrive.level_upΤο D1 Frenzy προχώρησε στο επόμενο επίπεδο
overdrive.endedD1 Frenzy ολοκληρώθηκε ή έληξε

Παραδείγματα ωφέλιμου φορτίου συμβάντων

stream.online

{ "id": "evt_a1b2c3d4e5f6", "event": "stream.online", "created_at": "2026-03-23T14:30:00Z", "data": { "user_id": 42, "user_slug": "progamer99", "name": "ProGamer99", "stream_title": "Ranked Grind - Road to Champion", "category_id": 5, "category_name": "Call of Duty", "protocol": "RTMP", "started_at": "2026-03-23T14:30:00Z" } }

stream.offline

{ "id": "evt_f6e5d4c3b2a1", "event": "stream.offline", "created_at": "2026-03-23T17:45:00Z", "data": { "user_id": 42, "user_slug": "progamer99", "duration_seconds": 11700, "vod_id": 281 } }

channel.follow

{ "id": "evt_c1d2e3f4a5b6", "event": "channel.follow", "created_at": "2026-03-23T15:10:00Z", "data": { "follower_id": 88, "follower_slug": "newplayer", "followed_id": 42, "followed_slug": "progamer99" } }

channel.tip

{ "id": "evt_d1e2f3a4b5c6", "event": "channel.tip", "created_at": "2026-03-23T16:20:00Z", "data": { "streamer_id": 42, "streamer_slug": "progamer99", "tipper_id": 55, "tipper_slug": "clipmaster", "amount": "5.00", "currency": "USD", "message": "Great stream!" } }

tournament.match.completed

{ "id": "evt_e1f2a3b4c5d6", "event": "tournament.match.completed", "created_at": "2026-03-23T21:15:00Z", "data": { "tournament_id": 15, "tournament_title": "Friday Night Frenzy", "match_id": 204, "round": 2, "winner": { "id": 42, "slug": "progamer99", "name": "ProGamer99" }, "loser": { "id": 77, "slug": "rival_x", "name": "Rival_X" }, "score": "3-1" } }

clip.created

{ "id": "evt_b1c2d3e4f5a6", "event": "clip.created", "created_at": "2026-03-23T15:45:00Z", "data": { "clip_id": 99, "slug": "insane-1v4-clutch-abc", "title": "Insane 1v4 clutch", "duration": 28, "streamer_id": 42, "streamer_slug": "progamer99", "creator_id": 55, "creator_slug": "clipmaster", "category_id": 5 } }

Πολιτική παράδοσης & επανάληψης

ΠροσπάθειαΚαθυστέρησηΣημειώσεις
1η (αρχική)ΆμεσηΣτάλθηκε μέσα σε δευτερόλεπτα από την εκδήλωση
2η (επανάληψη)30 δευτερόλεπταΕάν η πρώτη προσπάθεια αποτύχει ή λήξει
3η (επανάληψη)2 λεπτάΕκθετική υποχώρηση
4η (τελικός)10 λεπτάΤελευταία προσπάθεια πριν την επισήμανση ως αποτυχημένη
Important: Your endpoint must respond with a 2xx status within 10 δευτερόλεπτα. Non-2xx responses or timeouts trigger a retry. After 10 συνεχόμενες αποτυχίες, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Ρυθμίσεις προγραμματιστή.

Βέλτιστες Πρακτικές

  • Ελέγχετε πάντα τις υπογραφές πριν από την επεξεργασία ωφέλιμων φορτίων για την αποφυγή πλαστών συμβάντων.
  • Χρησιμοποιήστε το αναγνωριστικό παράδοσης για την αφαίρεση των αντιγράφων — επαναλήψεις στέλνουν το ίδιο αναγνωριστικό, επομένως αποθηκεύστε τα επεξεργασμένα αναγνωριστικά για να αποφύγετε τη διπλή επεξεργασία.
  • Απαντήστε γρήγορα, επεξεργαστείτε ασύγχρονα — επιστρέψτε το 200 OK αμέσως και χειριστείτε την επιχειρηματική λογική σε μια εργασία στο παρασκήνιο.
  • Χρησιμοποιήστε μόνο τελικά σημεία HTTPS — Οι διευθύνσεις URL webhook πρέπει να χρησιμοποιούν TLS. Οι επανακλήσεις HTTP απορρίπτονται.
  • Χειριστείτε άγνωστα γεγονότα με χάρη — μπορούν να προστεθούν νέοι τύποι συμβάντων. Επιστρέψτε 200 για μη αναγνωρισμένα συμβάντα αντί για σφάλματα.

Δ1 φρενίτιδα

Το D1 Frenzy ενεργοποιείται από γρήγορες συμβουλές και συνδρομές ενώ ένας streamer είναι ζωντανός. Προχωρά σε 5 επίπεδα με αυξανόμενους στόχους.

GET /api/overdrive/{streamerId}

Αποκτήστε το ενεργό D1 Frenzy για streamer. Επιστρέφει {"active": false} εάν δεν υπάρχει.

{ "active": true, "level": 2, "progress": 150, "target": 250, "progress_pct": 60.0, "total_contributions": 8, "total_contributors": 5, "expires_at": "2026-03-22T15:30:00+00:00" }

Στόχοι επιπέδου

ΕπίπεδοΠόντοι
1100
2250
3500
41,000
52,000

Δ1 φρενίτιδα — Πόντοι: Συμβουλή $1 → 100; Συνδρομή 500 × Επίπεδο. Διάρκεια: 5 Λεπτά; Cooldown: 30 Λεπτά.

Επέκταση SDK

Δημιουργήστε προσαρμοσμένες επεκτάσεις πλαισίου και επικάλυψης που μπορούν να εγκαταστήσουν οι streamers στις σελίδες του καναλιού τους. Οι επεκτάσεις εκτελούνται σε iframe με περιβάλλον δοκιμών και επικοινωνούν με την κεντρική σελίδα μέσω postMessage.

Ξεκινώντας

  1. Δημιουργήστε ένα κλειδί API στο Ρυθμίσεις προγραμματιστή.
  2. Δημιουργήστε την επέκτασή σας ως αυτόνομη σελίδα HTML που φιλοξενείται στον τομέα σας (απαιτείται HTTPS).
  3. Υποβάλετέ το για έλεγχο στην ενότητα Οι επεκτάσεις μου.
  4. Μόλις εγκριθεί, οι streamers μπορούν να το εγκαταστήσουν από το Extension Marketplace.

Τύποι επέκτασης

ΤύποςΤοποθεσίαΣυμπεριφορά
panelΚάτω από το πρόγραμμα αναπαραγωγής ροήςΟρατό όταν η ροή είναι ζωντανή. Κάρτα πλήρους πλάτους, προεπιλεγμένο ύψος 300 px.
overlayΠάνω από το πρόγραμμα αναπαραγωγής βίντεοΟρατό όταν ζωντανά. Θέση/μέγεθος ελέγχεται από το streamer μέσω του εργαλείου τοποθέτησης επικάλυψης.

postMessage API

Η επέκτασή σας λαμβάνει αυτόματα δεδομένα περιβάλλοντος κατά τη φόρτωσή της. Υλοποιήστε αυτές τις εκδηλώσεις:

Χρησιμοποιήστε την ακριβή D1Arena γονική προέλευση για κάθε μήνυμα. Η επίσημη SDK αντλεί και επικυρώνει αυτόματα αυτήν την προέλευση από τη σελίδα ενσωμάτωσης.

Επειδή τα iframe επέκτασης χρησιμοποιούν σκόπιμα μια αδιαφανή προέλευση sandbox, ο κεντρικός υπολογιστής D1Arena ελέγχει την ταυτότητα του ακριβούς καταχωρημένου παραθύρου iframe. Ο κωδικός επέκτασης πρέπει να εξακολουθήσει να πιστοποιεί την ταυτότητα του γονικού παραθύρου και την ακριβή προέλευση D1Arena πριν αποδεχτεί το περιβάλλον.

1. Ετοιμότητα σήματος

var d1ParentOrigin = 'https://d1arena.com'; // Tell the host page your extension is ready for context window.parent.postMessage({ type: 'D1_EXT_READY' }, d1ParentOrigin);

2. Λάβετε το πλαίσιο

window.addEventListener('message', function(e) { if (e.source === window.parent && e.origin === d1ParentOrigin && e.data && e.data.type === 'D1_CONTEXT') { var ctx = e.data.payload; // ctx.channelId - Streamer's user ID // ctx.channelName - Streamer's display name // ctx.channelSlug - Streamer's URL slug // ctx.viewerId - Current viewer's ID (null if not logged in) // ctx.isLive - Whether the stream is currently live } });

3. Αποστολή ενεργειών (προαιρετικό)

// Redirect the host page (e.g. for a "Storm" button) window.parent.postMessage({ type: 'D1_EXT_ACTION', action: 'storm', target: 'username-slug' }, d1ParentOrigin);

Πεδίο αδειών

Δηλώστε ποια δεδομένα χρειάζεται η επέκτασή σας. Οι αναθεωρητές επαληθεύουν ότι ο κωδικός σας ταιριάζει με τα δηλωθέντα δικαιώματα.

Πεδίο εφαρμογήςΠαρέχει πρόσβαση σε
read:streamΚατάσταση ροής, τίτλος, κατηγορία
read:viewersΑριθμός θεατών και λίστα
read:chatΜηνύματα συνομιλίας (μέσω καναλιού Pusher)
read:clipsΑποσπάσματα καναλιού μέσω /api/clips/{slug}
read:tournamentsΠληροφορίες ενεργού αγώνα μέσω /api/active-match/{id}
read:channelΠροφίλ καναλιού, ακόλουθοι, πρόγραμμα

Απαιτήσεις ασφαλείας

Οι επεκτάσεις εκτελούνται σε sandboxed iframe με sandbox="allow-scripts". Η επέκτασή σας δεν μπορεί έχει πρόσβαση σε cookie, localStorage ή υποβάλλει πιστοποιημένα αιτήματα στο d1arena.com.
  • Απαιτείται δημόσιο HTTPS — Η διεύθυνση URL του iframe πρέπει να χρησιμοποιεί TLS και να επιλύεται μόνο σε διευθύνσεις δημόσιου δικτύου.
  • Αναγνώσιμη από τον άνθρωπο πηγή — Χωρίς ασαφή ή ελαχιστοποιημένη JavaScript μόνο. Οι αναθεωρητές πρέπει να μπορούν να διαβάσουν τον κώδικά σας.
  • Δεν υπάρχει εξωτερική φόρτωση σεναρίου εκτός αν δηλωθεί στην υποβολή σας. Οι βιβλιοθήκες CDN (jQuery, Chart.js, κ.λπ.) είναι καλές.
  • Καμία εξαγωγή δεδομένων — Οι επεκτάσεις δεν πρέπει να στέλνουν δεδομένα θεατών σε υπηρεσίες ανάλυσης ή παρακολούθησης τρίτων.
  • Πολιτική περιεχομένου — Χωρίς διαφημίσεις, περιεχόμενο NSFW, εξόρυξη κρυπτονομισμάτων ή κακόβουλη συμπεριφορά.

Διαδικασία αναθεώρησης

ΚατάστασηΣημασία
pendingΥποβλήθηκε, εν αναμονή ελέγχου από τον διαχειριστή (συνήθως 1-3 εργάσιμες ημέρες).
approvedΕγκρίθηκε και είναι ορατή στο Extension Marketplace.
rejectedΑπορρίφθηκε με λόγο. Διορθώστε προβλήματα και υποβάλετε ξανά.
suspendedΚαταργήθηκε προσωρινά λόγω παράβασης πολιτικής. Επικοινωνήστε με την υποστήριξη.

Ενημερώσεις έκδοσης

Για να ενημερώσετε μια εγκεκριμένη επέκταση, διαγράψτε την τρέχουσα έκδοση και υποβάλετε μια νέα με αυξημένο αριθμό έκδοσης. Η νέα έκδοση περνάει ξανά από έλεγχο.

Καταγραφή αλλαγών

Παρακολούθηση αλλαγών API και νέων δυνατοτήτων. Ακολουθούμε τη σημασιολογική έκδοση και ανακοινώνουμε τις αλλαγές που πραγματοποιούνται τουλάχιστον 30 ημέρες νωρίτερα.

v1.0Μάρτιος 2026
  • Αρχική δημόσια κυκλοφορία API με έλεγχο ταυτότητας κλειδιού API.
  • Ροές: Καταχωρίστε ζωντανές ροές, λάβετε λεπτομέρειες για τη ροή με γυμνοσάλιαγκες.
  • Κατηγορίες: Αναζήτηση και λίστα όλων των κατηγοριών παιχνιδιών.
  • Χρήστες: Δημόσια προφίλ με ανταγωνιστικά στατιστικά, βαθμολογία ELO και πλήθος μεταλλίων.
  • Κλιπ: Περιηγηθείτε και ανακτήστε τις λεπτομέρειες του κλιπ με πληροφορίες ροής/δημιουργού.
  • Τουρνουά: Λίστα, φιλτράρισμα κατά κατάσταση/πρωτάθλημα, λήψη αριθμού συμμετεχόντων.
  • ELO Leaderboard: Πίνακες κατάταξης παγκοσμίως και ανά κατηγορία.
  • Πρωταθλήματα: Καταχωρίστε πρωταθλήματα με βαθμολογίες και αναλύσεις πόντων.
  • D1 Frenzy: Κατάσταση Frenzy σε πραγματικό χρόνο για κάθε streamer.
  • Webhooks (EventSub): 12 τύποι συμβάντων, συμπεριλαμβανομένων των συμβάντων ροής, καναλιού, τουρνουά, κλιπ και Frenzy.
  • Όρια ποσοστού

Χρειάζεστε βοήθεια;

Έχετε ερωτήσεις σχετικά με το API; Επικοινωνήστε μαζί μας.