Documentation Index
Fetch the complete documentation index at: https://www.rhetoricaudit.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
POST /api/analyze is the core endpoint of the Rhetoric Audit API. You send article text and optional metadata; the FME V19.1 engine returns a structured forensic evaluation covering ideology classification, manipulation risk, logical fallacies, emotional resonance, source reliability, and more. Responses are cached by URL and content hash — repeated submissions of the same article return instantly at no cost.
Endpoint
Request
The full text of the article to analyze. Must be between 100 and 100,000 characters. Strip HTML before submitting — the engine expects plain text.
The article title. Optional but recommended — improves classification accuracy and appears in the cached scan record.
The canonical URL of the article. Used to deduplicate identical content across requests. If omitted, deduplication falls back to a hash of the first 100 characters of
text.Your Rhetoric Audit user ID. Required to access the
signed_free or paid tier. See Authentication.A stable client-generated UUID. Required when no
userId is present. At least one of userId or deviceId must be included.Where the request originates. Accepted values:
extension, web, api, share, popup. Pass api for third-party integrations. This value is stored in the scan event log.Response
A successful200 response includes all V18.6 core fields plus optional V19 additive fields when the V19 pipeline is active. The fields below are always present.
Identity and metadata
The FME schema version used to produce this response, e.g.
"V18.6" or "19.1-bridge".The LLM model that produced the analysis, e.g.
"openai/gpt-4o-mini".ISO 8601 timestamp of when the analysis was run (or when the cached scan was originally created).
The article title, echoed from the request or
"Untitled" if not provided.The normalized canonical URL, echoed from the request.
LLM round-trip time in milliseconds.
0 on cache hits.Ideology classification
A short label describing the dominant philosophical framing of the article, e.g.
"Nationalist Realism".Score from
-100 (far left) to 100 (far right).Confidence in the ideology classification,
0–100.true when the article’s ideological framing is intentionally ambiguous or multi-valent.Scores for each of the ten FME ideology dimensions, each
0–100.The ideology with the highest score.
The ideology with the second-highest score.
The numerical gap between the
winner and second_place scores. A low gap combined with ambiguity_flag: true indicates weak classification.Manipulation and logic
Overall manipulation risk,
0–100. Higher values indicate more persuasive technique density.Density of logical fallacies relative to article length,
0–100.Array of detected logical fallacies. Empty when none are found.
Quality of the evidentiary support in the article,
0–100.Emotion and narrative
The three dominant emotional levers detected in the text.
The story structure the article follows, e.g.
"Us vs. Them" or "Hero's Journey".A prose description of information the article omits that would materially change its framing.
A detailed analytical narrative written at doctoral level, synthesizing all FME dimensions into a single interpretive summary.
Source and credibility
How transparent the article is about its intent and perspective,
0 (fully obfuscating) to 100 (fully informing).Depth-of-knowledge rating:
"DOK-1" through "DOK-4".Publisher reliability score,
0–10. Derived from a known-publisher lookup table; for unknown publishers the LLM estimate is pulled toward the mean.Predicted contribution to social volatility:
"LOW", "MOD", or "HIGH".Detected publisher name, or
null if not identified.Detected author name, or
null if not identified.Cache and quota
true if this response was served from the cache. Cache hits do not consume quota or credits.Internal UUID of the scan record. Present on both cache hits and fresh analyses.
Short alphanumeric ID for this scan. Use it to retrieve the scan later via
GET /api/scans/{shortcode} or share it at https://www.rhetoricaudit.com/s/{shortcode}.Whether the scan is publicly accessible via its shortcode URL.
true when the requesting deviceId matches the device that originally created the scan.The tier under which this request was processed:
anon, signed_free, paid, or bench.Present for
anon and signed_free tiers; null for paid.Remaining credit balance after this request. Only present for
paid tier on cache misses.Code examples
Error responses
| Status | Meaning | When it occurs |
|---|---|---|
400 | Bad request | text is missing, under 100 chars, or no identity fields provided |
422 | Not an article | The junk filter rejected the content (e.g. login pages, blank tabs) |
429 | Rate limit exceeded | Daily quota exhausted for anon or signed_free tier |
500 | Analysis failed | Unexpected server error |
502 | Invalid AI response | The LLM returned malformed JSON that could not be parsed into the V18.6 schema |
503 | AI service unavailable | Both the primary and fallback AI models are unavailable — retry with exponential backoff |
The
422 response includes a reason field with a short string describing why the content was rejected, and rejected: true. This is normal for pages that are not news articles — for example, the Chrome extension gates on this check client-side before sending to the API.