Άδειες
Διαχειριστείτε την επικύρωση και την ενεργοποίηση των αδειών, καθώς και την παρακολούθηση των συσκευών.
429 Too Many Requests με κεφαλίδα Retry-After: 60 μέχρι να μηδενιστεί το παράθυρο.Επικύρωση άδειας
Επικυρώστε και ενεργοποιήστε ένα κλειδί άδειας. Αυτό το endpoint έχει όριο 5 αιτημάτων ανά λεπτό ανά διεύθυνση IP.
Endpoint: POST /api/licenses/validate
| Παράμετρος | Τύπος | Υποχρεωτική | Περιγραφή |
|---|---|---|---|
license_key | string | Ναι | Το κλειδί άδειας προς επικύρωση |
device_id | string | Ναι | Σταθερό, μοναδικό αναγνωριστικό της συσκευής που ενεργοποιείται. Στέλνετε πάντα την ίδια τιμή για μια συγκεκριμένη συσκευή, καθώς με αυτή η συσκευή δεσμεύει και ξαναδεσμεύει τη θέση της |
curl -X POST "$BASE_URL/api/licenses/validate" \
-H "Content-Type: application/json" \
-d '{"license_key":"XXXX-XXXX-XXXX-XXXX","device_id":"device_abc123"}'
interface LicenseValidation {
valid: boolean
license: {
id: string
status: string
product: object
activation_date: string
expiration_date: string
current_activations: number
}
}
const result: LicenseValidation = await $fetch('/api/licenses/validate', {
method: 'POST',
body: {
license_key: 'XXXX-XXXX-XXXX-XXXX',
device_id: 'device_abc123'
}
})
import requests
response = requests.post(
"$BASE_URL/api/licenses/validate",
json={
"license_key": "XXXX-XXXX-XXXX-XXXX",
"device_id": "device_abc123"
}
)
result = response.json()
package main
import (
"bytes"
"encoding/json"
"net/http"
)
func validateLicense() {
payload := map[string]string{
"license_key": "XXXX-XXXX-XXXX-XXXX",
"device_id": "device_abc123",
}
body, _ := json.Marshal(payload)
resp, _ := http.Post(
"$BASE_URL/api/licenses/validate",
"application/json",
bytes.NewBuffer(body),
)
defer resp.Body.Close()
}
<?php
$response = file_get_contents(
'$BASE_URL/api/licenses/validate',
false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => json_encode([
'license_key' => 'XXXX-XXXX-XXXX-XXXX',
'device_id' => 'device_abc123'
])
]
])
);
$result = json_decode($response, true);
use reqwest::Client;
use serde_json::json;
let client = Client::new();
let response = client
.post("$BASE_URL/api/licenses/validate")
.json(&json!({
"license_key": "XXXX-XXXX-XXXX-XXXX",
"device_id": "device_abc123"
}))
.send()
.await?;
Απόκριση (επιτυχία):
{
"valid": true,
"license": {
"id": "uuid",
"status": "active",
"product": { "id": "uuid", "name": "studio", "features": ["client_api", "api_keys"] },
"activation_date": "2024-01-01T00:00:00Z",
"expiration_date": "2025-12-31T23:59:59Z",
"current_activations": 1
}
}
Απόκριση (σφάλμα):
{
"statusCode": 400,
"statusMessage": "Invalid licence key or validation failed"
}
| Κατάσταση | Πότε |
|---|---|
400 | Το license_key ή το device_id λείπει, είναι κενό ή υπερβολικά μεγάλο, ή το κλειδί είναι άγνωστο, ανενεργό ή έχει λήξει |
409 | Όλες οι θέσεις της άδειας είναι ήδη δεσμευμένες από άλλες συσκευές και καμία δεν έμεινε ανενεργή αρκετό χρόνο ώστε να ανακτηθεί |
429 | Υπέρβαση ορίου ρυθμού, δείτε Περιορισμός ρυθμού αιτημάτων |
400 δεν αναφέρει ποτέ ποιο πεδίο ήταν λανθασμένο: πριν δοκιμάσετε ξανά, βεβαιωθείτε ότι τα license_key και device_id υπάρχουν και δεν είναι κενά.Απενεργοποίηση άδειας
Authentication RequiredΑπαιτείται το cookie συνεδρίας session_token του κατόχου της άδειας (δείτε Έλεγχος ταυτότητας): μπορείτε να απενεργοποιήσετε μόνο άδεια που σας ανήκει.
Απενεργοποιήστε μια άδεια σε μια συγκεκριμένη συσκευή ή σε όλες τις συσκευές.
Endpoint: POST /api/licenses/deactivate
| Παράμετρος | Τύπος | Υποχρεωτική | Περιγραφή |
|---|---|---|---|
license_key | string | Ναι | Το κλειδί άδειας προς απενεργοποίηση |
device_id | string | Όχι | Η συγκεκριμένη συσκευή προς απενεργοποίηση (παραλείψτε το για όλες τις συσκευές) |
curl -X POST "$BASE_URL/api/licenses/deactivate" \
-b cookies.txt \
-H "Content-Type: application/json" \
-d '{"license_key":"XXXX-XXXX-XXXX-XXXX","device_id":"device_abc123"}'
const result = await $fetch('/api/licenses/deactivate', {
method: 'POST',
// session cookie (session_token) is sent automatically same-origin
body: {
license_key: 'XXXX-XXXX-XXXX-XXXX',
device_id: 'device_abc123'
}
})
import requests
response = requests.post(
"$BASE_URL/api/licenses/deactivate",
headers={"Cookie": f"session_token={token}"},
json={
"license_key": "XXXX-XXXX-XXXX-XXXX",
"device_id": "device_abc123"
}
)
req, _ := http.NewRequest("POST",
"$BASE_URL/api/licenses/deactivate",
bytes.NewBuffer(body))
req.Header.Set("Cookie", "session_token="+token)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
<?php
$response = file_get_contents(
'$BASE_URL/api/licenses/deactivate',
false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n" .
"Cookie: session_token=$token",
'content' => json_encode([
'license_key' => 'XXXX-XXXX-XXXX-XXXX',
'device_id' => 'device_abc123'
])
]
])
);
let response = client
.post("$BASE_URL/api/licenses/deactivate")
.header("Cookie", format!("session_token={}", token))
.json(&json!({
"license_key": "XXXX-XXXX-XXXX-XXXX",
"device_id": "device_abc123"
}))
.send()
.await?;
Απόκριση:
{
"success": true,
"message": "Device deactivated successfully",
"deactivated_count": 1,
"remaining_activations": 4
}
remaining_activations είναι ο αριθμός των θέσεων που παραμένουν σε χρήση μετά την απενεργοποίηση, δηλαδή το πλήθος των διακριτών συσκευών που μένουν ενεργές στην άδεια. Δεν είναι ο αριθμός των ελεύθερων θέσεων. Συνεπώς, η απενεργοποίηση όλων των συσκευών επιστρέφει 0. Υπολογίστε τις ελεύθερες θέσεις ως activation_limit - remaining_activations, χρησιμοποιώντας το activation_limit από το GET /api/licenses/status. Χωρίς device_id, το μήνυμα είναι «All devices deactivated successfully»· το deactivated_count είναι ο αριθμός των θέσεων που αποδέσμευσε η συγκεκριμένη κλήση.Κατάσταση άδειας
Authentication RequiredΑπαιτείται το cookie συνεδρίας session_token του κατόχου της άδειας (δείτε Έλεγχος ταυτότητας): μπορείτε να ελέγξετε μόνο άδεια που σας ανήκει.
Ελέγξτε την τρέχουσα κατάσταση μιας άδειας. Όριο 30 αιτημάτων ανά λεπτό ανά IP.
Endpoint: GET /api/licenses/status
| Παράμετρος | Τύπος | Υποχρεωτική | Περιγραφή |
|---|---|---|---|
license_key | query | Ναι | Το κλειδί άδειας προς έλεγχο |
curl -X GET "$BASE_URL/api/licenses/status?license_key=XXXX-XXXX-XXXX-XXXX" \
-b cookies.txt
const status = await $fetch('/api/licenses/status', {
// session cookie (session_token) is sent automatically same-origin
query: { license_key: 'XXXX-XXXX-XXXX-XXXX' }
})
import requests
response = requests.get(
"$BASE_URL/api/licenses/status",
headers={"Cookie": f"session_token={token}"},
params={"license_key": "XXXX-XXXX-XXXX-XXXX"}
)
req, _ := http.NewRequest("GET",
"$BASE_URL/api/licenses/status?license_key=XXXX-XXXX-XXXX-XXXX",
nil)
req.Header.Set("Cookie", "session_token="+token)
resp, _ := http.DefaultClient.Do(req)
<?php
$response = file_get_contents(
'$BASE_URL/api/licenses/status?license_key=XXXX-XXXX-XXXX-XXXX',
false,
stream_context_create([
'http' => [
'header' => "Cookie: session_token=$token"
]
])
);
let response = client
.get("$BASE_URL/api/licenses/status")
.header("Cookie", format!("session_token={}", token))
.query(&[("license_key", "XXXX-XXXX-XXXX-XXXX")])
.send()
.await?;
Απόκριση:
{
"license": {
"id": "uuid",
"license_key": "XXXX-XXXX-XXXX-XXXX",
"status": "active",
"purchase_date": "2024-01-01T00:00:00Z",
"activation_date": "2024-01-01T00:00:00Z",
"expiration_date": "2025-12-31T23:59:59Z",
"days_until_expiration": 365,
"activation_limit": 5,
"current_activations": 2,
"available_activations": 3,
"is_expired": false,
"is_active": true,
"product": { "id": "uuid", "name": "Studio 8K", "description": "...", "features": [] },
"user": { "id": "uuid", "first_name": "Jane", "last_name": "Doe", "email": "user@example.com" }
},
"active_devices": [
{
"id": "uuid",
"device_id": "device_abc123",
"device_name": "Studio Mac",
"platform": "macos",
"app_version": "3.1.2",
"activated_at": "2024-01-01T00:00:00Z",
"last_seen_at": "2024-01-02T09:00:00Z",
"ip_address": "192.168.1.1"
}
]
}
Κύκλος ζωής άδειας
Περιορισμός ρυθμού αιτημάτων
Τα endpoints αδειών έχουν όριο ρυθμού ανά IP σε σταθερό παράθυρο 60 δευτερολέπτων. Σε απόκριση 429 επιστρέφεται μία κεφαλίδα:
| Κεφαλίδα | Περιγραφή |
|---|---|
Retry-After | Δευτερόλεπτα μέχρι να μηδενιστεί το παράθυρο (πάντα 60) |
Όρια ρυθμού ανά endpoint
| Endpoint | Αιτήματα / 60 δευτ. | Βαθμίδα |
|---|---|---|
/api/licenses/validate | 5 | Αυστηρή |
/api/licenses/status | 30 | Τυπική |
/api/licenses/deactivate | 30 | Τυπική |
Το POST /api/licenses/validate εφαρμόζει το Αυστηρό όριο δύο φορές: μία ανά IP και μία με βάση το license_key που υποβάλλεται. Έτσι, ένα μεμονωμένο κλειδί δεν μπορεί να βομβαρδιστεί με αιτήματα από πολλές IP.
429 Too Many Requests για το υπόλοιπο του παραθύρου των 60 δευτερολέπτων. Δεν υπάρχει προοδευτική ή κλιμακούμενη διάρκεια αποκλεισμού.Τύποι αδειών
Κάθε άδεια αντιστοιχεί σε μία από τις τρέχουσες βαθμίδες προγραμμάτων. Το έγκυρο σύνολο λειτουργιών και ορίων κάθε βαθμίδας είναι αυτό που εμφανίζεται στη σελίδα τιμών: δείτε Σύγκριση προγραμμάτων.
| Βαθμίδα | Για ποιους προορίζεται | Βασικές προσθήκες σε σχέση με την προηγούμενη βαθμίδα |
|---|---|---|
free | Μόνιμο δωρεάν πρόγραμμα, χωρίς κάρτα, χωρίς λήξη | Ένα απλό τηλεχειριστήριο παρουσιάσεων: ένα δωμάτιο, ένας ομιλητής, κοινή χρήση οθόνης με υδατογράφημα και Stream Deck· όλες οι υπόλοιπες λειτουργίες είναι κλειδωμένες |
presenter | Ομιλητές | Timer Pro, συνομιλία, σχεδίαση, πολλαπλοί οικοδεσπότες και NDI |
pro (Studio HD) | Μεμονωμένοι παραγωγοί | Καλούντες, προσαρμοσμένα δωμάτια, κοινή χρήση βίντεο και τα βασικά εργαλεία του Studio |
ultra (Studio 4K) | Προχωρημένοι χρήστες και streamers | Απεριόριστα δωμάτια, αποθηκευμένα θέματα με τα χρώματα της επωνυμίας σας, επίπεδα, εγγραφή ISO, replay και το ευρύτερο σύνολο εργαλείων του Studio |
studio (Studio 8K) | Ομάδες παραγωγής | Σχεδιαστής διάταξης δωματίων, επωνυμία white label, το Client API, κλειδιά API, προσαρμοσμένοι τομείς, κοινόχρηστες ομαδικές άδειες ανά θέση |
enterprise | Μεγάλοι οργανισμοί και τμήματα προμηθειών | SSO, SCIM και προσαρμοσμένοι ρόλοι ομάδας, ετήσια συμβόλαια ανά θέση |
WebSocket σε πραγματικό χρόνο
Ελέγξτε ένα δωμάτιο Cliqer από το δικό σας λογισμικό σαν απομακρυσμένο τηλεχειριστήριο παρουσιάσεων, με διαφάνειες, το χρονόμετρο, δείκτη λέιζερ και μηνύματα προς τον οικοδεσπότη
Προχωρημένα θέματα
Επαγγελματικές λειτουργίες και διαμορφώσεις για εταιρικές εγκαταστάσεις και σύνθετες διατάξεις εκδηλώσεων.