API for your own system
With the API, your accounting or ERP system can send e-invoices through Rishah and fetch status, PDF and payment details. The API comes with the 20, 100 and 250 packages and with Enterprise. Each invoice sent counts as an ordinary invoice in the package.
Getting started
- Create an API key under Settings → API for your own system. It is shown only once.
- Put the key in your system. Every call is sent as
POSTto the address below with the key in the header and JSON in the body. - Try first with
"handling":"test".
POST https://rishah.dk/platform/api/v1.php
Authorization: Bearer rsh_xxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{"handling":"test"}
The response always has ok. If something goes wrong, there is a fixed code in fejl, which your program can read, and an explanation in besked.
Send an invoice or credit note
The file must be an e-invoice in the Peppol BIS 3 format (invoice or credit note) with your company as the sender. The same number can only be sent once – invoices and credit notes each have their own number series.
{"handling":"send","xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice …>…</Invoice>"}
→ 201 {"ok":true,"id":"5f2c…","type":"faktura","nummer":"1043","status":"leveret"}
Instead of xml the file can be sent base64-encoded in xml_base64.
Attachments, for example the invoice as a PDF, can be sent along in bilag. They are put into the e-invoice before it is sent. Peppol allows PDF, PNG, JPG, CSV and spreadsheets (.xlsx and .ods), at most 5 MB per file and 10 MB in total.
{"handling":"send","xml":"…","bilag":[{"filnavn":"faktura-1043.pdf","fil_base64":"JVBERi0…"}]}
status er leveret, when the receiver has got the invoice, or afsendt, when the network has queued it. If it is rejected later, the status changes to afvist or ugyldig with an explanation in besked. An invoice the network does not accept does not count in the package.
Status and list
{"handling":"status","id":"5f2c…"}
→ {"ok":true,"id":"5f2c…","type":"faktura","nummer":"1043","modtager":{…},"beloeb":2813.13,"valuta":"DKK","status":"leveret","sendt":"2026-11-08T18:20:00+01:00","gensendt":[]}
{"handling":"sendte","max":50,"siden":"2026-11-01T00:00:00+01:00"}
→ {"ok":true,"antal":12,"sendte":[…]}
Get an invoice with PDF and payment details
{"handling":"hent","id":"5f2c…"}
→ {"ok":true, …, "xml":"…", "pdf_base64":"JVBERi0…",
"betaling":{"kode":"58","konto":"DK5000400440116243","ref":"1043","belob":2813.13,"valuta":"EUR","forfald":"2026-11-16", …},
"betalingskode":{"art":"epc","qr":"BCD\n002\n…","kodelinje":null}}
betaling is the details your system can enter directly as a payment. betalingskode is the content of the QR code or the code line for the banking app – epc (euro), se (Swedish bankgiro/plusgiro), fik (Danish payment slip) or no (Norwegian account and KID).
Received invoices
{"handling":"modtagne","max":50,"siden":"2026-11-01T00:00:00+01:00"}
→ {"ok":true,"antal":3,"modtagne":[{"id":"a36c…","type":"faktura","nummer":"461455","afsender":{"navn":"…","land":"DK","nummer":"DK11945317"},"dato":"2026-10-15","beloeb":2632.5,"valuta":"DKK","modtaget":"2026-11-10T20:32:15+01:00","kilde":"netvaerk"}]}
{"handling":"modtaget","id":"a36c…"}
→ {"ok":true, …, "xml":"…", "pdf_base64":"JVBERi0…", "betaling":{…}}
All invoices your suppliers send you over NemHandel and Peppol arrive here – and also the ones you have added yourselves from a PDF ("kilde":"pdf").
Reply to the supplier
{"handling":"svar","id":"a36c…","kode":"RE","grund":"PRI","tekst":"Prisen på linje 2 passer ikke med aftalen"}
→ {"ok":true,"status":"leveret"}
The reply goes back to the supplier in the same format the invoice came in: a Peppol invoice response or an OIOUBL application response in NemHandel (here you can only reply AP or RE, and with RE must tekst must be filled in). kode: AB received, IP in process, UQ question, CA approved with reservations, RE rejected, AP approved, PD paid. With UQ, CA and RE there must be a grund: REF reference, LEG company details, REC not for us, QUA quality, DEL delivery, PRI prices, QTY quantity, ITM items, PAY payment terms, UNR does not recognise it, FIN financial terms, OTH other (then tekst must be filled in). If the supplier cannot receive replies electronically, the response says so.
When your customers reply to your own invoices, it says so in svar on status and sendte, and your webhook gets the event svar.
Orders, statements and other business documents
{"handling":"modtag_ordrer","til":true}
→ {"ok":true,"modtag_ordrer":true}
{"handling":"ordrer","siden":"2026-11-01T00:00:00+01:00"}
→ {"ok":true,"antal":1,"ordrer":[{"id":"7c1e…","type":"Order","retning":"modtaget","nummer":"PO-1043","koeber":"…","saelger":"…","beloeb":12500,"valuta":"DKK"}]}
{"handling":"ordre","id":"7c1e…"}
→ {"ok":true, …, "xml":"…"}
{"handling":"send_dokument","xml":"<Order …"}
→ 201 {"ok":true,"id":"…","type":"Order","nummer":"PO-1043","status":"leveret"}
If you turn on receiving orders, your numbers are registered to receive orders in NemHandel and Peppol as well. With send_dokument your system sends orders, order responses, delivery notes, statements and other business documents in Peppol BIS or OIOUBL – invoices and credit notes are sent with send. Each document counts as one invoice in the package. Your webhook gets the event order, when a new one arrives.
Read a PDF, Word or Excel invoice
{"handling":"laes","filnavn":"faktura.pdf","fil_base64":"JVBERi0…"}
→ {"ok":true,"filtype":"pdf","faktura":{…fakturaens oplysninger…},"advarsler":[…]}
The file is read into invoice details that your system can show for checking. Nothing is sent. With "rolle":"modtager" an invoice you have received from a supplier is read.
Message straight away (webhook)
{"handling":"webhook","url":"https://jeres-system.dk/rishah"}
→ {"ok":true,"webhook":"https://jeres-system.dk/rishah","hemmelighed":"…"}
Then we send a POST with JSON {"haendelse":…,"data":…,"tid":…}, when an invoice has been received (modtaget), and when there is news about a sent invoice (levering), and when your customer replies to an invoice (svar). Check the header X-Rishah-Signatur: sha256=…: HMAC-SHA256 of the whole body with the secret. Send "url":"" to turn it off. The lists above are always the safe place to fetch from.
Error codes
| fejl | HTTP | Meaning |
|---|---|---|
mangler_noegle | 401 | There is no API key in the header. |
ugyldig_noegle | 401 | The key does not exist. |
tilbagekaldt | 401 | The key has been revoked under Settings. |
pause | 429 | Too many wrong attempts – «sekunder» says how long the pause is. |
konto_laast | 403 | The account is locked. |
ingen_api_adgang | 403 | The account does not have a package with API (20, 100, 250 or Enterprise). |
kun_post | 405 | Only POST is allowed. |
ugyldig_json | 400 | The request is not JSON. |
ukendt_handling | 400 | The action does not exist. |
mangler_fil | 400 | There is no file in «xml» or «xml_base64». |
ugyldig_fil | 422 | The file is not a valid e-invoice (Peppol BIS 3). |
forkert_afsender | 403 | The file has a different sender than your company. |
dublet | 409 | The number has been sent before – «id» is the earlier one. |
kan_ikke_sende | 402 | The package or the balance is used up, or sending has been closed. |
ikke_fundet | 404 | There is no invoice with that id. |
kan_ikke_levere | 422 | The network did not accept the invoice (for example an invalid file) – «besked» says why. It does not count in the package. |
udloebet | 410 | The invoice is older than your package's storage period. |
kan_ikke_laese | 422 | The file could not be read as an invoice. |
kan_ikke_svare | 422 | The reply could not be sent – «besked» says why (for example, the supplier cannot receive replies). |
ugyldig_url | 400 | The webhook address must start with https:// and be reachable from the internet. |
for_stor | 413 | The request is over 20 MB. |
intern_fejl | 500 | Error on our side – try again in a moment. |
Security and limits
- Only POST over an encrypted connection (https, when the platform is on the server).
- We do not keep the key – only a fingerprint of it. If you lose it, revoke it and create a new one.
- 200 wrong attempts in 10 minutes with the same key give a 15-minute pause.
- At most 10 active keys per account. A new key and a revoked key each send a mail to your login e-mail and company e-mail.