# SPSS Tabulator: crosstabs with significance from a .sav file (`insight_genius/spss-tabulator`) Actor

Upload an SPSS .sav file and get a professional crosstab workbook (Excel) with column-letter significance tests, nets, multi-response and grid tables. No SPSS license needed. Deterministic: same file and spec, same numbers.

- **URL**: https://apify.com/insight_genius/spss-tabulator.md
- **Developed by:** [Insight Genius](https://apify.com/insight_genius) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3,000.00 / 1,000 tabulation up to 1,000 respondents

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SPSS Tabulator: crosstabs with significance from a .sav file

Upload an SPSS `.sav` file and get back a professional crosstab workbook in Excel, the kind market researchers build by hand in SPSS, Q or Displayr:

- banner × stub tables with **column-letter significance tests** (90 / 95 / 99 %), with a Bonferroni correction across the columns of each banner block, so a letter is stricter than a plain two-proportion test
- **nets** (Top 2 Box, Bottom 2 Box, your own groupings)
- **multi-response** and **grid** questions grouped automatically
- **weighting**, with effective base (Kish) for the tests
- means with t-tests on scale questions

**No SPSS license needed.** The tables come from a deterministic statistics engine: the same file and the same spec always give the same numbers. By default no AI is involved at all. There is one optional extra, an AI-written executive summary sheet (automatic mode only, off unless you turn it on); when enabled, the aggregated tables, not the raw respondent rows, are sent to an AI model, and its text can contain mistakes. The tables stay exact either way.

### Try it free in one click

The input form starts with a **synthetic sample survey** (400 respondents: gender, age, region, a satisfaction scale, a multi-response brand question and a rating grid). Press **Start** and you get the full automatic workbook, with banners, nets and significance letters. **Runs on the sample file are never charged.** Then upload your own `.sav`.

### Three ways to run it

| Mode | What you give | What you get | Price |
|---|---|---|---|
| **Automatic workbook** | just the `.sav` | the engine picks banners, groups multi-response and grids, adds nets, builds the full book | per workbook, see below |
| **Workbook from my spec** | the `.sav` + a JSON spec | exactly the tables you asked for | per workbook, see below |
| **Variables and labels** | just the `.sav` | variable names, labels, value labels and detected question types | **free** |

Tip: run **Variables and labels** first to see your variable names, then write a spec.

#### Spec example

```json
{
  "banner": "GENDER",
  "stubs": ["Q1", "Q2", "Q3"],
  "weight": "WEIGHT",
  "nets": { "Q1": { "Top 2 Box": [4, 5], "Bottom 2 Box": [1, 2] } },
  "title": "Brand tracker - wave 3"
}
```

### Pricing

You pay **once per delivered workbook**, based on the number of respondents (cases) in your file. If the run fails, whether because of a bad file, a rejected spec or an error on our side, **you are not charged**.

| Respondents in the file | Price per workbook |
|---|---|
| up to 1,000 | $3 |
| 1,001 – 5,000 | $6 |
| 5,001 – 20,000 | $12 |
| more than 20,000 | $20 |

### Output

- The workbook, as an `.xlsx` file in the run's key-value store (record `OUTPUT`), with a download link in the dataset.
- A dataset row with the respondent count, the amount charged, the engine version, the run's statistics and the **assumptions** the engine made (which variables it grouped, which scales it detected, what happened to each column), so you can audit the book.

### Limits

- `.sav` files only, up to 50 MB.
- **Workbook language:** English by default, or Spanish with *Workbook language*. It only changes the words the workbook writes by itself (Nets, Mean, Summary, Significance, Base...). Your variable names, question texts and answer labels always appear exactly as they are in your file.
- Very wide files (over ~1,000 variables) with many banners can hit the processing time limit; split the spec if that happens.

### What to check in automatic mode

Automatic mode is a fast starting point, not a finished deliverable. On a real survey it picks sensible banners (for example city, gender), groups multi-response questions and adds nets and significance letters. But it decides on its own, so review the **assumptions** in the dataset row and the first sheet of the workbook. Known limits:

- It does **not** detect a weighting variable. If your study is weighted, use *Workbook from my spec* and set `weight`.
- Administrative columns (respondent ID, timestamps) can be tabulated as if they were questions.
- It chooses the banners for you. If you need specific cross-breaks, use *Workbook from my spec*.

### Your data

Your file is downloaded by the Actor, read by the tabulation service to build the workbook, and the result is stored in **your own** Apify account. The service processes each file to answer that request and does not add it to a file library. The workbook is yours to delete from your run storage at any time. Do not upload data you are not allowed to process outside your organisation.

### Automate every survey wave (n8n, Make or your code)

Tracking studies are where this saves the most time: the same tables, every wave. A typical n8n workflow watches a Google Drive folder, uploads each new `.sav` to your Apify storage, runs this Actor with your study's spec, saves the workbook to another folder and emails the analyst.

To call it from anything else, use the Apify API endpoint `run-sync-get-dataset-items` with `savFile` set to a URL of your file. The dataset row includes `workbookUrl`, a signed link to download the Excel. The run fails without charge if the workbook is not produced.

# Actor input Schema

## `savFile` (type: `string`):

Upload your SPSS .sav file, or paste a public URL to one. Max 50 MB. The form starts with a synthetic sample survey: runs on that sample are free, so you can see a full workbook before using your own data.

## `mode` (type: `string`):

auto: the engine detects banners, multi-response groups and grids and builds the full crosstab workbook with no configuration. spec: you control banners, stubs, nets and weight with a tabulation spec. metadata: list variables, labels and detected question types (free, no workbook).

## `spec` (type: `object`):

JSON spec. Example: {"banner": "GENDER", "stubs": \["Q1", "Q2"], "weight": "WEIGHT", "nets": {"Q1": {"Top 2 Box": \[4, 5]}}, "title": "My study"}. Use the metadata mode first to see your variable names.

## `significanceLevel` (type: `string`):

Confidence level for the column-letter significance tests.

## `maxBanners` (type: `integer`):

How many banner variables the automatic workbook may use.

## `bookLanguage` (type: `string`):

Language of the words the workbook writes by itself (Nets, Mean, Summary, Significance...). Your variable names, question texts and answer labels always stay exactly as they are in your file.

## `includeExecutiveSummary` (type: `boolean`):

Off by default. When on, the aggregated tables (never the raw respondent rows) are sent to an AI model, which writes a text summary sheet. AI text can contain mistakes: the tables themselves stay exact either way.

## `outputMode` (type: `string`):

One sheet per question, or every table stacked in a single sheet.

## Actor input object example

```json
{
  "savFile": "https://api.apify.com/v2/key-value-stores/fF6TRY9zrnXbAWP81/records/sample-survey.sav?signature=x9UFHXlkPxdTwkkcLZpT",
  "mode": "auto",
  "spec": {
    "banner": "GENDER",
    "stubs": [
      "Q1"
    ],
    "title": "My study"
  },
  "significanceLevel": "0.95",
  "maxBanners": 3,
  "bookLanguage": "en",
  "includeExecutiveSummary": false,
  "outputMode": "multi_sheet"
}
```

# Actor output Schema

## `workbook` (type: `string`):

The .xlsx workbook. Empty in the free variables-and-labels mode.

## `summary` (type: `string`):

Respondents, price tier, amount charged, engine version, statistics and the assumptions the engine made.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "savFile": "https://api.apify.com/v2/key-value-stores/fF6TRY9zrnXbAWP81/records/sample-survey.sav?signature=x9UFHXlkPxdTwkkcLZpT",
    "spec": {
        "banner": "GENDER",
        "stubs": [
            "Q1"
        ],
        "title": "My study"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insight_genius/spss-tabulator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "savFile": "https://api.apify.com/v2/key-value-stores/fF6TRY9zrnXbAWP81/records/sample-survey.sav?signature=x9UFHXlkPxdTwkkcLZpT",
    "spec": {
        "banner": "GENDER",
        "stubs": ["Q1"],
        "title": "My study",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("insight_genius/spss-tabulator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "savFile": "https://api.apify.com/v2/key-value-stores/fF6TRY9zrnXbAWP81/records/sample-survey.sav?signature=x9UFHXlkPxdTwkkcLZpT",
  "spec": {
    "banner": "GENDER",
    "stubs": [
      "Q1"
    ],
    "title": "My study"
  }
}' |
apify call insight_genius/spss-tabulator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insight_genius/spss-tabulator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/V5bhtjipDxaAD9lfO/builds/VfyoomgxdkmALlpT8/openapi.json
