Swiss QR-bill Reader (PDF / image to JSON) avatar

Swiss QR-bill Reader (PDF / image to JSON)

Under maintenance

Pricing

from $30.00 / 1,000 swiss qr-bill readers

Go to Apify Store
Swiss QR-bill Reader (PDF / image to JSON)

Swiss QR-bill Reader (PDF / image to JSON)

Under maintenance

Read Swiss QR-bills from PDF invoices or images and get the payment data as JSON: IBAN or QR-IBAN, amount, currency, QR or creditor reference, creditor, debtor, message and Swico billing information, validated. Batch-ready for accounts-payable automation.

Pricing

from $30.00 / 1,000 swiss qr-bill readers

Rating

0.0

(0)

Developer

Najim Abdelmoula

Najim Abdelmoula

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Categories

Share

What does Swiss QR-bill Reader do?

Swiss QR-bill Reader reads the Swiss QR code printed on invoices (QR-facture, QR-Rechnung, QR-fattura) and returns the payment data as clean JSON: IBAN or QR-IBAN, amount, currency, QR reference or creditor reference, creditor, debtor, message and Swico billing information. Give it PDF files or images, scanned or native, one or hundreds, and get one validated row per QR-bill. It is a Swiss QR-bill OCR alternative: no character recognition, the data comes straight from the QR code, so it is exact.

It does not pay anything, does not talk to your bank, and keeps nothing after the run.

Why use Swiss QR-bill Reader?

Every supplier invoice in Switzerland carries a QR-bill since 2022. Typing its IBAN, reference and amount into accounting software is slow and error-prone; the QR code already contains all of it, character-exact.

  • ๐Ÿ“ฅ Accounts payable without typing: decode incoming invoices from an e-mail inbox, a shared folder or a document management system and push the fields to your ERP, Bexio, Abacus, Banana or a payment file.
  • โœ… Validated data: IBAN check digits, 27-digit QR reference modulo-10 check, ISO 11649 creditor reference check, account type versus reference type, currency and amount format. Problems are reported as warnings or errors per bill.
  • ๐Ÿ“„ PDF or image, native or scanned: pages are rendered and decoded at the resolution you choose; rotated or slightly skewed codes are handled.
  • ๐Ÿค– Automation-friendly: call it from n8n, Make, Zapier or the Apify API, or let an AI agent read a bill through the Apify MCP server. Structured input, structured output, no OCR service to host.
  • ๐Ÿ” Audit trail: the exact Swiss Payments Code decoded from the QR is returned with each row.

Typical users: fiduciaries and accountants, SMEs automating supplier invoices, ERP and DMS integrators, property managers, and AI assistants that book or pay invoices.

What data does it extract?

