Skip to content

JavaScript SDK

Mark AI images, songs and clips from JavaScript or TypeScript in one call: Node.js 20 or later, Next.js, Bun, Deno and edge runtimes. Types included, no dependencies, MIT-licensed.

Install

Shell
npm install @kennmarq/sdk

The SDK reads your key from KENNMARQ_API_KEY, or takes apiKey. Keep it on the server: never in the browser.

Mark a file

TypeScript
import { writeFile } from "node:fs/promises";
import { Kennmarq } from "@kennmarq/sdk";

const kennmarq = new Kennmarq();

const marked = await kennmarq.mark("render.png", {
  provider: "Acme Inc.",
  appName: "Acme Studio",
  appVersion: "2.1",
  model: "FLUX.1 schnell",
  markets: ["eu", "us-ca"],
});
await writeFile("render.marked.png", marked.data);
console.log(marked.markId, marked.watermarkId, marked.marksUsed);

mark() takes a path, a Blob or File, an ArrayBuffer or a Uint8Array, and sends a file over 4 MB through an upload by itself. Its options are POST /v1/mark's, in camelCase: source, provider, appName, appVersion, model, markets, check, outputFormat, input, and the visible label's label, deepfake and labelLanguage, labelPosition, labelSize, labelStyle.

In a Next.js route

app/api/generate/route.ts
import { generateImage } from "ai";
import { Kennmarq } from "@kennmarq/sdk";

const kennmarq = new Kennmarq();

export async function POST(request: Request) {
  const { prompt } = await request.json();
  const { image } = await generateImage({ model: "bfl/flux-3-image", prompt });
  const marked = await kennmarq.mark(image.uint8Array, { appName: "Acme Studio", markets: ["eu", "us-ca"] });
  return new Response(marked.data, { headers: { "Content-Type": marked.contentType } });
}

More in the Next.js and Vercel AI SDK guides.

Songs and clips

TypeScript
const song = await kennmarq.mark("track.mp3");                     // five marks per started minute
const clip = await kennmarq.mark("clip.mp4", { check: "ai-act" });  // a job: waits, then downloads

const job = await kennmarq.mark("long.mp4", { wait: false });       // or start it now…
const done = await kennmarq.waitFor(job.markId!);                   // …and fetch it later

Check, verify, receipts and usage

TypeScript
const answer = await kennmarq.check("render.png", "ai-act"); // the safety check: two marks
const report = await kennmarq.verify(marked.data);          // free; an image up to 4 MB needs no key
const receipt = await kennmarq.receipt(marked.markId!);     // for marks made with markets
const usage = await kennmarq.usage();

Errors

API errors throw KennmarqError with the API's code, the HTTP status and the requestId (errors). A safety block throws ContentBlocked, with the check's answer in safety, and nothing is marked or counted. A 429 that asks to wait a moment is waited out.

The source is on GitHub.