MVE API

Evidence-based verification — public trust layer, authenticated analysis APIs, and Free screening.

Base URLs

https://mve.vernr.com/api/v2https://mve.vernr.com/api/public/v1https://mve.vernr.com/v/{id}

Authentication

Paid and Free analysis endpoints require an API key in production:

curl -H "X-MVE-API-Key: YOUR_KEY" \
  -F "file=@photo.jpg" \
  "https://mve.vernr.com/api/v2/verify?mode=deep"

Public trust endpoints under /api/public/v1 do not require an API key. Only completed verifications are returned; others respond with 404.

Public Trust — GET /api/public/v1/verifications/:id

Returns a public-safe summary (not the full internal report JSON): verdict, certificate metadata, SHA-256, signature status, and allowed high-level evidence.

{
  "verification_id": "EVY-...",
  "public_url": "https://mve.vernr.com/v/EVY-...",
  "sha256": "...",
  "summary": { "headline": "...", "verdict": "verified_authentic", ... },
  "certificate": { "signed": true, "report_signature": "...", ... },
  "signature": { "signed": true, "report_signature": "..." },
  "public_evidence": [{ "source": "metadata", "type": "...", "result": "..." }],
  "limitations": ["..."]
}

Signature Verification — GET /api/public/v1/verifications/:id/verify

{
  "valid": true,
  "verification_id": "EVY-...",
  "signed": true,
  "signed_fields": {
    "public_id": "EVY-...",
    "sha256": "...",
    "verdict": "verified_authentic",
    "confidence_percent": 82,
    "strong_signals": 4,
    "total_signals": 9
  },
  "report_signature": "..."
}

Example — POST /api/v2/verify

curl -X POST "https://mve.vernr.com/api/v2/verify?mode=deep" \
  -H "X-MVE-API-Key: YOUR_KEY" \
  -F "file=@photo.jpg"

Free Screening — POST /api/free/v1/screen

Preliminary metadata/provenance/integrity screening. No ML model analysis. Same endpoint contract; authenticated and rate limited.

Endpoints

POST/api/v2/verify?mode=quick|deep|forensicEvidence graph verification (authenticated)
GET/api/v2/jobs/:idPoll v2 job status and retrieve report (authenticated)
GET/api/v2/verifications/:id/reportFull evidence graph report JSON (authenticated)
GET/api/v2/verifications/:id/certificateCertificate metadata (authenticated)
GET/api/public/v1/verifications/:idPublic summary + certificate + allowed evidence (no auth)
GET/api/public/v1/verifications/:id/certificatePublic certificate metadata (no auth)
GET/api/public/v1/verifications/:id/verifyPublic signature verification (no auth)
POST/api/free/v1/screenFree preliminary screening (authenticated, rate limited)
POST/api/v1/webhooksRegister webhook for verification.completed (authenticated)

Webhook Payload (signed delivery)

Headers:
  X-MVE-Event: verification.completed
  X-MVE-Timestamp: 1700000000
  X-MVE-Signature: hmac_sha256_hex

Body:
{
  "event": "verification.completed",
  "verification_id": "EVY-...",
  "verdict": "likely_ai_generated",
  "confidence": "high",
  "confidence_pct": 73,
  "sha256": "...",
  "timestamp": "2026-08-11T01:30:00Z"
}

Verdict Types

  • verified_authentic — VERIFIED AUTHENTIC
  • verified_ai_generated — VERIFIED AI
  • likely_ai_modified — LIKELY AI / MANIPULATED
  • inconclusive — INCONCLUSIVE (includes unable to verify)