The Lumethic Verification API

A photo verification API takes an uploaded image, checks it against its camera RAW file or its Content Credentials, and returns a signed result your application can act on. The Lumethic REST API does that for user-uploaded photos at any volume.

What the API does

You send a photo and, when you have it, the RAW file it came from. The API checks that the RAW holds real sensor data, that the photo matches it and that the metadata of both agrees with the camera, then signs the photo with a C2PA credential that records the result. Without a RAW it reads the Content Credentials and metadata the file already carries. The RAW is discarded after the check and processing runs in the European Union.

Three endpoints cover the workflow: POST /v1/verifications/ uploads the files and starts the check, GET /v1/verifications/{id} returns the status and the result, and POST /v1/verifications/{id}/share creates a report link you can hand to a reviewer. The full reference below lists every endpoint with request and response examples, and the same key works for the MCP server.

Pricing is per verification. The free plan includes 5 verifications a month, Basic includes 25 for €3.95 a month, Professional includes 500 for €49.95 a month, and additional verifications cost €0.25 each. Checks of an image without a RAW file are free and do not count toward the quota. Enterprise volumes are priced on request.

How to Get Started

Sign Up

Create an account to get access to the API.

Get Your Key

Generate an API key from your account dashboard.

Start Building

Use the documentation below to integrate and start verifying.

Using Lumethic from AI agents

Prefer to call Lumethic from an AI agent instead of raw HTTP? Our Model Context Protocol (MCP) server lets any MCP-capable client verify photo authenticity over a Streamable HTTP endpoint — with the same API key.

https://api.lumethic.com/mcp

View MCP docs

Sign Up to Get Started

Authenticate your requests by passing your API key as a Bearer Token in the Authorization header. You can create and manage your keys in your account dashboard.

API Overview

Lumethic - Integration API v1.0.0 · 43 endpoints

RESTful API for photo authenticity verification. Build automated integrations with any programming language: photo management systems, DAMs, CMSs, editorial workflows, or AI agents.

Base URL: https://api.lumethic.com

Upload RAW + photo pairs (or photo-only for a C2PA check)
Verify authenticity analysis
Share shareable reports

Authentication

Header: X-API-Key: your_key

Get your API key →

File Formats

RAW: CR2, CR3, ARW, NEF, DNG, RAF, ORF, RW2, PEF, SRW (optional; omit for an image-only C2PA check)

Image (pair): JPEG, HEIF/HEIC (only these corroborate the RAW)

Image (image-only): JPEG, PNG, WebP, HEIF/HEIC, AVIF, TIFF, GIF

Pricing

Free: 5 verifications/mo

Basic: 25/mo, €3.95

Professional: 500/mo, €49.95, incl. 50 PSD exports/mo

Enterprise: volume pricing, SLA

Overage: €0.25 (negotiable at volume). Billed in EUR for eurozone billing addresses and USD elsewhere, at the same numbers. Image-only checks are free and don't count toward quota. Plans →

Quick Start

# 1. Create a verification (omit -F "raw=..." for an image-only C2PA check)
curl -X POST "https://api.lumethic.com/v1/verifications/" \
  -H "X-API-Key: your_api_key" \
  -F "raw=@photo.CR2" -F "image=@photo.jpg"

# 2. Poll for result (every 20s, timeout 10min)
curl "https://api.lumethic.com/v1/verifications/{id}" -H "X-API-Key: your_api_key"

# Response: { status, assurance_level: "verified", capture_verified: true,
#             verification_mode: "raw_pair", result: true, result_confidence: 0.95 }
# Key on assurance_level + capture_verified; the result boolean is legacy.

Processing runs forensic analyses (RAW integrity, EXIF, sensor patterns, SSIM, histogram, recapture detection). See our whitepaper for details.

For AI Agents & Automated Integrations

Use the OpenAPI 3.1 spec to auto-generate type-safe clients:

openapi-generator generate -i https://api.lumethic.com/openapi.json -g python -o ./client
Workflow: POST /v1/verifications/ → Poll GET /v1/verifications/{id} → Read assurance_level & capture_verified

API Endpoints

Complete reference for all 43 endpoints, grouped by functionality.

Verifications

Create and manage photo authenticity verifications.

24 endpoints
GET/v1/verifications/
Auth

List Verifications

Retrieve a paginated list of photo authenticity verifications for your account.

View Details

Parameters

NameInType
offsetqueryinteger
sizequeryinteger
sort_byquerystring
sort_orderquerystring
searchquerystring
statusquerystring
resultquerystring
tagsquerystring
tag_matchquerystring

