Tax Rates

Base URL: https://api.cornerspot.net

Authentication: requests use a bearer token, for example Authorization: Bearer YOUR_API_KEY.

List tax rates

GET /c/api/v1/tax_rates

Paginated, filterable and sortable list of the team's tax rates. Requires the tax_rates_read scope.

Query parameters

FIELDTYPEDESCRIPTION
querystringFree-text search across name, description and region (case-insensitive substring). Takes precedence over filter[search].
filter[search]stringFree-text search across name, description and region (used only when query is absent).
filter[active]booleanFilter by active flag (truthy/falsy values are cast).
filter[region]stringFilter to an exact region/jurisdiction value.
sortstringOne of name,rate,region,position,active,created_at,updated_at; - prefix for descending.
pageinteger1-based page number.
per_pageintegerItems per page.

Code samples

curl --request GET \
  --url 'https://api.cornerspot.net/c/api/v1/tax_rates' \
  --header 'Authorization: Bearer YOUR_API_KEY'
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data);
// Node.js 18+ (native fetch)
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

if (!response.ok) {
  throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();
console.log(data);
import json
import urllib.request

url = "https://api.cornerspot.net/c/api/v1/tax_rates"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
}

request = urllib.request.Request(url, headers=headers, method="GET")

with urllib.request.urlopen(request) as response:
    data = json.loads(response.read().decode("utf-8"))
    print(data)
require "json"
require "net/http"

uri = URI("https://api.cornerspot.net/c/api/v1/tax_rates")

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end

puts JSON.parse(response.body)
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => 'https://api.cornerspot.net/c/api/v1/tax_rates',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer YOUR_API_KEY',
    ],
]);

$response = curl_exec($curl);
curl_close($curl);

$data = json_decode($response, true);
print_r($data);

Responses

STATUSDESCRIPTION
200 OKa page of tax rates
401 Unauthorizedmissing or invalid API key
403 Forbiddenthe key lacks the tax_rates_read scope

Create a tax rate

POST /c/api/v1/tax_rates

Creates a tax rate in the team's catalog. Requires the tax_rates_write scope.

Request body

FIELDTYPEDESCRIPTION
tax_rateobject
tax_rate.namestring · requiredRequired — display name.
tax_rate.ratestring · requiredRequired — percentage, >= 0 and < 100 (e.g. "7.5").
tax_rate.descriptionstringOptional description.
tax_rate.regionstringOptional region/jurisdiction.
tax_rate.activebooleanWhether the rate is active (defaults to true).
tax_rate.positionintegerManual sort position.

Code samples

curl --request POST \
  --url 'https://api.cornerspot.net/c/api/v1/tax_rates' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --data '{
  "tax_rate": {
    "name": "string",
    "rate": "string",
    "description": "string",
    "region": "string",
    "active": true,
    "position": 1
  }
}'
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    "tax_rate": {
      "name": "string",
      "rate": "string",
      "description": "string",
      "region": "string",
      "active": true,
      "position": 1
    }
  })
});

const data = await response.json();
console.log(data);
// Node.js 18+ (native fetch)
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    "tax_rate": {
      "name": "string",
      "rate": "string",
      "description": "string",
      "region": "string",
      "active": true,
      "position": 1
    }
  })
});

if (!response.ok) {
  throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();
console.log(data);
import json
import urllib.request

url = "https://api.cornerspot.net/c/api/v1/tax_rates"
payload = json.dumps({
  "tax_rate": {
    "name": "string",
    "rate": "string",
    "description": "string",
    "region": "string",
    "active": true,
    "position": 1
  }
}).encode("utf-8")
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_KEY",
}

request = urllib.request.Request(url, data=payload, headers=headers, method="POST")

with urllib.request.urlopen(request) as response:
    data = json.loads(response.read().decode("utf-8"))
    print(data)
require "json"
require "net/http"

uri = URI("https://api.cornerspot.net/c/api/v1/tax_rates")

request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer YOUR_API_KEY"
request.body = JSON.generate({
  "tax_rate": {
    "name": "string",
    "rate": "string",
    "description": "string",
    "region": "string",
    "active": true,
    "position": 1
  }
})

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end

puts JSON.parse(response.body)
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => 'https://api.cornerspot.net/c/api/v1/tax_rates',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Authorization: Bearer YOUR_API_KEY',
    ],
    CURLOPT_POSTFIELDS => json_encode([
    'tax_rate' => [
        'name' => 'string',
        'rate' => 'string',
        'description' => 'string',
        'region' => 'string',
        'active' => true,
        'position' => 1,
    ],
]),
]);

$response = curl_exec($curl);
curl_close($curl);

$data = json_decode($response, true);
print_r($data);

Responses

STATUSDESCRIPTION
201 Createdcreated
401 Unauthorizedmissing or invalid API key
403 Forbiddenthe key lacks the tax_rates_write scope
422 Unprocessable Contentvalidation errors

Get a tax rate

GET /c/api/v1/tax_rates/{id}

Fetches a single tax rate scoped to the authenticated team. Requires the tax_rates_read scope.

Path parameters

FIELDTYPEDESCRIPTION
idstring · requiredTax rate id.

Code samples

curl --request GET \
  --url 'https://api.cornerspot.net/c/api/v1/tax_rates/abc123' \
  --header 'Authorization: Bearer YOUR_API_KEY'
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates/abc123', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data);
// Node.js 18+ (native fetch)
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates/abc123', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

if (!response.ok) {
  throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();
console.log(data);
import json
import urllib.request

url = "https://api.cornerspot.net/c/api/v1/tax_rates/abc123"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
}

request = urllib.request.Request(url, headers=headers, method="GET")

