API
Better Social bietet eine Entwickler-API im Stil von JustAnotherPanel (JAP) v2, wie sie viele SMM-Panels nutzen. Die meisten bestehenden Panel-Clients funktionieren daher, sobald du Endpunkt und Schlüssel änderst.
Endpunkt und Authentifizierung
| Endpunkt | https://better-social.pro/api/v2 |
|---|---|
| Methoden | POST mit Form-urlencoded- oder JSON-Body oder GET mit Query-Parametern |
| In jeder Anfrage erforderlich | key (dein persönlicher API-Schlüssel) und action |
| Antwortformat | JSON |
| Währung | USD |
So bekommst du deinen Schlüssel: Öffne im Dashboard Tools → API. Ein Schlüssel wird automatisch erstellt, wenn du diese Seite zum ersten Mal öffnest. Dort kannst du ihn anzeigen, kopieren oder neu generieren (Regenerate). Beim Neu-Generieren funktioniert der alte Schlüssel sofort nicht mehr.
API-Bestellungen unterliegen denselben Guthaben- und Prüfregeln wie Bestellungen im Dashboard. GET ist praktisch für schnelle Tests, legt deinen Schlüssel aber in URLs und Server-Logs ab, nutze im Produktivbetrieb also POST.
Halte deinen API-Schlüssel geheim
Jeder, der deinen Schlüssel hat, kann mit deinem Guthaben Bestellungen aufgeben. Bewahre ihn nur auf deinem Server auf. Packe ihn nie in Browser-JavaScript, mobile Apps oder öffentliche Repositories. Wenn er durchgesickert ist, generiere ihn sofort im Dashboard neu. Das Better-Social-Team wird dich nie nach deinem API-Schlüssel fragen.
Übersicht der Aktionen
| Aktion | Parameter (außer key) | Rückgabe |
|---|---|---|
services | keine | Liste der verfügbaren Services |
add | service, link, quantity, optional comments | {"order": ..., "charge": ...} |
status | order (oder orders) | Status einer Bestellung (oder mehrerer) |
multi_status | orders (kommagetrennt) | Status nach Bestell-ID |
balance | keine | {"balance": ..., "currency": "USD"} |
refill | order oder orders | Die Antwort des Lieferanten |
cancel | order oder orders | Die Antwort des Lieferanten |
services: Services auflisten
curl -X POST https://better-social.pro/api/v2 \
-d key=YOUR_API_KEY \
-d action=services
Gibt ein Array mit einem Objekt pro verfügbarem Service zurück:
| Feld | Typ | Bedeutung |
|---|---|---|
service | integer | Service-ID, wird in add verwendet |
name | string | Name des Services |
type | string | Immer "Default" |
category | string | Name der Kategorie |
rate | string | Preis pro 1000 in USD, 4 Nachkommastellen |
min, max | string | Mindest- und Höchstmenge |
refill | boolean | Ob der Service Refills unterstützt |
cancel | boolean | Ob der Service Stornierungsanfragen unterstützt |
dripfeed | boolean | Drip-Feed-Kennzeichen |
needs_custom_text | boolean | Bei true sende comments mit add |
Beispielantwort (Werte zur Veranschaulichung)
[
{
"service": 101,
"name": "TikTok Live Likes",
"type": "Default",
"category": "TikTok Live",
"rate": "1.5000",
"min": "100",
"max": "100000",
"refill": false,
"cancel": false,
"dripfeed": false,
"needs_custom_text": false
}
]
add: eine Bestellung aufgeben
| Parameter | Pflicht | Beschreibung |
|---|---|---|
service | ja | Service-ID (integer) aus services |
link | ja | Ziel-Benutzername oder -Link. Für TikTok-Live-Services: @username oder https://www.tiktok.com/@username |
quantity | ja* | Ganzzahl zwischen min und max des Services |
comments | bei Services mit eigenen Kommentaren | Erforderlich, wenn needs_custom_text den Wert true hat. Ein Kommentar pro Zeile. Die Menge ist dann die Anzahl der nicht leeren Zeilen, und eine gesendete quantity wird ignoriert. |
Der Betrag ist rate × quantity ÷ 1000 und wird von deinem Guthaben abgezogen. Reicht dein Guthaben nicht, wird die Bestellung abgelehnt.
curl -X POST https://better-social.pro/api/v2 \
-d key=YOUR_API_KEY \
-d action=add \
-d service=101 \
-d link=@username \
-d quantity=500
Antwort
{"order": 123456, "charge": "0.7500"}
Verwende den zurückgegebenen Wert order mit status, refill und cancel. Manuelle Services geben eine Bestell-ID als String und "manual": true zurück, zum Beispiel {"order": "3f2c...", "manual": true, "charge": "5.0000"}.
Eigene Kommentare (JSON-Body)
curl -X POST https://better-social.pro/api/v2 \
-H "Content-Type: application/json" \
-d '{"key":"YOUR_API_KEY","action":"add","service":202,"link":"@username","comments":"Great stream!\nHello from Podgorica"}'
status: eine Bestellung prüfen
curl -X POST https://better-social.pro/api/v2 \
-d key=YOUR_API_KEY \
-d action=status \
-d order=123456
Antwort
{
"charge": "0.7500",
"start_count": null,
"status": "In progress",
"remains": "120",
"currency": "USD",
"order": 123456
}
statuskommt vom Lieferanten (zum BeispielPending,In progress,Completed,Partial,Canceled).remainsist die vom Lieferanten noch nicht gelieferte Menge odernull, wenn sie unbekannt ist.start_countist derzeit immernull.- Eine unbekannte Bestell-ID liefert
{"error": "not found"}. - Jeder Status-Aufruf fragt beim Lieferanten einen frischen Status ab, frage also nicht in einer schnellen Schleife ab.
multi_status: mehrere Bestellungen prüfen
Sende orders als kommagetrennte Liste (auch ein | als Trennzeichen funktioniert). Die Antwort ist ein Objekt mit den von dir gesendeten IDs als Schlüssel. status mit mehreren IDs in orders verhält sich genauso. status mit einer einzelnen ID gibt ein einzelnes Objekt zurück.
curl -X POST https://better-social.pro/api/v2 \
-d key=YOUR_API_KEY \
-d action=multi_status \
-d orders=123456,123457
Antwort
{
"123456": {"charge": "0.7500", "start_count": null, "status": "Completed", "remains": "0", "currency": "USD", "order": 123456},
"123457": {"error": "not found"}
}
balance: Guthaben prüfen
curl "https://better-social.pro/api/v2?key=YOUR_API_KEY&action=balance"
Antwort
{"balance": "12.3400", "currency": "USD"}
refill und cancel
Sende order (eine ID) oder orders (kommagetrennt). Deine Anfrage wird an den Lieferanten weitergeleitet, und dessen Antwort wird unverändert zurückgegeben. Bei mehreren IDs kommt sie als Objekt mit deinen IDs als Schlüssel zurück. Unbekannte IDs liefern {"error": "not found"}.
curl -X POST https://better-social.pro/api/v2 \
-d key=YOUR_API_KEY \
-d action=refill \
-d order=123456
Ob ein Refill oder eine Stornierung möglich ist, hängt vom Service ab (siehe die Flags refill und cancel in services). Unsere Stornierungsregeln gelten weiterhin: Bestellungen, die gestartet sind, können nicht storniert werden.
Fehler
Fehler verwenden HTTP-Statuscodes mit einem JSON-Body. Die meisten sehen aus wie {"detail": {"error": "message"}}. Manche nutzen einen einfachen String, etwa {"detail": "Invalid API key"}. Prüfe immer den HTTP-Statuscode.
| HTTP | Wann |
|---|---|
| 400 | action fehlt, unbekannte Aktion, service/link/quantity fehlt oder ist ungültig, Menge außerhalb von Min/Max, Kommentare fehlen bei einem Service mit eigenen Kommentaren, oder ein Link-Format ist für TikTok-Live-Services nicht erlaubt |
| 401 | API-Schlüssel fehlt oder ist ungültig |
| 402 | Nicht genug Guthaben für die Bestellung |
| 403 | Konto gesperrt oder der Ziel-Benutzername ist geschützt |
| 404 | Service nicht verfügbar |
| 502 | Der Lieferant hat einen Fehler zurückgegeben |
| 503 | Wartungsarbeiten laufen. Bitte versuche es später erneut. |
In den Ergebnissen von status, multi_status, refill und cancel wird ein Problem mit einer einzelnen Bestellung als {"error": "..."} für diese Bestellung gemeldet, mit HTTP 200.
Python-Beispiel
import os
import requests
API = "https://better-social.pro/api/v2"
KEY = os.environ["BETTER_SOCIAL_API_KEY"] # keep the key out of your code
def call(action, **params):
r = requests.post(API, data={"key": KEY, "action": action, **params}, timeout=30)
r.raise_for_status()
return r.json()
print(call("balance"))
order = call("add", service=101, link="@username", quantity=500)
print(call("status", order=order["order"]))
Best Practices
- Speichere den Schlüssel in einer Umgebungsvariable oder einem Secret-Manager, nie in Frontend-Code.
- Generiere den Schlüssel neu, wenn du glaubst, dass er offengelegt wurde oder wenn jemand mit Zugriff dein Team verlässt.
- Lies
servicesregelmäßig. Preise und Verfügbarkeit ändern sich. - Halte die Regel „eine Bestellung pro Link” ein. Siehe Bestellungen.
- Frage Status in einem vernünftigen Intervall ab, zum Beispiel alle paar Minuten, am besten mit
multi_status.