# TX Business Entities - Franchise Taxpayers & SOS Status (`j0401/tx-business-entities`) Actor

Texas business-entity register (public open data, 3.45M active franchise-tax taxpayers): SOS file number, charter date, registration status and right-to-transact flag, organizational type, registered address, county and franchise-tax responsibility date - filter by name, id, county, type or date.

- **URL**: https://apify.com/j0401/tx-business-entities.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / 1,000 tx business entity records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## TX Business Entities - Franchise Taxpayers & SOS Status

Texas's **register of business entities**, with the Secretary of State's registration view already joined in.

Every entity that holds a Texas franchise-tax account is here - **3,454,402** of them, **one row per entity**. Each row carries the Comptroller's account number *and* the Secretary of State's file number, charter date, registration status and right-to-transact-business flag, so a single lookup answers "is this a real Texas entity, what form is it, and may it currently do business in the state" without a second call.

### Low cost

**From $0.0001 per record, down to $0.00006 at Gold** Pay-per-event: you are charged per record delivered, and nothing for the query.

### What you get

| Field | Meaning |
|---|---|
| `taxpayerId` | 11-digit Comptroller taxpayer number - the entity's id |
| `name` | Registered entity name |
| `sosFileNumber` | Secretary of State file number |
| `sosStatus` / `sosStatusDate` | SOS registration status and the date it was set |
| `rightToTransact` | Whether the entity may transact business in Texas |
| `organizationalType` | Entity form - `CL` (LLC) 2,254,113 / `CT` 332,195 / `CI` 244,908 / `CN` 205,436 / `CF` 182,023 / `PL` 118,977 and 23 more |
| `charterDate` | SOS charter date - the **registration date stream** |
| `responsibilityBeginningDate` | Franchise-tax responsibility start |
| `countyCode` / `countyName` | Texas county of record |
| `address` / `city` / `state` / `zip` | Registered address |
| `recordTypeCode` | Source record-type code, passed through as published |

**3,454,402 rows against 3,454,371 distinct taxpayer numbers** - the row *is* the entity. There is no per-outlet, per-officer or per-filing fan-out here, so the count you see is the count you get.

### Modes

- **`search`** (default) - entities matching your filters.
- **`profile`** - one entity, located by `taxpayerId` or `sosFileNumber`.
- **`aggregate`** - one count row per group: by county, organizational type, SOS status, right-to-transact, exempt reason, or charter year.

### Example inputs

**One entity, by its Comptroller number** - `mode=profile` takes the exact 11-digit Comptroller taxpayer number.

```json
{ "mode": "profile", "taxpayerId": "10082832105" }
```

**LLCs registered in Travis County** - `county` takes the name, `orgType` the exact form code.

```json
{ "mode": "search", "county": "Travis", "orgType": "CL", "maxResults": 10 }
```

**Houston entities that may not transact business** - `city` is a case-insensitive substring, `rightToTransact=N` is the flag.

```json
{ "mode": "search", "city": "HOUSTON", "rightToTransact": "N", "maxResults": 10 }
```

**Entities by form** - `mode=aggregate` and `groupBy=orgType` roll the register up by organizational type.

```json
{ "mode": "aggregate", "groupBy": "orgType" }
```

**Recently chartered Texas entities** - `recentDays=30` returns entities chartered in the last 30 days.

```json
{ "recentDays": 30 }
```

**Find an entity by name** - `name` matches the registered entity name; the register includes out-of-state entities that keep a Texas account.

```json
{ "name": "BALLET" }
```

**By the number on the formation document** - `mode=profile` with the Secretary of State file number.

```json
{ "mode": "profile", "sosFileNumber": "0806763317" }
```

### A note on the county codes

The Comptroller publishes the county as a **number, not a name** - the 254 Texas counties numbered by name with spaces removed, so `LA SALLE` collates as `LASALLE`. `101` is Harris, `57` Dallas, `227` Travis, `220` Tarrant, `15` Bexar. Code `0` (385,296 rows) means the county was not reported.

Every record carries both the code and the resolved `countyName`, and you can filter by either - `county=Harris` or `countyCode=101`. A county name must be exact or an unambiguous prefix; `county=for` resolves to Fort Bend, while an ambiguous one like `county=De` reports the candidates rather than quietly returning four different counties.

