Pagination
Les trois formes de listes renvoyées par l'API NovaFisko, les paramètres page et per_page, et la bonne manière de parcourir toutes les pages.
Toutes les listes ne sont pas paginées. L'API renvoie trois formes selon la nature de la ressource. La référence précise la forme de chaque route.
| Forme | Quand | Exemples |
|---|---|---|
| Tableau simple | Référentiels de taille limitée | companies, accounts, journals, third-parties, vat-codes, fiscal-years |
| Pagination par page | Listes qui grandissent sans cesse | entries, documents, document-imports, bank-transactions, coda-files, history, sync/conflicts |
| Flux par curseur | Suivi des changements | sync/pull |
Tableaux simples
Les référentiels sont renvoyés entiers, sous la forme d'un tableau JSON à la racine. Filtrez-les avec les paramètres de recherche de la 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
}
]
Pagination par page
Paramètres
| Paramètre | Défaut | Maximum | Description |
|---|---|---|---|
page |
1 |
Numéro de la page, à partir de 1 | |
per_page |
50 |
200 |
Nombre d'éléments par page |
Les mouvements bancaires (bank-transactions) font exception : 100 éléments par défaut, 500 au maximum.
Forme de la réponse
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
}
| Champ | Description |
|---|---|
data |
Les éléments de la page |
current_page, last_page |
Page courante et dernière page |
per_page |
Taille de page appliquée, après plafonnement |
total |
Nombre total d'éléments correspondant aux filtres |
from, to |
Rang du premier et du dernier élément de la page |
next_page_url, prev_page_url |
URL de la page suivante ou précédente, null s'il n'y en a pas |
Les URL contenues dans next_page_url et links ne reprennent pas vos filtres (from, to, per_page...). Construisez vous-même l'URL de la page suivante en incrémentant page et en conservant vos paramètres.
Variantes
Quelques routes ajoutent des champs à la pagination standard ou en simplifient la forme.
| Route | Particularité |
|---|---|
sync/conflicts |
Pagination standard, plus open : le nombre de conflits encore ouverts |
trash |
data, current_page, per_page, last_page, total, plus counts, types, retention_days, can_purge |
activity, firms/{firm}/activity |
data, current_page, per_page et has_more au lieu de total |
firms/{firm}/webhooks/{webhook}/deliveries |
data et meta : {current_page, last_page, per_page, total} |
Pour le journal d'activité, avancez tant que has_more vaut true.
Parcourir toutes les pages
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
Ordre et stabilité
Les listes paginées sont triées du plus récent au plus ancien (entries par date d'écriture puis par id, history par id). Si des éléments sont créés pendant votre parcours, un élément peut glisser d'une page à la suivante et apparaître deux fois. Deux parades :
- bornez la période avec
fromettosur un intervalle clos ; - dédoublonnez sur
idde votre côté.
Pour une copie complète tenue à jour, n'interrogez pas les listes en boucle. Chargez-les une fois, puis suivez les changements avec sync/pull.
Flux par curseur
GET sync/pull ne connaît pas de pages. Vous lui donnez le dernier curseur reçu et il renvoie les changements survenus depuis.
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"
}
Tant que has_more vaut true, rappelez immédiatement la route avec le nouveau cursor. Le déroulé complet figure dans Synchroniser en continu.