# US Sales Tax Economic Nexus Checker: Which States to Register (`nerolabs/us-sales-tax-nexus`) Actor

Which US states a remote seller must register in for sales tax, from its dollar sales and order counts per state, using each state revenue department's threshold, period, marketplace and what-counts rules, sourced. Inputs: sales_by_state, period. Charged per check. Agent-ready: x402, MCP.

- **URL**: https://apify.com/nerolabs/us-sales-tax-nexus.md
- **Developed by:** [Adam Pearce](https://apify.com/nerolabs) (community)
- **Categories:** Business, E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 rule lookups

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

## US Sales Tax Economic Nexus Checker: Which States to Register

Since 2018 every sales tax state has its own economic nexus threshold, and they keep changing (Illinois dropped its 200 order test on 1 January 2026). Crossing one quietly means owing tax you never collected. This checks a seller's numbers against every state at once.

Built for ecommerce sellers, Shopify and Amazon store tools, bookkeepers, accounting software and AI agents that run a store's back office. Every answer names the law and links the official government page it came from, so a person can check it in one click.

### What it returns

- **Check my sales against every state** (`mode: "check"`): Checks which US states a remote seller (no office, staff or stock in the state) must register in to collect sales tax, from its sales into each state. Give sales_by_state with the dollar sales and number of transactions (orders) per state, the period those figures cover, and whether they include sales made through marketplaces such as Amazon or Etsy. Returns states where the seller is over the economic nexus threshold (must register), states close to it (80 percent or more), states under it, and for each the threshold, the measurement period the state uses, what sales count (gross, retail or taxable only), whether marketplace sales count, when registration must happen, and the state revenue department source. Unclear cases give the SAFE answer (treated as over) with what it depends on.
- **List state thresholds** (`mode: "list"`): Lists the economic nexus threshold of every US sales tax state (or one state) on a date: dollar and transaction thresholds, and/or logic, measurement period, what counts, marketplace rules, when to register and the official source. Also lists the states with no statewide sales tax.
- **Threshold changes** (`mode: "upcoming"`): Lists economic nexus threshold changes in a date window (for example states dropping the 200 transaction test), soonest first, with the old and new rule and source. Use a past from_date to see recent changes.

Answers that depend on something you did not say come back as the **safe** answer (the stricter rule) plus a `depends_on` note saying what would change it.

### Example input

```json
{
  "mode": "check",
  "sales_by_state": [
    {
      "state": "CA",
      "sales": 612000,
      "transactions": 3400
    },
    {
      "state": "TX",
      "sales": 180000,
      "transactions": 950
    },
    {
      "state": "NY",
      "sales": 520000,
      "transactions": 90
    },
    {
      "state": "IL",
      "sales": 140000,
      "transactions": 1600,
      "marketplace_sales": 60000
    }
  ],
  "period": "last_12_months"
}
```

### Example output (shortened)

```json
{
  "date": "2026-10-10",
  "verdict": "Register in 1 state: CA.",
  "must_register": [
    {
      "state": "CA",
      "name": "California",
      "your_figures": {
        "sales_counted": 612000,
        "transactions_counted": 3400,
        "period": "last_12_months"
      },
      "threshold": "$500,000 in sales",
      "percent_of_sales_threshold": 122,
      "percent_of_transaction_threshold": null,
      "measurement_period": "previous or current calendar year (crossing in either counts)",
      "source": "https://www.cdtfa.ca.gov/industry/wayfair.htm",
      "verified_on_primary_source": true,
      "result": "Over the threshold on the figures given (SAFE answer): register to collect sales tax.",
      "register_by": "Register and start collecting straight after the sale that takes total sales over $500,000 (CDTFA example: threshold passed on 6 July, registration required on 7 July; the crossing sale itself is not taxed).",
      "register_by_date_if_crossed_today": "2026-10-10"
    }
  ],
  "close_to_threshold": [
    {
      "state": "NY",
      "name": "New York",
      "your_figures": {
        "sales_counted": 520000,
        "transactions_counted": 90,
        "period": "last_12_months"
      },
      "threshold": "$500,000 in sales and 100 transactions",
      "percent_of_sales_threshold": 104,
      "percent_of_transaction_threshold": 90,
      "measurement_period": "the 12 months (four quarters) ending with the last completed quarter",
      "source": "https://www.tax.ny.gov/pubs_and_bulls/publications/sales/nexus.htm",
      "verified_on_primary_source": true,
      "result": "Under the threshold but close (80 percent or more). Watch this state."
    },
    {
      "state": "IL",
      "name": "Illinois",
      "your_figures": {
        "sales_counted": 80000,
        "transactions_counted": 1600,
        "period": "last_12_months"
      },
      "threshold": "$100,000 in sales",
      "percent_of_sales_threshold": 80,
      "percent_of_transaction_threshold": null,
      "measurement_period": "the 12 months (four quarters) ending with the last completed quarter",
      "source": "https://tax.illinois.gov/research/publications/bulletins/fy-2026-12.html",
      "verified_on_primary_source": true,
      "result": "Under the threshold but close (80 percent or more). Watch this state."
    }
  ],
  "under_threshold": [
    {
      "state": "TX",
      "name": "Texas",
      "your_figures": {
        "sales_counted": 180000,
        "transactions_counted": 950,
        "period": "last_12_months"
      },
      "threshold": "$500,000 in sales",
      "percent_of_sales_threshold": 36,
      "percent_of_transaction_threshold": null,
      "measurement_period": "any rolling 12 month period",
      "source": "https://comptroller.texas.gov/taxes/sales/remote-sellers.php",
      "verified_on_primary_source": true,
      "result": "Under the threshold."
    }
  ],
  "data_as_of": "2026-10-10"
}
```

### Inputs

- `sales_by_state`: One item per state the seller ships into: {"state":"CA","sales":612000,"transactions":3400}. Optional per item: marketplace_sales and marketplace_transactions (the part made through marketplace facilitators like Amazon), retail_sales (sales excluding sales for resale), taxable_sales (sales excluding exempt sales). Dollars are US dollars.
- `period`: What period the figures cover: last_12_months (default), previous_calendar_year or current_calendar_year (year to date).
- `includes_marketplace_sales`: True (default) if the sales and transactions figures include sales made through marketplace facilitators. Many states exclude those sales when testing a remote seller's threshold.
- `date`: The date to check the rules on, YYYY-MM-DD. Defaults to today. Thresholds changed in several states; past dates use the rule then in force.
- `show_all_states`: True to also list every sales tax state the seller did not report sales for. Default false.
- `lookups`: many questions in one run (up to 1,000), each item with the fields above.

### Pricing

**$0.003 per answered lookup** (a listing mode is one lookup). Failed lookups (for example an address the US Census geocoder cannot find) are not charged. 1,000 lookups cost $3 US dollars.

### For AI agents

- Runs through Apify's MCP server (`https://mcp.apify.com/?tools=nerolabs/us-sales-tax-nexus`) and through x402, so an agent without an Apify account can pay per call.
- A **free MCP server** with the same rules is at `https://us-sales-tax-nexus.nerolabs.workers.dev/mcp` for chat use; this actor adds bulk runs, datasets, scheduling, webhooks and Apify billing.
- Part of **Nero Labs Rules**: tools that answer rules which change after a model's training cutoff. The others: US minimum wage, pay transparency, US sales tax nexus, data breach deadlines.

### Data and limits

- Built from primary sources only (statutes, regulators, revenue departments, official gazettes), each figure with its source URL and a `verified_on_primary_source` flag.
- Rules data is checked and updated by Nero Labs; every answer carries `data_as_of`.
- Information, not legal or tax advice. Check the linked source before acting on a close call.

# Actor input Schema

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

check (default) answers one question, or every item in Lookups. The other modes list the rules themselves. Every mode is charged as one lookup per answer.

## `sales_by_state` (type: `array`):

One item per state the seller ships into: {"state":"CA","sales":612000,"transactions":3400}. Optional per item: marketplace_sales and marketplace_transactions (the part made through marketplace facilitators like Amazon), retail_sales (sales excluding sales for resale), taxable_sales (sales excluding exempt sales). Dollars are US dollars.

## `period` (type: `string`):

What period the figures cover: last_12_months (default), previous_calendar_year or current_calendar_year (year to date).

## `includes_marketplace_sales` (type: `boolean`):

True (default) if the sales and transactions figures include sales made through marketplace facilitators. Many states exclude those sales when testing a remote seller's threshold.

## `date` (type: `string`):

The date to check the rules on, YYYY-MM-DD. Defaults to today. Thresholds changed in several states; past dates use the rule then in force.

## `show_all_states` (type: `boolean`):

True to also list every sales tax state the seller did not report sales for. Default false.

## `lookups` (type: `array`):

Optional list of lookups for the check mode, up to 1,000 per run, each charged as one lookup. Each item uses the same field names as above, for example {"sales_by_state": \[{"state": "CA", "sales": 612000, "transactions": 3400}, {"state": "TX", "sales": 180000, "transactions": 950}, {"state": "NY", "sales": 520000, "transactions": 90}, {"state": "IL", "sales": 140000, "transactions": 1600, "marketplace_sales": 60000}], "period": "last_12_months"}.

## `state` (type: `string`):

Used by the 'List state thresholds' mode. Optional two-letter code or name. All states when left out.

## `from_date` (type: `string`):

Used by the 'Threshold changes' mode. YYYY-MM-DD, default today.

## `days` (type: `integer`):

Used by the 'Threshold changes' mode. 1 to 1460, default 365.

## Actor input object example

```json
{
  "mode": "check",
  "sales_by_state": [
    {
      "state": "CA",
      "sales": 612000,
      "transactions": 3400
    },
    {
      "state": "TX",
      "sales": 180000,
      "transactions": 950
    },
    {
      "state": "NY",
      "sales": 520000,
      "transactions": 90
    },
    {
      "state": "IL",
      "sales": 140000,
      "transactions": 1600,
      "marketplace_sales": 60000
    }
  ],
  "period": "last_12_months"
}
```

# Actor output Schema

## `results` (type: `string`):

One row per lookup (or per rule in a listing mode), with the official source for each answer.

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

Lookups asked, answered and failed, and the free MCP server URL.

# 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 = {
    "sales_by_state": [
        {
            "state": "CA",
            "sales": 612000,
            "transactions": 3400
        },
        {
            "state": "TX",
            "sales": 180000,
            "transactions": 950
        },
        {
            "state": "NY",
            "sales": 520000,
            "transactions": 90
        },
        {
            "state": "IL",
            "sales": 140000,
            "transactions": 1600,
            "marketplace_sales": 60000
        }
    ],
    "period": "last_12_months"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nerolabs/us-sales-tax-nexus").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 = {
    "sales_by_state": [
        {
            "state": "CA",
            "sales": 612000,
            "transactions": 3400,
        },
        {
            "state": "TX",
            "sales": 180000,
            "transactions": 950,
        },
        {
            "state": "NY",
            "sales": 520000,
            "transactions": 90,
        },
        {
            "state": "IL",
            "sales": 140000,
            "transactions": 1600,
            "marketplace_sales": 60000,
        },
    ],
    "period": "last_12_months",
}

# Run the Actor and wait for it to finish
run = client.actor("nerolabs/us-sales-tax-nexus").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 '{
  "sales_by_state": [
    {
      "state": "CA",
      "sales": 612000,
      "transactions": 3400
    },
    {
      "state": "TX",
      "sales": 180000,
      "transactions": 950
    },
    {
      "state": "NY",
      "sales": 520000,
      "transactions": 90
    },
    {
      "state": "IL",
      "sales": 140000,
      "transactions": 1600,
      "marketplace_sales": 60000
    }
  ],
  "period": "last_12_months"
}' |
apify call nerolabs/us-sales-tax-nexus --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nerolabs/us-sales-tax-nexus"
        }
    }
}
```

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/r5llGdGcfAdrVkg11/builds/nLMIWxH7QiQxu1uYE/openapi.json