✓ Response 200 — Paginated list of verifications

FieldType
items*object[]
total*integer
offset*integer
size*integer
total_pages*integer
▶ Example Response
{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "status": "...",
      "results": [
        "..."
      ],
      "result": null,
      "result_confidence": null,
      "assurance_level": null,
      "assurance_reason": null,
      "verdict": null,
      "verdict_reason": null,
      "evidence_report": null,
      "verification_mode": "...",
      "capture_verified": false,
      "raw_metadata": null,
      "image_metadata": null,
      "rendition_info": null,
      "rendition_corrected_info": null,
      "raw_photo_hash": null,
      "image_photo_hash": null,
      "image_thumbnail_url": null,
      "name": null,
      "short_code": null,
      "tags": [
        "..."
      ],
      "comment_count": 0,
      "account_id": "550e8400-e29b-41d4-a716-446655440000",
      "updated_at": "2024-01-15T10:30:00Z",
      "created_at": "2024-01-15T10:30:00Z"
    }
  ],
  "total": 0,
  "offset": 0,
  "size": 0,
  "total_pages": 0
}
▶ Error Responses (3)
400Invalid filter or sort parameter
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/verifications/
Auth

Create Verification

Create a new photo authenticity verification by uploading RAW and JPEG files.

View Details

Request Body (multipart/form-data) *

FieldType
image*string(binary)
rawstring
attestation_idstring
▶ Example Request
{
  "image": "<binary file>",
  "raw": null,
  "attestation_id": null
}

✓ Response 201 — Verification created and queued for processing

FieldType
id*string(uuid)
security_scorenumber
▶ Example Response
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
▶ Error Responses (3)
402Quota or budget limit reached
404Not found
422File hash mismatch
POST/v1/verifications/claim
Auth

Claim Verifications

Claim anonymous verifications into the authenticated account.

View Details

Request Body (application/json) *

FieldType
anonymous_user_id*string
▶ Example Request
{
  "anonymous_user_id": "string"
}

✓ Response 200 — Anonymous verifications claimed

FieldType
claimed*integer
verification_ids*string[]
▶ Example Response
{
  "claimed": 0,
  "verification_ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
▶ Error Responses (5)
404Not found
409Already claimed by another account
410Claim window elapsed
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
429Too many claim attempts
GET/v1/verifications/{verification_id}
Auth

Get Verification

Retrieve detailed results for a specific photo verification.

View Details

Parameters

NameInType
verification_id*pathstring

✓ Response 200 — Verification details returned

FieldType
id*string(uuid)
psd_exportobject
anchored_inobject[]
status*"pending" | "queued" | "in_progress" | "completed" | "failed"
failure_reasonstring
results*object[]
result*boolean
result_confidence*number
assurance_level"verified" | "provisional" | "provenance" | "unrated" | "flagged"
assurance_reasonstring
verdict"ai_declared" | "modified_after_signing" | "provenance_verified" | "self_declared_ai" | "unrated"
verdict_reason"watermark_detected" | "c2pa_generative_declared" | "tampered" | "invalid_signature" | "c2pa_trusted_capture" | "untrusted_signer_generative" | "iptc_digital_source_type" | "generator_metadata" | "container_signature" | "untrusted_signer" | "trust_unverified" | "no_capture_claim" | "no_trusted_timestamp" | "unlisted_actions_present" | "computational_capture_only" | "unrated_indeterminate" | "unrated_reviewed_clean" | "unrated_no_evidence"
evidence_reportobject
verification_mode"raw_pair" | "image_only"
capture_verifiedboolean
raw_metadata*object
image_metadata*object
rendition_info*object
rendition_corrected_info*object
raw_photo_hash*string
image_photo_hash*string
image_thumbnail_url*string
name*string
tagsobject[]
comment_countinteger
account_id*string(uuid)
updated_at*string(date-time)
created_at*string(date-time)
security_scorenumber
attestation_validatedboolean
device_fingerprint_idstring
camera_fingerprint_idstring
sequence_numberinteger
integrity_scorenumber
jailbreak_indicatorsstring[]
capture_gps_latitudenumber
capture_gps_longitudenumber
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "psd_export": null,
  "anchored_in": null,
  "status": "pending",
  "failure_reason": null,
  "results": [
    {
      "verificator_id": "550e8400-e29b-41d4-a716-446655440000",
      "verification_id": "550e8400-e29b-41d4-a716-446655440000",
      "details": {},
      "result": null,
      "confidence_score": 0,
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "updated_at": "2024-01-15T10:30:00Z",
      "created_at": "2024-01-15T10:30:00Z"
    }
  ],
  "result": null,
  "result_confidence": null,
  "assurance_level": null,
  "assurance_reason": null,
  "verdict": null,
  "verdict_reason": null,
  "evidence_report": null,
  "verification_mode": "raw_pair",
  "capture_verified": false,
  "raw_metadata": null,
  "image_metadata": null,
  "rendition_info": null,
  "rendition_corrected_info": null,
  "raw_photo_hash": null,
  "image_photo_hash": null,
  "image_thumbnail_url": null,
  "name": null,
  "tags": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "color": null
    }
  ],
  "comment_count": 0,
  "account_id": "550e8400-e29b-41d4-a716-446655440000",
  "updated_at": "2024-01-15T10:30:00Z",
  "created_at": "2024-01-15T10:30:00Z",
  "security_score": null,
  "attestation_validated": false,
  "device_fingerprint_id": null,
  "camera_fingerprint_id": null,
  "sequence_number": null,
  "integrity_score": null,
  "jailbreak_indicators": null,
  "capture_gps_latitude": null,
  "capture_gps_longitude": null
}
▶ Error Responses (2)
404Verification not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
DELETE/v1/verifications/{verification_id}
Auth

