curl --request GET \
--url https://api.envoi.no/v1/journal-entries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.envoi.no/v1/journal-entries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.envoi.no/v1/journal-entries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.envoi.no/v1/journal-entries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.envoi.no/v1/journal-entries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.envoi.no/v1/journal-entries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.envoi.no/v1/journal-entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "5a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"series": "SalesInvoice",
"number": 12,
"documentDate": "2026-09-29",
"postingDate": "2026-09-29",
"description": "Faktura 10023",
"status": "Posted",
"sourceDocumentType": "Invoice",
"sourceDocumentId": "8b6f2a4e-1c3d-4e5f-9a7b-2c4d6e8f0a12",
"correctsEntryId": null,
"lines": [
{
"lineNumber": 1,
"account": "1500",
"accountName": "Kundefordringer",
"description": null,
"debit": 1250,
"credit": 0,
"vatCode": null,
"customerId": "c2a9d4e1-5b7f-4c3a-8e6d-1f2a3b4c5d6e",
"supplierId": null,
"projectId": null
},
{
"lineNumber": 2,
"account": "3000",
"accountName": "Salgsinntekt handelsvarer, avgiftspliktig, høy sats",
"description": null,
"debit": 0,
"credit": 1000,
"vatCode": "3",
"customerId": null,
"supplierId": null,
"projectId": null
},
{
"lineNumber": 3,
"account": "2700",
"accountName": "Utgående merverdiavgift, høy sats",
"description": null,
"debit": 0,
"credit": 250,
"vatCode": null,
"customerId": null,
"supplierId": null,
"projectId": null
}
]
}
],
"page": 1,
"pageSize": 50,
"totalCount": 1,
"hasMore": false
}{
"code": "period-too-long",
"message": "The period may span at most 12 months.",
"details": {
"maxMonths": 12
}
}{
"code": "unauthorized",
"message": "A valid API client access token is required."
}{
"code": "insufficient_scope",
"message": "This API client needs bilag:read."
}{
"code": "accounting-not-enabled",
"message": "Accounting is not enabled for this account."
}{
"code": "rate_limited",
"message": "Too many requests; try again later."
}{
"code": "server-error",
"message": "The request could not be completed. It is safe to retry with the same Idempotency-Key."
}List journal entries
The journal entries in a period, in chronological order, a page at a time, each with its lines.
from and to are months (yyyy-MM) and both are included. A period spans at most 12 months; for a longer
history, ask one year at a time.
series is SalesInvoice, CreditNote, SupplierInvoice, Bank or Manual; status is Posted or
Reversed. A correcting entry names the posted entry it corrects in correctsEntryId.
curl --request GET \
--url https://api.envoi.no/v1/journal-entries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.envoi.no/v1/journal-entries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.envoi.no/v1/journal-entries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.envoi.no/v1/journal-entries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.envoi.no/v1/journal-entries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.envoi.no/v1/journal-entries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.envoi.no/v1/journal-entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "5a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"series": "SalesInvoice",
"number": 12,
"documentDate": "2026-09-29",
"postingDate": "2026-09-29",
"description": "Faktura 10023",
"status": "Posted",
"sourceDocumentType": "Invoice",
"sourceDocumentId": "8b6f2a4e-1c3d-4e5f-9a7b-2c4d6e8f0a12",
"correctsEntryId": null,
"lines": [
{
"lineNumber": 1,
"account": "1500",
"accountName": "Kundefordringer",
"description": null,
"debit": 1250,
"credit": 0,
"vatCode": null,
"customerId": "c2a9d4e1-5b7f-4c3a-8e6d-1f2a3b4c5d6e",
"supplierId": null,
"projectId": null
},
{
"lineNumber": 2,
"account": "3000",
"accountName": "Salgsinntekt handelsvarer, avgiftspliktig, høy sats",
"description": null,
"debit": 0,
"credit": 1000,
"vatCode": "3",
"customerId": null,
"supplierId": null,
"projectId": null
},
{
"lineNumber": 3,
"account": "2700",
"accountName": "Utgående merverdiavgift, høy sats",
"description": null,
"debit": 0,
"credit": 250,
"vatCode": null,
"customerId": null,
"supplierId": null,
"projectId": null
}
]
}
],
"page": 1,
"pageSize": 50,
"totalCount": 1,
"hasMore": false
}{
"code": "period-too-long",
"message": "The period may span at most 12 months.",
"details": {
"maxMonths": 12
}
}{
"code": "unauthorized",
"message": "A valid API client access token is required."
}{
"code": "insufficient_scope",
"message": "This API client needs bilag:read."
}{
"code": "accounting-not-enabled",
"message": "Accounting is not enabled for this account."
}{
"code": "rate_limited",
"message": "Too many requests; try again later."
}{
"code": "server-error",
"message": "The request could not be completed. It is safe to retry with the same Idempotency-Key."
}Authorizations
OAuth 2.0 client credentials. The token request also needs the audience form field (the Account ID), which OAuth tooling does not always send; see POST /v1/oauth/token.
Query Parameters
The first month, yyyy-MM. Required.
The last month, yyyy-MM. Required.
The page, from 1.
x >= 1Entries per page, 1 to 100.
1 <= x <= 100Response
A page of journal entries.
One page of a list.
The items on this page.
Show child attributes
Show child attributes
This page's number, from 1.
The page size asked for.
How many items there are on all pages together.
True when there is a next page.