BaxStream/Node.js SDK

Node.js SDK

Server-side video conversion, HLS output, and AI categorization/moderation for Express, NestJS, and any Node.js backend

Package: @baxcloud/baxstream@1.0.5

Sync vs async

Standalone AI (createCategorizationJob, createModerationJob, uploadImageForModeration, batch helpers) is synchronous: await the call and read result.safe, result.violations, result.batchItems, etc. from the HTTP response. Webhooks are optional.

HLS conversion is async: poll getVideoConversionJob or use video.conversion.* webhooks.

Full table: Standalone AI · Webhooks

Installation

npm install @baxcloud/baxstream
# or
pnpm add @baxcloud/baxstream

Requires Node.js 18+. The client connects to BaxCloud automatically — only projectId and apiKey are required.

Image moderation (sync)

1const result = await stream.createModerationJob({
2  inputUrl: 'https://example.com/photo.jpg',
3  inputType: 'image',
4  threshold: 0.30,
5});
6
7if (!result.safe) {
8  console.log(result.violations);
9}
10
11// Batch (1–20 images)
12const batch = await stream.createModerationBatchJob({
13  inputUrls: ['https://example.com/a.jpg', 'https://example.com/b.jpg'],
14});
15for (const item of batch.batchItems ?? []) {
16  console.log(item.index, item.safe);
17}

Quick Start (HLS)

1import { BaxCloudStreamClient } from '@baxcloud/baxstream';
2
3const stream = new BaxCloudStreamClient({
4  projectId: process.env.BAXCLOUD_PROJECT_ID!,
5  apiKey: process.env.BAXCLOUD_API_KEY!,
6});
7
8const job = await stream.createVideoConversionJob({
9  inputUrl: 'https://example.com/video.mp4',
10  outputFormats: ['720p', '1080p'],
11  s3Config: {
12    bucket: 'my-bucket',
13    accessKey: process.env.S3_ACCESS_KEY!,
14    secretKey: process.env.S3_SECRET_KEY!,
15    cdnUrl: 'https://cdn.example.com',
16  },
17});
18
19// Async — poll or use webhooks
20const status = await stream.getVideoConversionJob(job.id);
21console.log(status.status, status.outputUrl);

API methods

Video conversion (async): createVideoConversionJob, uploadVideoForConversion, listVideoConversionJobs, getVideoConversionJob, cancelVideoConversionJob

AI categorization (sync): createCategorizationJob, listCategorizationJobs, getCategorizationJob

AI moderation (sync): createModerationJob, uploadImageForModeration, createModerationBatchJob, uploadImagesForModeration, listModerationJobs, getModerationJob

Full REST reference: BaxStream docs · npm

Webhooks (optional for standalone AI)

Required for async HLS conversion workflows; optional for standalone categorization/moderation when you already read the synchronous HTTP response. Verify events with @baxcloud/baxcloud-server-sdk (webhook helpers only — BaxStream API calls use @baxcloud/baxstream):

1npm install @baxcloud/baxcloud-server-sdk
2
3import express from 'express';
4import { webhookMiddleware } from '@baxcloud/baxcloud-server-sdk';
5
6const app = express();
7
8app.post(
9  '/webhooks/baxstream',
10  express.json({
11    verify: (req: any, _res, buf) => { req.rawBody = buf.toString('utf8'); },
12  }),
13  webhookMiddleware(process.env.BAXCLOUD_WEBHOOK_SECRET!),
14  (req, res) => {
15    const event = req.baxcloudEvent;
16    if (event.event === 'video.conversion.completed') {
17      console.log('HLS ready:', event.data?.outputUrl);
18    }
19    res.json({ received: true });
20  },
21);

See BaxStream webhooks and the Server SDK guide.