Delete Verification

Delete a verification permanently.

View Details

Parameters

NameInType
verification_id*pathstring

✓ Response 200 — Verification deleted

FieldType
detail*string
▶ Example Response
{
  "detail": "string"
}
▶ Error Responses (3)
403Access denied
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/share
Auth

Get Verification Share

Get current sharing configuration for a verification.

View Details

Parameters

NameInType
verification_id*pathstring

✓ Response 200 — Share settings returned

FieldType
verification_id*string(uuid)
access_type*"restricted" | "anyone_with_link"
share_url*string
invited_emails*string[]
▶ Example Response
{
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "access_type": "restricted",
  "share_url": "string",
  "invited_emails": [
    "string"
  ]
}
▶ Error Responses (3)
403Sharing not available
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/verifications/{verification_id}/share
Auth

Create Or Update Verification Share

Enable or update sharing settings for a verification.

View Details

Parameters

NameInType
verification_id*pathstring

Request Body (application/json) *

FieldType
access_type*"restricted" | "anyone_with_link"
▶ Example Request
{
  "access_type": "anyone_with_link"
}

✓ Response 200 — Sharing enabled or updated

FieldType
verification_id*string(uuid)
access_type*"restricted" | "anyone_with_link"
share_url*string
invited_emails*string[]
▶ Example Response
{
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "access_type": "restricted",
  "share_url": "string",
  "invited_emails": [
    "string"
  ]
}
▶ Error Responses (3)
403Sharing not available
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
DELETE/v1/verifications/{verification_id}/share
Auth

Delete Verification Share

Disable sharing for a verification (make it private).

View Details

Parameters

NameInType
verification_id*pathstring

✓ Response 200 — Sharing disabled

FieldType
detail*string
▶ Example Response
{
  "detail": "string"
}
▶ Error Responses (3)
403Sharing not available
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/verifications/{verification_id}/share/invites
Auth

Add Verification Invite

Invite a specific user to access a shared verification.

View Details

Parameters

NameInType
verification_id*pathstring

Request Body (application/json) *

FieldType
email*string(email)
▶ Example Request
{
  "email": "editor@newspaper.com"
}

✓ Response 200 — User invited

FieldType
email*string
user_exists*boolean
▶ Example Response
{
  "email": "string",
  "user_exists": true
}
▶ Error Responses (4)
400Not shared
403Sharing not available
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
DELETE/v1/verifications/{verification_id}/share/invites
Auth

Remove Verification Invite

Remove a user's access to a shared verification.

View Details

Parameters

NameInType
verification_id*pathstring

Request Body (application/json) *

FieldType
email*string(email)
▶ Example Request
{
  "email": "editor@newspaper.com"
}

✓ Response 200 — User access revoked

FieldType
detail*string
▶ Example Response
{
  "detail": "string"
}
▶ Error Responses (3)
403Sharing not available
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/analytics/views
Auth

Get Verification View Analytics

Get view analytics for a shared verification.

View Details

Parameters

NameInType
verification_id*pathstring
start_datequerystring
end_datequerystring

✓ Response 200 — View analytics returned

