> ## Documentation Index
> Fetch the complete documentation index at: https://invopop-silo-entry-faults-guidance.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# NemHandel issuing invoices guide

> Issue OIOUBL invoices and credit notes in Denmark over the NemHandel network.

export const dkNemhandelSendInvoiceWorkflow = {
  "name": "Send NemHandel invoice",
  "description": "Convert an invoice to OIOUBL and send it over the NemHandel network",
  "schema": "bill/invoice",
  "steps": [{
    "id": "e3ad87b2-88d1-11f1-8000-920007eb4d91",
    "name": "Set State",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    }
  }, {
    "id": "e3add26c-88d1-11f1-8000-920007eb4d91",
    "name": "Add Sequential Code",
    "provider": "sequence.enumerate",
    "summary": "Dynamic · NemHandel · 000001",
    "config": {
      "name": "NemHandel",
      "padding": 6,
      "start": 1
    }
  }, {
    "id": "e3ae403a-88d1-11f1-8000-920007eb4d91",
    "name": "Sign Envelope",
    "provider": "silo.close"
  }, {
    "id": "e3afc3a6-88d1-11f1-8000-920007eb4d91",
    "name": "Generate OIOUBL",
    "provider": "gov-dk.convert",
    "summary": "OIOUBL 2.1 Invoice/CreditNote"
  }, {
    "id": "e3aea606-88d1-11f1-8000-920007eb4d91",
    "name": "Send to NemHandel",
    "provider": "gov-dk.send",
    "summary": "Submits and queues until eCourier confirms delivery"
  }, {
    "id": "e3af29be-88d1-11f1-8000-920007eb4d91",
    "name": "Set State",
    "provider": "silo.state",
    "summary": "Set state to `sent`{.state .sent}",
    "config": {
      "state": "sent"
    }
  }],
  "rescue": [{
    "id": "e3af4e58-88d1-11f1-8000-920007eb4d91",
    "name": "Set State",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const WorkflowDiagram = ({workflow}) => {
  const stateColors = {
    processing: "yellow",
    sent: "blue",
    received: "blue",
    registered: "green",
    completed: "green",
    error: "red"
  };
  const StateChip = ({state, label}) => <Badge size="sm" color={stateColors[state] || "gray"} icon="square-small" iconType="solid">
      {label.charAt(0).toUpperCase() + label.slice(1)}
    </Badge>;
  const providerIcons = {
    "silo.state": "https://silo.invopop.com/images/status.svg",
    "silo.close": "https://silo.invopop.com/images/check-badge.svg",
    "silo.if": "https://assets.invopop.com/apps/silo/if.svg",
    "silo.folder": "https://silo.invopop.com/images/folder.svg",
    "silo.modify": "https://silo.invopop.com/images/modify.svg",
    "silo.correct": "https://silo.invopop.com/images/replace.svg",
    "silo.sleep": "https://assets.invopop.com/icons/sleep.svg",
    silo: "https://assets.invopop.com/apps/silo/icon.svg",
    "sequence.enumerate": "https://sequence.invopop.com/images/enumerate.svg",
    "transform.job.create": "https://transform.invopop.com/images/jobs.svg",
    webhook: "https://webhook.invopop.com/icon.svg",
    lookup: "https://lookup.invopop.com/icon.png",
    dropbox: "https://dropbox.invopop.com/icon.png",
    pdf: "https://pdf.invopop.com/file-pdf.svg",
    peppol: "https://assets.invopop.com/apps/peppol/icon.svg",
    ubl: "https://assets.invopop.com/apps/ubl/logo.svg",
    cii: "https://assets.invopop.com/apps/cii/logo.svg",
    "gov-dk": "https://assets.invopop.com/flags/dk.svg",
    "gov-fi": "https://assets.invopop.com/flags/fi.svg",
    "gov-fr": "https://assets.invopop.com/flags/fr.svg",
    "chorus-pro": "https://assets.invopop.com/apps/chroruspro/icon.svg",
    "gov-es": "https://assets.invopop.com/apps/gov-es/icon.svg",
    "gov-es.sii": "https://assets.invopop.com/apps/sii/icon.svg",
    "gov-es.ticketbai": "https://assets.invopop.com/apps/ticketbai/icon.svg",
    "gov-es.facturae": "https://assets.invopop.com/apps/facturae/icon.svg",
    verifactu: "https://assets.invopop.com/apps/verifactu/icon.svg",
    "gov-pl": "https://assets.invopop.com/apps/ksef/icon.svg",
    "gov-sa": "https://assets.invopop.com/apps/zatca/icon.svg",
    "gov-ar": "https://assets.invopop.com/apps/arca/icon.svg",
    "at-pt": "https://assets.invopop.com/apps/at-pt/icon.svg",
    "sat-mx": "https://assets.invopop.com/apps/sat-mexico/icon.svg",
    "sw-sapien": "https://assets.invopop.com/apps/sw-sapien/icon.svg",
    "sdi-it": "https://assets.invopop.com/apps/sdi-italy/icon.svg",
    "ticket-it": "https://assets.invopop.com/apps/agenzia-entrate/icon.svg",
    "nfe-br": "https://assets.invopop.com/apps/notas-fiscais-eletronicas-brazil/icon.svg",
    chargebee: "https://assets.invopop.com/apps/chargebee/icon.svg",
    stripe: "https://assets.invopop.com/apps/stripe/icon.svg",
    email: "https://assets.invopop.com/apps/email/icon.svg",
    cron: "https://assets.invopop.com/apps/cron/icon.svg",
    ilyda: "https://assets.invopop.com/apps/ilyda/icon.svg",
    invoicexpress: "https://assets.invopop.com/apps/invoicexpress/icon.svg",
    plemsi: "https://assets.invopop.com/flags/co.svg"
  };
  const iconFor = provider => {
    const parts = (provider || "").split(".");
    for (let i = parts.length; i > 0; i--) {
      const url = providerIcons[parts.slice(0, i).join(".")];
      if (url) return url;
    }
    return null;
  };
  const StepIcon = ({provider}) => {
    const url = iconFor(provider);
    return <span title={provider} className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-gray-950/10 bg-white dark:border-white/10 dark:bg-white/5">
        {url ? <img src={url} alt="" className="h-4 w-4" /> : null}
      </span>;
  };
  const renderSummary = summary => {
    const nodes = [];
    const re = /`([^`]+)`(\{[^}]*\})?/g;
    let last = 0;
    let m;
    let k = 0;
    while ((m = re.exec(summary)) !== null) {
      if (m.index > last) nodes.push(summary.slice(last, m.index));
      const attrs = m[2] || "";
      if (attrs.indexOf(".state") >= 0) {
        const state = (attrs.match(/\.state\s+\.([\w-]+)/) || [])[1] || m[1];
        nodes.push(<StateChip key={k++} state={state} label={m[1]} />);
      } else if (attrs) {
        nodes.push(<span key={k++} className="text-sm font-medium text-gray-700 dark:text-gray-300">
            {m[1]}
          </span>);
      } else {
        nodes.push(<code key={k++} className="text-sm rounded bg-gray-100 px-1 font-mono text-sm dark:bg-white/10">
            {m[1]}
          </code>);
      }
      last = m.index + m[0].length;
    }
    if (last < summary.length) nodes.push(summary.slice(last));
    return nodes;
  };
  const NoteRow = ({text}) => <div className="mt-4 mb-1 font-mono text-sm leading-5 text-gray-400 dark:text-gray-500">{"// " + text}</div>;
  const renderSteps = (steps, counter) => (steps || []).map(step => {
    counter.n += 1;
    const n = counter.n;
    const branches = (step.next || []).filter(b => b.steps && b.steps.length > 0);
    return <div key={step.id || "step-" + n}>
          {step.notes ? <NoteRow text={step.notes} /> : null}
          <div className="mt-2.5 flex items-center">
            <span className="absolute left-0 w-10 text-center font-mono text-sm text-gray-400 select-none dark:text-gray-500">
              {n}
            </span>
            <div className="flex min-w-0 flex-1 items-center gap-2 rounded-xl border border-gray-950/5 bg-white px-2 py-2 dark:border-white/10 dark:bg-gray-900">
              <StepIcon provider={step.provider} />
              <span className="text-sm shrink-0 font-medium text-gray-900 dark:text-gray-100">{step.name}</span>
              {step.summary ? <span className="text-sm min-w-0 truncate text-gray-500 dark:text-gray-400">{renderSummary(step.summary)}</span> : null}
            </div>
          </div>
          {branches.length > 0 ? <div className="ml-5 border-l border-gray-200 -my-1 py-1 pl-6 dark:border-white/10">
              {branches.map((branch, bi) => <div key={branch.code || branch.status || bi}>
                  <div className="mt-4">
                    <span className="rounded-md bg-gray-200/70 px-2 py-1 font-mono text-sm text-gray-600 dark:bg-white/10 dark:text-gray-300">
                      {branch.code || branch.status}
                    </span>
                  </div>
                  {renderSteps(branch.steps, counter)}
                </div>)}
            </div> : null}
        </div>;
  });
  const counter = {
    n: 0
  };
  const wf = workflow || ({});
  return <div className="not-prose relative my-5 rounded-2xl border border-gray-950/5 bg-gray-50 py-3 pr-4 pb-5 pl-12 dark:border-white/10 dark:bg-white/[0.03]">
      {renderSteps(wf.steps, counter)}
      {wf.rescue && wf.rescue.length > 0 ? <div className="mt-6 border-t border-dashed border-gray-300 dark:border-white/10">
          <NoteRow text="If any step fails" />
          {renderSteps(wf.rescue, counter)}
        </div> : null}
    </div>;
};

## Introduction

**NemHandel** is the Danish e-invoicing network all public authorities — and a large share of businesses — receive their invoices through. Documents travel as **OIOUBL 2.1**, Denmark's national UBL dialect. The [Denmark app](/apps/denmark) converts GOBL invoices and credit notes to OIOUBL, validates them against the official schematron, and delivers them over the network through Invopop's partner [eCourier](https://ecourier.dk).

For onboarding suppliers, see the companion guide: [NemHandel supplier registration](/guides/dk-nemhandel-supplier). For importing the invoices your parties receive, see [NemHandel receiving invoices](/guides/dk-nemhandel-receiving).

| -               | Sandbox                                              | Live                      |
| --------------- | ---------------------------------------------------- | ------------------------- |
| **Supplier**    | Party registered against eCourier's test environment | Registered party required |
| **Environment** | eCourier sandbox                                     | eCourier production       |

## Prerequisites

* **A registered supplier**: follow the [NemHandel supplier registration guide](/guides/dk-nemhandel-supplier) to connect the Denmark app, have the supplier sign the authorisation agreement, and register their NemHandel participant before issuing.
* **The [`dk-oioubl-v2` addon](https://docs.gobl.org/addons/dk-oioubl-v2)** declared in `$addons` on every invoice, so the OIOUBL rules are validated before signing.
* **A routable customer**: the customer must resolve to a NemHandel endpoint. Public entities carry their **EAN/GLN number** as an endpoint (`GLN:5798000000000`-style); a Danish business with only a tax ID gets its `DK:CVR` endpoint derived automatically.
* **OIOUBL-compatible payment data**, if you include payment instructions: OIOUBL supports IBAN transfers plus the Danish channels (Giro, FIK, domestic bank transfer with its four-digit registration number, and NemKonto).

<Note>
  OIOUBL has no VAT-exempt category: invoices are standard-rated, zero-rated, or reverse-charge. An exempt VAT key is rejected up front — state the supply as zero-rated instead.
</Note>

## Setup

All of the following steps must be carried out from the [Invopop Console](https://console.invopop.com).

<Steps>
  <Step title="Create the send workflow">
    <Card iconType="duotone" title="Send NemHandel invoice workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=dk-send" horizontal>
      Add to my workspace →
    </Card>

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={dkNemhandelSendInvoiceWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.

        ```json Example Send NemHandel invoice workflow theme={null}
        {
            "name": "Send NemHandel invoice",
            "description": "Convert an invoice to OIOUBL and send it over the NemHandel network",
            "schema": "bill/invoice",
            "steps": [
                {
                    "id": "e3ad87b2-88d1-11f1-8000-920007eb4d91",
                    "name": "Set State",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    }
                },
                {
                    "id": "e3add26c-88d1-11f1-8000-920007eb4d91",
                    "name": "Add Sequential Code",
                    "provider": "sequence.enumerate",
                    "summary": "Dynamic · NemHandel · 000001",
                    "config": {
                        "name": "NemHandel",
                        "padding": 6,
                        "start": 1
                    }
                },
                {
                    "id": "e3ae403a-88d1-11f1-8000-920007eb4d91",
                    "name": "Sign Envelope",
                    "provider": "silo.close"
                },
                {
                    "id": "e3afc3a6-88d1-11f1-8000-920007eb4d91",
                    "name": "Generate OIOUBL",
                    "provider": "gov-dk.convert",
                    "summary": "OIOUBL 2.1 Invoice/CreditNote"
                },
                {
                    "id": "e3aea606-88d1-11f1-8000-920007eb4d91",
                    "name": "Send to NemHandel",
                    "provider": "gov-dk.send",
                    "summary": "Submits and queues until eCourier confirms delivery"
                },
                {
                    "id": "e3af29be-88d1-11f1-8000-920007eb4d91",
                    "name": "Set State",
                    "provider": "silo.state",
                    "summary": "Set state to `sent`{.state .sent}",
                    "config": {
                        "state": "sent"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "e3af4e58-88d1-11f1-8000-920007eb4d91",
                    "name": "Set State",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```
      </Tab>
    </Tabs>
  </Step>
</Steps>

## Send an invoice

Upload the invoice as a silo entry and run the send workflow on it.

<Info>The recommended approach for running jobs is to perform two steps: first upload the document to the [silo](/api-ref/silo/entries/create-an-entry-put), then [create a job](/api-ref/transform/jobs/create-a-job-post).</Info>

The workflow's two app steps split the work:

* **Generate OIOUBL** converts the signed GOBL envelope into an OIOUBL 2.1 document, validates it against the official schematron (v1.17), and stores the XML as an attachment on the entry under the `oioubl` file key. An invoice that would be rejected by the network fails here, before anything leaves the platform.
* **Send to NemHandel** submits that attachment and then waits: the job stays queued until eCourier confirms the document is delivered, re-checking whenever the network reports a status change. Delivery — not submission — is what completes the job.

The bytes stored on the entry are exactly the bytes that reached the network, so you can always download the OIOUBL file that was actually delivered.

### Duplicates are skipped

Running the send workflow again on an invoice that was already delivered skips with a `Duplicated Invoice` result instead of resubmitting, so a retried or repeated run never delivers the document twice.

### Generating without sending

The convert step also works on its own: a workflow that ends after **Generate OIOUBL** produces the validated XML attachment without submitting anything, which is useful for previewing the exact document a customer will receive.

## Example invoices

<AccordionGroup>
  <Accordion title="Example B2G invoice">
    In this example, we're invoicing a Danish public institution, the segment where e-invoicing is mandatory.

    Notice:

    * the `$addons` field is set to `dk-oioubl-v2`, which layers the OIOUBL 2.1 rules on top of the European EN 16931 baseline,
    * the customer carries its **EAN/GLN number** as an endpoint (`GLN:5798009883735`) — this is how public entities are identified in the NemHandelsregisteret,
    * the supplier declares no endpoint: the addon derives its `DK:CVR` endpoint automatically from the Danish tax ID,
    * the `ordering.purchases` block carries the order reference the receiving institution asked for,
    * the payment instructions use a SEPA credit transfer with an IBAN, and,
    * there are no calculations in some fields; these will be made automatically when uploading.

    <CodeGroup>
      ````json Denmark B2G invoice theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "type": "standard",
        "series": "SAMPLE",
        "code": "0042",
        "issue_date": "2026-08-01",
        "currency": "DKK",
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "people": [
            {
              "name": {
                "given": "Mette",
                "surname": "Kristensen"
              },
              "role": "Director"
            }
          ],
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Den Lille Skole",
          "endpoints": [
            {
              "uri": "GLN:5798009883735"
            }
          ],
          "addresses": [
            {
              "num": "10",
              "street": "Fredericiavej",
              "locality": "Helsingør",
              "code": "3000",
              "country": "DK"
            }
          ]
        },
        "ordering": {
          "purchases": [
            {
              "code": "5002701"
            }
          ]
        },
        "lines": [
          {
            "quantity": 20,
            "item": {
              "name": "Software licence",
              "price": "150.00",
              "unit": "item"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          }
        ],
        "payment": {
          "terms": {
            "due_dates": [
              {
                "date": "2026-08-31",
                "percent": "100%"
              }
            ]
          },
          "instructions": {
            "key": "credit-transfer+sepa",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243"
              }
            ],
            "ext": {
              "untdid-payment-means": "58"
            }
          }
        }
      }```
      ````

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "SAMPLE",
      	"code": "0042",
      	"issue_date": "2026-08-01",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Mette",
      					"surname": "Kristensen"
      				},
      				"role": "Director"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Den Lille Skole",
      		"endpoints": [
      			{
      				"uri": "GLN:5798009883735"
      			}
      		],
      		"addresses": [
      			{
      				"num": "10",
      				"street": "Fredericiavej",
      				"locality": "Helsingør",
      				"code": "3000",
      				"country": "DK"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "20",
      			"item": {
      				"name": "Software licence",
      				"price": "150.00",
      				"unit": "item"
      			},
      			"sum": "3000.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "3000.00"
      		}
      	],
      	"ordering": {
      		"purchases": [
      			{
      				"code": "5002701"
      			}
      		]
      	},
      	"payment": {
      		"terms": {
      			"due_dates": [
      				{
      					"date": "2026-08-31",
      					"amount": "3750.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "credit-transfer+sepa",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "58"
      			}
      		}
      	},
      	"totals": {
      		"sum": "3000.00",
      		"total": "3000.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"base": "3000.00",
      							"percent": "25.0%",
      							"amount": "750.00"
      						}
      					],
      					"amount": "750.00"
      				}
      			],
      			"sum": "750.00"
      		},
      		"tax": "750.00",
      		"total_with_tax": "3750.00",
      		"payable": "3750.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example B2B invoice">
    In this example, we're issuing a B2B invoice from a Danish supplier to another Danish business.

    Notice:

    * both parties are identified by their **CVR number** as the GOBL `tax_id.code`; the addon derives each party's `DK:CVR` endpoint from it,
    * the payment instructions describe a Danish domestic bank transfer (UNTDID payment means `42`): the account number plus the four-digit bank registration (clearing) code the OIOUBL rules require, and,
    * there are no calculations in some fields; these will be made automatically when uploading.

    <CodeGroup>
      ```json Denmark B2B invoice theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": ["dk-oioubl-v2"],
        "type": "standard",
        "series": "SAMPLE",
        "code": "0043",
        "issue_date": "2026-08-01",
        "currency": "DKK",
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Havnens Byggemarked A/S",
          "tax_id": {
            "country": "DK",
            "code": "12345674"
          },
          "addresses": [
            {
              "num": "3",
              "street": "Havnegade",
              "locality": "Aarhus C",
              "code": "8000",
              "country": "DK"
            }
          ]
        },
        "lines": [
          {
            "quantity": 10,
            "item": {
              "name": "Consulting services",
              "price": "800.00",
              "unit": "h"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          }
        ],
        "payment": {
          "terms": {
            "due_dates": [
              {
                "date": "2026-08-31",
                "percent": "100%"
              }
            ]
          },
          "instructions": {
            "key": "other",
            "ext": {
              "untdid-payment-means": "42"
            },
            "credit_transfer": [
              {
                "number": "1234567890",
                "clearing": "1234"
              }
            ]
          }
        }
      }
      ```

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "SAMPLE",
      	"code": "0043",
      	"issue_date": "2026-08-01",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Havnens Byggemarked A/S",
      		"tax_id": {
      			"country": "DK",
      			"code": "12345674"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "12345674"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:12345674"
      			}
      		],
      		"addresses": [
      			{
      				"num": "3",
      				"street": "Havnegade",
      				"locality": "Aarhus C",
      				"code": "8000",
      				"country": "DK"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "10",
      			"item": {
      				"name": "Consulting services",
      				"price": "800.00",
      				"unit": "h"
      			},
      			"sum": "8000.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "8000.00"
      		}
      	],
      	"payment": {
      		"terms": {
      			"due_dates": [
      				{
      					"date": "2026-08-31",
      					"amount": "10000.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "other",
      			"credit_transfer": [
      				{
      					"number": "1234567890",
      					"clearing": "1234"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "42"
      			}
      		}
      	},
      	"totals": {
      		"sum": "8000.00",
      		"total": "8000.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"base": "8000.00",
      							"percent": "25.0%",
      							"amount": "2000.00"
      						}
      					],
      					"amount": "2000.00"
      				}
      			],
      			"sum": "2000.00"
      		},
      		"tax": "2000.00",
      		"total_with_tax": "10000.00",
      		"payable": "10000.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example zero-rated invoice">
    In this example, we're issuing a domestic invoice for a zero-rated supply — newspapers, one of the few zero-rated categories under Momslovens §34.

    Notice:

    * the line's tax uses the `zero` VAT key: the supply is taxable at 0% with input VAT recovery, unlike an exempt supply,
    * OIOUBL has **no exempt category** on the wire, so genuinely exempt supplies (healthcare, education, financial services) cannot be invoiced through NemHandel as "exempt" — the addon rejects the `exempt` key and zero-rated is the closest the format supports, and,
    * everything else works exactly like the standard B2B invoice.

    <CodeGroup>
      ````json Denmark zero rate invoice theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "type": "standard",
        "series": "SAMPLE",
        "code": "0045",
        "issue_date": "2026-08-01",
        "currency": "DKK",
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Havnens Byggemarked A/S",
          "tax_id": {
            "country": "DK",
            "code": "12345674"
          },
          "addresses": [
            {
              "num": "3",
              "street": "Havnegade",
              "locality": "Aarhus C",
              "code": "8000",
              "country": "DK"
            }
          ]
        },
        "lines": [
          {
            "quantity": 250,
            "item": {
              "name": "Morgenavisen daily newspaper",
              "price": "12.00",
              "unit": "item"
            },
            "taxes": [
              {
                "cat": "VAT",
                "key": "zero"
              }
            ]
          }
        ],
        "payment": {
          "terms": {
            "due_dates": [
              {
                "date": "2026-08-31",
                "percent": "100%"
              }
            ]
          },
          "instructions": {
            "key": "credit-transfer+sepa",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243"
              }
            ]
          }
        }
      }```
      ````

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "SAMPLE",
      	"code": "0045",
      	"issue_date": "2026-08-01",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Havnens Byggemarked A/S",
      		"tax_id": {
      			"country": "DK",
      			"code": "12345674"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "12345674"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:12345674"
      			}
      		],
      		"addresses": [
      			{
      				"num": "3",
      				"street": "Havnegade",
      				"locality": "Aarhus C",
      				"code": "8000",
      				"country": "DK"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "250",
      			"item": {
      				"name": "Morgenavisen daily newspaper",
      				"price": "12.00",
      				"unit": "item"
      			},
      			"sum": "3000.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "zero",
      					"percent": "0%"
      				}
      			],
      			"total": "3000.00"
      		}
      	],
      	"payment": {
      		"terms": {
      			"due_dates": [
      				{
      					"date": "2026-08-31",
      					"amount": "3000.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "credit-transfer+sepa",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "58"
      			}
      		}
      	},
      	"totals": {
      		"sum": "3000.00",
      		"total": "3000.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "zero",
      							"base": "3000.00",
      							"percent": "0%",
      							"amount": "0.00"
      						}
      					],
      					"amount": "0.00"
      				}
      			],
      			"sum": "0.00"
      		},
      		"tax": "0.00",
      		"total_with_tax": "3000.00",
      		"payable": "3000.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example reverse charge invoice">
    In this example, we're issuing a domestic reverse charge invoice for copper scrap — one of the supplies (along with certain metals and electronics) where Denmark shifts the VAT liability to the buyer.

    Notice:

    * the line's tax uses the `reverse-charge` VAT key, so no VAT is charged and the customer accounts for it instead,
    * the `cef-vatex` extension carries the exemption reason code `VATEX-EU-AE` (reverse charge), which OIOUBL maps to its reverse-charge tax category, and,
    * both parties are Danish businesses identified by their CVR numbers.

    <CodeGroup>
      ````json Denmark reverse charge invoice theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "type": "standard",
        "series": "SAMPLE",
        "code": "0046",
        "issue_date": "2026-08-01",
        "currency": "DKK",
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Havnens Byggemarked A/S",
          "tax_id": {
            "country": "DK",
            "code": "12345674"
          },
          "addresses": [
            {
              "num": "3",
              "street": "Havnegade",
              "locality": "Aarhus C",
              "code": "8000",
              "country": "DK"
            }
          ]
        },
        "lines": [
          {
            "quantity": 500,
            "item": {
              "name": "Copper scrap",
              "price": "45.00",
              "unit": "kg"
            },
            "taxes": [
              {
                "cat": "VAT",
                "key": "reverse-charge",
                "ext": {
                  "cef-vatex": "VATEX-EU-AE"
                }
              }
            ]
          }
        ],
        "payment": {
          "terms": {
            "due_dates": [
              {
                "date": "2026-08-31",
                "percent": "100%"
              }
            ]
          },
          "instructions": {
            "key": "credit-transfer+sepa",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243"
              }
            ]
          }
        }
      }```
      ````

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "SAMPLE",
      	"code": "0046",
      	"issue_date": "2026-08-01",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Havnens Byggemarked A/S",
      		"tax_id": {
      			"country": "DK",
      			"code": "12345674"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "12345674"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:12345674"
      			}
      		],
      		"addresses": [
      			{
      				"num": "3",
      				"street": "Havnegade",
      				"locality": "Aarhus C",
      				"code": "8000",
      				"country": "DK"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "500",
      			"item": {
      				"name": "Copper scrap",
      				"price": "45.00",
      				"unit": "kg"
      			},
      			"sum": "22500.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "reverse-charge",
      					"ext": {
      						"cef-vatex": "VATEX-EU-AE"
      					}
      				}
      			],
      			"total": "22500.00"
      		}
      	],
      	"payment": {
      		"terms": {
      			"due_dates": [
      				{
      					"date": "2026-08-31",
      					"amount": "22500.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "credit-transfer+sepa",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "58"
      			}
      		}
      	},
      	"totals": {
      		"sum": "22500.00",
      		"total": "22500.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "reverse-charge",
      							"ext": {
      								"cef-vatex": "VATEX-EU-AE"
      							},
      							"base": "22500.00",
      							"amount": "0.00"
      						}
      					],
      					"amount": "0.00"
      				}
      			],
      			"sum": "0.00"
      		},
      		"tax": "0.00",
      		"total_with_tax": "22500.00",
      		"payable": "22500.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example intra-community invoice">
    In this example, we're invoicing a VAT-registered business in another EU member state — an intra-Community supply of goods, zero-rated under Momslovens §34.

    Notice:

    * the line's tax uses the `intra-community` VAT key with the `VATEX-EU-IC` exemption reason code,
    * the customer carries its own country's tax ID (a German VAT number here) and a **GLN endpoint** so NemHandel can route the document, and,
    * no Danish VAT is charged; the customer self-accounts for the acquisition in their own country.

    <CodeGroup>
      ````json Denmark intra-community invoice theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "type": "standard",
        "series": "SAMPLE",
        "code": "0047",
        "issue_date": "2026-08-01",
        "currency": "DKK",
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Rheinwerk Handel GmbH",
          "tax_id": {
            "country": "DE",
            "code": "111111125"
          },
          "endpoints": [
            {
              "uri": "GLN:4304984000008"
            }
          ],
          "addresses": [
            {
              "num": "18",
              "street": "Speditionstraße",
              "locality": "Düsseldorf",
              "code": "40221",
              "country": "DE"
            }
          ]
        },
        "lines": [
          {
            "quantity": 40,
            "item": {
              "name": "Industrial valves",
              "price": "320.00",
              "unit": "item"
            },
            "taxes": [
              {
                "cat": "VAT",
                "key": "intra-community",
                "ext": {
                  "cef-vatex": "VATEX-EU-IC"
                }
              }
            ]
          }
        ],
        "payment": {
          "terms": {
            "due_dates": [
              {
                "date": "2026-08-31",
                "percent": "100%"
              }
            ]
          },
          "instructions": {
            "key": "credit-transfer+sepa",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243"
              }
            ]
          }
        }
      }```
      ````

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "SAMPLE",
      	"code": "0047",
      	"issue_date": "2026-08-01",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Rheinwerk Handel GmbH",
      		"tax_id": {
      			"country": "DE",
      			"code": "111111125"
      		},
      		"endpoints": [
      			{
      				"uri": "GLN:4304984000008"
      			}
      		],
      		"addresses": [
      			{
      				"num": "18",
      				"street": "Speditionstraße",
      				"locality": "Düsseldorf",
      				"code": "40221",
      				"country": "DE"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "40",
      			"item": {
      				"name": "Industrial valves",
      				"price": "320.00",
      				"unit": "item"
      			},
      			"sum": "12800.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "intra-community",
      					"ext": {
      						"cef-vatex": "VATEX-EU-IC"
      					}
      				}
      			],
      			"total": "12800.00"
      		}
      	],
      	"payment": {
      		"terms": {
      			"due_dates": [
      				{
      					"date": "2026-08-31",
      					"amount": "12800.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "credit-transfer+sepa",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "58"
      			}
      		}
      	},
      	"totals": {
      		"sum": "12800.00",
      		"total": "12800.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "intra-community",
      							"ext": {
      								"cef-vatex": "VATEX-EU-IC"
      							},
      							"base": "12800.00",
      							"amount": "0.00"
      						}
      					],
      					"amount": "0.00"
      				}
      			],
      			"sum": "0.00"
      		},
      		"tax": "0.00",
      		"total_with_tax": "12800.00",
      		"payable": "12800.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example export invoice">
    In this example, we're invoicing a customer outside the EU — an export of goods, zero-rated under Momslovens §34.

    Notice:

    * the line's tax uses the `export` VAT key with the `VATEX-EU-G` exemption reason code,
    * the customer is a Norwegian business with its organisation number as tax ID and a GLN endpoint for routing, and,
    * no Danish VAT is charged on exports outside the EU.

    <CodeGroup>
      ````json Denmark export invoice theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "type": "standard",
        "series": "SAMPLE",
        "code": "0048",
        "issue_date": "2026-08-01",
        "currency": "DKK",
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Fjellvann Utstyr AS",
          "tax_id": {
            "country": "NO",
            "code": "987654325"
          },
          "endpoints": [
            {
              "uri": "GLN:7080000000000"
            }
          ],
          "addresses": [
            {
              "num": "7",
              "street": "Storgata",
              "locality": "Oslo",
              "code": "0155",
              "country": "NO"
            }
          ]
        },
        "lines": [
          {
            "quantity": 40,
            "item": {
              "name": "Industrial valves",
              "price": "320.00",
              "unit": "item"
            },
            "taxes": [
              {
                "cat": "VAT",
                "key": "export",
                "ext": {
                  "cef-vatex": "VATEX-EU-G"
                }
              }
            ]
          }
        ],
        "payment": {
          "terms": {
            "due_dates": [
              {
                "date": "2026-08-31",
                "percent": "100%"
              }
            ]
          },
          "instructions": {
            "key": "credit-transfer+sepa",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243"
              }
            ]
          }
        }
      }```
      ````

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "SAMPLE",
      	"code": "0048",
      	"issue_date": "2026-08-01",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Fjellvann Utstyr AS",
      		"tax_id": {
      			"country": "NO",
      			"code": "987654325MVA"
      		},
      		"endpoints": [
      			{
      				"uri": "GLN:7080000000000"
      			}
      		],
      		"addresses": [
      			{
      				"num": "7",
      				"street": "Storgata",
      				"locality": "Oslo",
      				"code": "0155",
      				"country": "NO"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "40",
      			"item": {
      				"name": "Industrial valves",
      				"price": "320.00",
      				"unit": "item"
      			},
      			"sum": "12800.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "export",
      					"ext": {
      						"cef-vatex": "VATEX-EU-G"
      					}
      				}
      			],
      			"total": "12800.00"
      		}
      	],
      	"payment": {
      		"terms": {
      			"due_dates": [
      				{
      					"date": "2026-08-31",
      					"amount": "12800.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "credit-transfer+sepa",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "58"
      			}
      		}
      	},
      	"totals": {
      		"sum": "12800.00",
      		"total": "12800.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "export",
      							"ext": {
      								"cef-vatex": "VATEX-EU-G"
      							},
      							"base": "12800.00",
      							"amount": "0.00"
      						}
      					],
      					"amount": "0.00"
      				}
      			],
      			"sum": "0.00"
      		},
      		"tax": "0.00",
      		"total_with_tax": "12800.00",
      		"payable": "12800.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example credit note">
    In this example, we're issuing a credit note that corrects a previously issued invoice.

    Notice:

    * the `type` is set to `credit-note`, which OIOUBL maps to its own CreditNote document (type code `381`),
    * the `preceding` array references the original invoice by its `series`, `code`, and `issue_date`, along with a `reason`, and,
    * there are no calculations in some fields; these will be made automatically when uploading.

    <CodeGroup>
      ```json Denmark credit note theme={null}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": ["dk-oioubl-v2"],
        "type": "credit-note",
        "series": "SAMPLE",
        "code": "0044",
        "issue_date": "2026-08-10",
        "currency": "DKK",
        "preceding": [
          {
            "series": "SAMPLE",
            "code": "0043",
            "issue_date": "2026-08-01",
            "reason": "Ordered quantity reduced"
          }
        ],
        "supplier": {
          "name": "Nordlys Software ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "addresses": [
            {
              "num": "24",
              "street": "Vesterbrogade",
              "locality": "København V",
              "code": "1620",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@nordlys.dk"
            }
          ]
        },
        "customer": {
          "name": "Havnens Byggemarked A/S",
          "tax_id": {
            "country": "DK",
            "code": "12345674"
          },
          "addresses": [
            {
              "num": "3",
              "street": "Havnegade",
              "locality": "Aarhus C",
              "code": "8000",
              "country": "DK"
            }
          ]
        },
        "lines": [
          {
            "quantity": 2,
            "item": {
              "name": "Consulting services",
              "price": "800.00",
              "unit": "h"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          }
        ]
      }
      ```

      ```json Built version theme={null}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "credit-note",
      	"series": "SAMPLE",
      	"code": "0044",
      	"issue_date": "2026-08-10",
      	"currency": "DKK",
      	"preceding": [
      		{
      			"issue_date": "2026-08-01",
      			"series": "SAMPLE",
      			"code": "0043",
      			"reason": "Ordered quantity reduced"
      		}
      	],
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "381"
      		}
      	},
      	"supplier": {
      		"name": "Nordlys Software ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "24",
      				"street": "Vesterbrogade",
      				"locality": "København V",
      				"code": "1620",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@nordlys.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Havnens Byggemarked A/S",
      		"tax_id": {
      			"country": "DK",
      			"code": "12345674"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "12345674"
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:12345674"
      			}
      		],
      		"addresses": [
      			{
      				"num": "3",
      				"street": "Havnegade",
      				"locality": "Aarhus C",
      				"code": "8000",
      				"country": "DK"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "2",
      			"item": {
      				"name": "Consulting services",
      				"price": "800.00",
      				"unit": "h"
      			},
      			"sum": "1600.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "1600.00"
      		}
      	],
      	"totals": {
      		"sum": "1600.00",
      		"total": "1600.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"base": "1600.00",
      							"percent": "25.0%",
      							"amount": "400.00"
      						}
      					],
      					"amount": "400.00"
      				}
      			],
      			"sum": "400.00"
      		},
      		"tax": "400.00",
      		"total_with_tax": "2000.00",
      		"payable": "2000.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

## FAQ

<AccordionGroup>
  <Accordion title="What documents can I send over NemHandel with the Denmark app?">
    Invoices and credit notes, as **OIOUBL 2.1** documents. Declare the [`dk-oioubl-v2` addon](https://docs.gobl.org/addons/dk-oioubl-v2) in `$addons` on the GOBL invoice: it layers the OIOUBL rules on top of the European EN 16931 baseline and rejects documents that would fail on the network before anything is sent. Reminders and invoice responses (OIOUBL ApplicationResponse) are not supported yet — they are planned for a follow-up release.
  </Accordion>

  <Accordion title="How do I know an invoice was actually delivered?">
    The send step doesn't report success on submission — it submits the OIOUBL document and then **waits until the network confirms delivery**. The job stays queued, re-checking the document's status when eCourier reports a change (and every few minutes on its own), and only completes when the document is delivered. If delivery fails, the job fails and your workflow's rescue steps run.
  </Accordion>

  <Accordion title="Can I issue a VAT-exempt invoice?">
    Not as "exempt". OIOUBL's tax category codelist supports standard-rated, zero-rated, and reverse-charge VAT, but has **no exempt category** on the wire. The `dk-oioubl-v2` addon rejects an exempt VAT key up front rather than silently relabelling it — state the supply as **zero-rated** instead.
  </Accordion>

  <Accordion title="What happens if I run the send workflow twice on the same invoice?">
    Nothing bad. A later run that finds the entry already delivered skips with a `Duplicated Invoice` result instead of resubmitting, so the receiver never gets the document twice.
  </Accordion>

  <Accordion title="Can I generate the OIOUBL file without sending it?">
    Yes. The convert step works on its own: it converts the GOBL invoice to OIOUBL 2.1, validates it against the official schematron, and stores the XML as an attachment on the silo entry under the `oioubl` file key. A workflow that only converts lets you inspect or download the file without submitting anything to the network.
  </Accordion>
</AccordionGroup>

More available in our [Denmark FAQ](/faq/denmark) section

***

<AccordionGroup>
  <Accordion title="🇩🇰 Invopop resources for Denmark">
    |            |                                                                                                                                                                                                                                                                                                                                                                                          |
    | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Compliance | <Icon icon="https://assets.invopop.com/flags/dk.svg" /> [Invoicing compliance in Denmark](/compliance/denmark)<br /> <Icon icon="timeline" /> [Compliance timeline](/timelines/denmark)                                                                                                                                                                                                  |
    | Apps       | <Icon icon="https://assets.invopop.com/flags/dk.svg" /> [Denmark](/apps/denmark)<br /> <Icon icon="https://assets.invopop.com/apps/peppol/icon.svg" /> [Peppol](/apps/peppol)                                                                                                                                                                                                            |
    | Guides     | <Icon icon="book" /> [Supplier registration guide](/guides/dk-nemhandel-supplier)<br /> <Icon icon="book" /> [Issuing invoices guide](/guides/dk-nemhandel)<br /> <Icon icon="book" /> [Receiving invoices guide](/guides/dk-nemhandel-receiving)<br /> <Icon icon="book" /> [Peppol guide](/guides/peppol)<br /> <Icon icon="book" /> [Chargebee guide](/guides/cb-denmark)             |
    | FAQ        | <Icon icon="square-question" /> [Denmark FAQ](/faq/denmark)                                                                                                                                                                                                                                                                                                                              |
    | GOBL       | <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [Danish OIOUBL 2.1 Addon](https://docs.gobl.org/addons/dk-oioubl-v2)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [Denmark Tax Regime](https://docs.gobl.org/regimes/dk)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) |
    | GitHub     | <Icon icon="github" /> [gobl.dk.oioubl](https://github.com/invopop/gobl.dk.oioubl)<br /> <Icon icon="github" /> [gobl.ubl](https://github.com/invopop/gobl.ubl)                                                                                                                                                                                                                          |
  </Accordion>
</AccordionGroup>

<Card title="Participate in our community" icon="forumbee" href="https://community.invopop.com" arrow="true" horizontal>
  Ask and answer questions about invoicing in Denmark →
</Card>
