curl --request POST \
--url https://api.arcuserp.com/v1/tax-codes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"code": "P0000000",
"name": "Tangible Personal Property (TPP)",
"description": "<string>",
"taxable": true,
"category": "<string>",
"avatax_tax_code": "<string>",
"is_active": true,
"metadata": {}
}
'import requests
url = "https://api.arcuserp.com/v1/tax-codes"
payload = {
"code": "P0000000",
"name": "Tangible Personal Property (TPP)",
"description": "<string>",
"taxable": True,
"category": "<string>",
"avatax_tax_code": "<string>",
"is_active": True,
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
code: 'P0000000',
name: 'Tangible Personal Property (TPP)',
description: '<string>',
taxable: true,
category: '<string>',
avatax_tax_code: '<string>',
is_active: true,
metadata: {}
})
};
fetch('https://api.arcuserp.com/v1/tax-codes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcuserp.com/v1/tax-codes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'code' => 'P0000000',
'name' => 'Tangible Personal Property (TPP)',
'description' => '<string>',
'taxable' => true,
'category' => '<string>',
'avatax_tax_code' => '<string>',
'is_active' => true,
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.arcuserp.com/v1/tax-codes"
payload := strings.NewReader("{\n \"code\": \"P0000000\",\n \"name\": \"Tangible Personal Property (TPP)\",\n \"description\": \"<string>\",\n \"taxable\": true,\n \"category\": \"<string>\",\n \"avatax_tax_code\": \"<string>\",\n \"is_active\": true,\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.arcuserp.com/v1/tax-codes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"code\": \"P0000000\",\n \"name\": \"Tangible Personal Property (TPP)\",\n \"description\": \"<string>\",\n \"taxable\": true,\n \"category\": \"<string>\",\n \"avatax_tax_code\": \"<string>\",\n \"is_active\": true,\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/tax-codes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"code\": \"P0000000\",\n \"name\": \"Tangible Personal Property (TPP)\",\n \"description\": \"<string>\",\n \"taxable\": true,\n \"category\": \"<string>\",\n \"avatax_tax_code\": \"<string>\",\n \"is_active\": true,\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object": "tax_code",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"code": "<string>",
"name": "<string>",
"description": "<string>",
"taxable": true,
"category": "<string>",
"avatax_tax_code": "<string>",
"is_active": true,
"external_source": "<string>",
"external_id": "<string>",
"metadata": {},
"deleted_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Create a tax code
Creates a new tax classification code; code must be unique within the entity. When AvaTax is the active tax provider, set avatax_tax_code to the matching AvaTax code, and the call requires tax_codes:write scope.
curl --request POST \
--url https://api.arcuserp.com/v1/tax-codes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"code": "P0000000",
"name": "Tangible Personal Property (TPP)",
"description": "<string>",
"taxable": true,
"category": "<string>",
"avatax_tax_code": "<string>",
"is_active": true,
"metadata": {}
}
'import requests
url = "https://api.arcuserp.com/v1/tax-codes"
payload = {
"code": "P0000000",
"name": "Tangible Personal Property (TPP)",
"description": "<string>",
"taxable": True,
"category": "<string>",
"avatax_tax_code": "<string>",
"is_active": True,
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
code: 'P0000000',
name: 'Tangible Personal Property (TPP)',
description: '<string>',
taxable: true,
category: '<string>',
avatax_tax_code: '<string>',
is_active: true,
metadata: {}
})
};
fetch('https://api.arcuserp.com/v1/tax-codes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcuserp.com/v1/tax-codes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'code' => 'P0000000',
'name' => 'Tangible Personal Property (TPP)',
'description' => '<string>',
'taxable' => true,
'category' => '<string>',
'avatax_tax_code' => '<string>',
'is_active' => true,
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.arcuserp.com/v1/tax-codes"
payload := strings.NewReader("{\n \"code\": \"P0000000\",\n \"name\": \"Tangible Personal Property (TPP)\",\n \"description\": \"<string>\",\n \"taxable\": true,\n \"category\": \"<string>\",\n \"avatax_tax_code\": \"<string>\",\n \"is_active\": true,\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.arcuserp.com/v1/tax-codes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"code\": \"P0000000\",\n \"name\": \"Tangible Personal Property (TPP)\",\n \"description\": \"<string>\",\n \"taxable\": true,\n \"category\": \"<string>\",\n \"avatax_tax_code\": \"<string>\",\n \"is_active\": true,\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/tax-codes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"code\": \"P0000000\",\n \"name\": \"Tangible Personal Property (TPP)\",\n \"description\": \"<string>\",\n \"taxable\": true,\n \"category\": \"<string>\",\n \"avatax_tax_code\": \"<string>\",\n \"is_active\": true,\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object": "tax_code",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"code": "<string>",
"name": "<string>",
"description": "<string>",
"taxable": true,
"category": "<string>",
"avatax_tax_code": "<string>",
"is_active": true,
"external_source": "<string>",
"external_id": "<string>",
"metadata": {},
"deleted_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_
Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Headers
Client-generated unique key for idempotent POST/PATCH/DELETE operations. Alias for the Idempotency parameter. Max 255 chars. On retry with the same key, the original response is returned without re-executing the operation. Keys expire after 24 hours.
255Body
Response
Tax code created
A tax classification code for products (e.g. AvaTax P0000000 generic tangible, ND040000 non-taxable digital, etc.). When AvaTax is the active jurisdiction provider, avatax_tax_code mirrors the canonical AvaTax tax code so jurisdiction sourcing flows through. Soft-delete refuses with HTTP 409 if any product still references the code (FK guard against orphaned product tax classification). Scope: tax_codes:read / tax_codes:write / tax_codes:delete.
"tax_code"
Operator-defined code unique per entity. 1..50 chars.
Human-readable label. 1..150 chars.
If false, products with this code are exempt from sales tax.
Optional grouping label (e.g. 'general', 'food', 'digital').
Mirrors the AvaTax tax code when AvaTax is the active provider.
Free-form caller metadata. Default {}.
Was this page helpful?