FieldType
total_views*integer
daily_views*object[]
▶ Example Response
{
  "total_views": 0,
  "daily_views": [
    {
      "date": "string",
      "count": 0
    }
  ]
}
▶ Error Responses (3)
400Invalid date format
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/renditions/thumbnail
Auth

Get Verification Thumbnail

Get the thumbnail image for a verification.

View Details

Parameters

NameInType
verification_id*pathstring
▶ Example Response
null

302: Redirect to CDN thumbnail URL

▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/renditions/signed/original
Auth

Get Verification Watermarked Image

Download the original JPEG with Lumethic verification watermark.

View Details

Parameters

NameInType
verification_id*pathstring

302: Redirect to pre-signed S3 URL for the watermarked image

307: Redirect to watermarked image URL with verification strip.

▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/psd-export
Auth

Poll a PSD export's state

Poll one PSD export's state.

View Details

Parameters

NameInType
verification_id*pathstring

✓ Response 200 — Successful Response

FieldType
status*"pending" | "queued" | "in_progress" | "completed" | "failed"
file_size_bytesinteger
canvas_widthinteger
canvas_heightinteger
downloads_usedinteger
downloads_limitinteger
expires_atstring
errorstring
created_at*string(date-time)
▶ Example Response
{
  "status": "pending",
  "file_size_bytes": null,
  "canvas_width": null,
  "canvas_height": null,
  "downloads_used": 0,
  "downloads_limit": 5,
  "expires_at": null,
  "error": null,
  "created_at": "2024-01-15T10:30:00Z"
}
▶ Error Responses (2)
404Verification not found, or no export requested yet (PSD_EXPORT_NOT_FOUND)
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/verifications/{verification_id}/psd-export
Auth

Request a flicker-comparison PSD export

Request a layered PSD of a completed RAW+JPEG verification.

View Details

Parameters

NameInType
verification_id*pathstring
waitqueryinteger

✓ Response 202 — Export state (existing or newly created)

FieldType
status*"pending" | "queued" | "in_progress" | "completed" | "failed"
file_size_bytesinteger
canvas_widthinteger
canvas_heightinteger
downloads_usedinteger
downloads_limitinteger
expires_atstring
errorstring
created_at*string(date-time)
▶ Example Response
{
  "status": "pending",
  "file_size_bytes": null,
  "canvas_width": null,
  "canvas_height": null,
  "downloads_used": 0,
  "downloads_limit": 5,
  "expires_at": null,
  "error": null,
  "created_at": "2024-01-15T10:30:00Z"
}
▶ Error Responses (5)
402Budget cap would be exceeded (BUDGET_EXCEEDED)
403Plan not entitled — Professional+ only (NOT_ENTITLED)
404Verification not found
409Verification not completed, or image-only (VALIDATION_ERROR)
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/psd-export/download
Auth

Download the generated PSD

Redirect to a short-lived signed URL for the generated PSD.

View Details

Parameters

NameInType
verification_id*pathstring

302: Redirect to a short-lived signed URL; consumes one of the 5 downloads

307: Successful Response

▶ Error Responses (5)
403Download limit used up (DOWNLOAD_LIMIT_REACHED)
404Verification not found, or no export requested yet (PSD_EXPORT_NOT_FOUND)
409Export not ready yet
410Export expired — re-request to regenerate free of charge (EXPIRED)
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/image
Auth

Get Verification Image

Download the JPEG image file for a verification.

View Details

Parameters

NameInType
verification_id*pathstring

302: Redirect to pre-signed S3 URL for direct download

307: Redirects to a temporary direct download URL for the JPEG image.

▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/verifications/{verification_id}/tags
Auth

Add tags to a verification

Add tags without touching the ones already present (safe for concurrent scripts).

View Details

Parameters

NameInType
verification_id*pathstring(uuid)

Request Body (application/json) *

FieldType
tags*string[]
▶ Example Request
{
  "tags": [
    "Client A",
    "wedding",
    "invoice sent"
  ]
}

✓ Response 200 — Successful Response

FieldType
tags*object[]
▶ Example Response
{
  "tags": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "color": null
    }
  ]
}
▶ Error Responses (2)
404Verification not found
422Invalid tag name, or too many tags
PUT/v1/verifications/{verification_id}/tags
Auth

Replace the tags on a verification

Set the verification's tags to exactly this list.

View Details

Parameters

NameInType
verification_id*pathstring(uuid)

Request Body (application/json) *

