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
npm install @kennmarq/sdkThe SDK reads your key from KENNMARQ_API_KEY, or takes apiKey. Keep it on the server: never in the browser.
Mark a file
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
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
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 laterCheck, verify, receipts and usage
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.