Skip to main content
Postcard is available as a hosted demo at postcard.fartlabs.org. No account required — just a Google Gemini API key to start new analyses.
1

Get a free Gemini API key

Postcard uses Google Gemini to power its corroboration and auditing stages. To start a new analysis, you need a free API key.
  1. Visit aistudio.google.com/api-keys.
  2. Sign in with your Google account.
  3. Click Create API key and copy the generated key.
Your API key is stored only in your browser as a cookie (postcard_api_key). It is never sent to Postcard’s servers except to initiate a new analysis. Completed reports are public and require no key to view.
2

Add your API key in Settings

  1. Open postcard.fartlabs.org.
  2. Click Settings in the navigation.
  3. Paste your Gemini API key into the API key field and save.
The key is now stored in your browser and will be sent automatically when you submit a new URL for analysis.
3

Enter a post URL

On the home page, paste any public social media post URL into the input field and press Enter or click Trace.Supported platforms include:
  • X (Twitter): https://x.com/user/status/...
  • Reddit: https://www.reddit.com/r/.../comments/...
  • YouTube: https://www.youtube.com/watch?v=...
  • Instagram, Bluesky, Threads, and generic public URLs
4

Watch the forensic pipeline run

After submission, Postcard runs a 4-stage forensic pipeline. You will see a real-time animation with progress messages as each stage completes:
StageMessageProgress
startingInitializing postcard…0%
scrapingFetching post content…10%
scrapedFetched content30%
corroboratingSearching for primary sources…40%
auditingVerifying origin and temporal alignment…70%
scoringCalculating Postcard score…90%
completePostcard complete100%
If a stage takes longer than expected, Postcard displays heartbeat messages (e.g., “Searching deep…”, “Analyzing metadata…”) to confirm the pipeline is still active.
5

Read the forensic report

When the pipeline completes, Postcard displays the full forensic report. The report includes:
  • Postcard Score — A 0–100% credibility score.
  • Origin subscore — Whether the post is reachable at its claimed URL.
  • Temporal subscore — Whether timestamps align with the reported narrative.
  • Corroboration subscore — Evidence found on trusted news and fact-checking domains.
  • Bias subscore — The ratio of supporting to total corroborating sources.
  • Primary sources — Links to independent articles and reports that reference the content.
  • Corroboration log — A step-by-step audit trail of every search query executed.
A higher score indicates the post is likely authentic and well-corroborated. A lower score indicates content drift, inaccessible origins, or a lack of independent verification.

Use the public API

You can also submit URLs programmatically without using the UI. The API follows a submit-then-poll pattern. Submit a URL for analysis:
curl -X POST "https://postcard.fartlabs.org/api/postcards" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://x.com/user/status/123",
    "userApiKey": "YOUR_GEMINI_API_KEY"
  }'
Response (202 Accepted):
{
  "id": "abc-123",
  "status": "processing",
  "message": "Forensic trace initialized."
}
Poll for results:
curl "https://postcard.fartlabs.org/api/postcards?url=https://x.com/user/status/123"
Full polling loop example:
# Start analysis
JOB=$(curl -s -X POST "https://postcard.fartlabs.org/api/postcards" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://x.com/user/status/123" }' | jq -r '.id')

# Poll for completion
while true; do
  RESPONSE=$(curl -s "https://postcard.fartlabs.org/api/postcards?url=https://x.com/user/status/123")
  STATUS=$(echo "$RESPONSE" | jq -r '.status')

  if [ "$STATUS" = "completed" ]; then
    echo "$RESPONSE" | jq '.postcard'
    break
  elif [ "$STATUS" = "failed" ]; then
    echo "Error: $(echo '$RESPONSE' | jq -r '.error')"
    break
  fi

  echo "Progress: $(echo '$RESPONSE' | jq -r '.progress // 0')"
  sleep 3
done
The GET /api/postcards?url= endpoint is read-only and does not trigger new analyses. To start a fresh trace, use POST /api/postcards. Pass "refresh": true in the body to force re-analysis of a previously cached URL.

Next steps

How it works

Learn how each stage of the forensic pipeline operates under the hood

API reference

Full endpoint documentation for programmatic access

Build docs developers (and LLMs) love