---
title: "Create Verification"
method: POST
path: "/v1/verifications/"
tags: ["Verifications"]
---

# Create Verification

`POST /v1/verifications/`

## Request

- Base URL: `https://api.lumethic.com`
- URL: `https://api.lumethic.com/v1/verifications/`
- Auth: `OAuth2PasswordBearer` (a scheme the document does not define)

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

This endpoint starts the photo verification process by accepting a RAW image file and its
corresponding JPEG. Our advanced algorithms will analyze both files to determine if the JPEG
is an authentic representation of the RAW photo, without manipulation or AI generation.

**One capture per verification**: a JPEG assembled from several RAW frames — a stitched
panorama, an exposure blend, a focus stack — cannot be certified against any single one of
its source frames. Submit it with one frame and the result is `unrated`, never `flagged`:
the pair could not be registered, which is a statement about the submission, not about the
picture. RAW compression variants our decoder cannot read (Nikon High Efficiency NEF among
them) also grade `unrated` with the variant named in the details.

**Authentication Required**: Valid API key or JWT token

**File Requirements**:
- **raw**: Original RAW file from camera (.raw, .cr2, .nef, .arw, .dng, etc.). Optional —
  omit it for an image-only C2PA verification (see below).
- **image**: The camera image that should match the RAW — JPEG, PNG, WebP, HEIF/HEIC, AVIF,
  TIFF, or GIF. Embedded camera EXIF adds a corroborating metadata cross-check when present,
  but EXIF is **advisory**: an EXIF-less image (a non-JPEG export or a stripped JPEG) still
  reaches `verified` on RAW authenticity + pixel correspondence. A genuine EXIF *mismatch*
  still flags. All formats are also accepted in the **image-only** flow (omit `raw`), which is
  C2PA-based and format-agnostic.

**Attestation**:
- **attestation_id**: Pre-validated attestation ID from POST /capture/attestation (optional)

**Mobile Capture Flow**:
1. Call POST /capture/challenge to get a challenge nonce
2. Capture photo and create attestation with file hashes
3. Call POST /capture/attestation to validate and get attestation_id (fast, small payload)
4. Upload files here with attestation_id when network is stable (no time pressure)

**Processing Flow**:
1. Files are securely uploaded to cloud storage
2. If attestation_id provided, validate file hashes match the pre-validated attestation
3. Verification is queued for processing
4. Multiple analysis algorithms run in parallel
5. Results are compiled into an authenticity report

**Response**: Returns verification ID (and security_score if attestation provided)

**Billing**: A RAW+image pair counts toward your monthly verification quota. An
image-only verification (no `raw`) is free — it does not consume quota or bill overage.

**Status Codes**:
- 201: Verification created successfully
- 402: Payment required (quota exceeded or budget limit reached)
- 400: Invalid attestation format or attestation_id not found
- 413: File size too large
- 422: Attestation validation failed or file hashes don't match

## Headers

- `X-API-Key` string, nullable

## Response `201`

Verification created and queued for processing

- CreateVerificationResponse: Response from creating a new verification.
  - `id` string, uuid, required: Unique identifier for the created verification
  - `security_score` number, nullable: Device security score from 0.0 to 1.0 if attestation was provided. Higher values indicate more trustworthy device integrity.

## Other responses

- `402`: Quota or budget limit reached
- `404`: Not found
- `422`: File hash mismatch

---

[API](https://skmtc.dev/lumethic/apis/lumethic-integration-api.md) · [All operations](https://skmtc.dev/lumethic/apis/lumethic-integration-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lumethic/apis/lumethic-integration-api/revisions/fdafea3a491e?raw)
