bolagsinsikt.

Webhooks

Skapa webhook

Kräver webhooks:manage och en plan med webhooks. Adressen måste vara https på port 443 och får inte peka på interna nät. Hemligheten (whsec_…) visas bara en gång.

curl -X POST "https://bolagsinsikt.se/api/public/v1/webhooks" \
  -H "Authorization: Bearer bi_test_DIN_NYCKEL" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.se/hooks/bolagsinsikt", "events": [ "company.updated", "financials.published" ], "filters": { "county": [ "Västernorrlands län" ] } }'

Händelsetyper

TypBeskrivning
company.createdNytt företag.
company.updatedPublik uppgift ändrad.
company.status_changedStatusändring.
financials.publishedNytt bokslut.
export.completedExport klar att ladda ner.
export.failedExport misslyckades.

Payload

Varje leverans är en POST med JSON och headers Bolagsinsikt-Event-Id, Bolagsinsikt-Event-Type, Bolagsinsikt-Signature och User-Agent: Bolagsinsikt-Webhooks/1.0. Svara med 2xx inom 10 sekunder. Använd event-id för att hoppa över dubbletter.

Payload
{
  "id": "evt_4b1c9e0f2a7d3e5c6b8a",
  "type": "company.updated",
  "created_at": "2026-09-29T06:12:44Z",
  "data": {
    "company_id": "co_8f3k2m",
    "org_nr": "5566778899",
    "changed_fields": [
      "website",
      "website_status"
    ]
  }
}

Verifiera signaturen

Headern ser ut så här: t=1759126364,v1=5f2b…. Beräkna HMAC-SHA256 av <t>.<rå body> med din hemlighet och jämför i konstant tid. Under 24 timmar efter att du bytt hemlighet skickas två v1 – godkänn om någon matchar. Använd alltid den råa bodyn, innan JSON-tolkning.

import crypto from "node:crypto";

export function verify(rawBody, header, secret, toleranceSec = 300) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const signatures = header.split(",").filter((p) => p.startsWith("v1=")).map((p) => p.slice(3));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  // Jämför i konstant tid. Flera v1 kan finnas under rotation.
  return signatures.some((sig) => sig.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)));
}

Omförsök

Misslyckade leveranser görs om efter 1 min, 5 min, 30 min, 2 h, 6 h, 12 h och 24 h. Efter 7 misslyckanden i rad markeras webhooken som felande, och efter 3 dygn stängs den av. Testa med POST /webhooks/{id}/test.

curl -X POST "https://bolagsinsikt.se/api/public/v1/webhooks/wh_12ab/test" \
  -H "Authorization: Bearer bi_test_DIN_NYCKEL"

Var sidan till hjälp?

Senast uppdaterad 29 september 2026