# Paginering

De fleste endpoints returnerer ét objekt. De få, der returnerer lister, er enten sideinddelte med `per_side` og `side` eller returnerer de bedste hits til en søgning.

## Sideinddelte lister

Registerlister sideinddeles med to query-parametre: `per_side` (antal pr. side) og `side` (1-indekseret). Svaret bærer `antal` (rækker på denne side) og `total` (rækker i hele listen), så du ved, hvornår du er færdig.

| Endpoint | `per_side` standard | `per_side` maks. | Bemærk |
| --- | --- | --- | --- |
| `GET /v1/ejerlav` | 100 | 100 | Sorteret efter ejerlavskode. |
| `GET /v1/vejnavne` | 100 | 200 | Kan afgrænses med `kommunekode`. |
| `GET /v1/postnumre` | — | — | Ikke sideinddelt: hele listen i ét svar (`antal` = `total`). |

En værdi over maksimum sættes ned til maksimum. En side efter den sidste giver en tom liste med `antal: 0`, ikke en fejl. Hver side er ét kald.

```text
{
  antal: number,       // rækker på denne side
  total: number,       // rækker i hele listen
  vejnavne: string[],  // (ejerlav: ejerlav[])
  meta: { kilde, grundfast_version }
}
```

## Hent alle sider

```js
const headers = { Authorization: `Bearer ${process.env.GRUNDFAST_API_KEY}` };
const perSide = 200;
const vejnavne = [];

for (let side = 1; ; side++) {
  const url = `https://api.grundfast.dk/v1/vejnavne?kommunekode=0851&per_side=${perSide}&side=${side}`;
  const res = await fetch(url, { headers });
  if (!res.ok) throw new Error(`${res.status}: ${(await res.json()).error}`);

  const page = await res.json();
  vejnavne.push(...page.vejnavne);
  if (page.antal < perSide || vejnavne.length >= page.total) break;
}

console.log(vejnavne.length, 'vejnavne i Aalborg Kommune');
```

Med [TypeScript-SDK’et](https://grundfast.dk/docs/sdk) er det samme `gf.vejnavne(perSide, side, kommunekode)` og `gf.ejerlav(perSide, side)`.

## Søgning og autocomplete

Søge-endpoints sideinddeles ikke. De returnerer de bedst rangerede hits op til et loft — til en søgeboks, ikke til at hente hele registret.

| Endpoint | Parameter | Standard | Maks. |
| --- | --- | --- | --- |
| `GET /v1/adresse/search` | `per_side` | 8 | 20 |
| `GET /v1/adgangsadresser/reverse` | `per_side` | 1 | 20 |
| `GET /v1/cvr/search` | `limit` (eller `per_side`) | 10 | 20 |
| `GET /v1/autocomplete` | — | 20 | 20 |
| `GET /v1/vejnavne/autocomplete`, `/v1/postnumre/autocomplete`, `/v1/ejerlav/autocomplete` | — | 20 | 20 |

Autocomplete for vejnavne, postnumre og ejerlav bærer også `antal` og `total`; her er `total` størrelsen af hele listen, der blev søgt i, ikke antallet af mulige hits.

> **Mange ejendomme på én gang** Skal du slå mange kendte BFE-numre eller adresser op, så brug [batch-endpoints eller eksport](https://grundfast.dk/docs/batch-og-eksport) i stedet for løkker over enkeltkald.
