Enterprise · chains, large web shops, marketplaces and ERP
Fiscalization for large systems, on the pricing model you choose
Tezga is the fiscal layer of your system: your website, ERP, OMS or register sends the order, and Tezga issues and fiscalizes the receipt through the Tax Administration V-PFR and returns the PFR number, QR code and PDF. You choose the model: RSD 2 per receipt, or €800 a month per site whatever the number of receipts.
- per fiscal receipt
- RSD 2per fiscal receipt
- or fixed, a month per site
- €800or fixed, a month per site
- contracted monthly availability
- 99.9%contracted monthly availability
- ESIR approved by the Tax Administration
- IB 1597ESIR approved by the Tax Administration
The price, in the open
No price on request. Two models: you choose the one that fits your volume, and the contract and service are the same.
Model 1 · per receipt
RSD 2
per fiscal receipt
+ €5,000 integration per site, one-off
- You pay only for receipts issued
- No fixed monthly amount
- For lower or uneven volume
Model 2 · fixed
€800
a month per site
+ €2,500 integration per site, one-off
- Unlimited fiscal receipts
- The same amount every month, Black Friday included
- For high volume
Both models
3 years
minimum contract term
- API calls are not billed
- 99.9% SLA and a contracted response time
- Updates for regulatory changes, at no extra cost
- Data processing agreement (Serbian ZZPL and GDPR) and NDA
Which pays off: at roughly RSD 117 to the euro, the fixed model is cheaper from about 46,800 receipts a month per site, and below that the per-receipt model is.
Example, two sites (say a B2C shop and a marketplace): on the fixed model €1,600 a month and €5,000 one-off; on the per-receipt model RSD 2 for each receipt and €10,000 one-off.
One site is one online shop: one domain on one instance of the platform. Several languages and currencies on the same instance are still one site.
Amounts are in euros and are paid in dinars at the National Bank of Serbia middle rate on the invoice date.
Enterprise terms, version 1.0, updated 14 October 2026.
Who Enterprise is for
For systems where receipts are not issued by a cashier but by other software, under its own key and in large numbers.
- Chains and franchises
- Several stores and several sites, the same products and one issuer of receipts for every channel.
- Large web shops
- Tens of thousands of orders a month, sales and Black Friday, without counting receipts.
- Marketplace platforms
- Receipts to the buyer under the seller's tax ID (PIB), commission through SEF.
- Companies with an ERP
- SAP, Dynamics, Pantheon or your own ERP stays the main system, and Tezga is the fiscal layer beneath it.
- Teams with their own developers
- Open OpenAPI, a sandbox, idempotent calls and signed webhooks.
What the price includes
Everything in the Biznis plan, plus what a system with several channels and several legal entities needs.
- Everything in the Biznis plan, at Enterprise scale
- Split deliveries: advance and then final invoices according to your delivery policy
- Marketplace: invoices to the buyer under the seller's tax ID (PIB), commission through SEF
- External channels: websites, ERP, registers, parcel lockers and couriers issue invoices through the API
- Bank statements from several banks, reconciliation by bank and account
- Every invoice as both PDF and thermal, the same for all channels
- Multiple legal entities, white-label, SLA with on-call support
Works with the systems you already have
A ready connector means it already exists in Tezga. For every other system we build the connection ourselves, through the same public API, and the one-off integration covers it.
Web shop platforms
ready connector- Magento and Adobe Commerce
- A ready webhook connector: the order arrives in its own format, with no repackaging.
- Shopify and Shopify Plus
- A ready two-way connector.
- WooCommerce
- A ready two-way connector.
- PrestaShop, OpenCart and BigCommerce
- A ready webhook connector.
Enterprise commerce and headless
through the API- VTEX
- The Orders hook (Feed v3) or your middleware calls Tezga once the order is paid.
- Salesforce Commerce Cloud, SAP Commerce Cloud, commercetools, Shopware
- A call from the OMS or the integration layer, after payment is confirmed.
- Your own site
- Next.js, Laravel, Symfony, Node.js, .NET, Java or Python: one HTTPS call with a JSON body.
ERP and business systems
through the API, both ways- SAP S/4HANA, SAP ECC and SAP Business One
- Through SAP Integration Suite or a direct HTTP call; the issued receipt comes back by webhook for posting.
- Microsoft Dynamics 365, Oracle NetSuite and Odoo
- Products and customers come in through /products and /customers, up to 500 items per call.
- Pantheon and local ERP systems
- Goods receipts and price changes through /kalkulacija and /nivelacija, with an entry in the KEP book.
Integration platforms
through the API- MuleSoft, Boomi and Azure Logic Apps
- A REST connector with an API key and an HMAC signature.
- n8n, Make and Zapier
- An HTTP step, no coding.
Fits any architecture
Tezga is a single REST service with idempotent calls. It makes no difference whether a monolith calls it or a hundred microservices do.
- Monolith
- One call from your existing code, after the payment is confirmed. No new infrastructure and nothing to install.
- Microservices
- A dedicated fiscal service or a consumer on a message queue (Kafka, RabbitMQ, Amazon SQS, Azure Service Bus). The same externalId never creates a second receipt, so a redelivered message is safe.
- Headless and composable (MACH)
- The BFF or the OMS calls Tezga; the front end and the CMS need not know it exists.
- Serverless
- AWS Lambda, Azure Functions, Google Cloud Functions, Vercel or Cloudflare Workers: a short, stateless call.
- Event-driven
- The outcome arrives by webhook with an HMAC signature, and a failed delivery is retried 5 times.
- Batch synchronisation
- Catalogue and customers from the ERP, up to 500 items per call, with an outcome per item; one bad item does not break the rest.
- Registers in stores
- The same account and the same issuer for web and store: the Tezga register runs on the web, on phones and on tablets.
How it works, live
Your site, Tezga and the Tax Administration in one flow
The customer pays on your site, the fiscal receipt is created on its own.
- 1Customer → Your site
paid order
The customer completes the purchase on your site.
- 2Your site → Tezga
POST /order
- 3Tezga → Tax Admin (V-PFR)
receipt to sign
- 4Tax Admin (V-PFR) → Tezga
PFR number + QR
- 5Tezga → Your site
racun.fiskalizovan
- 6Tezga → Customer
PDF by email
API documentation
REST with a JSON body, described in OpenAPI 3.1 (version 1.6.0). The specification is public and needs no key, so your team can import it into Postman, Swagger or a client generator before you sign.
- Base URL
- https://pos.narbiz.com
- Format
- JSON over HTTPS (TLS)
- Authentication
- The X-Tezga-Api-Key header; a key looks like tzg_ followed by 48 hexadecimal characters
- Keys
- Up to 20 named keys per company, one per system; each can be revoked on its own, made read-only and bound to a list of IP addresses
- Body signature
- HMAC-SHA256 in the X-Tezga-Signature header; once a secret is set, it is required for every write
- Idempotency
- By externalId: a repeated request returns the same document with the status postojalo (already existed), never a second receipt
- Rate limits
- 120 writes and 240 reads a minute per company; for Enterprise raised up to 10,000 a minute
- Size
- Body up to 512 KB, up to 500 items per call
- Environments
- Production, the Tax Administration sandbox and simulation; the same key and the same code, and the environment is read from GET /tax-labels
All calls
- POST
/api/integrations/orderIssue a receipt (or a pro forma invoice) - POST
/api/integrations/refundCancellation or refund - POST
/api/integrations/advanceAdvance receipt and closing the advance - POST
/api/integrations/kalkulacijaGoods receipt with costing - POST
/api/integrations/nivelacijaPrice change (revaluation) - POST
/api/integrations/copyReceipt copy (КОПИЈА) - POST
/api/integrations/productsWrite products (1 to 500) - POST
/api/integrations/customersWrite customers (1 to 500) - GET
/api/integrations/documentsDocument status by order number - GET
/api/integrations/documents/{id}Document status - GET
/api/integrations/tax-labelsTax rates and labels of the account - GET
/api/integrations/transactionsCompany bank transactions
curl -X POST "https://pos.narbiz.com/api/integrations/order?provider=custom" \
-H "X-Tezga-Api-Key: tzg_…" \
-H "X-Tezga-Signature: sha256=…" \
-H "Content-Type: application/json" \
-d '{
"externalId": "WEB-100245981",
"tok": "fiskalni",
"nacinPlacanja": "Kartica",
"cenaIzZahteva": true,
"posaljiMejl": true,
"kupac": { "naziv": "Kupac", "email": "kupac@primer.rs" },
"stavke": [
{ "sifra": "JAK-0042", "naziv": "Jakna", "kolicina": 1,
"cenaSaPdv": 12990, "poreskaStopa": "20" },
{ "naziv": "Dostava", "kolicina": 1, "cenaSaPdv": 390,
"poreskaStopa": "20", "jedinicaMere": "usluga" }
]
}'{
"ok": true,
"status": "kreirano",
"documentId": "b3f1…",
"broj": "RAC2026000123",
"statusDokumenta": "izdat",
"ukupnoSa": "13380.00",
"nacinPlacanja": "Kartica",
"fiskalni": {
"pfrBroj": "AB12CD34-AB12CD34-123",
"pfrVreme": "2026-10-14T10:00:02.000Z",
"brojacRacuna": "123/130ПП",
"esirBroj": "1597/1.1",
"verifikacioniUrl": "https://suf.purs.gov.rs/v/?vl=…"
},
"javniUrl": "https://pos.narbiz.com/r/7f3a…",
"javniPdfUrl": "https://pos.narbiz.com/r/7f3a…/pdf"
}javniUrl and javniPdfUrl work without signing in, so you can put them in the order confirmation. When the Tax Administration does not accept the receipt, the response is 202 with ok:false, the document stays issued and Tezga retries fiscalization on its own.
Response codes
- 200
- Document issued and fiscalized, or it already existed (status postojalo).
- 202
- Document issued, not yet accepted by the Tax Administration; Tezga retries fiscalization on its own.
- 400
- The body is not valid JSON or a required field is missing.
- 401
- The key is missing or wrong, or the signature does not match.
- 402
- The subscription is not active or the plan does not include the API.
- 403
- A read-only key, a register key, or an IP address outside the key's list.
- 404
- The document was not found in your company.
- 409
- The rules do not allow it, or the same request is being processed.
- 413
- The body is larger than 512 KB.
- 422
- The format is valid but the rules are not (for example a discount larger than the amount). Nothing was issued.
- 429
- Rate limit exceeded; Retry-After says after how many seconds to retry.
Webhooks
Tezga sends a POST to your URL for the events racun.fiskalizovan, racun.greska, refundacija.izvrsena and storno.izvrsen. Every delivery carries the X-Tezga-Event, X-Tezga-Delivery and X-Tezga-Signature headers (HMAC-SHA256 of the body). If your server does not respond, delivery is retried after 1, 5, 15, 60 and 360 minutes. Up to 5 URLs per company, each with its own secret, and the body carries your externalId, so matching does not need Tezga's id.
POST /vas-webhook
X-Tezga-Event: racun.fiskalizovan
X-Tezga-Delivery: 5c0e…
X-Tezga-Signature: sha256=…
{
"dogadjaj": "racun.fiskalizovan",
"vreme": "2026-10-14T10:00:03.000Z",
"tenantId": "…",
"podaci": {
"documentId": "b3f1…",
"broj": "RAC2026000123",
"fiskalni": { "pfrBroj": "AB12CD34-AB12CD34-123" },
"externalId": "WEB-100245981",
"provider": "custom"
}
}import { createHmac, timingSafeEqual } from "node:crypto";
export function potpisIspravan(telo, zaglavlje, tajna) {
const ocekivano =
"sha256=" + createHmac("sha256", tajna).update(telo).digest("hex");
const a = Buffer.from(zaglavlje ?? "");
const b = Buffer.from(ocekivano);
return a.length === b.length && timingSafeEqual(a, b);
}SLA: 99.9% availability
The contracted monthly availability of the receipt-issuing API is 99.9%, which is at most about 43 minutes of downtime a month.
- What is measured
- Availability of the receipt-issuing API and of the public receipt pages, per calendar month.
- What is excluded
- Announced maintenance and outages of the Tax Administration systems (V-PFR, SUF), which we cannot influence. Even then Tezga accepts orders, issues documents and retries fiscalization on its own.
- Where you see it
- A public status page, with no sign-in, and monitoring of V-PFR, SUF, SEF, email and the database every 10 minutes.
Response time
Standard
First response: 4 hours on working days
Resolution: next working day
On-call: no on-call
Extended
First response: 2 hours, 7 days a week
Resolution: same day
On-call: on-call phone 08-22 h
Critical sales
First response: 30 minutes, 24/7
Resolution: 4 hours for a sales outage
On-call: 24/7 on-call, named engineer
You choose the response tier in the contract. Before an announced campaign we raise the API rate limit on request.
Public status pageSecurity and compliance
A large retailer asks for evidence, not promises. This is what stands behind Tezga.
ISO/IEC 27001:2022
We run our information security management system (ISMS) to ISO/IEC 27001:2022: a security policy, risk assessment and treatment, a statement of applicability for all 93 Annex A controls, incident management, business continuity, supplier control and internal audit.
This is a statement of alignment, not of certification. We share the ISMS documentation under a non-disclosure agreement.
- Data in the EU
- The application and the database are in Frankfurt, in the European Union.
- Encryption
- TLS in transit; the security element and secrets are encrypted in the database and never shown back.
- API keys
- Only a hash of the key is stored; the key is shown once, when it is created.
- Signed messages
- HMAC-SHA256 on requests and on every webhook, compared in constant time.
- Audit trail
- Administrative actions and key entries are logged and never deleted.
- Fiscal integrity
- An issued receipt never changes: cancellation and refund are new documents that reference the original.
- Cards out of scope
- Tezga fiscalizes after the payment is confirmed and never sees card data, so PCI DSS scope stays with your payment provider.
- ZZPL and GDPR
- The data processing agreement is part of the terms: you are the controller and we are the processor.
- Approved ESIR
- Tax Administration decision 000-092-00-00123/2026-0000, identification number 1597, version 1.1.
- Backups
- Regular backups, with checks that the data can actually be restored from them.
How onboarding works
- 01
A call
With your technical and finance teams: channels, platforms, number of sites and legal entities.
- 02
Contract and NDA
A contract for at least 3 years, the SLA and the data processing agreement; an NDA before we look into your systems.
- 03
Integration
We connect your platform and ERP to Tezga and map sales, returns, advances and cancellations.
- 04
Test run
The whole flow in the Tax Administration sandbox, with the same key and the same code as in production.
- 05
Production
Going live means replacing the certificate on the account; the code and the API key stay the same.
Questions every large client asks
Which model should we choose?
The per-receipt model (RSD 2 per receipt, integration €5,000 per site) suits lower or uneven volume, because you pay only for receipts issued. The fixed model (€800 a month per site, integration €2,500) suits high volume. At roughly RSD 117 to the euro, the fixed model becomes cheaper from about 46,800 receipts a month per site.
Is €800 a month really regardless of the number of receipts?
Yes, on the fixed model the price does not depend on the number of fiscal receipts or API calls. The only technical limit is the number of requests a minute, which for Enterprise we raise to match your sales peak, up to 10,000 a minute.
What counts as one site?
One online shop: one domain on one instance of the platform. Several languages and currencies on the same instance are still one site. Two sites on the fixed model cost €1,600 a month and €5,000 one-off.
What does the integration cover?
A technical analysis of your system, flow mapping (sale, return, advance, cancellation), connecting your platform and ERP to Tezga, a test run in the Tax Administration sandbox and go-live in production. It is paid once, per site: €2,500 on the fixed model, €5,000 on the per-receipt model.
Why is the contract at least 3 years?
Integration and the SLA mean work up front: connecting, test runs, on-call duty and monitoring your systems. That is why the contract on either model is at least three years, which gives both sides a predictable relationship.
Do you have a ready connector for SAP or VTEX?
Ready connectors exist for Magento and Adobe Commerce, Shopify, WooCommerce, PrestaShop, OpenCart and BigCommerce. We connect SAP, VTEX, Dynamics and other systems ourselves, through the same public API, as part of the one-off integration.
What if the Tax Administration is down?
The order is accepted and the document issued, the response is 202, and Tezga retries fiscalization on its own and reports the outcome with the racun.fiskalizovan webhook. Tax Administration outages are excluded from the 99.9%, because we cannot influence them.
Are you ISO/IEC 27001 certified?
We run our ISMS to ISO/IEC 27001:2022, with a statement of applicability for all 93 Annex A controls. This is a statement of alignment, not of certification; we share the documentation under a non-disclosure agreement.
Where is the data and who can see it?
The application and the database are in Frankfurt, in the European Union. Tezga's administration sees the technical state of an account, not its sales, receipts or customers. The data processing agreement is part of the terms.
Can several legal entities be covered by one contract?
Yes. Each legal entity has its own tax ID (PIB), its own security element and its own account with the Tax Administration, while the contract and the SLA are shared. The price is calculated per site.
How is payment made?
Amounts are in euros and are paid in dinars at the National Bank of Serbia middle rate on the invoice date. On the per-receipt model, billing follows the actual number of fiscal receipts in the month. The integration is paid once, per site.
Is there a test environment?
Yes: the Tax Administration sandbox with a test security element, and a simulation that sends nothing to the Tax Administration. The key and the code are the same as in production; the environment is read from the okruzenje field of GET /api/integrations/tax-labels.
Let's talk about your system
Send us your platform, number of sites and a rough number of receipts a month. We reply with an integration plan and a contract.