FieldTypeDescription
file / pagestring / integerSource file name and page where the QR-bill was found
statusstringok, invalid (errors, or warnings in strict mode), not_found, error
account / accountTypestringIBAN, and whether it is a QR-IBAN or a regular IBAN
amount / currencynumber / stringAmount (empty when left to the payer) and CHF or EUR
referenceType / referencestringQRR (27-digit QR reference), SCOR (RF creditor reference) or NON
creditor / debtorobjectName, street, house number, postal code, city, country (or line1/line2 for combined addresses)
additionalInformationstringUnstructured message
billingInformationstringSwico structured billing information (//S1/...)
alternativeProceduresarrayAlternative procedure parameters, when present
rawPayloadstringThe exact Swiss Payments Code from the QR code
warnings / errorsarrayValidation messages

How to read a Swiss QR-bill

  1. Open the Actor and paste the URLs of your PDF invoices or images in File URLs (public links, or files uploaded to an Apify key-value store).
  2. Optionally restrict the pages to scan and raise the dpi for small or blurry codes.
  3. Click Start. Each QR-bill found appears in the Output tab as one row.
  4. Download the table as JSON, CSV or Excel, or read it from your automation through the API.

Where do I get file URLs from?

Any public link works. From n8n, Make or Zapier, upload the incoming PDF to an Apify key-value store with the Apify integration and pass the record URL. From code, use the Apify client to store the file, then call the Actor with its URL.

What is the difference between a QR-IBAN and an IBAN?

A QR-IBAN (bank identification 30000 to 31999) always comes with a 27-digit QR reference that your supplier uses to match your payment. A regular IBAN comes with an RF creditor reference or no reference. The Actor checks that the pair is consistent and warns you when it is not, because banks reject such payments.

How much does it cost?

The Actor is paid per decoded QR-bill (see the pricing box on this page). Files without a QR-bill, unreadable files and invalid bills are free. Reading 100 supplier invoices costs a few cents; the Apify free plan covers a small business's monthly volume.

Input

See the Input tab for all options. Minimal example:

{
"files": [
"https://example.com/invoices/2026-0042.pdf",
"https://example.com/invoices/scan-0043.jpg"
]
}

Output

You can download the dataset in JSON, CSV, Excel or HTML formats. One decoded bill and one file without QR-bill:

[
{
"file": "2026-0042.pdf",
"page": 1,
"status": "ok",
"version": "0200",
"account": "CH4431999123000889012",
"accountType": "QR-IBAN",
"creditor": {"type": "structured", "name": "Robert Schneider AG", "street": "Rue du Lac", "houseNumber": "1268", "postalCode": "2501", "city": "Biel", "country": "CH"},
"amount": 1949.75,
"currency": "CHF",
"debtor": {"type": "structured", "name": "Pia-Maria Rutschmann-Schnyder", "street": "Grosse Marktgasse", "houseNumber": "28", "postalCode": "9400", "city": "Rorschach", "country": "CH"},
"referenceType": "QRR",
"reference": "210000000003139471430009017",
"additionalInformation": "Order of 15 June 2026",
"billingInformation": null,
"alternativeProcedures": [],
"rawPayload": "SPC\r\n0200\r\n1\r\nCH4431999123000889012\r\nS\r\n...",
"warnings": [],
"errors": []
},
{
"file": "terms.pdf",
"status": "not_found",
"pagesScanned": 3,
"warnings": [],
"errors": []
}
]

Using the Actor from code and AI agents

Call it through the Apify API in any language, or expose it to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server. Example with the Python client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("<ACTOR_ID>").call(run_input={ # Actor ID or "username/name" from the API tab
"files": ["https://example.com/invoices/2026-0042.pdf"],
})
for bill in client.dataset(run["defaultDatasetId"]).iterate_items():
if bill["status"] == "ok":
print(bill["account"], bill["amount"], bill["currency"], bill["referenceType"], bill["reference"])

Privacy and data handling

Files are downloaded into the memory of your own Actor run, decoded and discarded. Only the extracted fields are written to the run's dataset, which belongs to your Apify account and follows your retention settings. The Actor author never receives, logs or stores your invoices. Invoices contain personal data of your suppliers and of yourself: process them under your own legal basis and delete the run's dataset when you no longer need it.

Frequently asked questions

The QR code is not found

Make sure the page containing the QR-bill is within the scanned pages (first 20 by default), raise dpi to 300 for small or blurry scans, and check that the file is a PDF or a supported image. Photos taken at an angle may need a straighter shot.

Can it read several QR-bills in one file?

Yes. Each distinct QR-bill found in a file becomes one row, with its page number.

Can it generate QR-bills too?

A companion Actor from the same author generates Swiss QR-bills as PDF, SVG or PNG from JSON or CSV.

Something looks wrong

Open an issue in the Issues tab with a minimal example (without real supplier data).

Development

Python 3.12, Apify SDK, pypdfium2 for PDF rendering, zxing-cpp for QR decoding, Pillow for images; the Swiss Payments Code parser and validators live in spc.py. pytest tests runs against reference bills; apify run runs the Actor locally.