SPSS InsightGenius API
Professional SPSS processing API + MCP server for market research. Upload .sav files, get crosstabs with significance testing, auto-detected question types, and publication-ready Excel exports. Includes AI-powered zero-config analysis.
Live: spss.insightgenius.io | API Docs: spss.insightgenius.io/docs | MCP: spss.insightgenius.io/mcp/sse
Quick Start
Option 1: Web UI (no code needed)
- Open spss.insightgenius.io
- Drag & drop your
.savfile - Click Auto-Analyze for instant results, or configure manually:
- Select banner variables (demographics for columns)
- Choose stubs (questions for rows)
- Enable Top 2 Box / Means
- Click Generate Excel → download your tabulation
Option 2: Auto-Analyze (zero config)
curl -X POST https://spss.insightgenius.io/v1/auto-analyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]" \
-o auto_analysis.xlsx
AI auto-detects banners, groups variables into MRS/Grid, applies nets, and generates a complete Excel.
Option 3: Full Control
curl -X POST https://spss.insightgenius.io/v1/tabulate \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]" \
-F 'spec={
"banners": ["gender", "region", "age_group"],
"stubs": ["_all_"],
"significance_level": 0.95,
"include_means": true,
"nets": {"sat_overall": {"Top 2 Box": [4,5], "Bottom 2 Box": [1,2]}},
"mrs_groups": {"Brand_Awareness": ["AWARE_A","AWARE_B","AWARE_C"]}
}' -o tabulation.xlsx
Option 4: Python
import requests, json
resp = requests.post(
"https://spss.insightgenius.io/v1/tabulate",
headers={"Authorization": "Bearer YOUR_API_KEY"},
files={"file": open("survey.sav", "rb")},
data={"spec": json.dumps({
"banners": ["gender", "region"],
"stubs": ["_all_"],
"include_means": True,
"significance_level": 0.95,
})}
)
with open("tabulation.xlsx", "wb") as f:
f.write(resp.content)
print(f"Done: {resp.headers['X-Stubs-Success']} tables generated")
Option 5: MCP (for AI agents)
Connect to https://spss.insightgenius.io/mcp/sse and use any of the 12 tools. Files are passed as base64.
Endpoints (14)
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/auto-analyze |
Zero-config — upload .sav, get complete Excel (AI-detected banners, MRS, grids, nets) |
| POST | /v1/tabulate |
Full tabulation → Excel with sig letters, nets, means, MRS, grids, custom groups. Accepts optional .docx Reporting Ticket. |
| POST | /v1/metadata |
Variable metadata + suggested banners + detected groups + preset nets |
| POST | /v1/frequency |
Frequency table (counts, %, mean, std, median) |
| POST | /v1/crosstab |
Single crosstab with sig letters (A/B/C) + chi-square p-value |
| POST | /v1/correlation |
Correlation matrix (Pearson/Spearman/Kendall) with p-values |
| POST | /v1/anova |
One-way ANOVA with Tukey HSD post-hoc comparisons |
| POST | /v1/gap-analysis |
Importance-Performance gap analysis with quadrants |
| POST | /v1/satisfaction-summary |
Compact T2B/B2B/Mean for multiple scale variables |
| POST | /v1/process |
Multi-operation pipeline (auto-detect or manual) |
| POST | /v1/convert |
Convert .sav → xlsx, csv, parquet, dta |
| POST | /v1/parse-ticket |
Parse Reporting Ticket .docx → tab plan (Haiku AI) |
| GET | /v1/health |
Health check + engine status |
| GET | /v1/usage |
Usage stats for your API key |
MCP Tools (12)
| Tool | Description |
|---|---|
get_spss_metadata |
Variable metadata + auto-detect |
get_variable_info |
Single variable detail |
analyze_frequencies |
Frequency table |
analyze_crosstabs |
Crosstab with sig letters |
analyze_correlation |
Correlation matrix |
analyze_anova |
ANOVA + Tukey HSD |
analyze_gap |
Gap analysis with quadrants |
summarize_satisfaction |
Satisfaction summary |
create_tabulation |
Full tabulation → Excel (base64) |
auto_analyze |
Zero-config → Excel (base64) |
export_data |
Format conversion |
list_files |
Available tools |
Tabulate Spec
| Field | Type | Default | Description |
|---|---|---|---|
banners |
string[] | required | Demographics for columns (e.g., ["gender", "region"]) |
stubs |
string[] | ["_all_"] |
Questions for rows (_all_ = auto-select all) |
significance_level |
float | 0.95 |
0.90, 0.95, or 0.99 |
weight |
string | null |
Weight variable name |
include_means |
bool | false |
Add Mean row with T-test sig letters |
include_total_column |
bool | true |
Total as first column |
output_mode |
string | "multi_sheet" |
"multi_sheet" or "single_sheet" |
nets |
object | null |
Per-variable net definitions |
mrs_groups |
object | null |
MRS groups: {"name": ["var1", "var2"]} |
grid_groups |
object | null |
Grid groups: {"name": {"variables": [...], "show": ["t2b","mean"]}} |
custom_groups |
array | null |
Custom breaks with AND conditions |
title |
string | "" |
Report title |
Excel Output
- Summary sheet: file info, column legend (A=London, B=South East...), stub index
- One sheet per stub: headers → letters → base (N) → data with
pct% SIG_LETTERS→ nets → means - MRS sheets: one per group, percentages can exceed 100%
- Grid sheets: compact T2B/B2B/Mean summary
- Significance letters in red, nets in green rows
- Freeze panes for scrolling
Significance Testing
Column proportion z-test with letter notation (A/B/C):
- Each banner category gets a letter (e.g., Male=A, Female=B, London=C, North=D)
- Each cell tested vs every other column
- Significantly higher → other column's letter appears (e.g.,
68.6% Emeans sig higher than column E) - Supports weighted (Kish effective-n) and unweighted
- Means tested with independent T-test
- Confidence levels: 90%, 95%, 99%
Authentication
All endpoints require: Authorization: Bearer sk_live_... or sk_test_...
Rate Limits
| Plan | Requests/min | Max file | Price |
|---|---|---|---|
| Free | 10 | 5 MB | $0 |
| Growth | 60 | 50 MB | $29/mo |
| Business | 200 | 200 MB | $99/mo |
| Enterprise | Unlimited | 500 MB | Custom |
Error Codes
| Code | HTTP | Meaning |
|---|---|---|
UNAUTHORIZED |
401 | Missing/invalid API key |
FORBIDDEN |
403 | Valid key, wrong scope |
RATE_LIMIT_EXCEEDED |
429 | Too many requests |
INVALID_FILE_FORMAT |
400 | Not a .sav file |
FILE_TOO_LARGE |
413 | Exceeds plan limit |
VARIABLE_NOT_FOUND |
400 | Variable doesn't exist |
PROCESSING_FAILED |
500 | Engine error |
PROCESSING_TIMEOUT |
504 | Exceeded time limit |
Local Development
git clone https://github.com/quack2025/spss-insightgenius-api.git
cd spss-insightgenius-api
pip install -r requirements.txt
cp .env.example .env # Edit with your API key hash
python main.py # → http://localhost:8000
python -m pytest tests/ -v # 68 tests
Stack
| Layer | Technology |
|---|---|
| API | FastAPI + Pydantic v2 |
| Engine | QuantipyMRX (crosstab, sig testing, auto-detect, MRS, NPS) |
| AI | Claude Haiku (ticket parsing, smart labels, executive summary) |
| Auth | API keys (SHA256, no DB) |
| Rate Limiting | Redis (fallback: in-memory) |
| MCP | FastMCP with SSE transport |
| Deploy | Railway (Docker, Gunicorn, 4 replicas, auto-deploy) |
Built by Genius Labs.