Quickstart
Certivu gives your AI-generated content a cryptographic signature — a tamper-evident, quantum-resistant proof of provenance. Anyone can verify that signature for free, forever.
1. Create an account
Section titled “1. Create an account”Sign up at certivu.ai/register. You’ll get a Free tier organization immediately — no credit card required.
After signing up, verify your email to unlock all features.
2. Register a generator
Section titled “2. Register a generator”A generator represents an AI model or pipeline. Each generator has its own ML-DSA keypair — the private key stays on your server, the public key is registered with Certivu.
Open the dashboard → Generators page and click Add Generator:
- Enter a name (e.g.
stable-diffusion-xl) - The dashboard generates an ML-DSA keypair for you
- Copy the private key immediately — it is shown only once
- The public key is automatically registered with Certivu
You’ll also receive your generator_id — keep it alongside the private key in your server’s environment variables.
3. Install the SDK
Section titled “3. Install the SDK”npm install @certivu/sdk# orbun add @certivu/sdkpip install certivuRequires Python 3.9+.
go env -w GOPROXY=https://cdn.certivu.ai/sdk/go,https://proxy.golang.org,directgo env -w GONOSUMDB=cdn.certivu.aiRequires Go 1.22+. See the Go SDK guide for the CDN-proxy details.
[registries.certivu]index = "sparse+https://cdn.certivu.ai/sdk/rust/"[dependencies]certivu = { version = "1.0.0", registry = "certivu" }Requires Rust 1.74+. See the Rust SDK guide for registry setup.
repositories { mavenCentral() maven { url "https://cdn.certivu.ai/sdk/maven" }}dependencies { implementation "ai.certivu:certivu:1.0.0"}Requires Java 17+. See the Java SDK guide for the Maven pom.xml form.
{ "repositories": [{ "type": "composer", "url": "https://cdn.certivu.ai/sdk/php" }], "require": { "certivu/sdk": "^1.0" }}Requires PHP 8.1+. See the PHP SDK guide for details.
curl -fsSL https://certivu.ai/install.sh | shInstalls a standalone binary — no runtime required.
4. Sign content
Section titled “4. Sign content”import { CertivuClient } from '@certivu/sdk'
const certivu = new CertivuClient({ apiKey: process.env.CERTIVU_API_KEY, generatorId: process.env.CERTIVU_GENERATOR_ID,})
const { token } = await certivu.sign({ content: await fs.readFile('./output.jpg'), model: 'stable-diffusion-xl',})
console.log(token) // ctv_7f3kx9mq2...from certivu import CertivuClient
client = CertivuClient( api_key="ctv_key_abc123", generator_id="your-generator-uuid",)
result = client.sign( content=open("output.jpg", "rb").read(), model="stable-diffusion-xl",)
print(result.token) # ctv_7f3kx9mq2...client := certivu.New("ctv_key_abc123", certivu.WithGeneratorID("your-generator-uuid"))
img, _ := os.ReadFile("output.jpg")res, err := client.Sign(context.Background(), img, "stable-diffusion-xl")
fmt.Println(res.Token) // ctv_7f3kx9mq2...let client = certivu::Client::builder("ctv_key_abc123") .generator_id("your-generator-uuid") .build();
let img = std::fs::read("output.jpg").unwrap();let res = client.sign(img, "stable-diffusion-xl").await?;
println!("{}", res.token); // ctv_7f3kx9mq2...CertivuClient client = CertivuClient.builder("ctv_key_abc123") .generatorId("your-generator-uuid") .build();
byte[] img = Files.readAllBytes(Path.of("output.jpg"));SignResult res = client.sign(img, "stable-diffusion-xl");
System.out.println(res.token()); // ctv_7f3kx9mq2...$client = new Certivu\Client('ctv_key_abc123', generatorId: 'your-generator-uuid');
$img = file_get_contents('output.jpg');$res = $client->sign($img, 'stable-diffusion-xl');
echo $res->token . "\n"; // ctv_7f3kx9mq2...certivu config set api-key ctv_key_abc123certivu config set generator-id your-generator-uuid
certivu sign ./output.jpg --model stable-diffusion-xl# ✓ Signed# Token ctv_7f3kx9mq2...The SDK and CLI automatically:
- Hash the content with SHA-3
- Sign the hash with ML-DSA (FIPS 204, post-quantum)
- Store a provenance record in Certivu
- Return a compact
ctv_token
5. Verify content
Section titled “5. Verify content”// Token auto-extracted from XMP metadata or watermark if not providedconst result = await certivu.verify({ content: imageBuffer })
if (result.authentic && result.confidence === 'high') { console.log('Verified:', result.provenance.org, result.provenance.signed_at)}result = client.verify(content=open("image.jpg", "rb").read())
if result.authentic and result.confidence == "high": print(f"Verified: {result.provenance.org} · {result.provenance.signed_at}")client := certivu.New("") // no API key needed to verify
res, err := client.Verify(context.Background(), imgBytes)if res.Authentic && res.Confidence == "high" { fmt.Println("Verified:", res.Provenance.Org, res.Provenance.SignedAt)}let client = certivu::Client::new(""); // no API key needed to verify
let res = client.verify(img_bytes).await?;if res.authentic && res.confidence == "high" { if let Some(p) = res.provenance { println!("Verified: {} · {}", p.org, p.signed_at); }}CertivuClient client = CertivuClient.create(""); // no API key needed to verify
VerifyResult res = client.verify(imgBytes);if (res.authentic() && res.confidence().equals("high")) { System.out.println("Verified: " + res.provenance().org() + " · " + res.provenance().signedAt());}$client = new Certivu\Client(''); // no API key needed to verify
$res = $client->verify($imgBytes);if ($res->authentic && $res->confidence === 'high') { echo "Verified: {$res->provenance['org']} · {$res->provenance['signed_at']}\n";}certivu verify ./image.jpg# ✓ Authentic — HIGH confidence# Org Acme AI# Model stable-diffusion-xlVerification is always free
Section titled “Verification is always free”No API key required to verify. Call POST /v1/verify directly, use the CLI, or use the public verifier at certivu.ai/verify.
Interactive API reference
Section titled “Interactive API reference”Explore and test all endpoints at api.certivu.ai/docs — powered by the OpenAPI 3.1 spec at api.certivu.ai/openapi.json.
What’s next
Section titled “What’s next”- Authentication guide — account flow, API keys vs session JWTs
- SDK Usage guide — batch verify, audit log, token status
- Python SDK guide — async client, error handling, AI/ML patterns
- Go SDK guide · Rust SDK guide · Java SDK guide · PHP SDK guide
- CLI Tool guide — config, CI usage, all flags
- Pricing & Quotas — plan limits and overage billing