Paginierung
Die drei Listenformen der NovaFisko-API, die Parameter page und per_page und der richtige Weg, alle Seiten zu durchlaufen.
Nicht alle Listen sind paginiert. Die API liefert je nach Art der Ressource drei Formen. Die Referenz gibt die Form jeder Route an.
| Form | Wann | Beispiele |
|---|---|---|
| Einfaches Array | Stammdaten begrenzter Größe | companies, accounts, journals, third-parties, vat-codes, fiscal-years |
| Seitenweise Paginierung | Listen, die ständig wachsen | entries, documents, document-imports, bank-transactions, coda-files, history, sync/conflicts |
| Cursor-Stream | Verfolgen von Änderungen | sync/pull |
Einfache Arrays
Stammdaten werden vollständig zurückgegeben, als JSON-Array auf der obersten Ebene. Filtern Sie sie mit den Suchparametern der Route.
curl "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/third-parties?type=supplier&q=brasserie" \
-H "Authorization: Bearer $NOVAFISKO_TOKEN"
[
{
"id": 41,
"type": "supplier",
"code": "BRASSCOL",
"name": "Brasserie des Collines SA",
"vat_number": "BE0999900134",
"version": 3
}
]
Seitenweise Paginierung
Parameter
| Parameter | Standard | Maximum | Beschreibung |
|---|---|---|---|
page |
1 |
Seitennummer, beginnend bei 1 | |
per_page |
50 |
200 |
Anzahl der Elemente pro Seite |
Die Bankbewegungen (bank-transactions) bilden eine Ausnahme: standardmäßig 100 Elemente, höchstens 500.
Form der Antwort
curl "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries?from=2026-07-01&to=2026-09-30&per_page=2&page=1" \
-H "Authorization: Bearer $NOVAFISKO_TOKEN"
{
"current_page": 1,
"data": [
{
"id": 1842,
"journal_id": 3,
"number": 212,
"entry_date": "2026-09-30T00:00:00.000000Z",
"label": "Brasserie des Collines SA",
"reference": "F-2026-0918",
"status": "posted",
"journal": {"id": 3, "code": "ACH", "type": "purchase"},
"third_party": {"id": 41, "name": "Brasserie des Collines SA"},
"lines": [
{"id": 5521, "account_id": 118, "debit": "1250.00", "credit": "0.00", "account": {"id": 118, "number": "604000", "label": "Achats de marchandises"}},
{"id": 5522, "account_id": 77, "debit": "262.50", "credit": "0.00", "account": {"id": 77, "number": "411000", "label": "TVA à récupérer"}},
{"id": 5523, "account_id": 90, "debit": "0.00", "credit": "1512.50", "account": {"id": 90, "number": "440000", "label": "Fournisseurs"}}
]
}
],
"first_page_url": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries?page=1",
"from": 1,
"last_page": 87,
"last_page_url": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries?page=87",
"links": [
{"url": null, "label": "« Précédent", "active": false},
{"url": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries?page=1", "label": "1", "active": true}
],
"next_page_url": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries?page=2",
"path": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries",
"per_page": 2,
"prev_page_url": null,
"to": 2,
"total": 173
}
| Feld | Beschreibung |
|---|---|
data |
Die Elemente der Seite |
current_page, last_page |
Aktuelle Seite und letzte Seite |
per_page |
Angewendete Seitengröße, nach Begrenzung auf das Maximum |
total |
Gesamtzahl der Elemente, die den Filtern entsprechen |
from, to |
Position des ersten und des letzten Elements der Seite |
next_page_url, prev_page_url |
URL der nächsten oder vorherigen Seite, null, wenn es keine gibt |
Die URLs in next_page_url und links übernehmen Ihre Filter (from, to, per_page...) nicht. Bauen Sie die URL der nächsten Seite selbst auf, indem Sie page erhöhen und Ihre Parameter beibehalten.
Varianten
Einige Routen ergänzen die Standardpaginierung um Felder oder vereinfachen ihre Form.
| Route | Besonderheit |
|---|---|
sync/conflicts |
Standardpaginierung, zusätzlich open: die Anzahl der noch offenen Konflikte |
trash |
data, current_page, per_page, last_page, total, zusätzlich counts, types, retention_days, can_purge |
activity, firms/{firm}/activity |
data, current_page, per_page und has_more anstelle von total |
firms/{firm}/webhooks/{webhook}/deliveries |
data und meta: {current_page, last_page, per_page, total} |
Beim Aktivitätsprotokoll blättern Sie weiter, solange has_more den Wert true hat.
Alle Seiten durchlaufen
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'https://api.novafisko.com/v1/',
'headers' => ['Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'), 'Accept' => 'application/json'],
]);
$page = 1;
do {
$response = json_decode((string) $client->get("companies/{$company}/entries", [
'query' => ['fiscal_year_id' => 7, 'per_page' => 200, 'page' => $page],
])->getBody(), true);
foreach ($response['data'] as $entry) {
// Handle one entry
}
$page++;
} while ($page <= $response['last_page']);
import os
import requests
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}", "Accept": "application/json"})
def all_entries(company, **filters):
page = 1
while True:
payload = session.get(
f"https://api.novafisko.com/v1/companies/{company}/entries",
params={**filters, "per_page": 200, "page": page},
timeout=60,
).json()
yield from payload["data"]
if page >= payload["last_page"]:
break
page += 1
Reihenfolge und Stabilität
Paginierte Listen sind vom neuesten zum ältesten Element sortiert (entries nach Buchungsdatum, dann nach id, history nach id). Werden während Ihres Durchlaufs Elemente angelegt, kann ein Element von einer Seite auf die nächste rutschen und zweimal erscheinen. Zwei Gegenmaßnahmen:
- begrenzen Sie den Zeitraum mit
fromundtoauf ein geschlossenes Intervall; - entfernen Sie Duplikate auf Ihrer Seite anhand der
id.
Für eine vollständige, aktuell gehaltene Kopie fragen Sie die Listen nicht in einer Schleife ab. Laden Sie sie einmal und verfolgen Sie die Änderungen danach mit sync/pull.
Cursor-Stream
GET sync/pull kennt keine Seiten. Sie übergeben den zuletzt erhaltenen Cursor, und die Route liefert die seither eingetretenen Änderungen.
curl "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/sync/pull?since=48211&limit=500" \
-H "Authorization: Bearer $NOVAFISKO_TOKEN"
{
"cursor": 48236,
"has_more": false,
"full_resync": false,
"changes": [
{"resource": "third_parties", "op": "upsert", "id": 41, "version": 4, "data": {"id": 41, "name": "Brasserie des Collines SA"}, "changed_at": "2026-10-05T08:41:02+00:00", "seq": 48236}
],
"server_time": "2026-10-05T08:41:09+00:00"
}
Solange has_more den Wert true hat, rufen Sie die Route sofort mit dem neuen cursor erneut auf. Den vollständigen Ablauf finden Sie unter Fortlaufend synchronisieren.