danskadresseapi-sdk
v2.1.0
Published
Officiel JavaScript/TypeScript SDK for DanskAdresseAPI — drop-in DAWA replacement. Komplet endpoint-coverage, replikering-iterator, webhook-verify og React hooks.
Maintainers
Readme
danskadresseapi-sdk
Officiel JavaScript/TypeScript SDK for DanskAdresseAPI — drop-in DAWA replacement.
v2.1 — komplet endpoint-coverage, streaming-iteratorer, webhook-verify og React-hooks.
Installation
bun add danskadresseapi-sdk
# eller: npm install danskadresseapi-sdkQuick start
import { Addr } from 'danskadresseapi-sdk';
const addr = new Addr({ apiKey: process.env.ADDR_KEY! });
// Autocomplete (flad array, DAWA-paritet)
const hits = await addr.autocomplete({ q: 'Nørrebrog' });
// Reverse geocoding
const near = await addr.reverse({ lat: 55.6883, lon: 12.5571 });
// Validering med score + suggestions
const check = await addr.datavask({
vejnavn: 'Nørrebrogade',
husnr: '1',
postnr: '2200',
});Endpoint-coverage
Alle /v1-ressourcer er eksponeret som namespace-objekter:
// Adresser & adgangsadresser
await addr.adresser.search({ q: 'storegade', postnr: '2100' });
await addr.adresser.byId('0a3f50a0-...');
// BBR
await addr.bbr.bygninger.byId('1234');
await addr.bbr.enheder.batch(['id1', 'id2', 'id3']); // Pro+
// DAGI (alle 7 typer)
await addr.dagi.lookup({ lat: 55.68, lon: 12.55 });
await addr.dagi.kommune('0101');
await addr.dagi.politikreds('1471');
// Postnumre + vejnavne
await addr.postnumre.list({ q: '2100' });
await addr.vejnavne.search({ q: 'storegade' });
// Reference-data
await addr.reference.jordstykker();
await addr.reference.bebyggelse('id');
// Geo
await addr.geo.density({ lat: 55.68, lon: 12.55, radiusMeters: 500 });Streaming-iteratorer
// Iterér ALLE matched adresser (auto-pagineret)
for await (const adresse of addr.adresser.all({ kommunekode: '0101' })) {
process(adresse);
}
// Replikering — event-stream
let cursor = 0;
for await (const event of addr.replikering.adresser.iterate({ cursor })) {
applyEvent(event);
cursor = event.sekvensnummer; // gem cursor lokalt for resume
}Batch-jobs
const { id } = await addr.batch.start({
endpoint: '/v1/datavask',
rows: [
{ vejnavn: 'storegade', husnr: '5', postnr: '2100' },
{ vejnavn: 'lille torv', husnr: '12', postnr: '8000' },
],
});
// Poll med exponential backoff (1s → 2s → 4s → 8s → 16s → 30s cap)
const final = await addr.batch.wait(id);
// Hent resultater
const results = await addr.batch.download(id);Webhook-verify
Separat sub-export så React-bundlere ikke fanger Node-crypto:
// Next.js API-route eller Express handler
import { verifyWebhook } from 'danskadresseapi-sdk/webhooks';
export async function POST(req: Request) {
const raw = await req.text();
const sig = req.headers.get('x-addr-signature') ?? '';
if (!verifyWebhook(raw, sig, process.env.WEBHOOK_SECRET!)) {
return new Response('Invalid signature', { status: 401 });
}
// ...behandl event
}Algoritmen er HMAC-SHA256 over ${unix_t}.${rawBody} med endpoint-secret. Replay-protection: 5 min default tolerance (override via { toleranceSeconds }).
React hooks
import { useAutocomplete } from 'danskadresseapi-sdk/react';
import { Addr } from 'danskadresseapi-sdk';
// Cache client mellem renders
const addr = new Addr({ apiKey: process.env.NEXT_PUBLIC_ADDR_KEY! });
export function AddressInput() {
const [q, setQ] = useState('');
const { results, loading, error } = useAutocomplete(q, {
client: addr,
debounceMs: 150,
limit: 6,
});
return (
<>
<input value={q} onChange={(e) => setQ(e.target.value)} />
{loading && <span>Søger...</span>}
{error && <span>{error.message}</span>}
<ul>{results.map(r => <li key={r.data.id}>{r.tekst}</li>)}</ul>
</>
);
}Konfiguration
new Addr({
apiKey: 'sk_live_…',
baseUrl: 'https://api.danskadresseapi.dk', // default
timeoutMs: 10_000, // default
retries: 1, // 5xx/netværk auto-retries
userAgentSuffix: 'my-app/1.0.0', // tilføjes efter "danskadresseapi-sdk/X.Y.Z"
});Errors
import { Addr, AddrError } from 'danskadresseapi-sdk';
try {
await addr.autocomplete({ q: 'x' });
} catch (err) {
if (err instanceof AddrError) {
console.log(err.type, err.status, err.requestId);
// type: 'unauthorized' | 'forbidden' | 'not_found' | 'rate_limited' | ...
}
}Migration fra DAWA
Vi spejler DAWA's URL-struktur 1:1 på /dawa/* — så hvis du bruger fetch direkte, behøver du ikke en SDK. Skift base-URL og du er færdig.
License
MIT
