NORMAN DEVELOPERS
API keys, permissions and data conventions
Authenticate with Bearer API keys, select company permissions, rotate credentials and understand Norman API amounts, dates and pagination.
Authentication & company access
Send Authorization: Bearer nrm_… on every authenticated request. Norman shows the full key once; the key list shows its prefix, permissions and last use. To rotate a key, create a replacement, update your integration and then revoke the old key.
Authorization: Bearer nrm_your_api_key
Content-Type: application/jsonOne key, one company
A key always uses the company it was created for. GET /companies/ returns that company. Paths containing {company_pk} use its publicId. Company IDs supplied in URLs, request bodies or an optional X-Company-Id header must match the key. Referenced clients, documents and transaction items must also belong to that company.
Choose the permissions your integration needs
Read and write permissions are separate: write_invoices does not include read_invoices. The Invoicing preset includes client and invoice reads and writes. full_access covers the operations in this reference for the key’s company. Expired or revoked keys stop working; access also ends if the creator’s account is disabled or company access is removed.
Some workflows need several permissions. Document batch processing and metadata corrections require write_documents and write_transactions. Matching invoice payments requires invoice and transaction permissions. Product catalog operations use invoice permissions. Each reference entry lists the full requirement. Saving client details from an invoice requires write_clients.
Data conventions
Money, dates and identifiers
- Transaction amounts use minor currency units. For EUR,
4999means €49.99. Invoice linerate: 15000means €150.00 per unit. Transaction amounts can be returned as decimal strings, for example"-4999.00". Preserve precision when converting them. - Transaction expenses use a negative amount and
cashflowType: "EXPENSE". Invoice quantities and unit prices are positive.vatRate: 19means 19%. - JSON field names use camelCase:
valueDate,invoicedItems,dueTo. Use the query names in the reference, such aspage_sizeanddate_from. - Dates use
YYYY-MM-DD; timestamps use ISO 8601 with a timezone. A transaction’svalueDateis a timestamp. - Use the UUID returned by the resource: usually
publicId, orpkfor tax reports. Check its response schema. Enum values are case-sensitive. For example, write invoicestatus: "draft"and clientclientType: "business". Some response fields contain display labels such as"Draft"or"Business"; use the request schema when sending values back.
Pagination & filtering
List responses contain count, next, previous and results. Use page and page_size, or follow next until it is null. The default page size can differ by resource; request an explicit size. The configured maximum is normally 1,000.
curl --fail-with-body "https://api.norman.finance/api/v1/accounting/transactions/?date_from=2026-09-01&date_to=2026-09-30&page=1&page_size=100" \
-H "Authorization: Bearer $NORMAN_API_KEY"Use PATCH to update selected fields. Deletion and verification can be refused when accounting or document state prevents the change.