Skip to main content

Quickstart

Sign your first asset in a few lines. @limboai/verifox-sdk-issuer runs in Node.js and returns a C2PA sidecar you embed back into the file. For the model behind it, see the Overview.

npm types runtime: Node.js

Install

npm install @limboai/verifox-sdk-issuer

The SDK ships as a WebAssembly module for Node.js. For browser-side verification, see @limboai/verifox-sdk-verifier.

Connect to the signing service

The SDK connects to the signing service at https://api.trylimbo.com. Pass your integration's token as an authorization: Bearer … header on SignerClient.connect. Configure the client once at startup, then invoke sign as needed.

Sign your first asset

You describe the asset's provenance as facts — where it came from (origin), what was composited in (components), and what was done to it (actions) — and the signer authors the C2PA manifest from them. A fresh camera capture is an origin of digitalCapture with nothing else.

sign-image.ts
import { SignerClient, AssetSdk, embed } from "@limboai/verifox-sdk-issuer";
import { readFile, writeFile } from "node:fs/promises";

const client = await SignerClient.connect("https://api.trylimbo.com", {
headers: { authorization: `Bearer ${process.env.LIMBO_API_KEY}` },
});
const sdk = AssetSdk.create(client);

const original = await readFile("photo.jpg");

const { sidecar } = await sdk.sign(original, "My Photo", {
origin: { sourceType: "digitalCapture" },
actions: [{ kind: "published" }],
}, { storage: { mode: "embedded" } });

const signed = embed(original, sidecar);
await writeFile("photo.signed.jpg", signed);

Run it:

node --experimental-strip-types sign-image.ts

Inspect the result

photo.signed.jpg is a standard JPEG. Any image viewer can open it, and a Verifier validates its embedded C2PA manifest.

Next steps