Saltar al contenido

SDK de TypeScript

El cliente @xos/sdk, generado a partir del documento OpenAPI, con modelos tipados, paginación, filtros, idempotencia, ETag y errores de problema.

@xos/sdk cubre cada operación del documento OpenAPI. Sus modelos, firmas de métodos y tabla de operaciones se generan a partir del documento en CI y nunca se editan a mano, así que una operación nueva aparece en el SDK en cuanto aparece en la API. Funciona en Node.js 22 o posterior, en navegadores y en entornos edge, sin dependencias.

Crea un cliente

import { XosClient } from "@xos/sdk";

const xos = new XosClient({
  baseUrl: "https://api.ghxstship.tech/v1",
  apiKey: process.env.XOS_API_KEY,
});

En lugar de apiKey, pasa accessToken para un token de sesión, o getToken para entregar un token nuevo antes de cada solicitud. Otras opciones: maxRetries (2 de forma predeterminada), timeoutMs (30000 de forma predeterminada) y un fetch propio.

Llama a las operaciones

Cada recurso es una propiedad y cada operación un método con el nombre de su id de operación: projects.list es xos.projects.list(), purchaseOrders.approve es xos.purchaseOrders.approve(id, body).

const { data: project, etag } = await xos.projects.get(projectId, {
  fields: ["name", "project_state"],
});

await xos.projects.update(projectId, { name: "Harborfront Fall Series" }, { ifMatch: etag! });

await xos.records.transition(recordId, {
  expected_state: "Scheduled",
  to_state: "Blocked",
  blocker_text: "Waiting on the rigging plot.",
});

Cada resultado tiene data, status, etag, rateLimit y headers. Primero van los parámetros de ruta, luego el cuerpo, luego los parámetros de consulta y al final las opciones.

Listas

list() devuelve una página con data y nextCursor. listAll() recorre cada fila de todas las páginas. Los filtros y el orden están tipados según la fila:

for await (const po of xos.purchaseOrders.listAll({
  filter: { po_state: { eq: "Approved" } },
  sort: ["-created_at"],
  fields: ["id", "po_number", "currency_code"],
})) {
  console.log(po.po_number);
}

Escrituras

Los métodos POST envían un Idempotency-Key automáticamente y lo reutilizan en los reintentos. Pasa idempotencyKey para que una llamada sea segura entre reinicios. Las actualizaciones requieren ifMatch; el sistema de tipos no te deja omitirlo.

Errores

import { XosPreconditionFailedError, XosRefusalError, XosValidationError } from "@xos/sdk";

try {
  await xos.purchaseOrders.approve(poId, {});
} catch (error) {
  if (error instanceof XosRefusalError) console.log(error.refusal, error.reason, error.rule);
  else if (error instanceof XosValidationError) console.log(error.errors);
  else if (error instanceof XosPreconditionFailedError) console.log("Read again and retry");
  else throw error;
}

Consulta Errores y rechazos para ver cada clase.

Webhooks

verifyWebhookSignature y signWebhookPayload se exportan desde @xos/sdk/webhooks. Consulta Webhooks.

Llamar a una operación por su id

xos.request(OPERATIONS["projects.get"], { path: { id } }) llama a cualquier operación de la tabla generada. La CLI y el servidor MCP están hechos así.