> This page is for version v6.0 (default).
> 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.

# Search TIC Codes

POST https://api.zip-tax.com/search/tic
Content-Type: application/json

Searches Taxability Information Codes (TIC) by free-text product description and returns ranked matches. Requires authentication via the X-API-KEY header or key query parameter. The response example is an excerpt showing the first three ranked results. Results and relevance scores may vary.

Reference: https://docs.zip.tax/api-reference/data/search-tic

## Authentication

- `X-API-KEY` header (required) — API Key authentication via header

## Request

### Body (application/json)

This endpoint expects an object.

- `query` (string, required) — Free-text product description to match against TIC codes

## Response

### 200

OK

- `$schema` (string, required) — URL to the JSON Schema for this response
- `query` (string, required) — Echo of the input query
- `results` (list of TicSearchResultDocumented, required) — Ranked TIC results (most relevant first)
- `nextCursor` (string, optional) — Cursor for retrieving the next page of results

## Errors

### 400 Search Tic Request Bad Request Error

Bad Request

- `detail` (string, optional) — A human-readable explanation specific to this occurrence of the problem.
- `errors` (list of ErrorDetail, optional) — List of individual error details
- `instance` (string, optional) — A URI reference that identifies the specific occurrence of the problem.
- `status` (long, optional) — HTTP status code
- `title` (string, optional) — A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
- `type` (string, optional, default: about:blank) — A URI reference to human-readable documentation for the error.

### 401 Search Tic Request Unauthorized Error

Unauthorized

- `detail` (string, optional) — A human-readable explanation specific to this occurrence of the problem.
- `errors` (list of ErrorDetail, optional) — List of individual error details
- `instance` (string, optional) — A URI reference that identifies the specific occurrence of the problem.
- `status` (long, optional) — HTTP status code
- `title` (string, optional) — A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
- `type` (string, optional, default: about:blank) — A URI reference to human-readable documentation for the error.

### 422 Search Tic Request Unprocessable Entity Error

Unprocessable Entity

- `detail` (string, optional) — A human-readable explanation specific to this occurrence of the problem.
- `errors` (list of ErrorDetail, optional) — List of individual error details
- `instance` (string, optional) — A URI reference that identifies the specific occurrence of the problem.
- `status` (long, optional) — HTTP status code
- `title` (string, optional) — A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
- `type` (string, optional, default: about:blank) — A URI reference to human-readable documentation for the error.

### 429 Search Tic Request Too Many Requests Error

Too Many Requests

- `detail` (string, optional) — A human-readable explanation specific to this occurrence of the problem.
- `errors` (list of ErrorDetail, optional) — List of individual error details
- `instance` (string, optional) — A URI reference that identifies the specific occurrence of the problem.
- `status` (long, optional) — HTTP status code
- `title` (string, optional) — A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
- `type` (string, optional, default: about:blank) — A URI reference to human-readable documentation for the error.

### 500 Search Tic Request Internal Server Error

Internal Server Error

- `detail` (string, optional) — A human-readable explanation specific to this occurrence of the problem.
- `errors` (list of ErrorDetail, optional) — List of individual error details
- `instance` (string, optional) — A URI reference that identifies the specific occurrence of the problem.
- `status` (long, optional) — HTTP status code
- `title` (string, optional) — A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
- `type` (string, optional, default: about:blank) — A URI reference to human-readable documentation for the error.

### 502 Search Tic Request Bad Gateway Error

Bad Gateway

- `detail` (string, optional) — A human-readable explanation specific to this occurrence of the problem.
- `errors` (list of ErrorDetail, optional) — List of individual error details
- `instance` (string, optional) — A URI reference that identifies the specific occurrence of the problem.
- `status` (long, optional) — HTTP status code
- `title` (string, optional) — A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
- `type` (string, optional, default: about:blank) — A URI reference to human-readable documentation for the error.

## Types

### TicSearchResultDocumented