FieldType
tags*string[]
▶ Example Request
{
  "tags": [
    "Client A",
    "wedding",
    "invoice sent"
  ]
}

✓ Response 200 — Successful Response

FieldType
tags*object[]
▶ Example Response
{
  "tags": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "color": null
    }
  ]
}
▶ Error Responses (2)
404Verification not found
422Invalid tag name, or too many tags
DELETE/v1/verifications/{verification_id}/tags/{tag_id}
Auth

Remove one tag from a verification

Detach a tag from the verification. The tag stays in the account vocabulary.

View Details

Parameters

NameInType
verification_id*pathstring(uuid)
tag_id*pathstring(uuid)

✓ Response 200 — Successful Response

FieldType
tags*object[]
▶ Example Response
{
  "tags": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "color": null
    }
  ]
}
▶ Error Responses (2)
404Verification not found, or tag not on this verification
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/verifications/{verification_id}/comments
Auth

List comments on a verification

All comments on the verification, oldest first. Visible to the owning account only.

View Details

Parameters

NameInType
verification_id*pathstring(uuid)

✓ Response 200 — Successful Response

FieldType
items*object[]
total*integer
▶ Example Response
{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "verification_id": "550e8400-e29b-41d4-a716-446655440000",
      "author_user_id": null,
      "author_name": null,
      "body": "string",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z",
      "edited_at": null
    }
  ],
  "total": 0
}
▶ Error Responses (2)
404Verification not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/verifications/{verification_id}/comments
Auth

Add a comment to a verification

Post an internal comment. The author is the calling user; API-key calls carry the key's owner.

View Details

Parameters

NameInType
verification_id*pathstring(uuid)

Request Body (application/json) *

FieldType
body*string
▶ Example Request
{
  "body": "Client confirmed this is the final edit."
}

✓ Response 201 — Successful Response

FieldType
id*string(uuid)
verification_id*string(uuid)
author_user_id*string
author_name*string
body*string
created_at*string(date-time)
updated_at*string(date-time)
edited_atstring
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "author_user_id": null,
  "author_name": null,
  "body": "string",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z",
  "edited_at": null
}
▶ Error Responses (2)
404Verification not found
422Empty or oversized comment, or comment limit reached
DELETE/v1/verifications/{verification_id}/comments/{comment_id}
Auth

Delete a comment

Delete a comment. Allowed for its author and for admins of the account.

View Details

Parameters

NameInType
verification_id*pathstring(uuid)
comment_id*pathstring(uuid)

204: Successful Response

▶ Error Responses (3)
403Not the author and not an account admin
404Comment not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
PATCH/v1/verifications/{verification_id}/comments/{comment_id}
Auth

Edit your own comment

Replace the body of a comment you wrote. Stamps ``edited_at``.

View Details

Parameters

NameInType
verification_id*pathstring(uuid)
comment_id*pathstring(uuid)

Request Body (application/json) *

FieldType
body*string
▶ Example Request
{
  "body": "Client confirmed this is the final edit (v2)."
}

✓ Response 200 — Successful Response

FieldType
id*string(uuid)
verification_id*string(uuid)
author_user_id*string
author_name*string
body*string
created_at*string(date-time)
updated_at*string(date-time)
edited_atstring
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "author_user_id": null,
  "author_name": null,
  "body": "string",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z",
  "edited_at": null
}
▶ Error Responses (3)
403Not the comment's author
404Comment not found
422Empty or oversized comment

Public Access

Public endpoints without authentication. Perfect for anonymous verifications and accessing shared results.

1 endpoint
GET/v1/public/health
Public

Health Check

Check API health status for monitoring and integration verification.

View Details
▶ Example Response
{}
▶ Error Responses (1)
404Not found

API Keys

Programmatically manage API keys for your account.

3 endpoints
GET/v1/apikeys/
Auth

List Api Keys

List all API keys for your current account.

View Details
▶ Example Response
[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "prefix": "string",
    "account_id": "550e8400-e29b-41d4-a716-446655440000",
    "user_id": "550e8400-e29b-41d4-a716-446655440000",
    "description": null,
    "expires_at": "2024-01-15T10:30:00Z",
    "is_active": true,
    "last_used_at": null,
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
]
▶ Error Responses (1)
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/apikeys/
Auth

Create Api Key

Create a new API key for programmatic access to the Lumethic API.

View Details

Request Body (application/json) *

FieldType
descriptionstring
account_id*string(uuid)
expires_in_daysinteger
scopestring
▶ Example Request
{
  "account_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "description": "CI/CD pipeline key",
  "expires_in_days": 90
}

