DevelopersAPI reference

Taxes API

REST endpoints for taxes in SKUFlow: 10 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
List tax rulesGET /organizations/{organizationId}/tax-rulesread
Add a tax rulePOST /organizations/{organizationId}/tax-ruleswrite
Get a tax ruleGET /organizations/{organizationId}/tax-rules/{taxRuleId}read
Change a tax rulePATCH /organizations/{organizationId}/tax-rules/{taxRuleId}write
Delete a tax ruleDELETE /organizations/{organizationId}/tax-rules/{taxRuleId}sensitive
Delete a set of tax rulesPOST /organizations/{organizationId}/tax-rules/deletesensitive
Import a tax rate tablePOST /organizations/{organizationId}/tax-rules/importwrite
Check the tax an address paysGET /organizations/{organizationId}/taxes/lookupread
Get the tax defaultsGET /organizations/{organizationId}/tax-settingsread
Change the tax defaultsPATCH /organizations/{organizationId}/tax-settingswrite

List tax rules

GET /organizations/{organizationId}/tax-rules

The business's sales tax rules by country, state and name, paged (rate tables can hold thousands of ZIP codes). search matches the name, city, county or an exact postal code; region a state; source the file a set was imported from. Also answers sources (MANUAL and each imported file, with counts). To know what an address pays use POST /taxes/lookup. Read-only.

Permissiontaxes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltaxRules_list (toolset settings)

Parameters

NameInTypeRequiredDescription
searchquerystringNoUp to 120 characters.
regionquerystringNoUp to 60 characters.
sourcequerystringNoUp to 120 characters.
activequerybooleanNo
limitqueryintegerNo1–200.
offsetqueryintegerNo

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstring
items[].namestring
items[].kindenumOne of COMPONENT, COMBINED.
items[].countrystring
items[].regionstring or null
items[].countystring or null
items[].citystring or null
items[].postalCodesarray of string
items[].ratePercentnumber
items[].clothingRatePercentnumber or null
items[].shippingTaxableboolean
items[].activeboolean
items[].notesstring or null
items[].sourcestringMANUAL, or the file it was imported from ("import:TX.csv").
items[].createdAtstring (date-time)
items[].updatedAtstring (date-time)
totalinteger
sourcesarray of object
sources[].sourcestring
sources[].countinteger

Add a tax rule

POST /organizations/{organizationId}/tax-rules

Adds a sales tax rule. New quotes and invoices shipping to an address it matches are taxed with it; existing ones keep their tax until "Update tax" (POST /quotes/{quoteId}/tax, POST /invoices/{invoiceId}/tax). Typical set-up: one COMPONENT rule per state you collect in, plus county / city rules, or COMBINED rules per ZIP code from a rate table (POST /tax-rules/import).

Permissiontaxes.manage (Owner, Admin)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooltaxRules_create (toolset settings)

Request body

FieldTypeRequiredDescription
namestringYesWhat it is, e.g. "Texas state", "Travis County", "Austin city". Up to 120 characters.
kindenumNoCOMPONENT (default): adds up with the other matching rules (state + county + city + district). COMBINED: the whole rate for the places it names; the most specific matching COMBINED rule wins alone. One of COMPONENT, COMBINED.
countrystring or nullNoISO country code (US, CA); default US. Up to 60 characters.
regionstring or nullNoState or province ("TX" or "Texas"); empty = the whole country. Up to 120 characters.
countystring or nullNoCounty or parish; empty = any. Up to 120 characters.
citystring or nullNoCity; empty = any. Up to 120 characters.
postalCodesarray of stringNoExact codes ("78701"), prefixes ("787*") or ranges ("78701-78799"); empty = any. ZIP+4 is matched on its first five digits. Up to 500 items.
ratePercentnumberYesPercent, e.g. 6.25. 0–100.
clothingRatePercentnumber or nullNoPercent on clothing (apparel lines); null = the same as ratePercent. 0 where clothing is exempt. 0–100.
shippingTaxablebooleanNoWhether this rate applies to shipping charges (default true).
activebooleanNoInactive rules are kept but never applied.
notesstring or nullNoUp to 2000 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","ratePercent":1}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
kindenumOne of COMPONENT, COMBINED.
countrystring
regionstring or null
countystring or null
citystring or null
postalCodesarray of string
ratePercentnumber
clothingRatePercentnumber or null
shippingTaxableboolean
activeboolean
notesstring or null
sourcestringMANUAL, or the file it was imported from ("import:TX.csv").
createdAtstring (date-time)
updatedAtstring (date-time)