- `description` (string, required) — Short description of the TIC code
- `documentation` (string, required) — Detailed documentation of the TIC code
- `label` (string, required) — Short TIC label
- `naturalLabel` (string, required) — Natural language TIC description
- `rank` (long, required) — 1-indexed rank (1 = most relevant)
- `score` (double, required) — Relevance score from semantic search (0-1)
- `ticId` (long, required) — TIC code

### ErrorDetail

- `location` (string, optional) — Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'
- `message` (string, optional) — Error message text
- `value` (any, optional) — The value at the given location

## Examples

**Request**

```json
{
  "query": "baked bread in plastic packaging"
}
```

**Response**

```json
{
  "$schema": "https://api.zip-tax.com/schemas/ticsearch",
  "query": "baked bread in plastic packaging",
  "results": [
    {
      "description": "Bakery items sold without eating utensils provided by the seller, including bread, rolls, buns, biscuits, bagels, croissants, pastries, donuts, Danish, cakes, tortes, pies, tarts, muffins, bars, cookies, tortillas ",
      "documentation": "Bakery items sold without eating utensils provided by the seller, including bread, rolls, buns, biscuits, bagels, croissants, pastries, donuts, Danish, cakes, tortes, pies, tarts, muffins, bars, cookies, and tortillas.",
      "label": "Bakery Items",
      "naturalLabel": "Bakery Items",
      "rank": 1,
      "score": 0.891025641025641,
      "ticId": 41030
    },
    {
      "description": "Uncategorized tangilble personal property",
      "documentation": "Any tangible personal property that does not fit within the other defined categories. This TIC defaults to taxable in all states. For uncategorized services, use TIC 00001.",
      "label": "General",
      "naturalLabel": "Uncategorized tangilble personal property",
      "rank": 2,
      "score": 0.8249269005847953,
      "ticId": 0
    },
    {
      "description": "Food and food ingredients excluding alcoholic beverages and tobacco",
      "documentation": "Food and food ingredients means substances, whether in liquid, concentrated, solid, frozen, dried, or dehydrated form, that are sold for ingestion or chewing by humans and are consumed for their taste or nutritional value. Note: Excludes alcoholic beverages and tobacco.",
      "label": "Food and Food ingredients",
      "naturalLabel": "Food and food ingredients excluding alcoholic beverages and tobacco",
      "rank": 3,
      "score": 0.7809034572733202,
      "ticId": 40030
    }
  ],
  "nextCursor": "eyJxdWVyeV9oYXNoIjoiYmFrZWQtYnJlYWQtaW4tcGxhc3RpYy1wYWNrYWdpbmciLCJvZmZzZXQiOjEwfQ=="
}
```

**SDK Code**

```python Ranked matches (first three results)
import requests

url = "https://api.zip-tax.com/search/tic"

payload = { "query": "baked bread in plastic packaging" }
headers = {
    "X-API-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Ranked matches (first three results)
const url = 'https://api.zip-tax.com/search/tic';
const options = {
  method: 'POST',
  headers: {'X-API-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"query":"baked bread in plastic packaging"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Ranked matches (first three results)
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.zip-tax.com/search/tic"

	payload := strings.NewReader("{\n  \"query\": \"baked bread in plastic packaging\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("X-API-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Ranked matches (first three results)
require 'uri'
require 'net/http'

url = URI("https://api.zip-tax.com/search/tic")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"query\": \"baked bread in plastic packaging\"\n}"

response = http.request(request)
puts response.read_body
```

```java Ranked matches (first three results)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.zip-tax.com/search/tic")
  .header("X-API-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"query\": \"baked bread in plastic packaging\"\n}")
  .asString();
```

```php Ranked matches (first three results)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.zip-tax.com/search/tic', [
  'body' => '{
  "query": "baked bread in plastic packaging"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'X-API-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Ranked matches (first three results)
using RestSharp;

var client = new RestClient("https://api.zip-tax.com/search/tic");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"query\": \"baked bread in plastic packaging\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Ranked matches (first three results)
import Foundation

let headers = [
  "X-API-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = ["query": "baked bread in plastic packaging"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.zip-tax.com/search/tic")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```