Skip to content

sidearmDRM/sdk-node

Repository files navigation

@sidearmdrm/sdk-node

TypeScript client for the Sidearm API. Protect media from AI training, detect AI content, search for stolen work.

Install

npm install @sidearmdrm/sdk-node

Quick Start

import { Sidearm } from "@sidearmdrm/sdk-node";
const client = new Sidearm({ apiKey: "sk_live_..." });
const job = await client.protect({
  media_url: "https://example.com/art.png",
  level: "maximum",
});
const result = await job.wait();

Protection

// Preset level (auto-selects algorithms)
const job = await client.protect({
  media_url: "https://...",
  level: "standard",
  tags: ["portfolio"],
});

// Run specific algorithms by name
const job2 = await client.run({
  algorithms: ["nightshade", "glaze", "hmark"],
  media_url: "https://...",
});

Job Polling

Async endpoints return a Job handle with built-in polling:

// Wait until done
const result = await job.wait({ timeoutMs: 120_000, intervalMs: 2_000 });

// Manual poll
const status = await job.poll();

// Resume from a previous job ID
const resumed = client.jobs.handle("job-uuid");
await resumed.wait();

Algorithms

const all = await client.algorithms.list();
const audio = await client.algorithms.list({ media_type: "audio" });
const open = await client.algorithms.list({ category: "open" });

Detection

// AI content detection (async)
const aiJob = await client.detect.ai({ media_url: "https://..." });
const aiResult = await aiJob.wait();

// Fingerprint detection (sync)
const matches = await client.detect.fingerprint({
  media_url: "https://...",
  tier: "perceptual",
});

// Membership inference
const memJob = await client.detect.membership({
  content_ids: ["uuid-1", "uuid-2"],
  suspect_model: "stable-diffusion-xl",
  method: "combined",
});
await memJob.wait();

Search

const results = await client.search.run({
  media_url: "https://...",
  type: "perceptual",
  limit: 10,
});

const history = await client.search.list({ limit: 20 });

Media Management

await client.media.register({ media_url: "https://...", mode: "basic" });
const library = await client.media.list({ limit: 50 });
const asset = await client.media.get("uuid");
await client.media.update("uuid", { original_media_url: "https://..." });
await client.media.delete("uuid");

Rights and Billing

const rights = await client.rights.get("media-uuid");
const billing = await client.billing.get("account-uuid", {
  start_date: "2026-01-01",
});

Error Handling

import { Sidearm, SidearmError } from "@sidearmdrm/sdk-node";

try {
  await client.protect({ media_url: "..." });
} catch (err) {
  if (err instanceof SidearmError) {
    console.error(err.message); // Human-readable message
    console.error(err.status);  // HTTP status code
    console.error(err.body);    // Raw response body
  }
}

Requirements

  • Node.js 18+ or modern browser (native fetch)
  • Zero runtime dependencies
  • Full TypeScript types included

License

MIT

About

TypeScript/Node.js SDK for the Sidearm API — protect media from AI training, detect AI content, and search for stolen work

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors