API

Everything the web app does is available as a JSON API. Interactive reference: /docs.

Analyze a text

curl -s https://stoprop.tech/api/analyze \
  -H 'Content-Type: application/json' \
  -d '{"text": "Everyone knows the plan failed.", "sensitivity": "balanced", "private": false}'

Returns highlighted spans (start/end offsets, label, colour, confidence, plain-language explanation, reported_speech, experimental), a profile, innocent_explanations, mode (llm or heuristics_only) and token cost. sensitivity: strict | balanced | broad. private: true means the text is not written to the shared cache.

Offsets are Unicode code points (Python string indices). In JavaScript, convert them before slicing strings that contain emoji or other characters outside the Basic Multilingual Plane.

Analyze a link

curl -s https://stoprop.tech/api/analyze   -H 'Content-Type: application/json'   -d '{"url": "https://news.err.ee/..."}'

Stoprop fetches public web pages only (private, local and cloud-metadata addresses are refused, every redirect is re-checked, 8 s / 2 MB limits), extracts the main text, and returns it as text together with source (title, final URL, date) and receipts for the domain.

Check a source (receipts only, no AI)

curl -s https://stoprop.tech/api/receipts   -H 'Content-Type: application/json'   -d '{"domain": "err-news.ee"}'

Each receipt: type, status (found | not_found | not_checked | error), flag (ok | warning | neutral), plain-English text, evidence_url, checked_at. Add "refresh": true to re-check items older than 15 minutes.

Taxonomy

curl -s https://stoprop.tech/api/techniques

Health and AI budget

curl -s https://stoprop.tech/api/health

Rate limits

Per client IP, per hour: analyze 30, receipts 60, swarm 10, feedback 30. Over the limit you get HTTP 429 with a plain message.

Coming: POST /api/swarm (M5), GET /api/metrics (M4).