Brazil Tax Reform Calculator - IBS and CBS
Pricing
Pay per event
Brazil Tax Reform Calculator - IBS and CBS
Simulate Brazilian IBS/CBS tax reform scenarios with step-by-step calculations, sourced assumptions, explicit estimate warnings and privacy-safe batch diagnostics.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Kman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
Brazil Tax Reform Calculator
Simulate Brazilian IBS/CBS tax reform scenarios for 2026–2033. Submit one anonymous calculation or a batch of up to 100. Each calculation produces a dataset row containing the engine result, step-by-step explanation, assumptions, public sources and warnings. Calculations run offline against the bundled parameter snapshot; they do not fetch current legislation.
Not legal/tax advice. This is an educational simulation and does not replace a qualified tax or legal professional. A verificado label describes the status of the parameters used in the bundled snapshot, not a professional opinion on a transaction. ESTIMATIVA marks hypothetical scenario assumptions. Parameters marked nao_verificado are always blocked.
Input
Use the original Portuguese engine field names. Monetary amounts are BRL numbers, with at most two decimal places and a maximum of one billion. Rates are fractions between zero and one, with up to six decimal places. Input is limited to 1 MiB. Unknown fields are rejected at every level. Do not submit personal data, identifiers, names, addresses or free text.
A verified-only calculation, without old-tax comparison:
{"categoria": "carga","ano": 2026,"base": 10000}
This returns an IBS/CBS debit and payment amount of BRL 100 before any declared waiver or credits. The result explains the configured 2026 offset against old federal taxes; it does not calculate an old-tax comparison unless enabled.
| Field | Meaning |
|---|---|
categoria, ano, base | Required category, year 2026–2033 and net IBS/CBS taxable base after statutory exclusions |
creditos | Eligible tax credits already established, as a complete { "cbs": 100, "ibs": 200 } object; these are tax amounts, not input costs |
permitirEstimativas | Omitted means false. True permits hypothetical parameters and also enables old-tax comparison unless explicitly disabled |
compararAntigos | Omitted means false when estimates are disabled. Explicit false keeps old-tax comparison disabled even with estimates enabled |
cumpreObrigacoes | Omitted means false. True declares compliance for the configured 2026 payment waiver |
confirmarEnquadramento | Explicit eligibility declaration required for reduced/exempt categories; enquadramentoConfirmado is the equivalent engine field; aliases must agree |
comando | calcular by default. comparar evaluates all eight transition years inside one dataset row; any estimated parameters used still need consent |
formato | texto by default, or json / markdown; controls formatted, while structured fields are always retained |
aliquotasPlenas, aliquotasAntigas | Optional hypothetical full reference rates or old-tax rates; complete numeric objects, requiring estimate consent when used |
tac | Cargo only: anonymous valor, eligible tipo (pf_nao_contribuinte or mei), pago: true, contratacaoDireta: true, optional CBS/IBS percentuais |
produto, quantidade, unidade, destinacao | Required for combustivel; product-specific unit, quantity up to one billion with six decimal places, destination insumo, revenda or consumo_final |
adRem, ibsRecolhido | Optional annual CBS/IBS fuel tariffs, up to one million BRL/unit with six decimal places, and payment declaration for the configured CBS deduction |
Categories (articles of LC 214/2025). Selecting a category does not validate statutory eligibility; reduced and exempt categories also need confirmarEnquadramento: true.
| Category | Scenario |
|---|---|
geral | General regime: full rate, full credit (art. 47) |
carga | Cargo freight: general regime, optional TAC presumed credit (art. 169) |
reduzido30 | 30% rate reduction: regulated professional services (art. 127) |
reduzido60 | 60% rate reduction: listed goods and services (art. 128) |
reduzido100 | Zero rate: listed goods and services; the supplier keeps its credits (art. 143) |
urbano | Urban rail or waterway public transport: 100% reduction, no credits for supplier or buyer (art. 285) |
urbanoRodoviario | Urban bus or metro public transport: exempt, with credits annulled (arts. 157 and 51) |
intermunicipal | Intercity or interstate public passenger transport: 40% reduction with credits (art. 286) |
aereoRegional | Regional air transport: 40% reduction (art. 287) |
fretamento | Closed-group charter: general regime, always marked ESTIMATIVA |
combustivel | Fuels: single-stage per-unit regime (arts. 172–180) |
urbano and urbanoRodoviario give the same amounts (no tax, no credits) under different legal grounds: a 100% reduction for rail and waterway, an exemption for bus and metro.
Batch example with an estimated freight/TAC scenario and a verified calculation:
{"formato": "json","calculations": [{ "categoria": "carga", "ano": 2026, "base": 10000 },{"categoria": "carga", "ano": 2033, "base": 10000,"creditos": { "cbs": 100, "ibs": 200 },"permitirEstimativas": true, "compararAntigos": false,"tac": {"valor": 1050, "tipo": "pf_nao_contribuinte","pago": true, "contratacaoDireta": true,"percentuais": { "cbs": 0.05, "ibs": 0.05 }}}]}
Batch mode permits only calculations, comando and formato at the top level; sending single-calculation fields together with calculations fails with MODO_MISTO and no charge. In the Console form, Category, Year and Base come prefilled with the first example above, so clear them before running a batch. Entries may override the operation and format. Put all scenario flags inside each entry. There is no truncation: empty lists and lists longer than 100 fail validation.
Fuel example (hypothetical annual tariffs; no extra transition multiplier):
{"categoria": "combustivel", "ano": 2033, "base": 10000,"produto": "diesel", "quantidade": 100, "unidade": "litro_20c","destinacao": "insumo", "adRem": { "cbs": 1, "ibs": 0.5 },"permitirEstimativas": true, "compararAntigos": false}
Output
Each successful row has status: "ok", a one-based index, categoria, ano, selo, result, steps, assumptions, warnings, format and formatted. The original engine result retains per-tax debits, credits, amounts due, balances, potential buyer credits and source metadata. Explanations and legal parameter notes remain in Portuguese. formatted is valid JSON when the selected format is json.
Real output of the first example above ({"categoria":"carga","ano":2026,"base":10000}), trimmed to the main fields; assumptions (7 sourced parameters) and formatted are omitted:
{"index": 1,"status": "ok","billable": true,"categoria": "carga","ano": 2026,"selo": "verificado","command": "calcular","format": "texto","result": {"tributos": {"cbs": { "debito": 90, "credito": 0, "devido": 90, "aRecolher": 90, "taxa": { "tipo": "ad_valorem", "valor": 0.009 } },"ibs": { "debito": 10, "credito": 0, "devido": 10, "aRecolher": 10, "taxa": { "tipo": "ad_valorem", "valor": 0.001 } }},"total": { "debito": 100, "credito": 0, "devido": 100, "aRecolher": 100, "saldoCredor": 0 }},"steps": [{"ano": 2026,"explanation": ["Base informada: R$ 10.000,00, já líquida das exclusões do art. 12 da LC 214/2025.","CBS: débito = R$ 10.000,00 × 0,9% (taxa após transição e redução de 0%) = R$ 90,00. LC 214/2025, arts. 12, 346 e 348; veja a premissa de regime para o artigo da redução.","CBS: crédito regular R$ 0,00 + presumido R$ 0,00 = R$ 0,00; devido antes de deduções R$ 90,00; saldo credor R$ 0,00. LC 214/2025, arts. 47–56. Créditos vedados ignorados: R$ 0,00.","IBS: débito = R$ 10.000,00 × 0,1% (taxa após transição e redução de 0%) = R$ 10,00. LC 214/2025, arts. 12, 343 e 348; veja a premissa de regime para o artigo da redução.","IBS: crédito regular R$ 0,00 + presumido R$ 0,00 = R$ 0,00; devido antes de deduções R$ 10,00; saldo credor R$ 0,00. LC 214/2025, arts. 47–56. Créditos vedados ignorados: R$ 0,00.","O valor a recolher de IBS/CBS R$ 100,00 é compensável com PIS/Cofins e, se não houver débito suficiente, com outros tributos federais (Decreto 12.955/2026, art. 583, I e II; LC 214/2025, art. 348).","Total a recolher de IBS/CBS R$ 100,00. Comparação com tributos antigos desativada; use --comparar para incluí-la. As compensações com esses tributos não foram apuradas."]}],"warnings": ["Not tax advice or legal advice. This educational simulation does not replace a qualified tax or legal professional.","Não é consultoria tributária: simulação educativa com base na lei pública; não substitui contador ou advogado."]}
In 2026 the CBS rate is 0.9% (LC 214/2025, art. 346) and the IBS rate is 0.1% (art. 343), so BRL 10,000 gives BRL 90 + BRL 10. The full warnings list also carries the scope and credit-segregation limits. Invalid calculations produce status: "invalid", billable: false and an error code/message without received values. They never trigger a calculation event. An empty or all-invalid run fails without a start event. Mixed batches retain valid results and free diagnostics. Charge limits produce free not_processed diagnostics for the remaining entries. Invalid initial PPE configuration fails before reading INPUT or writing dataset/KV outputs. Automatic charges must already be absent or zero in the platform configuration; the guard cannot reverse a platform start charge already applied. The key-value store contains RUN_SUMMARY with counts, event counts, completion status and the not-tax-advice notice.
Limits and sources
IBS and CBS credits stay separate. The simulator does not infer a net taxable base from a gross invoice, establish eligibility, calculate effective total tax burden or validate supplied credits. Old-tax comparison keeps bases constant and omits old credits and benefits. Annual reference rates, TAC coefficients and fuel tariffs may remain hypothetical in the snapshot; enabling estimates never enables unverified parameters. Fuel inputs represent the single-stage incidence; liquid volumes must already be converted to 20 °C, and GLP uses kilograms. Detailed simplified regimes, selective tax by product, special financial/real-estate regimes, operational split payment and regional exceptions are outside scope.
The bundled parametros.json records verification dates, status, effective dates and document/article references. Public official sources include Constitutional Amendment 132/2023, Complementary Law 214/2025, the federal tax authority, the IBS management committee and the official gazette. Check the bundled dates and current legislation before relying on a scenario.
Pricing and local execution
Final prices and packaging approved on 2026-10-24. The model is pay per event:
| Event | Price (USD) | Billing unit |
|---|---|---|
inicio-run | 0.005 | Once after at least one valid calculation is fully prepared |
calculo-concluido | 0.001 | Each valid calculation delivered with results, steps, assumptions and warnings |
One calculation costs USD 0.006; a batch of 100 costs USD 0.105 when all events are confirmed. A multi-year comparison counts as one calculation. Invalid calculations and diagnostics have no calculation charge. Empty or entirely invalid runs have no start charge. If a spending limit allows the start but prevents delivery, the start may be the only charged event.
The approved prices are embedded in the frozen EVENT_PRICES_USD constant in src/actor/billing.mjs. The bundled .actor/pay_per_event.json records approved_2026-10-24_not_published; this local manifest does not configure platform monetization or authorize publication. In PPE mode, platform event prices must match the numeric constants exactly. Missing events, differing prices, nonzero automatic charges and unexpected paid events fail the initial guard. Automatic apify-actor-start and apify-default-dataset-item events must be absent or have numeric zero prices.
The Actor declares apify and starts at src/actor/main.mjs. It serializes charges and honors ACTOR_MAX_TOTAL_CHARGE_USD, including zero, charging-manager limits and eventChargeLimitReached. The last confirmed unit remains counted when it reaches the limit. Outside PPE, the adapter still calls the SDK event methods; ignored-charge responses with chargedCount: 0 and no limit flag preserve delivery with pricingMode: "unpriced" and chargeUsd: 0. Summary event counts in that mode are not monetary charges.
The configured 256 MB covers the measured local SDK samples: 1 calculation took 0.783 s / 89.8 MiB, 100 took 1.482 s / 108.9 MiB, and empty input exited 1 at 0.660 s / 88.3 MiB. The maximum peak is approximately 109 MiB; 512 MB is only a fallback. Runs are limited to 256–512 MB with a 60-second default timeout. Evidence is recorded in prova/actor-sdk/medicoes.json. Hosted capacity and local Docker execution remain NOT_VERIFIED. Platform build/execution and PPE configuration are pending; publication requires new, separate approval.
For local checks, Node.js 24 is sufficient; the runner uses a file-backed fake Actor, disables network APIs, does not load the SDK and never reads a platform token. No package installation is needed:
node scripts/actor-local.mjs --input exemplos/carga-tac.json --output tmp/actor-demonode scripts/measure-actor.mjsnode --test
Use a new or empty output directory inside the repository. The runner saves dataset.jsonl, charges.jsonl, key-value-store.json and measurements.json. Its events are simulations without real charges; optional --ppe uses the approved constants as simulated unit prices. The measurement script runs 1-calculation, 100-calculation and empty-input cases three times and saves SDK-free evidence, separate from the SDK measurements above. The original offline CLI remains available through node src/cli.mjs or npm run cli -- .... Price approval is complete; platform validation and publication remain pending.