API Documentation

Integrate media authenticity verification into your platform

POST /resolve

Resolve a single artifact hash against the full MIR trust stack. Returns capture provenance, assertions, issuer continuity, and a neutral summary.

Request

{
  "hash": "a3f8c1e7b2e0941d5f20d3db..."  // 64-char hex SHA-256
}

Response

{
  "artifactHash": "a3f8c1e7...",
  "capture": {
    "sessionId": "uuid",
    "status": "COMPLETED",
    "scope": "LIVE_CAPTURE",
    "platform": "IOS",
    "deviceModel": "iPhone 15 Pro",
    "deviceOs": "iOS 18.1",
    "mediaType": "video",
    "resolution": "1920x1080",
    "fps": 30,
    "duration": 154,
    "chainLength": 47,
    "chainRoot": "hex...",
    "startedAt": "2026-03-21T10:00:00Z",
    "endedAt": "2026-03-21T10:02:34Z",
    "sensors": ["gps", "accel", "gyro"],
    "gps": { "lat": 33.4484, "lng": -112.0740, "accuracy": 5 }
  },
  "assertions": [
    {
      "assertionId": "uuid",
      "type": "ISSUED_BY",
      "issuerName": "Reuters",
      "issuerDomain": "reuters.com",
      "issuerId": "uuid",
      "algorithm": "Ed25519",
      "signatureValid": true,
      "createdAt": "2026-03-21T10:05:00Z",
      "revokedAt": null,
      "note": null,
      "tags": ["news", "verified"]
    }
  ],
  "issuerContinuity": [
    {
      "domain": "reuters.com",
      "issuerId": "uuid",
      "eventCount": 12400,
      "firstSeen": "2024-01-15T00:00:00Z",
      "lastSeen": "2026-03-21T09:00:00Z",
      "tier": 2,
      "status": "ACTIVE"
    }
  ],
  "protocolClaims": [],
  "signals": {
    "captureChains": 1,
    "assertions": 1,
    "disputes": 0,
    "issuersWithHistory": 1,
    "uniqueSigners": 1,
    "revokedAssertions": 0
  },
  "resolvedAt": "2026-03-21T10:06:00Z",
  "cached": false,
  "sources": {
    "assertionsQueried": true,
    "captureQueried": true,
    "mirQueried": true
  }
}
GET /resolve?hash=<sha256>

Public lookup — same response format as POST, with lighter rate limits (20 req/min vs 60 req/min authenticated).

Example

curl https://mirresolve.org/resolve?hash=a3f8c1e7b2e0941d5f...
POST /resolve/batch

Resolve up to 25 hashes in a single request. Results are keyed by artifact hash.

Request

{
  "hashes": [
    "a3f8c1e7b2e0941d5f20d3db...",
    "7b2e0941d5f20d3db9e4c8a1..."
  ]
}

Response

{
  "results": {
    "a3f8c1e7...": { /* full resolve result */ },
    "7b2e0941...": { /* full resolve result */ }
  }
}
GET /health

Health check. Returns service status, database connectivity, and uptime.

Response

{
  "status": "ok",        // ok | degraded
  "mongo": "connected",
  "redis": "connected",  // or "unavailable"
  "uptime": 3600
}

Signal Fields

The signals object contains factual counts. No labels. No interpretation. The consumer decides what they mean.

captureChains
Number of MIR Capture hash chains found for this artifact
assertions
Number of active (non-revoked) signed assertions
disputes
Number of DISPUTE or NOT_ISSUED_BY assertions
issuersWithHistory
Number of assertion issuers with participation history on MIR
uniqueSigners
Number of distinct issuer domains (excluding disputes)
revokedAssertions
Number of assertions that have been revoked by their issuers

Important: Absence Is Not Evidence

If MIR Resolve returns no data for a hash, that does not mean the media is fake. It means we have no information about it. Most media on the internet has no provenance data. MIR Resolve reports what exists — it does not infer what doesn't.