Presentamos los SDK de SupDesk

SupDesk Team

Todo producto serio acaba escribiendo una capa de integración: un script que lee de una bandeja de entrada, un trabajo cron que sincroniza un tablero, un endpoint que registra comentarios desde tu propia interfaz. La consola de SupDesk es estupenda cuando estás frente al teclado. En cuanto quieres automatizarla, necesitas una API, y una API solo es tan buena como los clientes que necesitas para comunicarte con ella.

Hoy publicamos cuatro de ellos.

Conoce los SDK

  • JavaScript / TypeScriptsupdesk en npm. Funciona sin modificaciones en Node 18+, Deno, Bun y Cloudflare Workers, con cero dependencias en tiempo de ejecución.
  • Pythonsupdesk en PyPI. Un cliente síncrono SupDesk y un cliente asíncrono AsyncSupDesk que comparten un mismo núcleo httpx.
  • Gogithub.com/rabinapps/supdesk-go. Solo la biblioteca estándar, por lo que compila en cualquier lugar donde funcione Go 1.23+, incluidos Cloudflare Workers mediante GOOS=wasip1.
  • Dartsupdesk en pub.dev. Construido sobre dio, por lo que los interceptores, CancelToken y los adaptadores de proxy funcionan exactamente como ya esperas.

Instalación

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

Una API, cuatro lenguajes

Los SDK no son cuatro envoltorios separados; son la misma API con la misma semántica en cada lenguaje. Si puedes leer los envíos en uno, puedes leerlos en los cuatro.

Paginación automática. list() devuelve una página que también es un iterable asíncrono: recorre todas las páginas con un for await, o recupera solo la primera cuando eso es todo lo que necesitas.

Recursos tipados. Envíos, comentarios, entradas del changelog, mensajes, registros en la lista de espera, programas beta y evaluadores, y artículos y categorías del centro de ayuda: cada uno con los métodos que esperarías y parámetros tipados, para que los errores tipográficos fallen en tiempo de compilación y no en producción.

Errores tipados. Cada fallo desciende de una única base: SupDeskError en JS y Python, APIError en Go, SupDeskException en Dart; de modo que un solo catch se encarga de todos mientras instanceof o errors.As siguen acotando el caso concreto.

Webhooks. constructEventFromRequest, construct_event_from_headers, ConstructEvent y constructEventFromHeaders verifican la firma de SupDesk en tiempo constante, para que puedas confiar en aquello sobre lo que actúa tu receptor.

Resiliencia integrada. Cada cliente reintenta con backoff exponencial y jitter, respeta Retry-After y nunca reintenta un POST medido que ya podría haber aceptado: una red inestable no puede duplicar el ticket de un usuario.

Diseñados para el servidor

Las claves de API de SupDesk autentican a todo tu proyecto, por lo que los SDK se niegan a ejecutarse en un navegador: los constructores de JS y Dart lanzan una excepción si detectan un DOM o una compilación de cliente, y los README son claros sobre el motivo. Mantén la clave en una variable de entorno del lado del servidor, detrás de un endpoint que controles.

Dos cosas más que conviene saber: las lecturas funcionan en todos los planes, mientras que las escrituras (POST/PATCH/DELETE) requieren un plan de pago; y las claves tienen alcance de proyecto, así que asigna una a cada entorno y podrás revocar una sin tocar las demás.

Dónde encaja SupDesk

Los SDK son la mitad de backend de la guía de integración SaaS de SupDesk: soporte multi-tenant, acceso a la API y webhooks para productos que quieren tener el soporte integrado en sus propios sistemas. La referencia completa se encuentra en la documentación de la API.

Primeros pasos

Consigue una clave de API en Configuración del espacio de trabajo → Claves de API, instala el cliente para tu stack y ejecuta el inicio rápido de esta página. Después clona el repositorio y lee el README.

Empieza en supdesk.app

SDK del lado del servidor para la integración de backend

Ejemplos de código en vivo extraídos del repositorio de GitHub de cada 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.',
);

Etiquetas

#sdk#api#developers