Voici les SDK SupDesk
Tout produit sérieux finit par écrire une couche d'intégration — un script qui lit une boîte de réception, une tâche cron qui synchronise un tableau, un endpoint qui dépose le feedback de votre propre interface. La console SupDesk est parfaite quand vous êtes au clavier. Dès que vous voulez automatiser, vous avez besoin d'une API, et une API ne vaut que ce que valent les clients qui la parlent.
Aujourd'hui, nous en livrons quatre.
À la rencontre des SDKs
- JavaScript / TypeScript —
supdesksur npm. S'exécute sans modification dans Node 18+, Deno, Bun et Cloudflare Workers, avec zéro dépendance d'exécution. - Python —
supdesksur PyPI. Un client synchroneSupDesket un client asynchroneAsyncSupDeskqui partagent un même cœur httpx. - Go —
github.com/rabinapps/supdesk-go. Bibliothèque standard uniquement, il se compile donc partout où tourne Go 1.23+ — y compris sur Cloudflare Workers viaGOOS=wasip1. - Dart —
supdesksur pub.dev. Construit sur dio, les interceptors,CancelTokenet les adaptateurs de proxy fonctionnent donc comme vous en avez l'habitude.
Installation
npm install supdeskpip install supdeskgo get github.com/rabinapps/supdesk-godependencies:
supdesk: ^0.1.0Une API, quatre langages
Les SDKs ne sont pas quatre wrappers distincts : c'est la même API avec les mêmes sémantiques dans chaque langage. Si vous savez lire les soumissions dans l'un, vous saurez les lire dans les quatre.
Pagination automatique. list() renvoie une page qui est aussi un itérable asynchrone — parcourez chaque page avec un for await, ou récupérez simplement la première page quand c'est tout ce qu'il vous faut.
Ressources typées. Soumissions, feedback, entrées de changelog, messages, inscriptions à la liste d'attente, programmes bêta et testeurs, articles et catégories du centre d'aide — chacune avec les méthodes attendues et des paramètres typés, pour que les coquilles échouent à la compilation plutôt qu'en production.
Erreurs typées. Chaque échec hérite d'une même classe de base — SupDeskError en JS et Python, APIError en Go, SupDeskException en Dart — un seul catch suffit donc à tout gérer, tandis que instanceof ou errors.As ciblent toujours le cas précis.
Webhooks. constructEventFromRequest, construct_event_from_headers, ConstructEvent et constructEventFromHeaders vérifient la signature de SupDesk en temps constant, pour que vous puissiez vous fier à ce sur quoi agit votre receiver.
Résilience intégrée. Chaque client réessaie avec backoff exponentiel et jitter, respecte Retry-After, et ne réessaie jamais un POST compté qu'il aurait déjà pu accepter — un réseau instable ne peut pas dupliquer le ticket d'un utilisateur.
Conçu pour le serveur
Les clés API SupDesk authentifient l'intégralité de votre projet : les SDKs refusent donc de s'exécuter dans un navigateur — les constructeurs JS et Dart lèvent une erreur s'ils détectent un DOM ou une build client, et les READMEs disent clairement pourquoi. Conservez la clé dans une variable d'environnement côté serveur, derrière un endpoint que vous contrôlez.
Deux autres choses à savoir : les lectures fonctionnent sur toutes les offres, tandis que les écritures (POST/PATCH/DELETE) exigent une offre payante ; et les clés sont propres à chaque projet, donc donnez-en une à chaque environnement et vous pourrez en révoquer une seule sans toucher aux autres.
Où SupDesk s'inscrit
Les SDKs constituent la moitié backend du guide d'intégration SaaS de SupDesk — support multi-tenant, accès API et webhooks pour les produits qui veulent intégrer le support à leurs propres systèmes. La référence complète se trouve dans la documentation API.
Pour commencer
Récupérez une clé API dans Paramètres de l'espace de travail → Clés API, installez le client adapté à votre stack et lancez le démarrage rapide de cette page. Puis clonez le repo et lisez le README.
SDK côté serveur pour l'intégration backend
Exemples de code en direct tirés du dépôt GitHub de chaque SDK.
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.',
);