> This page is for version v5.0.
> For other versions, use one of these documentation indexes:
> - v6.0 (default): https://docs.zip.tax/v-6-0/llms.txt
> - v5.0: https://docs.zip.tax/v-5-0/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.zip.tax/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.zip.tax/_mcp/server.

# Taxability Information Codes (TICs)

> **Warn**
>
> **Available on Pro and Enterprise plans.** See
> [Response Codes](../reference/response-codes) for the full list.

Not every product is taxed at the default sales tax rate. Most states
apply reduced rates, exemptions, or thresholds to specific categories
like clothing, groceries, prescription medication, software, and
digital goods. Ziptax's **Taxability Information Codes (TICs)** let
you attach a product category to a rate request and get back the
rules that actually apply to *that* product in *that* jurisdiction.

## When to use a TIC

Most integrations don't need TICs at first. The default sales tax rate
is correct for general merchandise in most places. You should attach a
TIC when:

* You sell categories that are commonly taxed differently (clothing,
  groceries, SaaS, digital downloads, medical items).
* Your team is filing returns and needs line-item detail showing *why*
  a reduced rate or exemption was applied.
* You're operating in states with aggressive category carve-outs
  (Minnesota on clothing, New York on apparel under \$110, Texas on
  food and medicine, and so on).

If you're selling a mix, the right pattern is to store a TIC on each
product in your catalog and pass it through on the rate request at
checkout.

## The TIC catalog

Ziptax publishes the full list of supported codes at
`GET /data/tic`. The feed is flat. Each entry is a row with an `id`, a
`parent` (for grouping into categories), a short `title`, a longer
`label`, and `nl_title` / `nl_label`, the non-localized (base English)
versions of the same two fields:

```json
{
  "tic_list": [
    {
      "tic": {
        "id": "20000",
        "parent": "0",
        "title": "Clothing",
        "label": "Clothing, Sports, and Accessories",
        "nl_title": "Clothing and Accessories",
        "nl_label": "Clothing, sportswear, and related accessories"
      }
    },
    {
      "tic": {
        "id": "20010",
        "parent": "20000",
        "title": "Clothing",
        "label": "Clothing",
        "nl_title": "Clothing",
        "nl_label": "Clothing and wearing apparel intended for general use."
      }
    },
    {
      "tic": {
        "id": "51020",
        "parent": "51001",
        "title": "Drugs, other than over-the-counter drugs, for human use with a prescription",
        "label": "with a prescription",
        "nl_title": "Prescription drugs for human use",
        "nl_label": "Drugs intended for human use that are dispensed with a prescription, excluding over-the-counter medications."
      }
    }
  ]
}
```

### Pulling the feed

#### cURL

```bash
curl -H "X-API-KEY: YOUR_API_KEY" \
  "https://api.zip-tax.com/data/tic"
```

#### Python

```python
import requests

res = requests.get(
    "https://api.zip-tax.com/data/tic",
    headers={"X-API-KEY": "YOUR_API_KEY"},
)
tic_list = res.json()["tic_list"]
```

#### Node.js

```javascript
const res = await fetch("https://api.zip-tax.com/data/tic", {
  headers: { "X-API-KEY": "YOUR_API_KEY" },
});
const { tic_list } = await res.json();
```

### Caching

The catalog changes **rarely**. New categories may be added, but
existing IDs are stable. Pull it once, store it in your own database,
and refresh on a weekly or monthly cadence. The feed has a separate
rate limit of 100 requests per minute, so don't use it as a per-request
lookup. Treat it as a reference table.

> **Warning**
>
> Don't call `/data/tic` on every product view in your storefront. Cache
> the list server-side and ship a read replica to your catalog service
> instead.

## Attaching a TIC to a rate request

Pass the `taxabilityCode` query parameter on any
`GET /request/v60` call:

```http
GET https://api.zip-tax.com/request/v60
  ?address=200+Spectrum+Center+Dr+Irvine+CA
  &taxabilityCode=51020
```

