What you’ll need
- A dashboard token (JWT). Not your secret key — see the warning below.
- A region you are set up to collect in.
The shape of the flow
1
Find your region id
Every call here is scoped to one region.
2
Look at the templates
Spotflow ships the standard rate for each region.
3
Create the configuration
Adopt a template, or set your own rate.
4
Change the rate
Update it without recreating it.
5
Switch it off
Deactivate rather than delete.
Step 1: Find your region id
Every tax call needs aregionId, and it is a small integer, not a UUID.
id is the regionId you need. taxStatus tells you whether tax is switched on for
that region yet.
GET /merchant/regions/tax-status returns a narrower list — only the regions that
support tax at all. On our test merchant that was Ghana, Nigeria, South Africa and
Kenya, while /merchant/regions returned those plus Benin, Cameroon, Côte d’Ivoire and
Global. If a region is missing from the tax-status list, you cannot configure tax there.Step 2: Look at the templates
Spotflow ships the standard rate for each region so you do not have to look it up.template: true means this is not yours yet. It is a suggestion, it has a
templateId but no id, and nothing is being charged. Step 3 turns it into a real
configuration.
Step 3: Create the configuration
template is now false and there is an id. That is a live configuration, and
tax is now being applied to collections in that region. Creating the first configuration
also enables tax for the merchant-region automatically — you do not switch it on
separately.
The
id is an integer (32), not a UUID, unlike accounts, transfers and plans.
Same for regionId and templateId.capAmount is required for percentage tax
The template disappears once you create a configuration
List the region again after creating:template: true row is gone. This endpoint returns templates and configurations
mixed together, and a template stops being offered once you have adopted it. Always
check the template flag rather than assuming a row is live.
A region can hold more than one configuration — we created a second, flat
Ghana VAT 2
alongside this one and it was accepted with 201. The specification suggests a
duplicate is rejected; on dev it is not. Check the list before creating, or you can end
up charging two taxes in one region.Step 4: Change the rate
There is no
regionId in the update body. A configuration’s region is fixed when you
create it. To move a tax to a different region, deactivate this one and create a new one.taxName, taxType and rate are all required on the update, so send the full object
even when changing one number.
To read a single configuration:
Step 5: Switch it off
There is no delete. You deactivate.{ "status": "active" } switches it back on, with the same rate and cap intact.
Deactivating is how you stop charging a tax while keeping the record for your own
history.
The status values are lowercase —
active and inactive — even though the API
specification lists them uppercase.When things go wrong
What to do next
- Bill a customer every month — recurring charges the tax applies to
- Give a Customer a Virtual Account — where collections land
- Pay one person out — move the proceeds on

