sweregAPI

Koppla ett CRM

Två anrop räcker: POST /crm/enrich matchar dina företagsposter mot registret och ger fält som kan skrivas rakt in i CRM:et, och POST /changes/query ger det som har ändrats sedan sist. Fältnamnen följer Walldy CRM men passar alla system.

Flödet

  1. Skapa en nyckel med companies:read (och financials:read om antal anställda ur årsredovisningen ska med) på Konto → Nycklar. Lägg den som hemlighet i CRM:ets server, t.ex. SWEREG_API_KEY.
  2. Berika: skicka CRM:ets företagsposter till POST /crm/enrich, högst 25 per anrop. Spara crm.swereg_id på posten.
  3. Bevaka: anropa POST /changes/query regelbundet med de sparade id:na och spara next_cursor mellan körningarna. Berika om de företag som har ändrats.

Bara från servern

Anropa API:et från CRM:ets server (serverfunktion eller jobb), aldrig från webbläsaren: nyckeln ger tillgång till kontots kvot, och API:t tar inte emot anrop med Origin från andra sajter.

Matcha och berika

Varje post har ett eget ref (t.ex. CRM:ets id) och minst org_nr eller name. Ort, postnummer och hemsida gör matchningen säkrare. Organisationsnummer får ha bindestreck, sekelsiffror eller vara ett momsnummer (SE…01).

statusBetydelseGör så här
matchedSäker träff: org.nr, eller namn med minst 0,85 i säkerhet och tydlig ledning.Skriv crm till posten och spara swereg_id.
ambiguousFlera möjliga företag. Upp till fem i candidates med säkerhet och matchade fält.Låt användaren välja, eller skicka posten igen med ort eller postnummer.
not_foundInget företag med tillräcklig likhet. Enskilda firmor kan bara hittas på namn (deras org.nr är personnummer).Lämna posten orörd.
curl -X POST "https://swereg.com/api/v1/crm/enrich" \
  -H "Authorization: Bearer bi_test_DIN_NYCKEL" \
  -H "Content-Type: application/json" \
  -d '{ "records": [ { "ref": "crm-123", "org_nr": "556012-5790" }, { "ref": "crm-124", "name": "Norrlands Bygg AB", "city": "Sundsvall", "website": "norrlandsbygg.se" } ] }'
Svar 200
{
  "data": [
    {
      "ref": "crm-123",
      "status": "matched",
      "confidence": 1,
      "matched_on": [
        "org_nr"
      ],
      "company": {
        "id": "co_8f3k2m",
        "name": "Aktiebolaget Volvo"
      },
      "crm": {
        "name": "Aktiebolaget Volvo",
        "org_number": "556012-5790",
        "orgnr_norm": "5560125790",
        "swereg_id": "co_8f3k2m"
      }
    },
    {
      "ref": "crm-124",
      "status": "ambiguous",
      "confidence": 0.73,
      "candidates": [
        {
          "id": "co_1a2b3c",
          "name": "Norrlands Bygg & Fastighet AB",
          "confidence": 0.73,
          "matched_on": [
            "name_partial",
            "city"
          ]
        }
      ]
    }
  ],
  "summary": {
    "matched": 1,
    "ambiguous": 1,
    "not_found": 0
  },
  "meta": {
    "request_id": "req_01J9Z6X4N0ABCDEFGHJKMNPQRS"
  }
}

Fält till CRM:et

Objektet crm har samma namn som kolumnerna i Walldy CRM:s företagstabell. Saknas en uppgift i registret är fältet null – skriv då inte över det som redan finns i CRM:et.

FältInnehåll
nameRegistrerat namn.
org_numberOrg.nr med bindestreck (556012-5790); null för enskilda firmor.
orgnr_normOrg.nr som 10 siffror.
addressBesöksadress (annars postadress) som en rad.
websiteHemsidans adress.
phoneTelefon som företaget själv angett.
industrySwereg-bransch (annars SNI-beskrivning).
employeesMedelantal anställda ur senaste årsredovisningen (kräver financials:read), annars null.
annual_revenueSenaste nettoomsättning i kronor.
latitude, longitudePosition.
logo_urlLogotyp om företaget laddat upp en.
legal_form, status, municipality, county, sni_codes, employees_classRegisteruppgifter.
latest_fiscal_year_end, latest_profit, latest_equity_ratioSenaste bokslut.
swereg_id, profile_url, data_updated_atSpara swereg_id för synk; länka profile_url.

Synka ändringar

Skicka upp till 1 000 företag per anrop (swereg_id eller org.nr). Svaret har händelser i ordning, not_found för okända identifierare och next_cursor. Skicka samma lista och since/types med cursorn tills has_more är false. Webhooks fungerar också, men filtrerar på län, kommun och bransch, inte enskilda företag.

curl -X POST "https://swereg.com/api/v1/changes/query" \
  -H "Authorization: Bearer bi_test_DIN_NYCKEL" \
  -H "Content-Type: application/json" \
  -d '{ "companies": [ "co_8f3k2m", "556012-5790" ], "since": "2026-10-01T00:00:00Z", "limit": 100 }'
Svar 200
{
  "data": [
    {
      "id": "evt_1042",
      "type": "company.updated",
      "company_id": "co_8f3k2m",
      "changed_fields": [
        "website"
      ],
      "previous": {
        "website": null
      },
      "occurred_at": "2026-10-10T06:12:44Z"
    }
  ],
  "not_found": [],
  "pagination": {
    "limit": 100,
    "has_more": false,
    "next_cursor": "eyJhZnRlciI6MTA0Mn0.x9"
  },
  "meta": {
    "request_id": "req_01J9Z6X4N0ABCDEFGHJKMNPQRS"
  }
}

Exempel i TypeScript

En serverfunktion som berikar CRM-poster i grupper om 25 och bara skriver fält som har ett värde. Kör den från ett jobb eller när en användare lägger till ett företag.

const SWEREG = "https://swereg.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.SWEREG_API_KEY}`, "Content-Type": "application/json" };

export async function enrichCompanies(rows: { id: string; name: string; org_number: string | null; website: string | null }[]) {
  for (let i = 0; i < rows.length; i += 25) {
    const records = rows.slice(i, i + 25).map((r) => ({ ref: r.id, name: r.name, org_nr: r.org_number ?? undefined, website: r.website ?? undefined }));
    const res = await fetch(`${SWEREG}/crm/enrich`, { method: "POST", headers, body: JSON.stringify({ records }) });
    if (res.status === 429) { await new Promise((r) => setTimeout(r, Number(res.headers.get("Retry-After") ?? 5) * 1000)); i -= 25; continue; }
    if (!res.ok) throw new Error((await res.json()).detail);
    for (const hit of (await res.json()).data) {
      if (hit.status !== "matched") continue;
      // Bara fält med värde, så att CRM:ets egna uppgifter inte skrivs över med null.
      const patch = Object.fromEntries(Object.entries(hit.crm).filter(([, v]) => v !== null));
      await db.update(companies).set(patch).where(eq(companies.id, hit.ref));
    }
  }
}

Var sidan till hjälp?

Senast uppdaterad 11 oktober 2026