Sign your first image in 5 minutes
This guide walks you through creating an account, generating a signing key, and signing your first image. Choose your integration method.
Prerequisites
- A Tectra account (free - create one below)
- curl installed (for API path) OR Python 3.10+ (for SDK path) OR Node.js 18+ (for TypeScript path) OR Docker (for agent path)
Step 1 - Create your account
Register at tectra.vision or via the API:
curl -X POST https://tectra.vision/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "you@company.com",
"password": "your-password",
"org_name": "Acme AI Inc.",
"org_type": "ai_provider"
}'
# Response:
# {
# "access_token": "eyJ...",
# "user": { "id": "...", "org_name": "Acme AI Inc." }
# }Save the access_token - you'll use it below.
Step 2 - Create an API key
API keys (prefixed iai_) are used for programmatic access:
curl -X POST https://tectra.vision/api/v1/keys/api-keys \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "production"}'
# Response:
# {
# "key": "iai_live_abc123xyz...",
# "id": "uuid-here"
# }
# Save the key - it is only shown once.Step 3 - Generate a signing key
Each signing key is an Ed25519 keypair. The private key is Fernet-encrypted and stored server-side.
curl -X POST https://tectra.vision/api/v1/keys/signing-keys \
-H "Authorization: Bearer iai_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"name": "main-key",
"origin_type": "ai_generated_image"
}'
# Response:
# {
# "id": "signing-key-uuid",
# "public_key_hex": "abc123...",
# "name": "main-key"
# }
# Save the signing key ID.Path A - REST API
Works with any language. Just HTTP.
Sign an image
curl -X POST "https://tectra.vision/api/v1/sign?signing_key_id=YOUR_KEY_UUID" \
-H "Authorization: Bearer iai_live_abc123..." \
-F "file=@your-image.png"
# Returns JSON certificate:
# {
# "record_id": "uuid",
# "sha256": "abc123...",
# "blockchain_status": "pending",
# "certificate": { ... }
# }Verify an image (no auth needed)
curl -X POST https://tectra.vision/api/v1/verify \
-F "file=@your-image.png"
# Returns:
# {
# "authentic": true,
# "confidence": 0.95,
# "signer": { "org_name": "Acme AI Inc." },
# "blockchain_tx": "0x...",
# "checks": {
# "watermark": { "passed": true, "details": "..." },
# "sha256": { "passed": true, "details": "..." },
# "perceptual_hash": { "passed": true, "details": "..." },
# "blockchain": { "passed": true, "details": "..." }
# }
# }Path B - Python SDK
Signs locally. Your image bytes never leave your machine.
pip install tectravision-sdkYou'll need your Fernet key from the dashboard (used to decrypt your private signing key locally):
from tectravision_sdk import TectraClient
client = TectraClient(
api_key="iai_live_abc123...",
signing_key_id="your-signing-key-uuid",
api_url="https://tectra.vision",
fernet_key="your-fernet-key", # from dashboard
)
# Sign an image
result = client.sign("photo.jpg")
print(f"Record: {result['record_id']}")
print(f"Watermarked: {result['output_path']}")
# Verify
result = client.verify("photo.jpg")
print(f"Authentic: {result['authentic']}")
print(f"Signer: {result['signer']['org_name']}")Path C - Docker Agent
Auto-sign all files in a directory. Zero code required.
# config.yaml
tectra:
api_url: https://tectra.vision
api_key: iai_live_abc123...
signing_key_id: your-signing-key-uuid
watch:
directories:
- /data/input
patterns: ["*.jpg", "*.jpeg", "*.png", "*.mp4"]
recursive: true
output:
signed_directory: /data/signed
keep_originals: true# docker-compose.yml
services:
tectra-agent:
image: tectravision/agent:latest
volumes:
- ./config.yaml:/app/config.yaml:ro
- /path/to/output:/data/input
- /path/to/signed:/data/signed
restart: unless-stoppeddocker compose up -d
# The agent watches /path/to/output and signs every new file automatically.Path D - TypeScript SDK
Sign and verify from Node.js or the browser.
npm install @tectra/sdkimport { TectraClient } from "@tectra/sdk";
const client = new TectraClient({
apiKey: "iai_live_abc123...",
signingKeyId: "your-signing-key-uuid",
});
// Sign an image
const signResult = await client.sign("./photo.jpg");
console.log("Record:", signResult.recordId);
console.log("Watermarked:", signResult.outputPath);
// Verify an image
const verifyResult = await client.verify("./photo.jpg");
console.log("Authentic:", verifyResult.authentic);
console.log("Signer:", verifyResult.signer?.orgName);See the full TypeScript SDK documentation for batch signing, video support, and more.
Just want to verify?
Install the tectra-verify open-source package or use the Chrome browser extension - no account needed.
What's next?
Learn how each layer of verification works under the hood.