> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.zip.tax/v-6-0/api-reference/ziptax-api/nexus-thresholds/nexus-threshold-list/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.zip.tax/_mcp/server. # List Economic Nexus Thresholds POST https://api.zip-tax.com/nexus-threshold/list Content-Type: application/json Returns the economic nexus thresholds that decide when a seller has to register in a state: the sales figure, the transaction count where one still applies, how the two combine, which sales count toward them, whether marketplace sales are included, and the period each state measures over. This is reference data. It is the same for every caller and is not derived from your sales: compare it against your own totals to work out where you are approaching a threshold. Send no body, or no `stateCodes`, to get every jurisdiction the country publishes. `countryCode` defaults to USA, currently the only country published. States with no general statewide sales tax (Delaware, Montana, New Hampshire, Oregon) are returned with `noSalesTax: true` and null thresholds rather than omitted. A `stateCodes` list naming a code that is not published is rejected with 400 rather than answered with the states that did match, so a typo cannot read back as 'this state has no threshold'. Reference: https://docs.zip.tax/api-reference/ziptax-api/nexus-thresholds/nexus-threshold-list ## Authentication - `X-API-KEY` header (required) — API Key authentication via header ## Request ### Body (application/json) This endpoint expects an object. - `countryCode` (string, optional) — ISO 3166-1 alpha-3 country code. Defaults to USA, which is the only country published today. A country with no published data returns 404. - `stateCodes` (list of string, optional) — Two-letter jurisdiction codes to return. Omit it for every jurisdiction. The response is ordered by state code regardless of the order sent, and a repeated code yields one row. ## Response ### 200 OK - `thresholds` (list of NexusThresholdOutput, optional) — The matching thresholds, ordered by state code. ## Errors ### 400 Nexus Threshold List Body 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 Nexus Threshold List Body 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. ### 404 Nexus Threshold List Body Not Found Error Not Found - `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 Nexus Threshold List Body 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 Nexus Threshold List Body 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 Nexus Threshold List Body 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. ### 503 Nexus Threshold List Body Service Unavailable Error Service Unavailable - `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 ### NexusThresholdOutput - `countryCode` (string, required) — ISO 3166-1 alpha-3 code of the country this jurisdiction belongs to. - `includableSales` (enum, required) — Which sales count toward the threshold. 'none' for a state with no general statewide sales tax. - Allowed values: `gross-sales`, `retail-sales`, `taxable-sales`, `gross-receipts`, `none` - `includableSalesDetail` (string, required) — The source wording behind includableSales, carrying qualifiers the enum cannot: California, Georgia, and Missouri count tangible personal property only, and Connecticut names retail sales of both property and services. Empty for a state with no general statewide sales tax. - `marketplace` (enum, required) — Whether sales made through a marketplace facilitator count toward the threshold. 'none' for a state with no general statewide sales tax. - Allowed values: `included`, `excluded`, `none` - `noSalesTax` (boolean, required) — True for the states with no general statewide sales tax: Delaware, Montana, New Hampshire, and Oregon. They are returned rather than omitted so a caller iterating states does not read a missing row as missing data. - `period` (string, required) — The window the threshold is measured over, in the source's own words. Prose rather than a code because the periods genuinely differ per state, from a calendar year to a rolling twelve months to the previous four sales tax quarters. Empty for a state with no general statewide sales tax. - `rule` (enum, required) — How the two thresholds combine. 'either-threshold': meeting either one establishes nexus. 'both-required': both must be met. 'sales-only': there is no transaction test. - Allowed values: `either-threshold`, `both-required`, `sales-only` - `stateCode` (string, required) — Two-letter jurisdiction code. US states plus DC and PR. - `thresholdSales` (long, optional) — Sales volume, in whole US dollars, that establishes economic nexus. Null for a state with no general statewide sales tax. - `thresholdTransactions` (long, optional) — Number of separate transactions that establishes economic nexus. Null when the state has no transaction test, which is increasingly common: several states have repealed theirs. ### 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 {} ``` **Response** ```json { "thresholds": [ { "countryCode": "USA", "includableSales": "gross-sales", "includableSalesDetail": "Gross sales (TPP only)", "marketplace": "included", "noSalesTax": false, "period": "Current or previous calendar year", "rule": "either-threshold", "stateCode": "CA", "thresholdSales": 500000, "thresholdTransactions": 200 } ] } ``` **SDK Code** ```python import requests url = "https://api.zip-tax.com/nexus-threshold/list" payload = {} headers = { "X-API-KEY": "", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.zip-tax.com/nexus-threshold/list'; const options = { method: 'POST', headers: {'X-API-KEY': '', 'Content-Type': 'application/json'}, body: '{}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.zip-tax.com/nexus-threshold/list" payload := strings.NewReader("{}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("X-API-KEY", "") 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 require 'uri' require 'net/http' url = URI("https://api.zip-tax.com/nexus-threshold/list") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["X-API-KEY"] = '' request["Content-Type"] = 'application/json' request.body = "{}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.zip-tax.com/nexus-threshold/list") .header("X-API-KEY", "") .header("Content-Type", "application/json") .body("{}") .asString(); ``` ```php request('POST', 'https://api.zip-tax.com/nexus-threshold/list', [ 'body' => '{}', 'headers' => [ 'Content-Type' => 'application/json', 'X-API-KEY' => '', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.zip-tax.com/nexus-threshold/list"); var request = new RestRequest(Method.POST); request.AddHeader("X-API-KEY", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "X-API-KEY": "", "Content-Type": "application/json" ] let parameters = [] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.zip-tax.com/nexus-threshold/list")! 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() ```