Profile creation

Trust profiles define what "trusted" means for your use case. They specify which assertions an image must carry and how those assertions are evaluated.

How trust profiles work

A trust profile is a multi-document YAML file. The first document contains metadata (name, issuer, version). Subsequent documents contain sections of checks -- each check has an expression that is evaluated against the image's extracted metadata.

When verification runs, each expression returns true or false. The ratio of passed checks to total checks determines the trust score: >= 0.95 is "pass", >= 0.7 is "warning", below that is "fail".

Workflow

Profile creation workflow
Input: template or check IDs
↓
create_profile()
↓
Resolve template → check definitions
↓
Build assertions with expressions
↓
profile_to_yaml() / save_profile()
↓
Output: profile YAML file

Python API

from jpegtrust import create_profile, save_profile, profile_to_yaml

# From a predefined template
profile = create_profile(
    template="newsroom",
    name="AP Wire Photo Policy",
    issuer="Associated Press",
)
save_profile(profile, "newsroom.yml")

# With specific checks only
profile = create_profile(
    check_ids=["signature_chain", "pixel_hash", "author_identity"],
    name="Minimal Policy",
)

# Get YAML string without saving
yaml_str = profile_to_yaml(profile)

CLI

# Create from template
jpegtrust profile create --template newsroom --name "Wire Photo" -o profile.yml

# List available templates
jpegtrust profile list-templates

# List all available checks
jpegtrust profile list-checks

# Create with specific checks
jpegtrust profile create --checks signature_chain,pixel_hash -o minimal.yml

Profile YAML structure

# Document 1: metadata
---
metadata:
  name: "Wire Photo Policy"
  issuer: "Associated Press"
  date: "2025-06-15T00:00:00Z"
  version: "1.0.0"
  language: en

# Document 2: required checks
---
- id: required_checks_info
  title: "Required checks"
  report_text: "Required checks for Wire Photo Policy"

- id: signature_chain
  description: "Valid cryptographic signature"
  expression: >
    manifests[0].status.signature == "claimSignature.validated"
  report_text:
    'true':
      en: "Valid signature chain found"
    'false':
      en: "No valid signature chain"

# Document 3: optional checks
---
- id: optional_checks_info
  title: "Optional checks"
  report_text: "Optional checks for Wire Photo Policy"

- id: gps_location
  description: "Geolocation data"
  expression: >
    manifests[0].assertions.'cawg.metadata'.'exif:GPSLatitude' != null
  report_text:
    'true':
      en: "GPS location data is present"
    'false':
      en: "No GPS location data found"

Available checks

Check Level Description
signature_chain required Valid cryptographic signature anchored to a trust root
capture_timestamp required UTC time set by camera at exposure
author_identity required Name and credential of the creator
edit_history required Chain of signed actions from capture to publication
ai_declaration required Explicit AI usage statement
gps_location optional Geolocation data
copyright optional Rights declaration and usage terms
data_mining optional Data mining usage permissions
pixel_hash required SHA-256 pixel data integrity

Predefined templates

Templates are named sets of check IDs. When you create a profile from a template, the corresponding checks are automatically enabled.

newsroom

All 9 checks enabled. Strictest profile -- every assertion must be present.

insurance

6 checks: signature_chain, capture_timestamp, author_identity, edit_history, gps_location, pixel_hash

creator

5 checks: signature_chain, author_identity, copyright, ai_declaration, pixel_hash

ai-labelling

7 checks: signature_chain, ai_declaration, digital_source_type, ai_labelling, edit_history, pixel_hash, data_mining

custom

No checks enabled by default. Pass check_ids to select exactly which checks you need.