{"openapi":"3.1.0","info":{"title":"Lumethic - Integration API","version":"1.0.0","description":"\nLumethic verifies photo authenticity by comparing RAW camera files against their JPEG exports.\nUse this API to create verifications, share results, and license verified photos.\n\n## Authentication\n\nAll endpoints require either a **JWT Bearer token** or an **API Key** in the `X-API-Key` header.\n\n- Get a JWT via `POST /v1/accounts/login`\n- Create API keys via `POST /v1/apikeys/`\n\n## Marketplace\n\nThere is no public listing directory. Photos are only accessible to buyers who receive\na direct link or email invite from the seller.\n\n## Error Handling\n\nAll errors return a structured `ErrorResponse` with:\n- `error_code`: Machine-parseable error code (e.g., `VERIFICATION_NOT_FOUND`)\n- `message`: Human-readable error description\n- `suggestion`: Optional hint for how to resolve the error\n- `details`: Optional additional context\n","contact":{"name":"Lumethic","url":"https://lumethic.com","email":"support@lumethic.com"}},"paths":{"/v1/verifications/":{"get":{"tags":["Verifications"],"summary":"List Verifications","description":"Retrieve a paginated list of photo authenticity verifications for your account.\n\nThis endpoint returns all verifications you've created, with powerful filtering and search capabilities.\nEach verification represents a comparison between a RAW photo file and its corresponding JPEG to\ndetermine authenticity.\n\n**Authentication Required**: Valid API key or JWT token\n\n**Query Parameters**:\n- **offset**: Start position for pagination (0-based index)\n- **size**: Number of results per page (1-100, default 20)\n- **sort_by**: Sort field - created_at (default), updated_at, or status\n- **sort_order**: asc or desc (default)\n- **search**: Find verifications by name, ID, or photo hash\n- **status**: Filter by processing status\n- **result**: Filter by authenticity outcome\n\n**Response**: Returns a `VerificationListResponse` containing:\n- **items**: Array of verification objects with full details\n- **total**: Total number of verifications matching filters\n- **offset**: Current offset position\n- **size**: Number of items returned\n- **total_pages**: Total pages available\n\n**Example Use Cases**:\n- Get all completed verifications: `?status=completed`\n- Find authentic photos only: `?result=true&status=completed`\n- Search by filename: `?search=wedding_photo.jpg`\n- Recent verifications first: `?sort_by=created_at&sort_order=desc`","operationId":"list_verifications_v1_verifications__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of items to skip for pagination","default":0,"title":"Offset"},"description":"Number of items to skip for pagination"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of items to return per page (max 100)","default":20,"title":"Size"},"description":"Number of items to return per page (max 100)"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Field to sort by: 'status', 'created_at', or 'updated_at'","default":"created_at","title":"Sort By"},"description":"Field to sort by: 'status', 'created_at', or 'updated_at'"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","description":"Sort order: 'asc' for ascending or 'desc' for descending","default":"desc","title":"Sort Order"},"description":"Sort order: 'asc' for ascending or 'desc' for descending"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by verification name, ID, or photo hash","title":"Search"},"description":"Search by verification name, ID, or photo hash"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by verification status. Supports comma-separated values: 'pending', 'queued', 'in_progress', 'completed', or 'failed'. Example: 'pending,queued,in_progress'","title":"Status"},"description":"Filter by verification status. Supports comma-separated values: 'pending', 'queued', 'in_progress', 'completed', or 'failed'. Example: 'pending,queued,in_progress'"},{"name":"result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by authenticity result: 'true' for authentic images, 'false' for non-authentic","title":"Result"},"description":"Filter by authenticity result: 'true' for authentic images, 'false' for non-authentic"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Paginated list of verifications","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationListResponse"},"example":{"items":[{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","status":"completed","result":true,"result_confidence":0.97,"name":"wedding_photo.jpg","raw_photo_hash":"sha256:abc123def456...","image_photo_hash":"sha256:789012abc345...","image_thumbnail_url":"https://cdn.lumethic.com/thumbnails/a1b2c3d4.jpg","raw_metadata":{"camera":"Nikon Z9","iso":200},"image_metadata":{"width":6048,"height":4032},"results":[{"id":"e5f6a7b8-c9d0-1234-ef01-234567890abc","verificator_id":"f6a7b8c9-d0e1-2345-f012-34567890abcd","verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","result":true,"confidence_score":0.98,"details":{"ssim_score":0.96,"method":"structural_similarity"},"created_at":"2025-06-15T10:32:00Z","updated_at":"2025-06-15T10:32:00Z"}],"security_score":0.95,"attestation_validated":true,"capture_gps_latitude":47.3769,"capture_gps_longitude":8.5417,"account_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","created_at":"2025-06-15T10:30:00Z","updated_at":"2025-06-15T10:35:00Z"}],"total":42,"offset":0,"size":20,"total_pages":3}}}},"400":{"description":"Invalid filter or sort parameter","content":{"application/json":{"example":{"detail":{"error_code":"VALIDATION_ERROR","message":"Invalid status filter(s): unknown.","suggestion":"Must be one of: pending, queued, in_progress, completed, failed."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Verifications"],"summary":"Create Verification","description":"Create a new photo authenticity verification by uploading RAW and JPEG files.\n\nThis endpoint starts the photo verification process by accepting a RAW image file and its\ncorresponding JPEG. Our advanced algorithms will analyze both files to determine if the JPEG\nis an authentic representation of the RAW photo, without manipulation or AI generation.\n\n**Authentication Required**: Valid API key or JWT token\n\n**File Requirements**:\n- **raw**: Original RAW file from camera (.raw, .cr2, .nef, .arw, .dng, etc.)\n- **image**: Corresponding JPEG file (.jpg, .jpeg) that should match the RAW\n\n**Attestation**:\n- **attestation_id**: Pre-validated attestation ID from POST /capture/attestation (optional)\n\n**Mobile Capture Flow**:\n1. Call POST /capture/challenge to get a challenge nonce\n2. Capture photo and create attestation with file hashes\n3. Call POST /capture/attestation to validate and get attestation_id (fast, small payload)\n4. Upload files here with attestation_id when network is stable (no time pressure)\n\n**Processing Flow**:\n1. Files are securely uploaded to cloud storage\n2. If attestation_id provided, validate file hashes match the pre-validated attestation\n3. Verification is queued for processing\n4. Multiple analysis algorithms run in parallel\n5. Results are compiled into an authenticity report\n\n**Response**: Returns verification ID (and security_score if attestation provided)\n\n**Billing**: This operation counts toward your monthly verification quota.\n\n**Status Codes**:\n- 201: Verification created successfully\n- 402: Payment required (quota exceeded or budget limit reached)\n- 400: Invalid attestation format or attestation_id not found\n- 413: File size too large\n- 422: Attestation validation failed or file hashes don't match","operationId":"create_verification_v1_verifications__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_verification_v1_verifications__post"}}}},"responses":{"201":{"description":"Verification created and queued for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVerificationResponse"},"examples":{"without_attestation":{"summary":"Created without attestation","value":{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}},"with_attestation":{"summary":"Created with attestation","value":{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","security_score":0.95}}}}}},"402":{"description":"Quota or budget limit reached","content":{"application/json":{"example":{"detail":{"error_code":"QUOTA_EXCEEDED","message":"Verification limit exceeded.","suggestion":"Upgrade your plan to continue."}}}}},"404":{"description":"Not found"},"422":{"description":"File hash mismatch","content":{"application/json":{"example":{"detail":{"error_code":"HASH_MISMATCH","message":"File hashes do not match attestation."}}}}}}}},"/v1/verifications/{verification_id}":{"get":{"tags":["Verifications"],"summary":"Get Verification","description":"Retrieve detailed results for a specific photo verification.\n\nGet the complete verification report including authenticity analysis results, processing status,\nand all metadata comparisons for a single verification.\n\n**Authentication Required**: Valid API key or JWT token\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Response**: Returns a verification object containing:\n- **id**: Verification unique identifier\n- **name**: Original filename of the image\n- **status**: Current processing status (pending, queued, in_progress, completed, failed)\n- **result**: Authenticity determination (true = authentic, false = not authentic, null = pending)\n- **created_at/updated_at**: Timestamps\n- **results**: Array of detailed analysis results from each verification algorithm\n- **account_id**: Your account identifier\n- **rendition_info**: Processing transformation details\n- **image_thumbnail_url**: CDN URL for verification thumbnail\n- **raw_metadata/image_metadata**: EXIF and technical metadata\n\n**Verification Results Include**:\n- SSIM similarity scores between RAW and JPEG\n- Perceptual hash comparisons\n- EXIF metadata analysis\n- Sensor signature verification\n- Color histogram comparisons\n- Processing chain validation\n\n**Status Codes**:\n- 200: Verification found and returned\n- 404: Verification not found or access denied\n- 401: Authentication required","operationId":"get_verification_v1_verifications__verification_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Verification details returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationApiResponseV2"},"example":{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","status":"completed","result":true,"result_confidence":0.97,"name":"wedding_photo.jpg","raw_photo_hash":"sha256:abc123def456...","image_photo_hash":"sha256:789012abc345...","image_thumbnail_url":"https://cdn.lumethic.com/thumbnails/a1b2c3d4.jpg","raw_metadata":{"camera":"Nikon Z9","iso":200},"image_metadata":{"width":6048,"height":4032},"results":[{"id":"e5f6a7b8-c9d0-1234-ef01-234567890abc","verificator_id":"f6a7b8c9-d0e1-2345-f012-34567890abcd","verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","result":true,"confidence_score":0.98,"details":{"ssim_score":0.96,"method":"structural_similarity"},"created_at":"2025-06-15T10:32:00Z","updated_at":"2025-06-15T10:32:00Z"}],"security_score":0.95,"attestation_validated":true,"capture_gps_latitude":47.3769,"capture_gps_longitude":8.5417,"account_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","created_at":"2025-06-15T10:30:00Z","updated_at":"2025-06-15T10:35:00Z"}}}},"404":{"description":"Verification not found","content":{"application/json":{"example":{"detail":{"error_code":"VERIFICATION_NOT_FOUND","message":"Verification not found."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Verifications"],"summary":"Delete Verification","description":"Delete a verification permanently.\n\nRemove a verification from your account. Once deleted, the verification will no longer\nbe accessible through any endpoints and will return 404 errors.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Effect**:\n- Removes verification from your account\n- Verification becomes inaccessible via all endpoints\n- Share links will no longer work\n- This action cannot be undone\n\n**Response**: Confirmation message\n\n**Status Codes**:\n- 200: Verification deleted successfully\n- 404: Verification not found\n- 403: Access denied (not verification owner)\n\n**Use Cases**:\n- Clean up old or unwanted verification results\n- Remove sensitive verification data\n- Manage account storage and organization","operationId":"delete_verification_v1_verifications__verification_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Verification deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__verifications__DetailResponse"},"example":{"detail":"Verification deleted successfully"}}}},"403":{"description":"Access denied","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Access denied."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verifications/{verification_id}/share":{"get":{"tags":["Verifications"],"summary":"Get Verification Share","description":"Get current sharing configuration for a verification.\n\nRetrieve the sharing settings for a verification, including access type and invited users.\nUse this to check if a verification is currently shared and who has access.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Response**: Returns `VerificationShareResponse` with:\n- **verification_id**: The verification identifier\n- **access_type**: Either \"anyone_with_link\" or \"restricted\"\n- **share_url**: Public URL for accessing the shared verification\n- **invited_emails**: List of email addresses with access (for restricted sharing)\n\n**Access Types**:\n- **anyone_with_link**: Anyone with the URL can view the verification\n- **restricted**: Only invited email addresses can access\n\n**Status Codes**:\n- 200: Sharing settings returned\n- 404: Verification not found or not shared\n- 403: Access denied (not verification owner)\n\n**Use Cases**:\n- Check sharing status before sending links to clients\n- Audit who has access to sensitive verification results\n- Verify sharing configuration after setup","operationId":"get_verification_share_v1_verifications__verification_id__share_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Share settings returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationShareResponse"},"example":{"verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","access_type":"restricted","share_url":"https://lumethic.com/en/results/a1b2c3d4-e5f6-7890-abcd-ef1234567890","invited_emails":["editor@newspaper.com","client@agency.com"]}}}},"403":{"description":"Sharing not available","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Anonymous verifications cannot be shared.","suggestion":"Register for a free account to claim your verifications and unlock sharing features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Verifications"],"summary":"Create Or Update Verification Share","description":"Enable or update sharing settings for a verification.\n\nConfigure how others can access your verification results. Perfect for sharing authenticity\nreports with clients, editors, or stakeholders while maintaining control over access.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Request Body**: `VerificationShareRequest` containing:\n- **access_type**: \"anyone_with_link\" or \"restricted\"\n\n**Sharing Options**:\n- **anyone_with_link**: Generate a public URL that anyone can access\n- **restricted**: Only specifically invited email addresses can view\n\n**Response**: Returns updated `VerificationShareResponse` with:\n- **verification_id**: The verification identifier\n- **access_type**: Configured access type\n- **share_url**: Public URL for accessing the shared verification\n- **invited_emails**: Current list of invited users (for restricted access)\n\n**Email Notifications**: When enabling sharing, invited users receive email notifications\nwith the share link and verification details.\n\n**Status Codes**:\n- 200: Sharing enabled/updated successfully\n- 404: Verification not found\n- 403: Access denied (not verification owner)\n\n**Security**: Shared verifications show results but hide account information and internal IDs.","operationId":"create_or_update_verification_share_v1_verifications__verification_id__share_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationShareRequest"}}}},"responses":{"200":{"description":"Sharing enabled or updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationShareResponse"},"example":{"verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","access_type":"anyone_with_link","share_url":"https://lumethic.com/en/results/a1b2c3d4-e5f6-7890-abcd-ef1234567890","invited_emails":[]}}}},"403":{"description":"Sharing not available","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Anonymous verifications cannot be shared.","suggestion":"Register for a free account to claim your verifications and unlock sharing features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Verifications"],"summary":"Delete Verification Share","description":"Disable sharing for a verification (make it private).\n\nRemove all sharing settings and revoke access to the verification. The share URL will no longer\nwork and all invited users will lose access.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Effect**:\n- Removes all sharing configuration\n- Invalidates the share URL\n- Removes all user invitations\n- Makes verification private to your account only\n\n**Response**: Confirmation message\n\n**Status Codes**:\n- 200: Sharing disabled successfully\n- 404: Verification not found\n- 403: Access denied (not verification owner)\n\n**Use Cases**:\n- Revoke access after collaboration is complete\n- Make sensitive verification results private\n- Clean up sharing after project completion\n\n**Note**: This action cannot be undone. To share again, you'll need to reconfigure\nsharing settings and re-invite users.","operationId":"delete_verification_share_v1_verifications__verification_id__share_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Sharing disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__verifications__DetailResponse"},"example":{"detail":"Verification sharing has been disabled"}}}},"403":{"description":"Sharing not available","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Anonymous verifications cannot be shared.","suggestion":"Register for a free account to claim your verifications and unlock sharing features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verifications/{verification_id}/share/invites":{"post":{"tags":["Verifications"],"summary":"Add Verification Invite","description":"Invite a specific user to access a shared verification.\n\nAdd an email address to the access list for a restricted verification. The invited user will\nreceive an email notification with the share link and can access the verification results.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Prerequisites**: Verification must already be shared with \"restricted\" access type.\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Request Body**: `VerificationShareInviteRequest` containing:\n- **email**: Email address of the user to invite\n\n**Response**: Returns `VerificationShareInviteResponse` with:\n- **email**: The invited email address\n- **user_exists**: Whether this email belongs to a registered Lumethic user\n\n**Email Notification**: The invited user receives an email with:\n- Verification share link\n- Information about who shared it\n- Verification date and basic details\n\n**Status Codes**:\n- 200: User invited successfully\n- 400: Verification is not shared or not set to restricted access\n- 404: Verification not found\n- 403: Access denied (not verification owner)\n\n**Use Cases**:\n- Share verification results with specific clients or colleagues\n- Grant access to legal teams for evidence review\n- Collaborate with editors on photo authenticity\n\n**Note**: Users can be invited multiple times safely — duplicates are handled automatically.","operationId":"add_verification_invite_v1_verifications__verification_id__share_invites_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationShareInviteRequest"}}}},"responses":{"200":{"description":"User invited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationShareInviteResponse"},"example":{"email":"editor@newspaper.com","user_exists":true}}}},"400":{"description":"Not shared","content":{"application/json":{"example":{"detail":{"error_code":"SHARE_NOT_FOUND","message":"Verification is not shared."}}}}},"403":{"description":"Sharing not available","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Anonymous verifications cannot be shared.","suggestion":"Register for a free account to claim your verifications and unlock sharing features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Verifications"],"summary":"Remove Verification Invite","description":"Remove a user's access to a shared verification.\n\nRevoke access for a specific email address from a restricted verification. The user will\nno longer be able to view the verification results.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Prerequisites**: Verification must be shared with \"restricted\" access type.\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Request Body**: `VerificationShareInviteDeleteRequest` containing:\n- **email**: Email address to remove from access list\n\n**Response**: Confirmation message\n\n**Effect**:\n- Removes email from the verification's access list\n- User can no longer access the shared verification\n- Previously sent emails/links will no longer work for this user\n\n**Status Codes**:\n- 200: User access revoked successfully\n- 404: Verification not found or user was not invited\n- 403: Access denied (not verification owner)\n\n**Use Cases**:\n- Remove access for former team members or collaborators\n- Revoke access after project completion\n- Clean up access lists for security\n- Remove accidentally invited users\n\n**Note**: This action cannot be undone. To restore access, you'll need to\nre-invite the user using the add invite endpoint.","operationId":"remove_verification_invite_v1_verifications__verification_id__share_invites_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationShareInviteDeleteRequest"}}}},"responses":{"200":{"description":"User access revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__verifications__DetailResponse"},"example":{"detail":"User editor@newspaper.com has been removed from sharing"}}}},"403":{"description":"Sharing not available","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Anonymous verifications cannot be shared.","suggestion":"Register for a free account to claim your verifications and unlock sharing features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verifications/{verification_id}/analytics/views":{"get":{"tags":["Verifications"],"summary":"Get Verification View Analytics","description":"Get view analytics for a shared verification.\n\nRetrieve analytics data showing how many times a verification share link has been viewed,\nincluding total views and daily breakdown for chart visualization.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Query Parameters**:\n- **start_date**: Optional start date for filtering (ISO 8601 format)\n- **end_date**: Optional end date for filtering (ISO 8601 format)\n\n**Response**: Returns analytics object containing:\n- **total_views**: Total number of views in the specified period\n- **daily_views**: Array of daily view counts for chart visualization\n  - Each entry contains: {date: \"YYYY-MM-DD\", count: number}\n\n**Status Codes**:\n- 200: Analytics data returned successfully\n- 404: Verification not found\n- 403: Access denied (not verification owner)\n\n**Use Cases**:\n- Monitor engagement with shared verification results\n- Track how verification shares are performing over time\n- Generate reports on verification visibility\n- Analyze traffic patterns for shared content","operationId":"get_verification_view_analytics_v1_verifications__verification_id__analytics_views_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for analytics (ISO 8601 format, e.g., 2024-01-01)","title":"Start Date"},"description":"Start date for analytics (ISO 8601 format, e.g., 2024-01-01)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for analytics (ISO 8601 format, e.g., 2024-12-31)","title":"End Date"},"description":"End date for analytics (ISO 8601 format, e.g., 2024-12-31)"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"View analytics returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewAnalyticsResponse"},"example":{"total_views":156,"daily_views":[{"date":"2025-01-01","count":12},{"date":"2025-01-02","count":8},{"date":"2025-01-03","count":15}]}}}},"400":{"description":"Invalid date format","content":{"application/json":{"example":{"detail":{"error_code":"INVALID_FORMAT","message":"Invalid date format.","suggestion":"Use ISO 8601 format (e.g., 2025-01-01)."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verifications/{verification_id}/renditions/thumbnail":{"get":{"tags":["Verifications"],"summary":"Get Verification Thumbnail","description":"Get the thumbnail image for a verification.\n\nRedirects to the CDN-hosted thumbnail URL for a verification's JPEG image. Useful for\nbuilding gallery views or preview grids without downloading full-resolution images.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: UUID of the verification\n\n**Response**: 302 redirect to CDN thumbnail URL.\n\n**Status Codes**:\n- 302: Redirect to thumbnail URL\n- 404: Verification not found or no thumbnail available","operationId":"get_verification_thumbnail_v1_verifications__verification_id__renditions_thumbnail_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Redirect to CDN thumbnail URL.","content":{"application/json":{"schema":{}}}},"302":{"description":"Redirect to CDN thumbnail URL"},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":{"error_code":"VERIFICATION_NOT_FOUND","message":"Verification not found."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verifications/{verification_id}/renditions/signed/original":{"get":{"tags":["Verifications"],"summary":"Get Verification Watermarked Image","description":"Download the original JPEG with Lumethic verification watermark.\n\nRetrieve the original JPEG image with a polaroid-style verification strip appended at the bottom.\nThe strip includes the Lumethic logo, verification timestamp, and a QR code linking to the\nverification results page.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Watermark Strip Contents**:\n- Lumethic logo\n- \"Lumethic verified\" text\n- Verification timestamp in international format (e.g., \"14 Dec 2025 · 08:53 UTC\")\n- QR code linking to the verification results page\n\n**Response**: Returns a 302 redirect to a temporary pre-signed URL (valid for 1 hour)\n\n**Requirements**:\n- Verification must have completed successfully (result = true)\n- Watermarked image must have been generated during verification\n\n**Status Codes**:\n- 302: Redirect to watermarked image URL\n- 404: Verification not found, verification failed, or watermarked image not available\n\n**Use Cases**:\n- Share verified photos with embedded proof of authenticity\n- Add verification stamps to portfolio images\n- Provide clients with verified images that link to verification results","operationId":"get_verification_watermarked_image_v1_verifications__verification_id__renditions_signed_original_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"302":{"description":"Redirect to pre-signed S3 URL for the watermarked image"},"307":{"description":"Redirect to watermarked image URL with verification strip."},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":{"error_code":"VERIFICATION_NOT_FOUND","message":"Verification not found."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verifications/{verification_id}/image":{"get":{"tags":["Verifications"],"summary":"Get Verification Image","description":"Download the original JPEG image file for a verification.\n\nRetrieve the original JPEG image that was uploaded during verification creation.\nThis endpoint redirects to a temporary pre-signed URL for fast direct download from S3/CDN.\n\n**Authentication Required**: Valid API key or JWT token (verification owner only)\n\n**Path Parameters**:\n- **verification_id**: Unique identifier for the verification\n\n**Response**: Returns a 302 redirect to a temporary pre-signed URL (valid for 1 hour) that\nprovides direct access to the image file with proper headers:\n- **Content-Type**: image/jpeg\n- **Content-Disposition**: inline with filename\n\n**Status Codes**:\n- 302: Redirect to direct download URL\n- 404: Verification not found or image data not available\n- 403: Access denied (not verification owner)\n\n**Performance**: This endpoint provides the fastest possible download speeds by:\n- Redirecting directly to S3/CDN (bypassing application server)\n- Leveraging CDN edge locations for global distribution\n- Eliminating memory buffering in the application\n\n```","operationId":"get_verification_image_v1_verifications__verification_id__image_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"302":{"description":"Redirect to pre-signed S3 URL for direct download"},"307":{"description":"Redirects to a temporary direct download URL for the JPEG image."},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":{"error_code":"VERIFICATION_NOT_FOUND","message":"Verification not found."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/apikeys/":{"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"Create a new API key for programmatic access to the Lumethic API.\n\nGenerate a long-lived API key that can be used instead of JWT tokens for server-to-server\nintegrations, CI/CD pipelines, and automated workflows. The raw key is returned only once\nin the response — store it securely.\n\n**Authentication Required**: Valid JWT token\n\n**Request Body**:\n- **account_id**: The account to associate the key with (must be an account you have access to)\n- **description**: Optional label to identify the key's purpose\n- **expires_in_days**: Key lifetime in days (default 365, minimum 1)\n\n**Response**: Returns the created key metadata and the raw key string.\n\n**Status Codes**:\n- 201: API key created successfully\n- 403: You do not have access to the specified account","operationId":"create_api_key_v1_apikeys__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateRequest"}}}},"responses":{"201":{"description":"API key created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateResponse"},"example":{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","prefix":"lk_a1b2c3d4","account_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","user_id":"550e8400-e29b-41d4-a716-446655440000","description":"CI/CD pipeline key","expires_at":"2026-01-15T10:30:00Z","created_at":"2025-01-15T10:30:00Z","raw_key":"lk_a1b2c3d4_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}}}},"403":{"description":"Access denied","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"User does not have access to the specified account."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"List all API keys for your current account.\n\nRetrieve metadata for all API keys associated with your account, including active and\nexpired keys. Use this to audit key usage and manage key lifecycle.\n\n**Authentication Required**: Valid JWT token or API key\n\n**Response**: Returns an array of API key metadata objects. Note: raw key values are\nnever returned after creation — only the prefix is shown for identification.\n\n**Status Codes**:\n- 200: List of API keys returned","operationId":"list_api_keys_v1_apikeys__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"List of API keys","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APIKeyInfo"},"title":"Response List Api Keys V1 Apikeys  Get"},"example":[{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","prefix":"lk_a1b2c3d4","account_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","user_id":"550e8400-e29b-41d4-a716-446655440000","description":"CI/CD pipeline key","expires_at":"2026-01-15T10:30:00Z","is_active":true,"last_used_at":"2025-06-01T14:22:00Z","created_at":"2025-01-15T10:30:00Z","updated_at":"2025-06-01T14:22:00Z"}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/apikeys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Revoke Api Key","description":"Revoke an API key, permanently disabling it.\n\nImmediately invalidates the specified API key. Any requests using this key will be\nrejected after revocation. This action cannot be undone — create a new key if needed.\n\n**Authentication Required**: Valid JWT token or API key\n\n**Path Parameters**:\n- **key_id**: UUID of the API key to revoke\n\n**Status Codes**:\n- 204: Key revoked successfully (no response body)\n- 404: Key not found or you do not have permission to revoke it","operationId":"revoke_api_key_v1_apikeys__key_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"204":{"description":"Key revoked successfully"},"404":{"description":"API key not found","content":{"application/json":{"example":{"detail":{"error_code":"ACCOUNT_NOT_FOUND","message":"API Key not found or you do not have permission to revoke it."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/listings":{"post":{"tags":["Marketplace"],"summary":"Create Listing","description":"Create a marketplace listing for a verified photo.\n\nTurn a verified photo into a licensable listing that buyers can purchase. Each listing is\ntied to a single verification and supports multiple license types (personal, commercial,\neditorial, extended) with independent pricing.\n\n**Important**: There is no public browsing or discovery of listings. Listings are only\naccessible to buyers who receive a direct link or email invite from the seller. Share\nyour listing URL or use the verification sharing features to make it available.\n\n**Authentication Required**: Valid API key or JWT token\n\n**Query Parameters**:\n- **verification_id**: UUID of the verification to create a listing for\n\n**Request Body**: Listing details including title, description, currency, prices per\nlicense type (in cents), and license terms for each type.\n\n**Restrictions**:\n- Verification must belong to your account\n- Anonymous verifications cannot create listings (register for a free account first)\n- At least one license type price must be set\n\n**Status Codes**:\n- 201: Listing created successfully\n- 402: Insufficient permissions (plan upgrade required)\n- 403: Anonymous verification — register to unlock marketplace\n- 404: Verification not found","operationId":"create_listing_v1_marketplace_listings_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"verification_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Verification Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateListingRequestApi"}}}},"responses":{"201":{"description":"Listing created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingResponse"},"example":{"id":"b2c3d4e5-f6a7-8901-bcde-f12345678901","verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","title":"Sunset over Lake Zurich","description":"Authenticated landscape photo taken with Nikon Z9","is_active":true,"currency":"usd","price_personal_cents":1000,"price_commercial_cents":5000,"price_editorial_cents":2000,"price_extended_cents":10000,"license_terms_personal":"Personal use only, no redistribution","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","total_sales":0,"total_revenue_cents":0,"created_at":"2025-06-15T10:30:00Z","updated_at":"2025-06-20T14:00:00Z"}}}},"402":{"description":"Plan upgrade required","content":{"application/json":{"example":{"detail":{"error_code":"PAYMENT_REQUIRED","message":"Insufficient permissions to create listing.","suggestion":"Upgrade your plan to access marketplace features."}}}}},"403":{"description":"Anonymous verification","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Anonymous verifications cannot create marketplace listings.","suggestion":"Register for a free account to claim your verifications and unlock marketplace features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Marketplace"],"summary":"Get Seller Listings","description":"List all marketplace listings owned by your account.\n\nRetrieve your listings with sales totals and pricing. Use pagination parameters for\naccounts with many listings.\n\n**Important**: This returns only your own listings. There is no public listing directory —\nbuyers can only access listings through direct links or email invites you share with them.\n\n**Authentication Required**: Valid API key or JWT token\n\n**Query Parameters**:\n- **limit**: Max results to return (default 50)\n- **offset**: Number of results to skip for pagination (default 0)\n\n**Status Codes**:\n- 200: Listings returned (empty array if none)","operationId":"get_seller_listings_v1_marketplace_listings_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results to return","default":50,"title":"Limit"},"description":"Maximum number of results to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip for pagination","default":0,"title":"Offset"},"description":"Number of results to skip for pagination"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Seller listings returned","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ListingResponse"},"title":"Response Get Seller Listings V1 Marketplace Listings Get"},"example":[{"id":"b2c3d4e5-f6a7-8901-bcde-f12345678901","verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","title":"Sunset over Lake Zurich","description":"Authenticated landscape photo taken with Nikon Z9","is_active":true,"currency":"usd","price_personal_cents":1000,"price_commercial_cents":5000,"price_editorial_cents":2000,"price_extended_cents":10000,"license_terms_personal":"Personal use only, no redistribution","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","total_sales":3,"total_revenue_cents":8000,"created_at":"2025-06-15T10:30:00Z","updated_at":"2025-06-20T14:00:00Z"}]}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/listings/{listing_id}":{"put":{"tags":["Marketplace"],"summary":"Update Listing","description":"Update an existing marketplace listing.\n\nModify the title, description, pricing, or license terms of a listing you own.\nChanges take effect immediately for new purchases.\n\n**Authentication Required**: Valid API key or JWT token (listing owner only)\n\n**Path Parameters**:\n- **listing_id**: UUID of the listing to update\n\n**Request Body**: Same fields as create — all fields are replaced (not merged).\n\n**Restrictions**:\n- Listing must belong to your account\n- Cannot update listings tied to anonymous verifications\n\n**Status Codes**:\n- 200: Listing updated successfully\n- 403: Access denied or anonymous verification restriction\n- 404: Listing not found","operationId":"update_listing_v1_marketplace_listings__listing_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateListingRequestApi"}}}},"responses":{"200":{"description":"Listing updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingResponse"},"example":{"id":"b2c3d4e5-f6a7-8901-bcde-f12345678901","verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","title":"Sunset over Lake Zurich","description":"Authenticated landscape photo taken with Nikon Z9","is_active":true,"currency":"usd","price_personal_cents":1000,"price_commercial_cents":5000,"price_editorial_cents":2000,"price_extended_cents":10000,"license_terms_personal":"Personal use only, no redistribution","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","total_sales":3,"total_revenue_cents":8000,"created_at":"2025-06-15T10:30:00Z","updated_at":"2025-06-20T14:00:00Z"}}}},"403":{"description":"Access denied","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Cannot update listings for anonymous verifications.","suggestion":"Register for a free account to claim your verifications and unlock marketplace features."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Marketplace"],"summary":"Deactivate Listing","description":"Deactivate a marketplace listing, removing it from sale.\n\nMarks the listing as inactive. Existing completed purchases and downloads remain valid,\nbut no new purchases can be made. The listing can be reactivated by updating it.\n\n**Authentication Required**: Valid API key or JWT token (listing owner only)\n\n**Path Parameters**:\n- **listing_id**: UUID of the listing to deactivate\n\n**Status Codes**:\n- 204: Listing deactivated (no response body)\n- 403: Access denied\n- 404: Listing not found","operationId":"deactivate_listing_v1_marketplace_listings__listing_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"204":{"description":"Listing deactivated"},"403":{"description":"Access denied","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Access denied."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Marketplace"],"summary":"Get Listing","description":"Get a marketplace listing by ID.\n\nRetrieve listing details including pricing, license terms, and sales totals. This endpoint\ndoes not require authentication, but the caller must know the listing UUID — there is no\npublic directory or search for listings. Sellers share listing URLs directly with\npotential buyers via link or email invite.\n\n**Authentication**: Not required (public endpoint, but listing ID must be known)\n\n**Path Parameters**:\n- **listing_id**: UUID of the listing\n\n**Status Codes**:\n- 200: Listing returned\n- 404: Listing not found","operationId":"get_listing_v1_marketplace_listings__listing_id__get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}}],"responses":{"200":{"description":"Listing returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingResponse"},"example":{"id":"b2c3d4e5-f6a7-8901-bcde-f12345678901","verification_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","title":"Sunset over Lake Zurich","description":"Authenticated landscape photo taken with Nikon Z9","is_active":true,"currency":"usd","price_personal_cents":1000,"price_commercial_cents":5000,"price_editorial_cents":2000,"price_extended_cents":10000,"license_terms_personal":"Personal use only, no redistribution","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","total_sales":3,"total_revenue_cents":8000,"created_at":"2025-06-15T10:30:00Z","updated_at":"2025-06-20T14:00:00Z"}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/sales":{"get":{"tags":["Marketplace"],"summary":"Get Seller Sales","description":"List all sales (purchases by others) for your marketplace listings.\n\nRetrieve purchase records where other users bought licenses for your photos.\nIncludes payment status, license type, and download expiration.\n\n**Authentication Required**: Valid API key or JWT token\n\n**Query Parameters**:\n- **limit**: Max results to return (default 50)\n- **offset**: Number of results to skip for pagination (default 0)\n\n**Status Codes**:\n- 200: Sales returned (empty array if none)","operationId":"get_seller_sales_v1_marketplace_sales_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results to return","default":50,"title":"Limit"},"description":"Maximum number of results to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip for pagination","default":0,"title":"Offset"},"description":"Number of results to skip for pagination"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Sales list returned","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseResponse"},"title":"Response Get Seller Sales V1 Marketplace Sales Get"},"example":[{"id":"c3d4e5f6-a7b8-9012-cdef-123456789012","listing_id":"b2c3d4e5-f6a7-8901-bcde-f12345678901","currency":"usd","price_cents":5000,"license_type":"commercial","status":"completed","download_expires_at":"2025-07-15T10:30:00Z","created_at":"2025-06-15T10:30:00Z"}]}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/listings/{listing_id}/analytics/sales":{"get":{"tags":["Marketplace"],"summary":"Get Listing Sales Analytics","description":"Get sales analytics for a marketplace listing.\n\nRetrieve analytics data showing how many times a photo listing has been sold,\nincluding total sales count, total revenue, and daily breakdown for chart visualization.\n\n**Authentication Required**: Valid API key or JWT token (listing owner only)\n\n**Path Parameters**:\n- **listing_id**: UUID of the listing\n\n**Query Parameters**:\n- **start_date**: Optional start date filter (ISO 8601, e.g. `2025-01-01`)\n- **end_date**: Optional end date filter (ISO 8601, e.g. `2025-12-31`)\n\n**Status Codes**:\n- 200: Analytics data returned\n- 400: Invalid date format\n- 404: Listing not found or access denied","operationId":"get_listing_sales_analytics_v1_marketplace_listings__listing_id__analytics_sales_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for analytics (ISO 8601 format, e.g., 2024-01-01)","title":"Start Date"},"description":"Start date for analytics (ISO 8601 format, e.g., 2024-01-01)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for analytics (ISO 8601 format, e.g., 2024-12-31)","title":"End Date"},"description":"End date for analytics (ISO 8601 format, e.g., 2024-12-31)"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Sales analytics returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesAnalyticsResponse"},"example":{"total_sales":23,"total_revenue_cents":4500,"daily_sales":[{"date":"2025-01-01","count":2,"revenue_cents":500},{"date":"2025-01-02","count":1,"revenue_cents":250},{"date":"2025-01-03","count":3,"revenue_cents":750}]}}}},"400":{"description":"Invalid date format","content":{"application/json":{"example":{"detail":{"error_code":"INVALID_FORMAT","message":"Invalid date format.","suggestion":"Use ISO 8601 format (e.g., 2025-01-01)."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/listings/{listing_id}/purchase":{"post":{"tags":["Marketplace"],"summary":"Initiate Purchase","description":"Start a purchase for a photo listing via Stripe checkout.\n\nInitiates a Stripe checkout session for the chosen license type. The response includes\na `checkout_url` to redirect the buyer to Stripe's hosted payment page. After payment,\nStripe sends a webhook to complete the purchase and enable downloads.\n\n**Important**: Listings are not publicly browsable. You need a direct listing link from the\nseller to purchase.\n\n**Authentication Required**: Valid API key or JWT token (buyer)\n\n**Path Parameters**:\n- **listing_id**: UUID of the listing to purchase\n\n**Request Body**:\n- **license_type**: One of `personal`, `commercial`, `editorial`, `extended`\n\n**Query Parameters**:\n- **success_url**: URL to redirect after successful payment\n- **cancel_url**: URL to redirect if payment is cancelled\n\n**Status Codes**:\n- 200: Checkout session created\n- 400: Invalid price configuration for the selected license type\n- 404: Listing not found","operationId":"initiate_purchase_v1_marketplace_listings__listing_id__purchase_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"success_url","in":"query","required":false,"schema":{"type":"string","default":"https://lumethic.com/purchase/success","title":"Success Url"}},{"name":"cancel_url","in":"query","required":false,"schema":{"type":"string","default":"https://lumethic.com/purchase/cancel","title":"Cancel Url"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiatePurchaseRequest"}}}},"responses":{"200":{"description":"Checkout session created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiatePurchaseResponse"},"example":{"purchase_id":"d4e5f6a7-b8c9-0123-def0-234567890123","checkout_url":"https://checkout.stripe.com/c/pay/cs_live_..."}}}},"400":{"description":"Invalid price","content":{"application/json":{"example":{"detail":{"error_code":"VALIDATION_ERROR","message":"Invalid price configuration."}}}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/purchases":{"get":{"tags":["Marketplace"],"summary":"Get Buyer Purchases","description":"List all photo licenses you have purchased.\n\nRetrieve your purchase history including payment status, license type, and download\navailability. Only completed purchases allow image downloads.\n\n**Authentication Required**: Valid API key or JWT token\n\n**Query Parameters**:\n- **limit**: Max results to return (default 50)\n- **offset**: Number of results to skip for pagination (default 0)\n\n**Status Codes**:\n- 200: Purchases returned (empty array if none)","operationId":"get_buyer_purchases_v1_marketplace_purchases_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results to return","default":50,"title":"Limit"},"description":"Maximum number of results to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip for pagination","default":0,"title":"Offset"},"description":"Number of results to skip for pagination"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Purchases returned","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseResponse"},"title":"Response Get Buyer Purchases V1 Marketplace Purchases Get"},"example":[{"id":"c3d4e5f6-a7b8-9012-cdef-123456789012","listing_id":"b2c3d4e5-f6a7-8901-bcde-f12345678901","currency":"usd","price_cents":5000,"license_type":"commercial","status":"completed","download_expires_at":"2025-07-15T10:30:00Z","created_at":"2025-06-15T10:30:00Z"}]}}},"404":{"description":"Not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/purchases/{purchase_id}/download":{"get":{"tags":["Marketplace"],"summary":"Download Purchased Image","description":"Download the original high-resolution image for a completed purchase.\n\nStream the full-resolution JPEG for a purchase you own. The purchase must have status\n`completed` (payment confirmed) and the download link must not be expired.\n\n**Authentication Required**: Valid API key or JWT token (purchase buyer only)\n\n**Path Parameters**:\n- **purchase_id**: UUID of the purchase\n\n**Response**: Streams the JPEG image with `Content-Disposition: attachment` headers.\n\n**Status Codes**:\n- 200: Image streamed successfully\n- 402: Purchase not yet completed (payment pending)\n- 403: Access denied (not the buyer)\n- 404: Purchase not found or image data unavailable\n- 410: Download link has expired","operationId":"download_purchased_image_v1_marketplace_purchases__purchase_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"purchase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Purchase Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Image streamed as JPEG","content":{"application/json":{"schema":{}},"image/jpeg":{}}},"402":{"description":"Payment pending","content":{"application/json":{"example":{"detail":{"error_code":"PAYMENT_REQUIRED","message":"Purchase not completed."}}}}},"403":{"description":"Access denied","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Access denied."}}}}},"404":{"description":"Not found"},"410":{"description":"Download expired","content":{"application/json":{"example":{"detail":{"error_code":"EXPIRED","message":"Download link has expired."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/marketplace/listings/{listing_id}/download":{"get":{"tags":["Marketplace"],"summary":"Download Listing Image","description":"Download the original high-resolution image by listing ID.\n\nAlternative download endpoint that looks up a completed purchase by listing ID instead of\npurchase ID. Useful when integrating with listing pages where the purchase ID isn't readily\navailable.\n\n**Authentication Required**: Valid API key or JWT token (must have a completed purchase)\n\n**Path Parameters**:\n- **listing_id**: UUID of the listing\n\n**Response**: Streams the JPEG image with `Content-Disposition: attachment` headers.\n\n**Status Codes**:\n- 200: Image streamed successfully\n- 403: No completed purchase found for this listing\n- 404: Listing not found or image data unavailable\n- 410: Download link has expired","operationId":"download_listing_image_v1_marketplace_listings__listing_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Image streamed as JPEG","content":{"application/json":{"schema":{}},"image/jpeg":{}}},"403":{"description":"Purchase required","content":{"application/json":{"example":{"detail":{"error_code":"ACCESS_DENIED","message":"Purchase required to download original image."}}}}},"404":{"description":"Not found"},"410":{"description":"Download expired","content":{"application/json":{"example":{"detail":{"error_code":"EXPIRED","message":"Download link has expired."}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/health":{"get":{"tags":["Public Access"],"summary":"Health Check","description":"Check API health status for monitoring and integration verification.\n\nSimple endpoint to verify that the Lumethic API is operational and responding to requests.\nUseful for monitoring systems, load balancers, and integration testing.\n\n**Authentication**: None required - public endpoint\n\n**Response**: Returns status object containing:\n- **status**: \"healthy\" when API is operational\n\n**Status Codes**:\n- 200: API is healthy and operational\n\n**Use Cases**:\n- Monitor API availability in production\n- Verify connectivity during integration development\n- Health checks for load balancers and orchestration systems\n- Automated monitoring and alerting systems","operationId":"health_check_v1_public_health_get","responses":{"200":{"description":"API is healthy","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check V1 Public Health Get"},"example":{"status":"healthy"}}}},"404":{"description":"Not found"}}}}},"components":{"schemas":{"APIKeyCreateRequest":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"account_id":{"type":"string","format":"uuid","title":"Account Id"},"expires_in_days":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Expires In Days","default":365}},"type":"object","required":["account_id"],"title":"APIKeyCreateRequest","examples":[{"account_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","description":"CI/CD pipeline key","expires_in_days":90}]},"APIKeyCreateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier for the API key"},"prefix":{"type":"string","title":"Prefix","description":"Key prefix for identification (e.g., 'lk_a1b2c3d4')"},"account_id":{"type":"string","format":"uuid","title":"Account Id","description":"Account this key is associated with"},"user_id":{"type":"string","format":"uuid","title":"User Id","description":"User who created the key"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"User-provided description of the key's purpose"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"ISO 8601 timestamp when the key expires"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO 8601 timestamp when the key was created"},"raw_key":{"type":"string","title":"Raw Key","description":"The full API key string. Store this securely — it cannot be retrieved again after creation."}},"type":"object","required":["id","prefix","account_id","user_id","description","expires_at","created_at","raw_key"],"title":"APIKeyCreateResponse","description":"Response after creating a new API key. Contains the raw key which is only shown once."},"APIKeyInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier for the API key"},"prefix":{"type":"string","title":"Prefix","description":"Key prefix for identification (e.g., 'lk_a1b2c3d4')"},"account_id":{"type":"string","format":"uuid","title":"Account Id","description":"Account this key is associated with"},"user_id":{"type":"string","format":"uuid","title":"User Id","description":"User who created the key"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"User-provided description of the key's purpose"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"ISO 8601 timestamp when the key expires"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the key is currently active and usable"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"ISO 8601 timestamp of last successful authentication with this key"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO 8601 timestamp when the key was created"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"ISO 8601 timestamp when the key was last modified"}},"type":"object","required":["id","prefix","account_id","user_id","description","expires_at","is_active","last_used_at","created_at","updated_at"],"title":"APIKeyInfo","description":"API key metadata (without the raw key secret)."},"Body_create_verification_v1_verifications__post":{"properties":{"raw":{"type":"string","format":"binary","title":"Raw","description":"RAW photo file (.raw, .cr2, .nef, .arw, .dng, etc.)"},"image":{"type":"string","format":"binary","title":"Image","description":"JPEG photo file (.jpg, .jpeg) corresponding to the RAW file"},"attestation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attestation Id","description":"Pre-validated attestation ID from POST /capture/attestation"}},"type":"object","required":["raw","image"],"title":"Body_create_verification_v1_verifications__post"},"BoundingBox":{"properties":{"corners":{"items":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2},"type":"array","title":"Corners"}},"type":"object","required":["corners"],"title":"BoundingBox","description":"Represents a bounding box that can be non-rectangular due to perspective transforms."},"CreateListingRequestApi":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"currency":{"$ref":"#/components/schemas/SupportedCurrency","default":"usd"},"price_personal_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Personal Cents"},"price_commercial_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Commercial Cents"},"price_editorial_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Editorial Cents"},"price_extended_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Extended Cents"},"license_terms_personal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Personal"},"license_terms_commercial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Commercial"},"license_terms_editorial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Editorial"},"license_terms_extended":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Extended"}},"type":"object","required":["title"],"title":"CreateListingRequestApi","examples":[{"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"}]},"CreateVerificationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier for the created verification"},"security_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Security Score","description":"Device security score from 0.0 to 1.0 if attestation was provided. Higher values indicate more trustworthy device integrity."}},"type":"object","required":["id"],"title":"CreateVerificationResponse","description":"Response from creating a new verification.","examples":[{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}]},"CropInfo":{"properties":{"top":{"type":"integer","title":"Top"},"bottom":{"type":"integer","title":"Bottom"},"left":{"type":"integer","title":"Left"},"right":{"type":"integer","title":"Right"}},"type":"object","required":["top","bottom","left","right"],"title":"CropInfo"},"DailySalesCount":{"properties":{"date":{"type":"string","title":"Date","description":"Date in ISO 8601 format (YYYY-MM-DD)"},"count":{"type":"integer","title":"Count","description":"Number of sales on this date"},"revenue_cents":{"type":"integer","title":"Revenue Cents","description":"Total revenue in cents for this date"}},"type":"object","required":["date","count","revenue_cents"],"title":"DailySalesCount","description":"Daily sales count for analytics."},"DailyViewCount":{"properties":{"date":{"type":"string","title":"Date","description":"Date in ISO 8601 format (YYYY-MM-DD)"},"count":{"type":"integer","title":"Count","description":"Number of views on this date"}},"type":"object","required":["date","count"],"title":"DailyViewCount","description":"Daily view count for analytics."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitiatePurchaseRequest":{"properties":{"license_type":{"$ref":"#/components/schemas/LicenseType"}},"type":"object","required":["license_type"],"title":"InitiatePurchaseRequest","examples":[{"license_type":"commercial"}]},"InitiatePurchaseResponse":{"properties":{"purchase_id":{"type":"string","title":"Purchase Id"},"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"}},"type":"object","required":["purchase_id"],"title":"InitiatePurchaseResponse"},"LicenseType":{"type":"string","enum":["personal","commercial","editorial","extended"],"title":"LicenseType","description":"License type for photo marketplace purchases.\n\n- PERSONAL: Personal, non-commercial use only (no redistribution)\n- COMMERCIAL: Use in marketing materials, advertisements, and business contexts\n- EDITORIAL: Use in news, journalism, and educational publications\n- EXTENDED: Unlimited commercial use including merchandise and resale"},"ListingResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier for the listing"},"verification_id":{"type":"string","format":"uuid","title":"Verification Id","description":"ID of the verified photo this listing represents"},"title":{"type":"string","title":"Title","description":"Display title for the listing"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description of the photo and its context"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the listing is currently available for purchase"},"currency":{"type":"string","title":"Currency","description":"ISO 4217 currency code (e.g., 'usd', 'eur', 'chf')"},"price_personal_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Personal Cents","description":"Price in cents for personal use license"},"price_commercial_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Commercial Cents","description":"Price in cents for commercial use license"},"price_editorial_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Editorial Cents","description":"Price in cents for editorial use license"},"price_extended_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Extended Cents","description":"Price in cents for extended/unlimited use license"},"license_terms_personal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Personal","description":"Terms and restrictions for personal use"},"license_terms_commercial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Commercial","description":"Terms and restrictions for commercial use"},"license_terms_editorial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Editorial","description":"Terms and restrictions for editorial use"},"license_terms_extended":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Terms Extended","description":"Terms and restrictions for extended use"},"total_sales":{"type":"integer","title":"Total Sales","description":"Total number of licenses sold for this listing"},"total_revenue_cents":{"type":"integer","title":"Total Revenue Cents","description":"Total revenue generated in cents"},"created_at":{"type":"string","title":"Created At","description":"ISO 8601 timestamp when the listing was created"},"updated_at":{"type":"string","title":"Updated At","description":"ISO 8601 timestamp when the listing was last modified"}},"type":"object","required":["id","verification_id","title","description","is_active","currency","price_personal_cents","price_commercial_cents","price_editorial_cents","price_extended_cents","license_terms_personal","license_terms_commercial","license_terms_editorial","license_terms_extended","total_sales","total_revenue_cents","created_at","updated_at"],"title":"ListingResponse","description":"Response model for marketplace listings."},"PurchaseResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier for the purchase"},"listing_id":{"type":"string","format":"uuid","title":"Listing Id","description":"ID of the listing this purchase is for"},"currency":{"type":"string","title":"Currency","description":"ISO 4217 currency code used for the purchase"},"price_cents":{"type":"integer","title":"Price Cents","description":"Amount paid in cents"},"license_type":{"type":"string","title":"License Type","description":"Type of license purchased: personal, commercial, editorial, or extended"},"status":{"type":"string","title":"Status","description":"Payment status: pending, completed, or failed"},"download_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Expires At","description":"ISO 8601 timestamp when download access expires"},"created_at":{"type":"string","title":"Created At","description":"ISO 8601 timestamp when the purchase was initiated"}},"type":"object","required":["id","listing_id","currency","price_cents","license_type","status","download_expires_at","created_at"],"title":"PurchaseResponse","description":"Response model for photo license purchases."},"RenditionInfo":{"properties":{"image_thumbnail_url":{"type":"string","title":"Image Thumbnail Url"},"raw_thumbnail_url":{"type":"string","title":"Raw Thumbnail Url"},"rendition_longest_edge":{"type":"integer","title":"Rendition Longest Edge"},"rendition_thumbnail_longest_edge":{"type":"integer","title":"Rendition Thumbnail Longest Edge"},"crop_percentage":{"type":"number","title":"Crop Percentage"},"crop_pixels":{"$ref":"#/components/schemas/CropInfo"},"rotation_degrees":{"type":"number","title":"Rotation Degrees"},"resize_info":{"$ref":"#/components/schemas/ResizeInfo"},"bounding_box":{"$ref":"#/components/schemas/BoundingBox"},"original_image_width":{"type":"integer","title":"Original Image Width"},"original_image_height":{"type":"integer","title":"Original Image Height"},"original_raw_width":{"type":"integer","title":"Original Raw Width"},"original_raw_height":{"type":"integer","title":"Original Raw Height"},"rendition_image_width":{"type":"integer","title":"Rendition Image Width"},"rendition_image_height":{"type":"integer","title":"Rendition Image Height"},"rendition_raw_width":{"type":"integer","title":"Rendition Raw Width"},"rendition_raw_height":{"type":"integer","title":"Rendition Raw Height"},"thumbnail_image_width":{"type":"integer","title":"Thumbnail Image Width"},"thumbnail_image_height":{"type":"integer","title":"Thumbnail Image Height"},"thumbnail_raw_width":{"type":"integer","title":"Thumbnail Raw Width"},"thumbnail_raw_height":{"type":"integer","title":"Thumbnail Raw Height"},"exp_shift":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Exp Shift"},"gamma_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gamma Power"},"gamma_slope":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gamma Slope"},"lens_correction_aperture":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lens Correction Aperture"},"lens_correction_focal_length":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lens Correction Focal Length"},"lens_correction_distance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lens Correction Distance"},"lens_correction_crop_factor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lens Correction Crop Factor"}},"type":"object","required":["image_thumbnail_url","raw_thumbnail_url","rendition_longest_edge","rendition_thumbnail_longest_edge","crop_percentage","crop_pixels","rotation_degrees","resize_info","bounding_box","original_image_width","original_image_height","original_raw_width","original_raw_height","rendition_image_width","rendition_image_height","rendition_raw_width","rendition_raw_height","thumbnail_image_width","thumbnail_image_height","thumbnail_raw_width","thumbnail_raw_height"],"title":"RenditionInfo","description":"Rendition information containing transformation and dimension details."},"ResizeInfo":{"properties":{"width_scale":{"type":"number","title":"Width Scale"},"height_scale":{"type":"number","title":"Height Scale"}},"type":"object","required":["width_scale","height_scale"],"title":"ResizeInfo"},"SalesAnalyticsResponse":{"properties":{"total_sales":{"type":"integer","title":"Total Sales","description":"Total number of sales in the specified period"},"total_revenue_cents":{"type":"integer","title":"Total Revenue Cents","description":"Total revenue in cents in the specified period"},"daily_sales":{"items":{"$ref":"#/components/schemas/DailySalesCount"},"type":"array","title":"Daily Sales","description":"Daily breakdown of sales and revenue for chart visualization"}},"type":"object","required":["total_sales","total_revenue_cents","daily_sales"],"title":"SalesAnalyticsResponse","description":"Analytics data for marketplace listing sales."},"ShareAccessType":{"type":"string","enum":["restricted","anyone_with_link"],"title":"ShareAccessType","description":"Access control type for shared verifications.\n\n- restricted: Only invited email addresses can view the verification\n- anyone_with_link: Anyone with the share URL can view the verification"},"SupportedCurrency":{"type":"string","enum":["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"],"title":"SupportedCurrency","description":"Supported currencies for marketplace listings and purchases.\n\nFocus on major currencies for EU, US, Australia, and Canada regions,\nplus other commonly used currencies in photography markets."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerificationApiResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"$ref":"#/components/schemas/VerificationStatus"},"results":{"items":{"$ref":"#/components/schemas/VerificationResult"},"type":"array","title":"Results"},"result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Result"},"result_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Result Confidence"},"raw_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Raw Metadata"},"image_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Image Metadata"},"rendition_info":{"anyOf":[{"$ref":"#/components/schemas/RenditionInfo"},{"type":"null"}]},"rendition_corrected_info":{"anyOf":[{"$ref":"#/components/schemas/RenditionInfo"},{"type":"null"}]},"raw_photo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Photo Hash"},"image_photo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Photo Hash"},"image_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Thumbnail Url"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"short_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Code"},"account_id":{"type":"string","format":"uuid","title":"Account Id"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","status","results","result","result_confidence","raw_metadata","image_metadata","rendition_info","rendition_corrected_info","raw_photo_hash","image_photo_hash","image_thumbnail_url","account_id","updated_at","created_at"],"title":"VerificationApiResponse","description":"API response schema for verifications without internal photodata IDs."},"VerificationApiResponseV2":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Unique identifier for the verification"},"status":{"$ref":"#/components/schemas/VerificationStatus","description":"Current processing status of the verification"},"results":{"items":{"$ref":"#/components/schemas/VerificationResult"},"type":"array","title":"Results","description":"Array of detailed results from each verification algorithm"},"result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Result","description":"Overall authenticity determination: true = authentic, false = not authentic, null = pending"},"result_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Result Confidence","description":"Confidence score from 0.0 to 1.0 for the overall result"},"raw_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Raw Metadata","description":"EXIF and technical metadata from the RAW file"},"image_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Image Metadata","description":"EXIF and technical metadata from the JPEG file"},"rendition_info":{"anyOf":[{"$ref":"#/components/schemas/RenditionInfo"},{"type":"null"}],"description":"Transformation details between RAW and JPEG"},"rendition_corrected_info":{"anyOf":[{"$ref":"#/components/schemas/RenditionInfo"},{"type":"null"}],"description":"Lens-corrected transformation details between RAW and JPEG"},"raw_photo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Photo Hash","description":"SHA-256 hash of the RAW file for integrity verification"},"image_photo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Photo Hash","description":"SHA-256 hash of the JPEG file for integrity verification"},"image_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Thumbnail Url","description":"CDN URL for the verification thumbnail image"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User-provided name or original filename"},"account_id":{"type":"string","format":"uuid","title":"Account Id","description":"Account that owns this verification"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"ISO 8601 timestamp of last update"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO 8601 timestamp when verification was created"},"security_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Security Score","description":"Device security score from 0.0 to 1.0 if attestation was provided. Higher = more trustworthy."},"attestation_validated":{"type":"boolean","title":"Attestation Validated","description":"Whether device attestation was provided and validated","default":false},"device_fingerprint_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Device Fingerprint Id","description":"Unique identifier for the device that captured the photo"},"camera_fingerprint_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Camera Fingerprint Id","description":"Unique identifier for the camera hardware used"},"sequence_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sequence Number","description":"Sequential capture number from the app session for tamper detection"},"integrity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Integrity Score","description":"App integrity score from attestation (0.0 to 1.0)"},"jailbreak_indicators":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Jailbreak Indicators","description":"List of detected jailbreak/root indicators on the device"},"capture_gps_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capture Gps Latitude","description":"GPS latitude at time of capture"},"capture_gps_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capture Gps Longitude","description":"GPS longitude at time of capture"}},"type":"object","required":["id","status","results","result","result_confidence","raw_metadata","image_metadata","rendition_info","rendition_corrected_info","raw_photo_hash","image_photo_hash","image_thumbnail_url","name","account_id","updated_at","created_at"],"title":"VerificationApiResponseV2","description":"Enhanced verification response with attestation data (v2)."},"VerificationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VerificationApiResponse"},"type":"array","title":"Items","description":"Array of verification objects"},"total":{"type":"integer","title":"Total","description":"Total number of verifications matching the query"},"offset":{"type":"integer","title":"Offset","description":"Current offset position in the result set"},"size":{"type":"integer","title":"Size","description":"Number of items returned in this page"},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available"}},"type":"object","required":["items","total","offset","size","total_pages"],"title":"VerificationListResponse","description":"Paginated list of verifications."},"VerificationResult":{"properties":{"verificator_id":{"type":"string","format":"uuid","title":"Verificator Id"},"verification_id":{"type":"string","format":"uuid","title":"Verification Id"},"details":{"additionalProperties":true,"type":"object","title":"Details"},"result":{"type":"boolean","title":"Result"},"confidence_score":{"type":"number","title":"Confidence Score"},"id":{"type":"string","format":"uuid","title":"Id"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["verificator_id","verification_id","details","result","confidence_score","id","updated_at","created_at"],"title":"VerificationResult"},"VerificationShareInviteDeleteRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"VerificationShareInviteDeleteRequest","examples":[{"email":"editor@newspaper.com"}]},"VerificationShareInviteRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"VerificationShareInviteRequest","examples":[{"email":"editor@newspaper.com"}]},"VerificationShareInviteResponse":{"properties":{"email":{"type":"string","title":"Email","description":"The email address that was invited"},"user_exists":{"type":"boolean","title":"User Exists","description":"Whether this email belongs to a registered Lumethic user"}},"type":"object","required":["email","user_exists"],"title":"VerificationShareInviteResponse","description":"Response after inviting a user to access a shared verification."},"VerificationShareRequest":{"properties":{"access_type":{"$ref":"#/components/schemas/ShareAccessType"}},"type":"object","required":["access_type"],"title":"VerificationShareRequest","examples":[{"access_type":"anyone_with_link"}]},"VerificationShareResponse":{"properties":{"verification_id":{"type":"string","format":"uuid","title":"Verification Id","description":"The verification being shared"},"access_type":{"$ref":"#/components/schemas/ShareAccessType","description":"Who can access this shared verification"},"share_url":{"type":"string","title":"Share Url","description":"Public URL to view the shared verification"},"invited_emails":{"items":{"type":"string"},"type":"array","title":"Invited Emails","description":"Email addresses with access (for restricted sharing)"}},"type":"object","required":["verification_id","access_type","share_url","invited_emails"],"title":"VerificationShareResponse","description":"Response containing sharing configuration for a verification."},"VerificationStatus":{"type":"string","enum":["pending","queued","in_progress","completed","failed"],"title":"VerificationStatus","description":"Processing status of a photo verification.\n\n- pending: Verification created, awaiting processing\n- queued: Added to processing queue\n- in_progress: Actively being analyzed\n- completed: Analysis finished (check result field for outcome)\n- failed: Analysis failed due to an error"},"ViewAnalyticsResponse":{"properties":{"total_views":{"type":"integer","title":"Total Views","description":"Total number of views in the specified period"},"daily_views":{"items":{"$ref":"#/components/schemas/DailyViewCount"},"type":"array","title":"Daily Views","description":"Daily breakdown of view counts for chart visualization"}},"type":"object","required":["total_views","daily_views"],"title":"ViewAnalyticsResponse","description":"Analytics data for verification share link views."},"app__api__verifications__DetailResponse":{"properties":{"detail":{"type":"string","title":"Detail","description":"Human-readable message describing the result of the operation"}},"type":"object","required":["detail"],"title":"DetailResponse","description":"Generic response containing a detail message."}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT token from POST /v1/accounts/login"},"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key from POST /v1/apikeys/. Format: lk_{prefix}_live_{secret}"}}},"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"servers":[{"url":"https://api.lumethic.com","description":"Production"}],"tags":[{"name":"Verifications","description":"Create, retrieve, and manage photo authenticity verifications. Upload RAW and JPEG pairs to verify authenticity."},{"name":"Marketplace","description":"List verified photos for sale, purchase licenses, and download originals. No public directory — share listings via direct link or email invite."},{"name":"API Keys","description":"Create and manage long-lived API keys for programmatic access to the Lumethic API."},{"name":"Public Access","description":"Public endpoints that do not require authentication."}]}