API Documentation

Overview

The FashFinder API provides programmatic access to classification data, pattern analysis, and LLM-generated insights. This is a read-only static JSON API hosted on GitHub Pages, designed for researchers, journalists, and developers to integrate FashFinder data into their own tools and analyses.

Note: This API serves static JSON files and is updated periodically as new classifications are processed. There is no backend server, so all endpoints are simple GET requests to JSON files.

Base URL

https://fash-finder.com/

All API endpoints are relative to this base URL. For local development, use http://localhost:8000/

Authentication

No authentication required. All data is publicly accessible. No API keys, tokens, or registration needed.

Endpoints

FashFinder provides four main data endpoints:

1. Classifications Data

GET /data.json

Returns all classified articles with full evidence, source metadata, and categorization.

Response Structure

{ "classifications": [ { "classification_id": "string", "timestamp": "ISO 8601 datetime", "source_metadata": { "type": "official_government | investigative_journalism | legal_document | mainstream_news", "name": "string", "title": "string", "date": "YYYY-MM-DD", "url": "string", "author": "string" }, "content_type": "rhetoric | action", "classification": { "primary_category": "string", "secondary_categories": ["string"], "severity_level": 1-4, "confidence": "High | Medium | Low" }, "evidence": { "quotes": [ { "text": "string", "category": "string", "explanation": "string" } ], "observable_indicators": ["string"], "distinguishing_features": ["string"] }, "analysis": { "rationale": "string", "context_factors": ["string"] } } ] }

Key Fields

content_type string

Whether this is rhetoric (statements, proposals) or action (implemented policies)

severity_level integer (1-4)

1: Rhetoric without implementation
2: Oppressive policies/systems without violence
3: State violence (arrests, prosecutions, killings)
4: Mass atrocities (genocide, industrial-scale violence)

primary_category string

Main taxonomy category (1-10) with optional subcategory (e.g., "2.1.1")

Example Request

fetch('https://fash-finder.com/data.json') .then(response => response.json()) .then(data => console.log(data.classifications));

2. Pattern Analysis

GET /pattern_analysis.json

Statistical pattern analysis including three-metric assessment, category distribution, and rhetoric-to-action progressions.

Response Structure

{ "generated_at": "ISO 8601 datetime", "total_classifications": integer, "date_range": { "earliest": "YYYY-MM-DD", "latest": "YYYY-MM-DD" }, "three_metric_assessment": { "fascism_stage": { "stage": 1-4, "description": "string", "justification": "string" }, "current_intensity": { "level": "mild | moderate | severe | extreme", "description": "string" }, "momentum": { "status": "stable | accelerating | rapid | critical", "description": "string", "recent_30_day_count": integer, "previous_30_day_count": integer, "change_percentage": number } }, "rhetoric_vs_action": { "rhetoric_count": integer, "action_count": integer, "rhetoric_percentage": number, "action_percentage": number }, "severity_distribution": { "1": integer, "2": integer, "3": integer, "4": integer }, "category_distribution": { "1": integer, "2": integer, ... }, "rhetoric_to_action_progressions": [ { "rhetoric_id": "string", "action_id": "string", "category": "string", "time_gap_days": integer, "explanation": "string" } ] }

Example Request

fetch('https://fash-finder.com/pattern_analysis.json') .then(response => response.json()) .then(data => console.log(data.three_metric_assessment));

3. LLM Narrative Analysis

GET /llm_pattern_analysis.json

AI-generated narrative analysis with key findings, systemic patterns, and recommendations.

Response Structure

{ "generated_at": "ISO 8601 datetime", "narrative_summary": "string (markdown formatted)", "key_findings": ["string"], "systemic_patterns": ["string"], "recommendations": ["string"] }

Example Request

fetch('https://fash-finder.com/llm_pattern_analysis.json') .then(response => response.json()) .then(data => console.log(data.narrative_summary));

4. LLM Prompts

GET /prompts.json

Documentation of all LLM prompts used in the classification pipeline for transparency and reproducibility.

Response Structure

{ "generated_at": "string", "classification_pipeline": [ { "class_name": "string", "docstring": "string (full prompt)", "input_fields": [], "output_fields": [] } ], "pattern_analysis": [ { "class_name": "string", "docstring": "string (full prompt)", "input_fields": [], "output_fields": [] } ] }

Example Request

fetch('https://fash-finder.com/prompts.json') .then(response => response.json()) .then(data => console.log(data.classification_pipeline));

Example Usage

Filter Classifications by Severity

fetch('https://fash-finder.com/data.json') .then(response => response.json()) .then(data => { const severityThree = data.classifications.filter( c => c.classification.severity_level >= 3 ); console.log(`${severityThree.length} high-severity classifications`); });

Get Recent Actions Only

fetch('https://fash-finder.com/data.json') .then(response => response.json()) .then(data => { const actions = data.classifications.filter( c => c.content_type === 'action' ); console.log(`${actions.length} action-based classifications`); });

Calculate Category Statistics

fetch('https://fash-finder.com/pattern_analysis.json') .then(response => response.json()) .then(data => { const topCategory = Object.entries(data.category_distribution) .sort((a, b) => b[1] - a[1])[0]; console.log(`Top category: ${topCategory[0]} with ${topCategory[1]} instances`); });

Python Example

import requests # Fetch classifications response = requests.get('https://fash-finder.com/data.json') data = response.json() # Filter by category category_7 = [ c for c in data['classifications'] if c['classification']['primary_category'].startswith('7') ] print(f"Found {len(category_7)} classifications in Category 7")

CORS & Rate Limits

CORS

All endpoints support CORS. You can fetch data from any domain without cross-origin restrictions.

Rate Limits

No rate limits. Since this is a static file API hosted on GitHub Pages, there are no server-side rate limits. However, please be considerate and cache responses when possible to reduce bandwidth usage.

Update Frequency

Data is updated periodically (typically daily or weekly) as new classifications are processed. Check the generated_at field in each response to see when the data was last updated.

Additional Resources