Wir stellen die SupDesk-SDKs vor

SupDesk Team

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 / TypeScriptsupdesk auf npm. Läuft unverändert in Node 18+, Deno, Bun und Cloudflare Workers, mit null Laufzeitabhängigkeiten.
  • Pythonsupdesk auf PyPI. Ein synchroner SupDesk-Client und ein asynchroner AsyncSupDesk-Client, die sich einen gemeinsamen httpx-Kern teilen.
  • Gogithub.com/rabinapps/supdesk-go. Nur die Standardbibliothek, sodass es überall baut, wo Go 1.23+ läuft — einschließlich Cloudflare Workers über GOOS=wasip1.
  • Dartsupdesk auf pub.dev. Basiert auf dio, sodass Interceptors, CancelToken und Proxy-Adapter genau so funktionieren, wie Sie es bereits gewohnt sind.

Installation

npm install supdesk
pip install supdesk
go get github.com/rabinapps/supdesk-go
dependencies:
  supdesk: ^0.1.0

Eine 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.

Jetzt starten auf supdesk.app

Serverseitige SDKs für die Backend-Integration

Live-Codebeispiele, die direkt aus dem GitHub-Repository jedes SDK geladen werden.

RabinApps/supdesk-nodeJavaScript / TypeScript
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.",
});
RabinApps/supdesk-pythonPython
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.",
)
RabinApps/supdesk-goGo
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.",
})
RabinApps/supdesk-dartDart
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.',
);

Tags

#sdk#api#developers