Wir stellen die SupDesk-SDKs vor
Jedes ernsthafte Produkt braucht früher oder später eine Integrationsschicht — ein Skript, das einen Posteingang liest, ein Cron-Job, der ein Board synchronisiert, ein Endpunkt, der Feedback aus Ihrer eigenen Oberfläche einsammelt. Die SupDesk-Konsole ist großartig, solange Sie direkt davor sitzen. Sobald Sie sie automatisieren möchten, brauchen Sie eine API — und eine API ist nur so gut wie die Clients, über die Sie mit ihr sprechen.
Heute veröffentlichen wir vier davon.
Die SDKs im Überblick
- JavaScript / TypeScript —
supdeskauf npm. Läuft unverändert in Node 18+, Deno, Bun und Cloudflare Workers, mit null Laufzeitabhängigkeiten. - Python —
supdeskauf PyPI. Ein synchronerSupDesk-Client und ein asynchronerAsyncSupDesk-Client, die sich einen gemeinsamen httpx-Kern teilen. - Go —
github.com/rabinapps/supdesk-go. Nur die Standardbibliothek, sodass es überall baut, wo Go 1.23+ läuft — einschließlich Cloudflare Workers überGOOS=wasip1. - Dart —
supdeskauf pub.dev. Basiert auf dio, sodass Interceptors,CancelTokenund Proxy-Adapter genau so funktionieren, wie Sie es bereits gewohnt sind.
Installation
npm install supdeskpip install supdeskgo get github.com/rabinapps/supdesk-godependencies:
supdesk: ^0.1.0Eine API, vier Sprachen
Die SDKs sind keine vier getrennten Wrapper; sie sind in jeder Sprache dieselbe API mit derselben Semantik. Wer Einreichungen in einer Sprache lesen kann, kann sie in allen vier lesen.
Automatische Paginierung. list() gibt eine Seite zurück, die zugleich ein asynchrones Iterable ist — blättern Sie mit einem for await durch jede Seite oder holen Sie sich nur die erste, wenn das alles ist, was Sie brauchen.
Typisierte Ressourcen. Einreichungen, Feedback, Changelog-Einträge, Nachrichten, Wartelisten-Anmeldungen, Beta-Programme und Tester sowie Hilfe-Center-Artikel und -Kategorien — jeweils mit den Methoden, die Sie erwarten, und typisierten Parametern, sodass Tippfehler bereits beim Kompilieren auffallen statt erst in der Produktion.
Typisierte Fehler. Jeder Fehler stammt von einer einzigen Basisklasse ab — SupDeskError in JS und Python, APIError in Go, SupDeskException in Dart — sodass ein einziger catch alles abfängt, während instanceof beziehungsweise errors.As dennoch auf den konkreten Fall eingrenzt.
Webhooks. constructEventFromRequest, construct_event_from_headers, ConstructEvent und constructEventFromHeaders prüfen SupDesks Signatur in konstanter Zeit, sodass Sie dem vertrauen können, worauf Ihr Empfänger reagiert.
Eingebaute Resilienz. Jeder Client wiederholt Anfragen mit exponentiellem Backoff und Jitter, berücksichtigt Retry-After und wiederholt niemals einen abgerechneten POST, der womöglich bereits angenommen wurde — ein instabiles Netzwerk kann ein Nutzer-Ticket also nicht doppelt einreichen.
Von Grund auf serverbasiert
SupDesk-API-Keys authentifizieren Ihr gesamtes Projekt, daher weigern sich die SDKs, im Browser zu laufen — die JS- und Dart-Konstruktoren werfen einen Fehler, wenn sie ein DOM oder einen Client-Build erkennen, und die READMEs sagen unverblümt, warum. Bewahren Sie den Key in einer serverseitigen Umgebungsvariable auf, hinter einem Endpunkt, den Sie kontrollieren.
Zwei weitere Dinge, die Sie wissen sollten: Leseoperationen funktionieren in jedem Tarif, Schreiboperationen (POST/PATCH/DELETE) erfordern dagegen einen kostenpflichtigen Tarif; und Keys sind projektspezifisch — geben Sie also jeder Umgebung einen eigenen Key, dann können Sie einen widerrufen, ohne die übrigen anzutasten.
Wo SupDesk seinen Platz findet
Die SDKs bilden den Backend-Teil des SupDesk-SaaS-Integrationsleitfadens — Multi-Tenant-Support, API-Zugriff und Webhooks für Produkte, die Support in ihre eigenen Systeme eingebettet haben möchten. Die vollständige Referenz finden Sie in der API-Dokumentation.
Loslegen
Holen Sie sich einen API-Key unter Workspace-Einstellungen → API-Keys, installieren Sie den Client für Ihren Stack und führen Sie den Schnellstart auf dieser Seite aus. Klonen Sie anschließend das Repository und lesen Sie das README.
Serverseitige SDKs für die Backend-Integration
Live-Codebeispiele, die direkt aus dem GitHub-Repository jedes SDK geladen werden.
import { SupDesk } from "supdesk";
const supdesk = new SupDesk({ apiKey: process.env.SUPDESK_API_KEY! });
// Auto-pages: iterating walks every page for you.
for await (const submission of await supdesk.submissions.list({
status: "open",
})) {
console.log(submission.title);
}
await supdesk.submissions.create({
type: "bug",
title: "Export button does nothing",
email: "user@example.com",
body: "Clicking Export on the reports page has no effect.",
});from supdesk import SupDesk
supdesk = SupDesk() # api_key=... or $SUPDESK_API_KEY
# Auto-pages: iterating walks every page for you.
for submission in supdesk.submissions.list(status="open"):
print(submission.title)
supdesk.submissions.create(
type="bug",
title="Export button does nothing",
email="user@example.com",
body="Clicking Export on the reports page has no effect.",
)import "github.com/rabinapps/supdesk-go/supdesk"
client, err := supdesk.New(os.Getenv("SUPDESK_API_KEY"))
if err != nil {
log.Fatal(err)
}
page, err := client.Submissions.List(ctx, supdesk.SubmissionsListParams{
Status: ptr("open"),
})
if err != nil {
return err
}
// Auto-pages: All walks every page for you.
for sub, err := range page.All(ctx) {
if err != nil {
return err
}
fmt.Println(sub.Title)
}
_, err = client.Submissions.Create(ctx, supdesk.SubmissionsCreateParams{
Type: supdesk.SubmissionTypeBug,
Title: "Export button does nothing",
Email: "user@example.com",
Body: "Clicking Export on the reports page has no effect.",
})import 'dart:io';
import 'package:supdesk/supdesk.dart';
final supdesk = SupDesk(apiKey: Platform.environment['SUPDESK_API_KEY']!);
// Auto-pages: the stream walks every page for you.
final page = await supdesk.submissions.list(status: PostStatus.open);
await for (final submission in page.autoPaging()) {
print(submission.title);
}
await supdesk.submissions.create(
type: SubmissionType.bug,
title: 'Export button does nothing',
email: 'user@example.com',
body: 'Clicking Export on the reports page has no effect.',
);