with urllib.request.urlopen(request) as response:
    data = json.loads(response.read().decode("utf-8"))
    print(data)
require "json"
require "net/http"

uri = URI("https://api.cornerspot.net/c/api/v1/tax_rates/abc123")

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end

puts JSON.parse(response.body)
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => 'https://api.cornerspot.net/c/api/v1/tax_rates/abc123',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer YOUR_API_KEY',
    ],
]);

$response = curl_exec($curl);
curl_close($curl);

$data = json_decode($response, true);
print_r($data);

Responses

STATUSDESCRIPTION
200 OKthe tax rate
401 Unauthorizedmissing or invalid API key
403 Forbiddenthe key lacks the tax_rates_read scope
404 Not Foundno such tax rate in this team

Update a tax rate

PATCH /c/api/v1/tax_rates/{id}

Updates a tax rate. Requires the tax_rates_write scope.

Path parameters

FIELDTYPEDESCRIPTION
idstring · requiredTax rate id.

Request body

FIELDTYPEDESCRIPTION
tax_rateobject
tax_rate.namestring
tax_rate.ratestringPercentage, >= 0 and < 100.
tax_rate.descriptionstring
tax_rate.regionstring
tax_rate.activeboolean
tax_rate.positioninteger

Code samples

curl --request PATCH \
  --url 'https://api.cornerspot.net/c/api/v1/tax_rates/abc123' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --data '{
  "tax_rate": {
    "name": "string",
    "rate": "string",
    "description": "string",
    "region": "string",
    "active": true,
    "position": 1
  }
}'
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates/abc123', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    "tax_rate": {
      "name": "string",
      "rate": "string",
      "description": "string",
      "region": "string",
      "active": true,
      "position": 1
    }
  })
});

const data = await response.json();
console.log(data);
// Node.js 18+ (native fetch)
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates/abc123', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    "tax_rate": {
      "name": "string",
      "rate": "string",
      "description": "string",
      "region": "string",
      "active": true,
      "position": 1
    }
  })
});

if (!response.ok) {
  throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();
console.log(data);
import json
import urllib.request

url = "https://api.cornerspot.net/c/api/v1/tax_rates/abc123"
payload = json.dumps({
  "tax_rate": {
    "name": "string",
    "rate": "string",
    "description": "string",
    "region": "string",
    "active": true,
    "position": 1
  }
}).encode("utf-8")
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_KEY",
}

request = urllib.request.Request(url, data=payload, headers=headers, method="PATCH")

with urllib.request.urlopen(request) as response:
    data = json.loads(response.read().decode("utf-8"))
    print(data)
require "json"
require "net/http"

uri = URI("https://api.cornerspot.net/c/api/v1/tax_rates/abc123")

request = Net::HTTP::Patch.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer YOUR_API_KEY"
request.body = JSON.generate({
  "tax_rate": {
    "name": "string",
    "rate": "string",
    "description": "string",
    "region": "string",
    "active": true,
    "position": 1
  }
})

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end

puts JSON.parse(response.body)
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => 'https://api.cornerspot.net/c/api/v1/tax_rates/abc123',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Authorization: Bearer YOUR_API_KEY',
    ],
    CURLOPT_POSTFIELDS => json_encode([
    'tax_rate' => [
        'name' => 'string',
        'rate' => 'string',
        'description' => 'string',
        'region' => 'string',
        'active' => true,
        'position' => 1,
    ],
]),
]);

$response = curl_exec($curl);
curl_close($curl);

$data = json_decode($response, true);
print_r($data);

Responses

STATUSDESCRIPTION
200 OKupdated
401 Unauthorizedmissing or invalid API key
403 Forbiddenthe key lacks the tax_rates_write scope
404 Not Foundno such tax rate in this team
422 Unprocessable Contentvalidation errors

Delete a tax rate

DELETE /c/api/v1/tax_rates/{id}

Deletes a tax rate via the deletion service. Detaches the rate from products and deal line items (totals self-correct), but is blocked (422) when the rate is referenced by historical invoice tax items. Requires the tax_rates_write scope.

Path parameters

FIELDTYPEDESCRIPTION
idstring · requiredTax rate id.

Query parameters

FIELDTYPEDESCRIPTION
reasonstringOptional human reason recorded on the deletion audit event.

Code samples

curl --request DELETE \
  --url 'https://api.cornerspot.net/c/api/v1/tax_rates/abc123' \
  --header 'Authorization: Bearer YOUR_API_KEY'
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates/abc123', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data);
// Node.js 18+ (native fetch)
const response = await fetch('https://api.cornerspot.net/c/api/v1/tax_rates/abc123', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

if (!response.ok) {
  throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();
console.log(data);
import json
import urllib.request

url = "https://api.cornerspot.net/c/api/v1/tax_rates/abc123"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
}

request = urllib.request.Request(url, headers=headers, method="DELETE")

with urllib.request.urlopen(request) as response:
    data = json.loads(response.read().decode("utf-8"))
    print(data)
require "json"
require "net/http"

uri = URI("https://api.cornerspot.net/c/api/v1/tax_rates/abc123")

request = Net::HTTP::Delete.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end

puts JSON.parse(response.body)
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => 'https://api.cornerspot.net/c/api/v1/tax_rates/abc123',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer YOUR_API_KEY',
    ],
]);

$response = curl_exec($curl);
curl_close($curl);

$data = json_decode($response, true);
print_r($data);

Responses

STATUSDESCRIPTION
204 No Contentdeleted
401 Unauthorizedmissing or invalid API key
403 Forbiddenthe key lacks the tax_rates_write scope
404 Not Foundno such tax rate in this team
422 Unprocessable Contentdeletion blocked because the rate is still in use

Was this article helpful?