✓ Response 201 — API key created successfully

FieldType
id*string(uuid)
prefix*string
account_id*string(uuid)
user_id*string(uuid)
description*string
expires_at*string(date-time)
created_at*string(date-time)
raw_key*string
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "prefix": "string",
  "account_id": "550e8400-e29b-41d4-a716-446655440000",
  "user_id": "550e8400-e29b-41d4-a716-446655440000",
  "description": null,
  "expires_at": "2024-01-15T10:30:00Z",
  "created_at": "2024-01-15T10:30:00Z",
  "raw_key": "string"
}
▶ Error Responses (2)
403Access denied
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
DELETE/v1/apikeys/{key_id}
Auth

Revoke Api Key

Revoke an API key, permanently disabling it.

View Details

Parameters

NameInType
key_id*pathstring(uuid)

204: Key revoked successfully

▶ Error Responses (2)
404API key not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}

Marketplace

Buy and sell verified authentic photos with built-in licensing.

11 endpoints
GET/v1/marketplace/listings
Auth

Get Seller Listings

List all marketplace listings owned by your account.

View Details

Parameters

NameInType
limitqueryinteger
offsetqueryinteger
▶ Example Response
[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "verification_id": "550e8400-e29b-41d4-a716-446655440000",
    "title": "string",
    "description": null,
    "is_active": true,
    "currency": "string",
    "price_personal_cents": null,
    "price_commercial_cents": null,
    "price_editorial_cents": null,
    "price_extended_cents": null,
    "license_terms_personal": null,
    "license_terms_commercial": null,
    "license_terms_editorial": null,
    "license_terms_extended": null,
    "total_sales": 0,
    "total_revenue_cents": 0,
    "created_at": "string",
    "updated_at": "string"
  }
]
▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/marketplace/listings
Auth

Create Listing

Create a marketplace listing for a verified photo.

View Details

Parameters

NameInType
verification_id*querystring(uuid)

Request Body (application/json) *

FieldType
title*string
descriptionstring
currency"usd" | "cad" | "mxn" | "eur" | "gbp" | "chf" | "sek" | "nok" | "dkk" | "pln" | "czk" | "huf" | "ron" | "bgn" | "aud" | "nzd" | "jpy" | "sgd" | "hkd" | "krw" | "cny" | "inr" | "thb" | "myr" | "brl" | "aed" | "zar" | "ils"
price_personal_centsinteger
price_commercial_centsinteger
price_editorial_centsinteger
price_extended_centsinteger
license_terms_personalstring
license_terms_commercialstring
license_terms_editorialstring
license_terms_extendedstring
▶ Example Request
{
  "currency": "usd",
  "description": "Authenticated landscape photo taken with Nikon Z9",
  "license_terms_commercial": "Commercial use in marketing materials",
  "license_terms_editorial": "Editorial use in news and publications",
  "license_terms_extended": "Unlimited commercial use including merchandise",
  "license_terms_personal": "Personal use only, no redistribution",
  "price_commercial_cents": 5000,
  "price_editorial_cents": 2000,
  "price_extended_cents": 10000,
  "price_personal_cents": 1000,
  "title": "Sunset over Lake Zurich"
}

✓ Response 201 — Listing created successfully

FieldType
id*string(uuid)
verification_id*string(uuid)
title*string
description*string
is_active*boolean
currency*string
price_personal_cents*integer
price_commercial_cents*integer
price_editorial_cents*integer
price_extended_cents*integer
license_terms_personal*string
license_terms_commercial*string
license_terms_editorial*string
license_terms_extended*string
total_sales*integer
total_revenue_cents*integer
created_at*string
updated_at*string
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "title": "string",
  "description": null,
  "is_active": true,
  "currency": "string",
  "price_personal_cents": null,
  "price_commercial_cents": null,
  "price_editorial_cents": null,
  "price_extended_cents": null,
  "license_terms_personal": null,
  "license_terms_commercial": null,
  "license_terms_editorial": null,
  "license_terms_extended": null,
  "total_sales": 0,
  "total_revenue_cents": 0,
  "created_at": "string",
  "updated_at": "string"
}
▶ Error Responses (4)
402Plan upgrade required
403Anonymous verification
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/marketplace/listings/{listing_id}
Public

Get Listing

Get a marketplace listing by ID.

View Details

Parameters

NameInType
listing_id*pathstring(uuid)

✓ Response 200 — Listing returned

