Skip to main content
Returns the current analysis state for a submitted URL. Use this endpoint to poll for progress after calling POST /api/postcards, and to retrieve the full forensic report once analysis completes. Method and path
GET https://postcard.fartlabs.org/api/postcards?url={url}

Request

Query parameters

url
string
required
The social media post URL being analyzed. Must exactly match the URL that was submitted to POST /api/postcards (the API normalizes both for comparison, so minor variations like trailing slashes are handled).

Responses

The response shape varies based on the current analysis state. All responses use Content-Type: application/json.

Processing (status: “processing”)

Returned while the analysis is queued or actively running. The stage and progress fields let you show a progress indicator.
status
string
required
"processing" — analysis is in progress.
id
string
UUID of the postcard record.
stage
string
Current pipeline stage key. One of: starting, scraping, scraped, corroborating, auditing, scoring, complete.
progress
number
A float from 0.0 to 1.0 representing overall pipeline completion. Useful for progress bars.
message
string
Human-readable description of the current stage (e.g., "Searching for primary sources...").
{
  "status": "processing",
  "stage": "corroborating",
  "message": "Searching for primary sources...",
  "progress": 0.4
}

Completed (status: “completed”)

The full forensic report is included in the response. No further polling is needed.
status
string
required
"completed".
url
string
required
The normalized URL that was analyzed.
platform
string
required
Detected platform: "X", "YouTube", "Reddit", "Instagram", or "Other".
postcardScore
number
required
Composite credibility score from 0.0 (low credibility) to 1.0 (high credibility).
markdown
string
required
Full extracted post content in Markdown format.
postcard
object
Structured metadata extracted from the post.
triangulation
object
Source triangulation metadata.
audit
object
Origin and temporal audit scores.
corroboration
object
Results of the AI-driven source corroboration pass.
timestamp
string
required
ISO 8601 datetime when the analysis was created.
id
string
UUID of the completed postcard record. Use this as the {id} parameter for the OG image endpoint.
{
  "status": "completed",
  "url": "https://x.com/user/status/123",
  "platform": "X",
  "postcardScore": 0.875,
  "markdown": "# Post content...",
  "postcard": {
    "platform": "X",
    "mainText": "Post content here...",
    "username": "@username",
    "timestampText": "2h ago"
  },
  "triangulation": {
    "targetUrl": "https://x.com/user/status/123",
    "queries": []
  },
  "audit": {
    "originScore": 0.85,
    "temporalScore": 0.9,
    "totalScore": 0.875,
    "auditLog": []
  },
  "corroboration": {
    "primarySources": [],
    "queriesExecuted": [],
    "verdict": "verified",
    "summary": "Content has been corroborated by trusted sources.",
    "confidenceScore": 0.85,
    "corroborationLog": []
  },
  "timestamp": "2026-04-04T12:00:00.000Z",
  "id": "550e8400-e29b-41d4-a716-446655440000"
}

Failed (status: “failed”)

The analysis could not be completed. The error field contains a description of what went wrong.
status
string
required
"failed".
id
string
UUID of the failed postcard record.
error
string
Description of the failure (e.g., "Unable to access this content. Login or signup wall detected.").
{
  "status": "failed",
  "error": "Unable to access this content. Login or signup wall detected."
}

Not found (404)

No analysis exists for the given URL. Submit the URL via POST /api/postcards to start a trace.
status
string
required
"not_found".
error
string
required
Human-readable message directing the caller to submit the URL.
{
  "status": "not_found",
  "error": "Analysis not found. Submit this URL via the Postcard UI to start a trace."
}

Polling pattern

Poll this endpoint every 3–5 seconds after submitting a URL. Stop when status is "completed" or "failed".
# Step 1: 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')

# Step 2: 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

Build docs developers (and LLMs) love