### Example output

**`mode=profile`, `taxpayerId=10082832105`** - one entity, carrying both the Comptroller account number and the SOS registration view:

```json
{
 "platform": "tx-business-entities",
 "source": "texas-comptroller-franchise",
 "mode": "search",
 "groupKey": "",
 "groupCount": "",
 "groupBy": "",
 "address": "400 FOREST OAKS DR",
 "charterDate": "",
 "city": "FAIRVIEW",
 "countyCode": "43",
 "countyName": "Collin",
 "exemptBeginDate": "",
 "exemptReasonCode": "",
 "name": "JDM RESOURCES, LTD",
 "organizationalType": "PL",
 "recordType": "entity",
 "recordTypeCode": "X",
 "responsibilityBeginningDate": "2008-01-01T00:00:00.000",
 "rightToTransact": "N",
 "sosFileNumber": "",
 "sosStatus": "",
 "sosStatusDate": "",
 "sourceUpdatedAt": "2026-09-19",
 "state": "TX",
 "taxpayerId": "10082832105",
 "zip": "75069"
}
```

**`mode=aggregate`, `groupBy=orgType`** - the register by entity form:

```
CL   2,254,113
CT     332,195
CI     244,908
CN     205,436
CF     182,023
PL     118,977
```

**Recently chartered Texas entities** - `recentDays=30` (abridged; results are ordered by taxpayer number, not date):

```
2026-08-21  SVAM INTERNATIONAL INC.     CF  GREAT NECK
2026-08-28  FLEXSYS AMERICA LLC         CL  AKRON
2026-08-26  LANDWEST DESIGN GROUP, LLC  CL  AUSTIN
2026-08-21  DTX IT SOLUTIONS LLC        CL  CORPUS CHRISTI
2026-08-27  ANTLER RANCH, LLC           CL  FORT WORTH
2026-08-27  PITMAN PROPERTY, LLC        CL  DALLAS
```

**Find an entity by name** - `name=BALLET` (abridged - 8 match, and the register includes out-of-state entities that keep a Texas account):

```
11616759111  NORTH TEXAS YOUTH BALLET, INC.                 SOUTHLAKE    Tarrant
12013345868  FRISCO BALLET                                  FRISCO       Collin
12022578574  THE BALLET CONSERVATORY OF SOUTH TEXAS, INC.   SAN ANTONIO  Bexar
12029687675  BALLET FOLKLORICO DE FORT WORTH, INC.          FORT WORTH   Tarrant
```

**Where Texas businesses are** - `mode=aggregate`, `groupBy=countyCode`:

```
101  Harris         538,568
  0  (not reported) 385,296
 57  Dallas         361,626
227  Travis         337,644
220  Tarrant        201,560
 43  Collin         174,974
 15  Bexar          154,424
 79  Fort Bend      114,980
```

### Source

> **Counts below are a live snapshot** - the register is refreshed on the source's own schedule, so exact figures move between reads. The order of magnitude and the ratios are stable.

