Skip to main content
Media Verification Workflow (n8n)
Pattern: Viral content triage — trigger → reverse search → geolocation analysis → assessment report
Skills used: media-verification-specialist, geolocation-verification-specialist, ai-document-analysis
Workflow overview
[Webhook Trigger] → [Compose Verification Plan] → [Reverse Image Search]
→ [Metadata Extraction] → [Geolocation Analysis] → [Assessment Report]
Node chain
1. Webhook Trigger
- Type: Webhook (POST)
- Path:
/webhook/media-verification - Body schema:
{
"media_url": "https://example.com/image.jpg",
"claim": "Photo shows protest at City Hall on May 10, 2026",
"source_post_url": "https://twitter.com/user/status/123456"
}
2. Compose Verification Plan
- Type: HTTP Request
- Method: POST
- URL:
{{ $vars.PATRIOT_API_URL }}/investigate/workflow - Body:
{
"question": "Verify the authenticity and claimed location/time of this media: {{ $json.claim }}",
"context": "Source URL: {{ $json.source_post_url }}"
}
- Purpose: Get a structured verification plan from Claude.
3. Reverse Image Search
- Type: Code node (JavaScript)
- Purpose: Check the image against known reverse image search services:
- Google Lens (via URL parameter)
- TinEye API (if configured)
- Yandex Images (via URL parameter)
- Output: Earliest known appearance date, alternative sources, and any modifications detected.
- Note: Fully automated reverse image search may require commercial API access (TinEye). Manual steps can be flagged for analyst action.
4. Metadata Extraction
- Type: Code node or HTTP Request to Tika
- Purpose: Extract EXIF data from the image:
- Camera model, timestamp, GPS coordinates (if present)
- Software modification history
- Compression artifacts suggesting re-saves
- Note: Many social media platforms strip EXIF data. Absence of metadata is expected and should not be interpreted as evidence of manipulation.
5. Geolocation Analysis
- Type: HTTP Request (to Claude chat for analysis)
- Method: POST
- URL:
{{ $vars.PATRIOT_API_URL }}/chat/message - Body:
{
"message": "Analyze this image for geolocation clues. Identify visible landmarks, signage, vegetation, architecture, sun position/shadows, and any other location indicators. Provide a confidence assessment: exact location / city-level / region-level / insufficient evidence. Image URL: {{ $json.media_url }}",
"persona": "investigator"
}
- Output: Location assessment with confidence level and supporting evidence.
6. Assessment Report
- Type: Respond to Webhook
- Body:
{
"claim": "original claim text",
"verification_status": "verified | disputed | inconclusive",
"location_assessment": {
"confidence": "city-level",
"identified_location": "Atlanta, GA",
"evidence": ["visible CNN Center signage", "Peachtree Street intersection"],
"provenance": "AI-inferred"
},
"temporal_assessment": {
"confidence": "date-level",
"evidence": ["shadow angle consistent with May afternoon"],
"provenance": "AI-inferred (Estimated)"
},
"earliest_known_post": "URL and timestamp from reverse search",
"metadata_findings": "EXIF summary or 'metadata stripped'",
"recommended_next_steps": ["field verification", "contact original poster"],
"provenance_notice": "Location and temporal assessments are AI-inferred and require field verification"
}
Confidence levels
| Level | Meaning | Action |
|---|---|---|
| Exact | GPS coordinates or unique landmark identified | Report with (Verified) |
| City-level | Multiple consistent urban indicators | Report with (Estimated) |
| Region-level | Vegetation, architecture, or language clues | Report with (Estimated) — needs corroboration |
| Insufficient | No reliable indicators | Report “Location cannot be determined from available evidence” |
When to use
- Verifying viral social media images or videos
- Fact-checking claims about protest locations or sizes
- Investigating potentially manipulated media
- Assessing the provenance of leaked documents or screenshots