Get a tax rule

GET /organizations/{organizationId}/tax-rules/{taxRuleId}

One tax rule: where it applies and its rates. Read-only.

Permissiontaxes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltaxRules_get (toolset settings)

Parameters

NameInTypeRequiredDescription
taxRuleIdpathstringYes

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules/{taxRuleId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
kindenumOne of COMPONENT, COMBINED.
countrystring
regionstring or null
countystring or null
citystring or null
postalCodesarray of string
ratePercentnumber
clothingRatePercentnumber or null
shippingTaxableboolean
activeboolean
notesstring or null
sourcestringMANUAL, or the file it was imported from ("import:TX.csv").
createdAtstring (date-time)
updatedAtstring (date-time)

Change a tax rule

PATCH /organizations/{organizationId}/tax-rules/{taxRuleId}

Changes the fields sent (a new rate, places, active: false to stop applying it). Applies to quotes and invoices taxed from now on; existing ones keep their tax until updated.

Permissiontaxes.manage (Owner, Admin)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooltaxRules_update (toolset settings)

Parameters

NameInTypeRequiredDescription
taxRuleIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoWhat it is, e.g. "Texas state", "Travis County", "Austin city". Up to 120 characters.
kindenumNoCOMPONENT (default): adds up with the other matching rules (state + county + city + district). COMBINED: the whole rate for the places it names; the most specific matching COMBINED rule wins alone. One of COMPONENT, COMBINED.
countrystring or nullNoISO country code (US, CA); default US. Up to 60 characters.
regionstring or nullNoState or province ("TX" or "Texas"); empty = the whole country. Up to 120 characters.
countystring or nullNoCounty or parish; empty = any. Up to 120 characters.
citystring or nullNoCity; empty = any. Up to 120 characters.
postalCodesarray of stringNoExact codes ("78701"), prefixes ("787*") or ranges ("78701-78799"); empty = any. ZIP+4 is matched on its first five digits. Up to 500 items.
ratePercentnumberNoPercent, e.g. 6.25. 0–100.
clothingRatePercentnumber or nullNoPercent on clothing (apparel lines); null = the same as ratePercent. 0 where clothing is exempt. 0–100.
shippingTaxablebooleanNoWhether this rate applies to shipping charges (default true).
activebooleanNoInactive rules are kept but never applied.
notesstring or nullNoUp to 2000 characters.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules/{taxRuleId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","kind":"COMPONENT","country":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
kindenumOne of COMPONENT, COMBINED.
countrystring
regionstring or null
countystring or null
citystring or null
postalCodesarray of string
ratePercentnumber
clothingRatePercentnumber or null
shippingTaxableboolean
activeboolean
notesstring or null
sourcestringMANUAL, or the file it was imported from ("import:TX.csv").
createdAtstring (date-time)
updatedAtstring (date-time)

Delete a tax rule

DELETE /organizations/{organizationId}/tax-rules/{taxRuleId}

Destructive: deletes the rule. Quotes and invoices already taxed keep their tax; prefer active: false to keep it on file.

Permissiontaxes.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltaxRules_delete (toolset settings)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
taxRuleIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules/{taxRuleId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
oktrue

Delete a set of tax rules

POST /organizations/{organizationId}/tax-rules/delete

Destructive: deletes every rule imported from one file (source, as listed in GET /tax-rules sources), or every rule with all: true (rules kept by hand included). Documents already taxed keep their tax.

Permissiontaxes.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltaxRules_deleteMany (toolset settings)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Request body

FieldTypeRequiredDescription
sourcestringNoUp to 120 characters.
allbooleanNo

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules/delete" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":"string","all":true}'

Response

200: the answer's fields
FieldTypeDescription
deletedinteger

Import a tax rate table

POST /organizations/{organizationId}/tax-rules/import

Reads a CSV rate table and adds its rules. Two layouts: Avalara's free rate tables (State, ZipCode, TaxRegionName, EstimatedCombinedRate…; one COMBINED rule per ZIP code), or a sheet with columns name, country, state, county, city, zip (codes separated by spaces or ;), rate (percent), and optionally kind, clothing_rate, shipping_taxable. Rules imported before from a file of the same fileName are replaced (re-import an updated table); rules added by hand are never touched. dryRun: true only checks and previews. Answers how many rules were written, how many replaced and the rows that could not be read.

Permissiontaxes.manage (Owner, Admin)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooltaxRules_import (toolset settings)

Request body

FieldTypeRequiredDescription
contentstringYesThe CSV file's text.
fileNamestring or nullNoNames the set ("TX.csv"); a later import of the same name replaces it. Up to 120 characters.
dryRunbooleanNo

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-rules/import" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content":"string"}'

Response

200: the answer's fields
FieldTypeDescription
formatenum or nullOne of AVALARA, SIMPLE.
sourcestring
importedinteger
replacedinteger
problemsarray of object
problems[].lineinteger
problems[].messagestring
previewarray of objectThe first rows as read.
preview[].lineinteger
preview[].namestring
preview[].kindenumOne of COMPONENT, COMBINED.
preview[].countrystring or null
preview[].regionstring or null
preview[].countystring or null
preview[].citystring or null
preview[].postalCodesarray of string
preview[].ratePercentnumber
preview[].clothingRatePercentnumber or null
preview[].shippingTaxableboolean

Check the tax an address pays

GET /organizations/{organizationId}/taxes/lookup

What a sale shipped to an address is taxed: give an address (country, state, county, city, zip) or a saved propertyId; with customerId, the customer's exemption and the address's own rate apply too, exactly as on a quote. Answers the rate, the clothing and shipping rates, the source (RULES, ADDRESS, DEFAULT, EXEMPT, NONE) and the rules that applied. Read-only.

Permissiontaxes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltaxes_lookup (toolset settings)

Parameters

NameInTypeRequiredDescription
countryquerystringNoUp to 120 characters.
statequerystringNoUp to 120 characters.
countyquerystringNoUp to 120 characters.
cityquerystringNoUp to 120 characters.
zipquerystringNoUp to 30 characters.
propertyIdquerystringNoA saved address (GET /properties).
customerIdquerystringNoApply the customer's tax exemption.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/taxes/lookup" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
sourceenumOne of EXEMPT, MANUAL, ADDRESS, RULES, UNIT, DEFAULT, NONE.
rulesarray of object
rules[].idstring
rules[].namestring
rules[].kindenumOne of COMPONENT, COMBINED.
rules[].ratePercentnumber
addressobject or null
address.countrystring or null
address.statestring or null
address.countystring or null
address.citystring or null
address.zipstring or null
ratePercentnumber
clothingRatePercentnumber or null
shippingRatePercentnumber or null
resolvedAtstring

Get the tax defaults

GET /organizations/{organizationId}/tax-settings

The default rate (where no rule, address rate or unit default applies), whether it taxes shipping, and how many rules are active. Read-only.

Permissiontaxes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltaxes_settings (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-settings" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
defaultRatePercentnumber or nullPercent where no rule, address rate or unit default applies; null = no tax.
defaultShippingTaxableboolean
activeRulesintegerHow many active tax rules the business has.

Change the tax defaults

PATCH /organizations/{organizationId}/tax-settings

Sets the default rate (percent, or null for none) used where no tax rule, address rate or unit default applies, and whether it taxes shipping. Applies to quotes and invoices taxed from now on.

Permissiontaxes.manage (Owner, Admin)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooltaxes_updateSettings (toolset settings)

Request body

FieldTypeRequiredDescription
defaultRatePercentnumber or nullNo0–100.
defaultShippingTaxablebooleanNo

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/tax-settings" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"defaultRatePercent":1,"defaultShippingTaxable":true}'

Response

200: the answer's fields
FieldTypeDescription
defaultRatePercentnumber or nullPercent where no rule, address rate or unit default applies; null = no tax.
defaultShippingTaxableboolean
activeRulesintegerHow many active tax rules the business has.

On this page