Texas Comptroller of Public Accounts, published on `data.texas.gov` as [Active Franchise Taxpayers](https://data.texas.gov/d/9cir-efmm) - public open data, no login and no key. It is refreshed periodically rather than on a fixed daily beat, and publication runs a few days behind the filing date, so the most recent days of a date window fill in after the fact. Roughly **20,000-45,000 entities are chartered in a 30-day window**, depending on the season.

Two things about this register are worth knowing before you rely on a field.

**Seven percent of rows have no SOS status at all** - 240,606 of them. A blank status is real data, not a defect: not every franchise-tax account maps to a Secretary of State charter, and those rows are still valid entities. `sosStatus` is blank on exactly those and the rest of their record is intact.

**The code columns carry the source's own formatting noise.** A small number of rows store `sosStatus`, `rightToTransact` or the organisational type with a trailing space (211, 279 and 57 rows respectively). Filtering the raw column splits one status into two and totals read low - the register reports `A` as 2,803,556 where the honest figure is 2,803,769. Trailing spaces are stripped from both the filter and the source column here, so a status is a status and the totals add up.

The register is also a **moving target for a date-filtered export**: it lists entities in business, so an entity that later dissolves leaves the file entirely. Pull the window you need with `charterFrom` / `charterTo` or `recentDays` - do not expect an id you saw last quarter to still be present.

### Output

Every record carries the same key set regardless of mode - the entity fields plus `recordType`, and the aggregate columns (`groupKey`, `groupCount`, `groupBy`) which are `""` outside aggregate mode.

### Related actors

- **TX CMBL Vendors** - the Texas vendor register, with NIGP commodity codes.
- **TX ESBD Awards** - awarded state contracts, with the winning vendor and amount.
- **CO Business Entities** - the same idea for Colorado, with the full SOS filing history.

# Actor input Schema

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

search = entities matching your filters (default). profile = one entity by taxpayerId or sosFileNumber. aggregate = one count row per group (see groupBy).

## `name` (type: `string`):

Entity name substring, e.g. 'BALLET', 'CONTRACTING'. Case-insensitive. Blank = any.

## `taxpayerId` (type: `string`):

Exact 11-digit Comptroller taxpayer number, e.g. '32107752175'. The register's own entity id.

## `sosFileNumber` (type: `string`):

Exact Secretary of State file number, e.g. '0806763317'. The number on the SOS formation document.

## `county` (type: `string`):

Texas county by name, e.g. 'Harris', 'Travis'. Exact name or an unambiguous prefix; an ambiguous prefix reports the candidates. Blank = any.

## `countyCode` (type: `string`):

Numeric Comptroller county code (the 254 Texas counties numbered alphabetically; 101 = Harris, 57 = Dallas, 227 = Travis, 220 = Tarrant, 15 = Bexar). '0' = county not reported (385,296 rows). Blank = any.

## `orgType` (type: `string`):

Exact organizational-type code. CL (limited liability company) ~2.25M, CT ~332k, CI ~245k, CN ~205k, CF ~182k, PL (limited partnership) ~119k. Blank = any.

## `sosStatus` (type: `string`):

Exact single-letter Secretary-of-State status code. A ~2.80M, R ~345k, F ~58k. Blank = any (240,573 rows have no SOS status at all).

## `rightToTransact` (type: `string`):

Exact right-to-transact-business code. A ~3.26M, N ~130k, U ~45k, D ~20k. Blank = any.

## `city` (type: `string`):

Registered-address city substring, e.g. 'HOUSTON', 'DALLAS'. Blank = any.

## `zip` (type: `string`):

Registered-address ZIP, e.g. '78701'. Matched on the 5-digit prefix. Blank = any.

## `charterFrom` (type: `string`):

SOS charter date on or after this date (YYYY-MM-DD). This is the registration-date stream - use it to pull entities chartered in a window. Blank = any.

## `charterTo` (type: `string`):

SOS charter date on or before this date (YYYY-MM-DD). Blank = any.

## `recentDays` (type: `integer`):

Shortcut for recently registered entities, e.g. 30 returns entities chartered in the last 30 days. Cannot be combined with charterFrom / charterTo. 0 = off.

## `groupBy` (type: `string`):

Which dimension to aggregate over (mode=aggregate). Blank = countyCode. Every group is returned - aggregate mode is not cut off by maxResults.

## `maxResults` (type: `integer`):

Cap the number of records pushed in search / profile mode (0 = default 50; up to 10,000 per run). Each record is metered individually, so there is no per-run charge cap. Aggregate mode returns every group.

## Actor input object example

```json
{
  "mode": "search",
  "name": "",
  "taxpayerId": "",
  "sosFileNumber": "",
  "county": "",
  "countyCode": "",
  "orgType": "",
  "sosStatus": "",
  "rightToTransact": "",
  "city": "",
  "zip": "",
  "charterFrom": "",
  "charterTo": "",
  "recentDays": 0,
  "groupBy": "",
  "maxResults": 50
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

Texas business-entity records or aggregates - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("j0401/tx-business-entities").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("j0401/tx-business-entities").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 '{}' |
apify call j0401/tx-business-entities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/tx-business-entities"
        }
    }
}
```

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/a2r5ODxUMwKTuyX8Y/builds/rfmfjX5ds01hPIGTT/openapi.json
