Developers
One key, one header, your own figures.
You create the key in KRONENWERK yourself and choose there what it may do. With it you read your customers, your invoices, your transactions and your open items — and create customers, transactions and invoice drafts. Events from the working day go to an address you register: signed, and retried.
Access
Two lines, and you are connected.
The key is shown exactly once; only its hash is stored. A test key and a live key are two separate keys with two separate prefixes, and a key can never do more than the person who issued it was allowed to.
| Base address | Header |
|---|---|
| https://kronenwerk.org/api/extern/v1 | Authorization: Bearer greif_live_… |
What you read
Every address requires its own scope.
A key holds only the permissions you give it. Where one is missing the path answers 403 rather than data — and that holds for your own key too.
| Path | Scope | What comes back |
|---|---|---|
| GET /api/extern/v1/me | The key itself: company, environment, scopes, last use. The first call anybody writes. |
|
| GET /api/extern/v1/customers | customers:read | One page of customers and suppliers, newest first. |
| GET /api/extern/v1/customers/{id} | customers:read | A single customer with all of their master data. |
| POST /api/extern/v1/customers | customers:write | Creates a customer. KRONENWERK draws the partner number from the business's own sequence. |
| GET /api/extern/v1/invoices | invoices:read | Issued invoices, filterable by payment state and issue date. |
| GET /api/extern/v1/invoices/{number} | invoices:read | One issued invoice, exactly as the archive froze it. |
| POST /api/extern/v1/invoices/drafts | invoices:write customers:read companies:read | Starts an invoice draft for a customer. It is not thereby issued. |
| GET /api/extern/v1/transactions | transactions:read | Transactions — orders, projects, production runs — with their stage and due date, newest first. Narrow to a period with period, from and to; the window goes by the date the work started. |
| POST /api/extern/v1/transactions | transactions:write transactions:read | Creates a transaction. Number, stage and timeline are produced as they are on the product's own screen. |
| PATCH /api/extern/v1/transactions/{id} | transactions:write transactions:read | Changes a transaction that already exists. A field left out stays as it is; "none" as the customer removes the customer. |
| GET /api/extern/v1/reports/outstanding | reports:read | Receivables and payables outstanding today, kept apart by direction. |
| GET /api/extern/v1/webhooks | webhooks:write | This company's webhook endpoints. |
| GET /api/extern/v1/webhooks/events | webhooks:write | The events an endpoint can subscribe to. |
| POST /api/extern/v1/webhooks | webhooks:write | Register an endpoint; the signing secret is in the answer once. |
| DELETE /api/extern/v1/webhooks/{id} | webhooks:write | Disable an endpoint; the delivery log stays. |
An example
One call, one answer.
Every amount is a whole number in the smallest unit of its currency, never formatted text. A date is a calendar day with no time zone. That way no separator can be misread and no day can shift by one.
| Request | Response |
|---|---|
| GET https://kronenwerk.org/api/extern/v1/invoices?status=OPEN&size=1 | {"data":[{"number":"R-2026-0001","issuedOn":"2026-04-02","buyer":"Kellermann GmbH","currency":"EUR","gross":{"minor":105910,"currency":"EUR"},"outstanding":{"minor":105910,"currency":"EUR"},"paymentState":"OPEN","overdue":false}],"page":0,"size":1,"total":1,"more":false} |
Webhooks
Six events, raised by real work.
You register an address and choose what it should be told about. Every delivery carries a stable event identifier that does not change across retries — so a receiver that has processed it once may discard every later copy.
| Event | When it is sent |
|---|---|
| invoice.issued | An invoice was issued: the number is spent, the document is archived and immutable. |
| invoice.paid | An invoice has been settled in full — by a payment, however it was recorded. |
| invoice.cancelled | An invoice was cancelled: a reversal document exists that voids it in full. Nothing is deleted. |
| purchase.recorded | A supplier's invoice or an expense was recorded, with supplier, date and amounts. |
| payment.recorded | A payment was recorded, with direction, amount, day and the document it settles. |
| bank.transaction.imported | A bank transaction was imported and is ready to be matched. |
Signature
Every delivery is signed, and the signature carries a moment in time.
When you register the address you are given a secret — once. Verify the timestamp and the body together with it, not the body alone: a signature without a moment stays valid forever and can be replayed at you later.
| Header | How to verify it |
|---|---|
| KRONENWERK-Signature: t=1775462400,v1=… | Compute HMAC with SHA-256 over the timestamp, a full stop and the unaltered body, using the secret as the key, and compare the result with v1. Reject a delivery whose timestamp is more than five minutes from your own clock. |
The boundary
A draft is allowed. Sending is not.
The difference between preparing something and setting it in motion is the core of this whole undertaking, and it will live in the services rather than in an interface — what a screen forbids is forbidden only on that screen. An AI system must never be a way around the financial controls.
| May prepare | May not set in motion |
|---|---|
| Create an estimate draft | Send the estimate |
| Create an invoice draft | Issue the invoice |
| Suggest a payment match | Post the payment |
| Propose a refund | Move the money back |