Voici les SDK SupDesk

SupDesk Team

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 / TypeScriptsupdesk sur npm. S'exécute sans modification dans Node 18+, Deno, Bun et Cloudflare Workers, avec zéro dépendance d'exécution.
  • Pythonsupdesk sur PyPI. Un client synchrone SupDesk et un client asynchrone AsyncSupDesk qui partagent un même cœur httpx.
  • Gogithub.com/rabinapps/supdesk-go. Bibliothèque standard uniquement, il se compile donc partout où tourne Go 1.23+ — y compris sur Cloudflare Workers via GOOS=wasip1.
  • Dartsupdesk sur pub.dev. Construit sur dio, les interceptors, CancelToken et les adaptateurs de proxy fonctionnent donc comme vous en avez l'habitude.

Installation

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

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

Commencer sur supdesk.app

SDK côté serveur pour l'intégration backend

Exemples de code en direct tirés du dépôt GitHub de chaque SDK.

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.',
);

Étiquettes

#sdk#api#developers