The base response fields (`baseRates`, `taxSummaries`) are unchanged.
Ziptax adds a `productDetail` object with the TIC metadata and the
`rateRules` that apply in this jurisdiction right now:

```json
{
  "metadata": { "response": { "code": 100, "name": "RESPONSE_CODE_SUCCESS" } },
  "taxSummaries": [
    { "rate": 0.0775, "taxType": "SALES_TAX", "summaryName": "Total Base Sales Tax" }
  ],
  "productDetail": {
    "id": "51020",
    "title": "Drugs, other than over-the-counter drugs, for human use with a prescription",
    "label": "with a prescription",
    "rateRules": [
      {
        "jurTaxCode": "06",
        "effectiveDt": "2020-01-01",
        "expiresDt": null,
        "effectiveTaxRate": 0.0,
        "percentTaxable": 0.0,
        "exemptUnder": null,
        "exemptOver": null,
        "taxablePortionOver": null,
        "isDestinationTaxType": true,
        "isFoodDrug": true
      }
    ]
  }
}
```

### Reading the `rateRules` array

Each rule describes how a single jurisdiction treats this product
category, filtered to rules active on the current date:

| Field                       | Meaning                                                            |
| --------------------------- | ------------------------------------------------------------------ |
| `jurTaxCode`                | FIPS-like code identifying the jurisdiction (state, county, city). |
| `effectiveDt` / `expiresDt` | Validity window. A `null` `expiresDt` means "still in effect".     |
| `effectiveTaxRate`          | The rate that applies to this product in this jurisdiction.        |
| `percentTaxable`            | Fraction of the sale that's taxable (e.g. `0.5` = half-exempt).    |
| `exemptUnder`               | Line-item exemption threshold below this dollar amount.            |
| `exemptOver`                | Exempt above this dollar amount.                                   |
| `taxablePortionOver`        | Only the amount over this threshold is taxed.                      |
| `isDestinationTaxType`      | Whether the rule follows destination sourcing.                     |
| `isFoodDrug`                | Hint for food/drug category classification.                        |

### Common shapes

* **Fully exempt** (prescription drugs in most states):
  `effectiveTaxRate: 0`, `percentTaxable: 0`.
* **Reduced rate** (grocery food in Illinois):
  `effectiveTaxRate: 0.0175` instead of the normal 6.25%.
* **Threshold exemption** (clothing in New York under \$110):
  `exemptUnder: 110`, meaning anything under \$110 is exempt and anything
  above is taxed normally.
* **Blended** (Tennessee single-article tax): use `sat_item_total`
  alongside the TIC so Ziptax can compute the blended rate.

## Worked example

A California retailer selling a \$120 sweater to an Orange County
address passes TIC `20010` (Clothing). California doesn't exempt
clothing at this price, so `productDetail.rateRules` for the CA
jurisdiction looks like the general merchandise rule and
`taxSummaries[0].rate` is the standard 7.75% (at the time of writing).
The same request into a New York address under \$110 would return a
rule with `exemptUnder: 110` and a 0% effective rate, so your app
should collect \$0 in tax on that line.

## Integration checklist

1. Pull `/data/tic` once, store it, refresh weekly.
2. Let merchants or your catalog service assign a TIC to each product
   (or default to "general merchandise" if unassigned).
3. On checkout, send one `/request/v60` call per taxable line *or* one
   call per destination with the dominant TIC, depending on your mix.
4. Read `productDetail.rateRules` for that jurisdiction and apply the
   `effectiveTaxRate` / `exemptUnder` / `exemptOver` logic yourself,
   or trust `taxSummaries[0].rate` if Ziptax's adjustment is sufficient.
5. Log the raw `productDetail` response on every transaction. It's the
   evidence trail you'll want at filing time.

## Related

#### [By Address](../rest-api/by-address)

Pass `taxabilityCode` alongside an address lookup.

#### [By Lat / Lng](../rest-api/by-lat-lng)

Same parameter works on coordinate lookups.

#### [Response Codes](../reference/response-codes)

Code 113 signals your plan doesn't include product rules.