FieldType
id*string(uuid)
verification_id*string(uuid)
title*string
description*string
is_active*boolean
currency*string
price_personal_cents*integer
price_commercial_cents*integer
price_editorial_cents*integer
price_extended_cents*integer
license_terms_personal*string
license_terms_commercial*string
license_terms_editorial*string
license_terms_extended*string
total_sales*integer
total_revenue_cents*integer
created_at*string
updated_at*string
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "title": "string",
  "description": null,
  "is_active": true,
  "currency": "string",
  "price_personal_cents": null,
  "price_commercial_cents": null,
  "price_editorial_cents": null,
  "price_extended_cents": null,
  "license_terms_personal": null,
  "license_terms_commercial": null,
  "license_terms_editorial": null,
  "license_terms_extended": null,
  "total_sales": 0,
  "total_revenue_cents": 0,
  "created_at": "string",
  "updated_at": "string"
}
▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
PUT/v1/marketplace/listings/{listing_id}
Auth

Update Listing

Update an existing marketplace listing.

View Details

Parameters

NameInType
listing_id*pathstring(uuid)

Request Body (application/json) *

FieldType
title*string
descriptionstring
currency"usd" | "cad" | "mxn" | "eur" | "gbp" | "chf" | "sek" | "nok" | "dkk" | "pln" | "czk" | "huf" | "ron" | "bgn" | "aud" | "nzd" | "jpy" | "sgd" | "hkd" | "krw" | "cny" | "inr" | "thb" | "myr" | "brl" | "aed" | "zar" | "ils"
price_personal_centsinteger
price_commercial_centsinteger
price_editorial_centsinteger
price_extended_centsinteger
license_terms_personalstring
license_terms_commercialstring
license_terms_editorialstring
license_terms_extendedstring
▶ Example Request
{
  "currency": "usd",
  "description": "Authenticated landscape photo taken with Nikon Z9",
  "license_terms_commercial": "Commercial use in marketing materials",
  "license_terms_editorial": "Editorial use in news and publications",
  "license_terms_extended": "Unlimited commercial use including merchandise",
  "license_terms_personal": "Personal use only, no redistribution",
  "price_commercial_cents": 5000,
  "price_editorial_cents": 2000,
  "price_extended_cents": 10000,
  "price_personal_cents": 1000,
  "title": "Sunset over Lake Zurich"
}

✓ Response 200 — Listing updated successfully

FieldType
id*string(uuid)
verification_id*string(uuid)
title*string
description*string
is_active*boolean
currency*string
price_personal_cents*integer
price_commercial_cents*integer
price_editorial_cents*integer
price_extended_cents*integer
license_terms_personal*string
license_terms_commercial*string
license_terms_editorial*string
license_terms_extended*string
total_sales*integer
total_revenue_cents*integer
created_at*string
updated_at*string
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_id": "550e8400-e29b-41d4-a716-446655440000",
  "title": "string",
  "description": null,
  "is_active": true,
  "currency": "string",
  "price_personal_cents": null,
  "price_commercial_cents": null,
  "price_editorial_cents": null,
  "price_extended_cents": null,
  "license_terms_personal": null,
  "license_terms_commercial": null,
  "license_terms_editorial": null,
  "license_terms_extended": null,
  "total_sales": 0,
  "total_revenue_cents": 0,
  "created_at": "string",
  "updated_at": "string"
}
▶ Error Responses (3)
403Access denied
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
DELETE/v1/marketplace/listings/{listing_id}
Auth

Deactivate Listing

Deactivate a marketplace listing, removing it from sale.

View Details

Parameters

NameInType
listing_id*pathstring(uuid)

204: Listing deactivated

▶ Error Responses (3)
403Access denied
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/marketplace/sales
Auth

Get Seller Sales

List all sales (purchases by others) for your marketplace listings.

View Details

Parameters

NameInType
limitqueryinteger
offsetqueryinteger
▶ Example Response
[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "listing_id": "550e8400-e29b-41d4-a716-446655440000",
    "currency": "string",
    "price_cents": 0,
    "license_type": "string",
    "status": "string",
    "download_expires_at": null,
    "created_at": "string"
  }
]
▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/marketplace/listings/{listing_id}/analytics/sales
Auth

Get Listing Sales Analytics

Get sales analytics for a marketplace listing.

View Details

Parameters

NameInType
listing_id*pathstring(uuid)
start_datequerystring
end_datequerystring

✓ Response 200 — Sales analytics returned

