Koppla ett CRM
Flödet
- Skapa en nyckel med
companies:read(ochfinancials:readom antal anställda ur årsredovisningen ska med) på Konto → Nycklar. Lägg den som hemlighet i CRM:ets server, t.ex.SWEREG_API_KEY. - Berika: skicka CRM:ets företagsposter till
POST /crm/enrich, högst 25 per anrop. Sparacrm.swereg_idpå posten. - Bevaka: anropa
POST /changes/queryregelbundet med de sparade id:na och sparanext_cursormellan körningarna. Berika om de företag som har ändrats.
Bara från servern
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).
| status | Betydelse | Gör så här |
|---|---|---|
matched | Sä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. |
ambiguous | Flera 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_found | Inget 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" } ] }'{
"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ält | Innehåll |
|---|---|
name | Registrerat namn. |
org_number | Org.nr med bindestreck (556012-5790); null för enskilda firmor. |
orgnr_norm | Org.nr som 10 siffror. |
address | Besöksadress (annars postadress) som en rad. |
website | Hemsidans adress. |
phone | Telefon som företaget själv angett. |
industry | Swereg-bransch (annars SNI-beskrivning). |
employees | Medelantal anställda ur senaste årsredovisningen (kräver financials:read), annars null. |
annual_revenue | Senaste nettoomsättning i kronor. |
latitude, longitude | Position. |
logo_url | Logotyp om företaget laddat upp en. |
legal_form, status, municipality, county, sni_codes, employees_class | Registeruppgifter. |
latest_fiscal_year_end, latest_profit, latest_equity_ratio | Senaste bokslut. |
swereg_id, profile_url, data_updated_at | Spara 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 }'{
"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