Storefront regions
Regional pricing for a storefront: list the active regions, resolve a buyer country to a region, read one region, list tax classes and get a non-binding tax estimate for a country. Authenticated with the sales-channel id (vc_*) in the path and the browser Origin header. Read-only. Pass the resolved region id as regionId on the catalogue calls to get region-priced products.
List active regions
Lists the active regions of the store, the default region first, then by name. A region groups countries under one currency and one tax-inclusive setting. Region data is storefront-public and is gated on the products:read scope.
For /api/vc/{connectionId}/* routes the connectionId (vc_*) is in the URL path — not a header. Live-mode requests must also send a matching Origin header.
In: header
Path Parameters
Sales channel ID (vc_*), the canonical salesChannelId. connectionId is the deprecated name of the same value and is still the literal path segment.
Header Parameters
Origin of the storefront page making the call, for example https://shop.example.com. Required: a request with no Origin header is refused with 403. On a LIVE channel its host must equal the channel's registered domain (or one of its subdomains) or match an allowed origin. A TEST channel with no domain accepts any origin; once a domain is set it is matched as on LIVE.
Version of the calling SDK (the Brainerce SDK sends it automatically). Informational: it is recorded on the channel and never changes the response.
curl -X GET "https://api.brainerce.com/api/vc/string/regions" \ -H "origin: string" \ -H "X-SDK-Version: string"{
"data": [
{
"id": "clreg_abc123",
"name": "Europe",
"slug": "europe",
"currency": "EUR",
"countries": [
"DE",
"FR",
"IT"
],
"taxInclusive": true,
"isDefault": false
}
]
}{
"statusCode": 403,
"code": "INSUFFICIENT_SCOPE",
"message": "API key does not have the required scope: products:write",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions"
}{
"statusCode": 404,
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too many requests",
"details": {
"retryAfterSeconds": 12
},
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions"
}Resolve buyer country to a region
Resolves a buyer country to a region in one call. Send the country your edge runtime reports (for example the Cloudflare CF-IPCountry header). When no active region lists the country, the default region is returned with matched: false.
For /api/vc/{connectionId}/* routes the connectionId (vc_*) is in the URL path — not a header. Live-mode requests must also send a matching Origin header.
In: header
Path Parameters
Sales channel ID (vc_*), the canonical salesChannelId. connectionId is the deprecated name of the same value and is still the literal path segment.
Query Parameters
Buyer country, ISO 3166-1 alpha-2, case-insensitive. A missing or blank value is treated as unknown and resolves to the default region.
Header Parameters
Origin of the storefront page making the call, for example https://shop.example.com. Required: a request with no Origin header is refused with 403. On a LIVE channel its host must equal the channel's registered domain (or one of its subdomains) or match an allowed origin. A TEST channel with no domain accepts any origin; once a domain is set it is matched as on LIVE.
Version of the calling SDK (the Brainerce SDK sends it automatically). Informational: it is recorded on the channel and never changes the response.
curl -X GET "https://api.brainerce.com/api/vc/string/regions/auto?country=DE" \ -H "origin: string" \ -H "X-SDK-Version: string"{
"region": {
"id": "clreg_abc123",
"name": "Europe",
"slug": "europe",
"currency": "EUR",
"countries": [
"DE",
"FR",
"IT"
],
"taxInclusive": true,
"isDefault": false
},
"matched": true,
"country": "DE"
}{
"statusCode": 403,
"code": "INSUFFICIENT_SCOPE",
"message": "API key does not have the required scope: products:write",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions/auto"
}{
"statusCode": 404,
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions/auto"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too many requests",
"details": {
"retryAfterSeconds": 12
},
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions/auto"
}Get region
Returns one active region with the payment providers enabled for it.
For /api/vc/{connectionId}/* routes the connectionId (vc_*) is in the URL path — not a header. Live-mode requests must also send a matching Origin header.
In: header
Path Parameters
Sales channel ID (vc_*), the canonical salesChannelId. connectionId is the deprecated name of the same value and is still the literal path segment.
Region id, from regions.
Header Parameters
Origin of the storefront page making the call, for example https://shop.example.com. Required: a request with no Origin header is refused with 403. On a LIVE channel its host must equal the channel's registered domain (or one of its subdomains) or match an allowed origin. A TEST channel with no domain accepts any origin; once a domain is set it is matched as on LIVE.
Version of the calling SDK (the Brainerce SDK sends it automatically). Informational: it is recorded on the channel and never changes the response.
curl -X GET "https://api.brainerce.com/api/vc/string/regions/string" \ -H "origin: string" \ -H "X-SDK-Version: string"{
"id": "clreg_abc123",
"name": "Europe",
"slug": "europe",
"currency": "EUR",
"countries": [
"DE",
"FR",
"IT"
],
"taxInclusive": true,
"isDefault": false,
"paymentProviders": [
{
"id": "clinst_abc123",
"appId": "clapp_abc123",
"name": "Stripe"
}
]
}{
"statusCode": 403,
"code": "INSUFFICIENT_SCOPE",
"message": "API key does not have the required scope: products:write",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions/{regionId}"
}{
"statusCode": 404,
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions/{regionId}"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too many requests",
"details": {
"retryAfterSeconds": 12
},
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/regions/{regionId}"
}Estimate tax for a buyer country (non-binding preview)
Non-binding tax preview for product and cart pages. Only country-wide standard rates are used, so a state or province rate joins at checkout (taxCoverage: partial flags that case). The authoritative tax is always calculated at checkout from the full shipping address.
For /api/vc/{connectionId}/* routes the connectionId (vc_*) is in the URL path — not a header. Live-mode requests must also send a matching Origin header.
In: header
Path Parameters
Sales channel ID (vc_*), the canonical salesChannelId. connectionId is the deprecated name of the same value and is still the literal path segment.
Query Parameters
Items subtotal in the store currency. A non-numeric or negative value answers 400.
0 <= valueBuyer country, ISO 3166-1 alpha-2, case-insensitive. Without it no tax can be matched: untaxedReason is no_country when the store has tax on.
The buyer's region. Its tax-inclusive override, when set, decides inclusive or exclusive math. Omitted: the store default region, the one checkout uses when no region is passed. An id that is not one of this store's regions falls back to the store setting.
Header Parameters
Origin of the storefront page making the call, for example https://shop.example.com. Required: a request with no Origin header is refused with 403. On a LIVE channel its host must equal the channel's registered domain (or one of its subdomains) or match an allowed origin. A TEST channel with no domain accepts any origin; once a domain is set it is matched as on LIVE.
Version of the calling SDK (the Brainerce SDK sends it automatically). Informational: it is recorded on the channel and never changes the response.
curl -X GET "https://api.brainerce.com/api/vc/string/tax/estimate?subtotal=0&country=DE®ionId=string" \ -H "origin: string" \ -H "X-SDK-Version: string"{
"appliesTax": true,
"rate": 17,
"rateName": "VAT",
"rates": [
{
"rateId": "cltax_abc123",
"name": "VAT",
"rate": 17,
"amount": 17
}
],
"estimatedTax": 17,
"pricesIncludeTax": false,
"currency": "USD",
"note": "Estimate — final tax calculated at checkout with the full shipping address",
"untaxedReason": "no_country",
"taxCoverage": "partial"
}{
"statusCode": 400,
"code": "VALIDATION_FAILED",
"message": "name should not be empty, price must be a positive number",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax/estimate"
}{
"statusCode": 403,
"code": "INSUFFICIENT_SCOPE",
"message": "API key does not have the required scope: products:write",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax/estimate"
}{
"statusCode": 404,
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax/estimate"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too many requests",
"details": {
"retryAfterSeconds": 12
},
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax/estimate"
}List tax classes
Lists the tax classes of the store (name, slug, description) for transparency labels such as a "9% VAT" badge. Rates are not included.
For /api/vc/{connectionId}/* routes the connectionId (vc_*) is in the URL path — not a header. Live-mode requests must also send a matching Origin header.
In: header
Path Parameters
Sales channel ID (vc_*), the canonical salesChannelId. connectionId is the deprecated name of the same value and is still the literal path segment.
Header Parameters
Origin of the storefront page making the call, for example https://shop.example.com. Required: a request with no Origin header is refused with 403. On a LIVE channel its host must equal the channel's registered domain (or one of its subdomains) or match an allowed origin. A TEST channel with no domain accepts any origin; once a domain is set it is matched as on LIVE.
Version of the calling SDK (the Brainerce SDK sends it automatically). Informational: it is recorded on the channel and never changes the response.
curl -X GET "https://api.brainerce.com/api/vc/string/tax-classes" \ -H "origin: string" \ -H "X-SDK-Version: string"{
"data": [
{
"id": "cltc_abc123",
"name": "Standard",
"slug": "standard",
"description": "Applies to most products",
"isDefault": true
}
]
}{
"statusCode": 403,
"code": "INSUFFICIENT_SCOPE",
"message": "API key does not have the required scope: products:write",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax-classes"
}{
"statusCode": 404,
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax-classes"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too many requests",
"details": {
"retryAfterSeconds": 12
},
"timestamp": "2026-08-23T10:15:00.000Z",
"path": "/api/vc/{connectionId}/tax-classes"
}