Developers

CanonProof API

Verify files, generate cryptographically signed certificates, and embed public verification in your product — without building forensic tooling yourself.

Upload → Verify → Certificate Explainable indicators + score Public verify link
API-first verification

Drop authenticity checks into your workflow

Quickstart

Authenticate, upload, fetch certificate

01

Create an API key

In your dashboard, create a key (you’ll only see the full token once). Store it securely.

Header: Authorization: Bearer cp_live_… Alt: X-Api-Key: cp_live_…
02

Upload and verify

Call POST /api/v1/client/verifications with multipart/form-data and a file field. You’ll receive a certificateId.

03

Fetch the certificate

Use GET /api/v1/client/certificates/{certificateId} to retrieve the signed certificate JSON for your audit trail.

Minimal integration

These are the real routes in the client API.

POST https://canonproof.com/api/v1/client/verifications
GET  https://canonproof.com/api/v1/client/certificates/{certificateId}
GET  https://canonproof.com/api/v1/client/usage/remaining
Auth: API Key (Bearer) Outputs: status + score + indicators Signed: ES256
Swagger note: your header must be Authorization: Bearer cp_live_… — not just the token.
Endpoints

Readable examples, like modern API docs

List API keys

Returns API keys for the current client user/org.

Auth: API Key (Bearer or X-Api-Key)
You can also send the key as: X-Api-Key: cp_live_... (no Bearer prefix).
curl -X GET "https://canonproof.com/api/v1/client/api-keys" \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const res = await fetch("https://canonproof.com/api/v1/client/api-keys", {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(await res.json());
import os, requests
r = requests.get(
  "https://canonproof.com/api/v1/client/api-keys",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Create API key

Creates a new API key for your org.

Auth: API Key (Bearer or X-Api-Key)
The request body shape may include extra fields depending on your implementation (e.g., scopes).
curl -X POST "https://canonproof.com/api/v1/client/api-keys" \
  -H "Authorization: Bearer cp_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "My integration key" }'
const res = await fetch("https://canonproof.com/api/v1/client/api-keys", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.CP_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ name: "My integration key" })
});
console.log(await res.json());
import os, requests
r = requests.post(
  "https://canonproof.com/api/v1/client/api-keys",
  headers={
    "Authorization": f"Bearer {os.getenv('CP_API_KEY')}",
    "Content-Type": "application/json"
  },
  json={"name": "My integration key"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Delete API key

Revokes an API key by id.

Auth: API Key (Bearer or X-Api-Key)
curl -X DELETE "https://canonproof.com/api/v1/client/api-keys/00000000-0000-0000-0000-000000000000" \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const id = "00000000-0000-0000-0000-000000000000";
const res = await fetch(`https://canonproof.com/api/v1/client/api-keys/${id}`, {
  method: "DELETE",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(res.status);
import os, requests
id = "00000000-0000-0000-0000-000000000000"
r = requests.delete(
  f"https://canonproof.com/api/v1/client/api-keys/{id}",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

List certificates

Paged list of certificates created by this API key’s user/org.

Auth: API Key
curl -X GET "https://canonproof.com/api/v1/client/certificates?page=1&pageSize=25" \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const res = await fetch("https://canonproof.com/api/v1/client/certificates?page=1&pageSize=25", {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(await res.json());
import os, requests
r = requests.get(
  "https://canonproof.com/api/v1/client/certificates",
  params={"page": 1, "pageSize": 25},
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Get certificate JSON

Fetch the sealed + signed certificate payload for audit trails and verification.

Auth: API Key
curl -X GET "https://canonproof.com/api/v1/client/certificates/cp1_..." \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const res = await fetch("https://canonproof.com/api/v1/client/certificates/cp1_...", {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(await res.json());
import os, requests
r = requests.get(
  "https://canonproof.com/api/v1/client/certificates/cp1_...",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Download certificate bundle

Downloads an offline verification bundle (e.g., JSON + signature material).

Auth: API Key
curl -L "https://canonproof.com/api/v1/client/certificates/cp1_.../bundle" \
  -H "Authorization: Bearer cp_live_YOUR_KEY" \
  -o cert-bundle.json
const res = await fetch("https://canonproof.com/api/v1/client/certificates/cp1_.../bundle", {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
const buf = await res.arrayBuffer();
console.log("bytes:", buf.byteLength);
import os, requests
r = requests.get(
  "https://canonproof.com/api/v1/client/certificates/cp1_.../bundle",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
open("cert-bundle.json", "wb").write(r.content)
print(r.status_code)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Usage / remaining summary

Returns remaining, included, credits and used counts for the current subscription window.

Auth: API Key
curl -X GET "https://canonproof.com/api/v1/client/usage/remaining" \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const res = await fetch("https://canonproof.com/api/v1/client/usage/remaining", {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(await res.json());
import os, requests
r = requests.get(
  "https://canonproof.com/api/v1/client/usage/remaining",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Create verification (upload file)

Multipart upload. Returns verification id + certificate reference (primary integration endpoint).

Auth: API Key (Bearer or X-Api-Key)
If you prefer, you can send the key as: X-Api-Key: cp_live_... (no Bearer prefix).
curl -X POST "https://canonproof.com/api/v1/client/verifications" \
  -H "Authorization: Bearer cp_live_YOUR_KEY" \
  -F "file=@/path/to/evidence.pdf"
const fs = require("fs");

const fd = new FormData();
fd.append("file", fs.createReadStream("/path/to/evidence.pdf"));

const res = await fetch("https://canonproof.com/api/v1/client/verifications", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.CP_API_KEY}`
  },
  body: fd
});

const data = await res.json();
console.log(data);
import os, requests

with open("/path/to/evidence.pdf", "rb") as f:
    r = requests.post(
        "https://canonproof.com/api/v1/client/verifications",
        headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"},
        files={"file": ("evidence.pdf", f, "application/pdf")}
    )
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Check verification status

Returns the current status for a verification id.

Auth: API Key
curl -X GET "https://canonproof.com/api/v1/client/verifications/00000000-0000-0000-0000-000000000000/status" \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const id = "00000000-0000-0000-0000-000000000000";
const res = await fetch(`https://canonproof.com/api/v1/client/verifications/${id}/status`, {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(await res.json());
import os, requests
id = "00000000-0000-0000-0000-000000000000"
r = requests.get(
  f"https://canonproof.com/api/v1/client/verifications/{id}/status",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

Retrieve verification result

Returns the verification result payload (status/score/confidence/indicators summary).

Auth: API Key
curl -X GET "https://canonproof.com/api/v1/client/verifications/00000000-0000-0000-0000-000000000000/result" \
  -H "Authorization: Bearer cp_live_YOUR_KEY"
const id = "00000000-0000-0000-0000-000000000000";
const res = await fetch(`https://canonproof.com/api/v1/client/verifications/${id}/result`, {
  method: "GET",
  headers: { "Authorization": `Bearer ${process.env.CP_API_KEY}` }
});
console.log(await res.json());
import os, requests
id = "00000000-0000-0000-0000-000000000000"
r = requests.get(
  f"https://canonproof.com/api/v1/client/verifications/{id}/result",
  headers={"Authorization": f"Bearer {os.getenv('CP_API_KEY')}"}
)
print(r.status_code, r.text)
Base: https://canonproof.com Key: cp_live_… JSON + signatures

This page is designed as a sales+explain API overview, not the full reference.

Operational confidence

Built for evidence workflows

Security primitives

  • SHA-256 hashing recorded on certificates
  • ES256 signature on certificate payloads
  • Public verification validates authenticity of the certificate (not “truth”)
  • AI is advisory-only and expressed as indicators when available

Developer-friendly

  • Clear response shapes: status, score, confidence, indicators
  • Simple “verify then certificate” pattern
  • Works for images, audio, video, and PDFs
  • Integrates cleanly with your case IDs and intake metadata
FAQ

Questions dev teams ask

No — CanonProof certifies integrity and authenticity signals of a file and signs the result. It does not determine the truth of claims or events.

Typically: fileId, sha256, status, score/confidence, certificateId, and the publicUrl. Fetch and archive the certificate JSON when you need immutable audit trails.

AI is advisory-only. When available it becomes indicators (e.g., probabilities/confidence) and is never the sole decisive factor.

Yes — the /c/{publicId} link is designed exactly for that. It verifies the certificate signature and shows the result without requiring an account.

Want API access?

Start with Professional Integrity or Advanced Assurance. If you’re a platform, talk to us about enterprise terms.