FieldType
total_sales*integer
total_revenue_cents*integer
daily_sales*object[]
▶ Example Response
{
  "total_sales": 0,
  "total_revenue_cents": 0,
  "daily_sales": [
    {
      "date": "string",
      "count": 0,
      "revenue_cents": 0
    }
  ]
}
▶ Error Responses (3)
400Invalid date format
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/marketplace/listings/{listing_id}/purchase
Auth

Initiate Purchase

Start a purchase for a photo listing via Stripe checkout.

View Details

Parameters

NameInType
listing_id*pathstring(uuid)
success_urlquerystring
cancel_urlquerystring

Request Body (application/json) *

FieldType
license_type*"personal" | "commercial" | "editorial" | "extended"
▶ Example Request
{
  "license_type": "commercial"
}

✓ Response 200 — Checkout session created

FieldType
purchase_id*string
checkout_urlstring
▶ Example Response
{
  "purchase_id": "string",
  "checkout_url": null
}
▶ Error Responses (3)
400Invalid price
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/marketplace/purchases
Auth

Get Buyer Purchases

List all photo licenses you have purchased.

View Details

Parameters

NameInType
limitqueryinteger
offsetqueryinteger
▶ Example Response
[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "listing_id": "550e8400-e29b-41d4-a716-446655440000",
    "currency": "string",
    "price_cents": 0,
    "license_type": "string",
    "status": "string",
    "download_expires_at": null,
    "created_at": "string"
  }
]
▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/marketplace/purchases/{purchase_id}/download
Auth

Download Purchased Image

Download the original high-resolution image for a completed purchase.

View Details

Parameters

NameInType
purchase_id*pathstring(uuid)
▶ Example Response
null
▶ Error Responses (5)
402Payment pending
403Access denied
404Not found
410Download expired
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
GET/v1/marketplace/listings/{listing_id}/download
Auth

Download Listing Image

Download the original high-resolution image by listing ID.

View Details

Parameters

NameInType
listing_id*pathstring(uuid)
▶ Example Response
null
▶ Error Responses (4)
403Purchase required
404Not found
410Download expired
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}

Other

4 endpoints
GET/v1/tags/
Auth

List the account's tags

List every tag of the account with the number of verifications carrying it, sorted by name.

View Details

✓ Response 200 — Successful Response

FieldType
items*object[]
▶ Example Response
{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "color": null,
      "verification_count": 0,
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z"
    }
  ]
}
▶ Error Responses (2)
404Not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
POST/v1/tags/
Auth

Create a tag

Create a tag in the account vocabulary. Names are unique per account, case-insensitively.

View Details

Request Body (application/json) *

FieldType
name*string
colorstring
▶ Example Request
{
  "color": "#1a73e8",
  "name": "Client A"
}

✓ Response 201 — Successful Response

FieldType
id*string(uuid)
name*string
colorstring
verification_countinteger
created_at*string(date-time)
updated_at*string(date-time)
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "string",
  "color": null,
  "verification_count": 0,
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z"
}
▶ Error Responses (3)
404Not found
409Tag already exists
422Invalid name or colour
DELETE/v1/tags/{tag_id}
Auth

Delete a tag

Delete a tag from the vocabulary and detach it from every verification. Verifications are untouched.

View Details

Parameters

NameInType
tag_id*pathstring(uuid)

204: Successful Response

▶ Error Responses (2)
404Tag not found
422Validation Error
{
  "detail": [
    {
      "loc": [
        "..."
      ],
      "msg": "string",
      "type": "string"
    }
  ]
}
PATCH/v1/tags/{tag_id}
Auth

Rename or recolour a tag

Update a tag's name and/or colour. A rename is reflected on every verification carrying it.

View Details

Parameters

NameInType
tag_id*pathstring(uuid)

Request Body (application/json) *

FieldType
namestring
colorstring
▶ Example Request
{
  "name": "Client B"
}

✓ Response 200 — Successful Response

FieldType
id*string(uuid)
name*string
colorstring
verification_countinteger
created_at*string(date-time)
updated_at*string(date-time)
▶ Example Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "string",
  "color": null,
  "verification_count": 0,
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z"
}
▶ Error Responses (3)
404Tag not found
409Tag already exists
422Invalid name or colour

Response Codes

200 Success · 201 Created · 204 Deleted

302/307 Redirect

400 Bad request · 401 Unauthorized · 402 Quota exceeded

403 Forbidden · 404 Not found · 422 Validation error

429 Rate limit exceeded

OpenAPI Specification

Download the complete spec for code generation and API clients.