For utviklere

API-dokumentasjon

Koble Webspesialisten CRM til nettsiden, nettbutikken, regnskapet eller egne systemer. Et enkelt REST API med JSON, forutsigbare feilmeldinger på norsk og signerte webhooks.

Grunn-URL
https://crm.webspesialisten.no/api/v1
Format
JSON, UTF-8
Autentisering
Bearer-nøkkel
Grense
600 kall / 10 min

Introduksjon

API-et gir tilgang til de samme dataene som dere ser i CRM-et: bedrifter, kontakter, salgsmuligheter, aktiviteter, produkter, saker og tilbud. Alt som gjøres via API-et går gjennom de samme reglene som i appen – validering, tilgangskontroll, revisjonslogg og webhooks – og vises med en gang for kollegaene deres.

  • Alle forespørsler og svar er JSON. Send Content-Type: application/json på POST og PATCH.
  • ID-er er UUID. Tidspunkter er ISO 8601 i UTC (2026-09-26T10:15:00.000Z), datoer er YYYY-MM-DD.
  • Beløp er tall i NOK eks. mva. Vi godtar også norske tall som tekst, f.eks. "12 500,50".
  • Svar er pakket i { "data": … }. Lister har i tillegg next_cursor og has_more.
  • API-et krever planen Pro eller Bedrift (alt er åpent i prøveperioden).

Autentisering

Lag en API-nøkkel under Innstillinger → API og webhooks (krever administrator). Nøkkelen vises bare én gang – lagre den trygt, f.eks. som miljøvariabel. Send den i hver forespørsel:

Header
Authorization: Bearer wcrm_…

Nøkkelen opptrer som brukeren som lagde den (eller kontoeieren om brukeren er slettet), så «Opprettet av» og revisjonsloggen viser hvem som står bak integrasjonen. Velg minst mulig tilgang:

Tilgang (scope)Kan brukes til
read LesetilgangKun GET-forespørsler.
write Lese- og skrivetilgangKan opprette, endre og slette data.
leads Kun skjema (leads)Kan bare sende inn henvendelser til POST /api/v1/leads. Trygg å bruke i et nettskjema.
Hold nøkler hemmelige. Lese- og skrivenøkler skal aldri ligge i nettleserkode eller i git. Bare «leads»-nøkler er laget for å kunne ligge i et offentlig nettskjema. Tilbakekall en nøkkel med ett klikk hvis den kommer på avveie.

Hurtigstart

Sett nøkkelen i en miljøvariabel (export CRM_TOKEN=wcrm_…) og prøv:

# Test at nøkkelen virker
curl https://crm.webspesialisten.no/api/v1/me \
  -H "Authorization: Bearer $CRM_TOKEN"

# Opprett en kontakt
curl -X POST https://crm.webspesialisten.no/api/v1/contacts \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"Kari","last_name":"Nordmann","email":"kari@firma.no","tags":["nettside"]}'

Svaret er hele kontakten, inkludert id og url til kontakten i CRM-et:

Svar 201
{
  "data": {
    "id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "first_name": "Kari",
    "last_name": "Nordmann",
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "company_name": "Fjordkraft Konsult AS",
    "email": "kari@fjordkraftkonsult.no",
    "phone": null,
    "mobile": "912 34 567",
    "title": "Daglig leder",
    "department": null,
    "address": null,
    "postal_code": null,
    "city": "Bergen",
    "birthday": null,
    "linkedin": null,
    "category": "kunde",
    "status": "active",
    "source": "Nettside",
    "notes": null,
    "consent_marketing": true,
    "consent_source": "Nyhetsbrev-skjema",
    "consent_at": "2026-09-20T08:15:00.000Z",
    "last_contacted_at": "2026-09-24T10:00:00.000Z",
    "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "tags": [
      "nyhetsbrev"
    ],
    "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_at": "2026-09-20T08:15:00.000Z",
    "updated_at": "2026-09-24T10:00:00.000Z",
    "url": "https://crm.webspesialisten.no/app/kontakter/0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10"
  }
}

Paginering og filtre

Alle lister er sidevis med cursor. Standard er 50 per side, maks 200. Når has_more er true, sender du next_cursor tilbake som cursor for å få neste side. Cursoren er stabil selv om det kommer nye rader underveis.

ParameterTypeBeskrivelse
qtekstFritekstsøk (delstreng, uavhengig av store/små bokstaver).
limitheltallAntall per side, 1–200. Standard 50.
cursortekstHent neste side: send verdien fra «next_cursor» i forrige svar.
ordertekstSortering på opprettet-tidspunkt. Standard «desc» (nyeste først).
descasc
updated_sincetidspunktBare oppføringer endret etter dette tidspunktet (ISO 8601). Nyttig for synkronisering.

I tillegg har hver ressurs egne filtre (f.eks. company_id, status, tag) – se referansen under. Filtre kombineres med OG.

// Hent alle kontakter endret siden forrige synk
async function* allContacts(since) {
  let cursor = null;
  do {
    const qs = new URLSearchParams({ limit: "200", updated_since: since });
    if (cursor) qs.set("cursor", cursor);
    const res = await fetch(`https://crm.webspesialisten.no/api/v1/contacts?${qs}`, { headers });
    const page = await res.json();
    yield* page.data;
    cursor = page.next_cursor;
  } while (cursor);
}

for await (const c of allContacts("2026-09-01T00:00:00Z")) console.log(c.email);

Feilhåndtering

Vi bruker vanlige HTTP-statuskoder. Feil har alltid samme form, med en maskinlesbar code og en norsk message som kan vises direkte til brukeren. Ved valideringsfeil sier fields hvilke felt som er feil.

Svar 400
{
  "error": {
    "code": "validation_error",
    "message": "Ugyldig e-postadresse.",
    "fields": {
      "email": "Ugyldig e-post"
    }
  }
}
StatusKodeBetydning
400validation_errorUgyldig eller manglende felt. «fields» sier hvilke.
400invalid_jsonBody er ikke gyldig JSON-objekt.
400invalid_cursorCursor er ugyldig eller utløpt.
401unauthorizedMangler, ugyldig eller tilbakekalt API-nøkkel.
402plan_limitPlanens grense er nådd (f.eks. antall kontakter).
403insufficient_scopeNøkkelen har ikke tilgang (lesenøkkel mot skriveendepunkt, eller leads-nøkkel).
403plan_upgrade_requiredAPI er ikke inkludert i planen.
403forbiddenBrukeren bak nøkkelen har ikke tilgang.
403account_suspendedKontoen er suspendert eller avsluttet.
404not_foundFinnes ikke (eller tilhører en annen konto).
405method_not_allowedOperasjonen støttes ikke for ressursen.
409conflictKonflikt, f.eks. oppføringen er i bruk.
413payload_too_largeBody over 1 MB.
429rate_limitedFor mange forespørsler. Vent til «Retry-After» sekunder.
500internal_errorFeil hos oss. Prøv igjen senere.

Rategrenser

Hver nøkkel kan gjøre 600 forespørsler per 10 minutter. Alle svar har headerne under. Går du over grensen får du 429 med Retry-After (sekunder). Trenger dere mer til en stor import? Ta kontakt, eller bruk importen i CRM-et.

X-RateLimit-LimitMaks antall forespørsler i vinduet (600).
X-RateLimit-RemainingHvor mange du har igjen.
X-RateLimit-ResetNår vinduet nullstilles (Unix-tid, sekunder).
Retry-AfterBare ved 429: sekunder til du kan prøve igjen.

CORS er åpent for alle domener (Access-Control-Allow-Origin: *). API-et bruker ikke informasjonskapsler.

Referanse

Endepunkter

Generert fra samme kilde som openapi.json, så dokumentasjonen alltid er i takt med API-et.

Konto

GET /api/v1/mescope: leads / write

Hvem er jeg?

Kontoen, planen og nøkkelen som brukes. Fungerer med alle nøkkeltyper – fin for å teste at nøkkelen virker.

Svar

200 Konto og nøkkel. Mulige feil: 401403429

FeltTypeBeskrivelse
orgobjektKontoen: id, name, org_number, status, trial_ends_at.
planobjektPlanen: id, name, modules (moduler som er låst opp).
tokenobjektNøkkelen: id, name, prefix, scope.
userobjektBrukeren nøkkelen opptrer som: id, email, first_name, last_name, role.
rate_limitobjektlimit og window_seconds.
Eksempel
curl "https://crm.webspesialisten.no/api/v1/me" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "org": {
      "id": "a0a55924-1633-4c46-8f54-33daa984e898",
      "name": "Utvikling AS",
      "org_number": null,
      "status": "active",
      "trial_ends_at": null
    },
    "plan": {
      "id": "pro",
      "name": "Pro",
      "modules": [
        "quotes",
        "api",
        "webhooks"
      ]
    },
    "token": {
      "id": "…",
      "name": "Nettside",
      "prefix": "wcrm_Ab12Cd",
      "scope": "write"
    },
    "user": {
      "id": "…",
      "email": "ola@firma.no",
      "first_name": "Ola",
      "last_name": "Nordmann",
      "role": "owner"
    },
    "rate_limit": {
      "limit": 600,
      "window_seconds": 600
    }
  }
}

Leads

POST /api/v1/leadsscope: leads / write

Send inn henvendelse fra nettskjema

Ett kall fra kontaktskjemaet på nettsiden: finner eller oppretter bedrift (org.nr./navn) og kontakt (e-post), oppretter eventuelt en salgsmulighet og lagrer meldingen som notat. Kan brukes med en «leads»-nøkkel, som ikke har tilgang til noe annet.

Body (JSON)
FeltTypeBeskrivelse
nametekstFullt navn (deles i fornavn/etternavn). Alternativ til first_name/last_name.
first_nametekstFornavn.
last_nametekstEtternavn.
emaile-postE-post. Brukes til å finne eksisterende kontakt. E-post eller telefon er påkrevd.
phonetekstTelefon.
mobiletekstMobil.
titletekstStilling.
company_nametekstFirmanavn. Eksisterende bedrift matches på org.nr., deretter navn.
org_numbertekstOrg.nr. (9 siffer, valideres).
websiteURLFirmaets nettside (ved ny bedrift).
messagetekstMeldingen fra skjemaet. Lagres som notat på tidslinjen.
subjecttekstTittel på notatet. Standard «Henvendelse via nettskjema».
sourcetekstKilde. Standard «Nettskjema».
deal_titletekstOpprett en salgsmulighet med denne tittelen.
deal_valuetallVerdi på salgsmuligheten (NOK eks. mva). Oppretter salgsmulighet selv uten tittel.
consent_marketingtrue/falseSamtykke til markedsføring (avkrysset i skjemaet).
consent_sourcetekstHvor samtykket ble gitt. Standard = source.
tagsliste med tekstTagger på ny kontakt/bedrift.
Svar

201 IDer til det som ble funnet/opprettet. Mulige feil: 400401402403429

FeltTypeBeskrivelse
company_idUUID · kan være nullBedriften (ny eller eksisterende).
contact_idUUIDKontakten (ny eller eksisterende).
deal_idUUID · kan være nullNy salgsmulighet.
activity_idUUID · kan være nullNotatet med meldingen.
createdobjektHva som ble opprettet: { company, contact, deal } (boolean).
Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/leads" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Kari Nordmann","email":"kari@firma.no","phone":"912 34 567","company_name":"Firma AS","message":"Vi ønsker tilbud på nytt nettsted.","deal_value":50000,"consent_marketing":true}'
Svar 201
{
  "data": {
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "deal_id": "b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d",
    "activity_id": "c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4",
    "created": {
      "company": true,
      "contact": true,
      "deal": true
    }
  }
}

Oppslag

GET /api/v1/pipeline-stagesscope: read / write

Faser i salgspipelinen

Alle faser i rekkefølge. Bruk «id» som «stage_id» på salgsmuligheter.

Svar

200 Faser. Mulige feil: 401403429

FeltTypeBeskrivelse
idUUIDFase-ID (brukes som «stage_id» på salgsmuligheter).
nametekstNavn.
probabilityheltallStandard sannsynlighet 0–100 %.
sortheltallRekkefølge i tavlen.
kindtekstType fase.
openwonlost
colortekst · kan være nullFarge (hex).
Eksempel
curl "https://crm.webspesialisten.no/api/v1/pipeline-stages" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "5d6e7f80-1111-4c2d-8e3f-4a5b6c7d8e9f",
      "name": "Tilbud sendt",
      "probability": 50,
      "sort": 3,
      "kind": "open",
      "color": "#1173d4"
    }
  ]
}
GET /api/v1/tagsscope: read / write

Tagger

Alle tagger i kontoen med antall bruk.

Svar

200 Tagger. Mulige feil: 401403429

FeltTypeBeskrivelse
idUUIDTagg-ID.
nametekstNavn.
colortekstFarge (hex).
usageheltallAntall oppføringer med taggen.
Eksempel
curl "https://crm.webspesialisten.no/api/v1/tags" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "8a9b0c1d-7777-4a2b-8c3d-4e5f6a7b8c9d",
      "name": "vip",
      "color": "#1173d4",
      "usage": 12
    }
  ]
}

Bedrifter

Firmaregisteret: kunder, leads, leverandører og partnere. Org.nr. valideres (MOD11) og må være unikt i kontoen.

Objektet Company – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for bedriften.
nametekstFirmanavn.
org_numbertekst · kan være nullOrganisasjonsnummer, 9 siffer (mellomrom fjernes).
industrytekst · kan være nullBransje.
nace_codetekst · kan være nullNACE-kode fra Brønnøysund.
employeesheltall · kan være nullAntall ansatte.
websiteURL · kan være nullNettside. «https://» legges til om det mangler.
emaile-post · kan være nullFirmaets e-post.
phonetekst · kan være nullTelefon.
addresstekst · kan være nullGateadresse.
postal_codetekst · kan være nullPostnummer.
citytekst · kan være nullPoststed.
municipalitytekst · kan være nullKommune.
countrytekstLand. Standard «Norge».
categorytekstKategori. Standard «lead».
kundeleadprospektleverandorpartnertidligere
statustekstStandard «active».
activeinactive
descriptiontekst · kan være nullFritekst om firmaet.
owner_idUUID · kan være nullAnsvarlig bruker (se GET /users). Standard: eieren av API-nøkkelen.
tagsliste med tekstTagger (navn). Ved PATCH erstattes hele listen. Nye tagger opprettes automatisk.
created_bykun lesUUID · kan være nullBrukeren som opprettet oppføringen (for API-kall: eieren av nøkkelen).
created_atkun lestidspunktOpprettet (ISO 8601, UTC).
updated_atkun lestidspunktSist endret (ISO 8601, UTC).
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/companiesscope: read / write

List bedrifter

Firmaregisteret: kunder, leads, leverandører og partnere. Org.nr. valideres (MOD11) og må være unikt i kontoen. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
org_numbertekstEksakt org.nr.
categorytekstKategori.
kundeleadprospektleverandorpartnertidligere
statustekstStatus.
activeinactive
owner_idUUIDBare oppføringer med denne ansvarlige.
tagtekstBare oppføringer med denne taggen (navn, uavhengig av store/små bokstaver).

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/companies?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
      "name": "Fjordkraft Konsult AS",
      "org_number": "923456783",
      "industry": "Rådgivning",
      "nace_code": "70.220",
      "employees": 12,
      "website": "https://fjordkraftkonsult.no",
      "email": "post@fjordkraftkonsult.no",
      "phone": "55 12 34 56",
      "address": "Strandkaien 2",
      "postal_code": "5013",
      "city": "Bergen",
      "municipality": "Bergen",
      "country": "Norge",
      "category": "kunde",
      "status": "active",
      "description": null,
      "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "tags": [
        "vip"
      ],
      "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "created_at": "2026-09-20T08:15:00.000Z",
      "updated_at": "2026-09-24T13:02:11.000Z",
      "url": "https://crm.webspesialisten.no/app/bedrifter/7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/companiesscope: write

Opprett bedrift

Oppretter bedrift. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Company. Skrivbare felt: name, org_number, industry, nace_code, employees, website, email, phone, address, postal_code, city, municipality, country, category, status, description, owner_id, tags.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/companies" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Fjordkraft Konsult AS","org_number":"923456783","city":"Bergen","category":"lead","tags":["nettside"]}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/companies/{id}scope: read / write

Hent bedrift

Én bedrift med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til bedrift.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/companies/7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "name": "Fjordkraft Konsult AS",
    "org_number": "923456783",
    "industry": "Rådgivning",
    "nace_code": "70.220",
    "employees": 12,
    "website": "https://fjordkraftkonsult.no",
    "email": "post@fjordkraftkonsult.no",
    "phone": "55 12 34 56",
    "address": "Strandkaien 2",
    "postal_code": "5013",
    "city": "Bergen",
    "municipality": "Bergen",
    "country": "Norge",
    "category": "kunde",
    "status": "active",
    "description": null,
    "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "tags": [
      "vip"
    ],
    "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_at": "2026-09-20T08:15:00.000Z",
    "updated_at": "2026-09-24T13:02:11.000Z",
    "url": "https://crm.webspesialisten.no/app/bedrifter/7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c"
  }
}
PATCH /api/v1/companies/{id}scope: write

Endre bedrift

Delvis oppdatering: bare feltene du sender, endres. Send null for å tømme et felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til bedrift.
Body (JSON) – bare feltene du vil endre

Se feltene under Company. Skrivbare felt: name, org_number, industry, nace_code, employees, website, email, phone, address, postal_code, city, municipality, country, category, status, description, owner_id, tags.

Svar

200 Oppdatert. Mulige feil: 400401403404429409

Eksempel
curl -X PATCH "https://crm.webspesialisten.no/api/v1/companies/7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"category":"kunde","employees":14}'

Svaret er hele objektet i data, som ved GET.

DELETE /api/v1/companies/{id}scope: write

Slett bedrift

Sletter permanent. Svarer 204 uten innhold.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til bedrift.
Svar

204 Slettet. Mulige feil: 401403404409429

Eksempel
curl -X DELETE "https://crm.webspesialisten.no/api/v1/companies/7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c" \
  -H "Authorization: Bearer $CRM_TOKEN"

Kontakter

Personregisteret. En kontakt kan være knyttet til en bedrift. Minst ett av fornavn, etternavn eller e-post må fylles ut.

Objektet Contact – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for kontakten.
first_nametekstFornavn.
last_nametekstEtternavn.
company_idUUID · kan være nullID til bedriften kontakten jobber i.
company_namekun lestekst · kan være nullNavnet på bedriften.
emaile-post · kan være nullE-post (lagres med små bokstaver).
phonetekst · kan være nullFasttelefon.
mobiletekst · kan være nullMobil.
titletekst · kan være nullStilling.
departmenttekst · kan være nullAvdeling.
addresstekst · kan være nullAdresse.
postal_codetekst · kan være nullPostnummer.
citytekst · kan være nullPoststed.
birthdaydato · kan være nullFødselsdato (YYYY-MM-DD).
linkedinURL · kan være nullLinkedIn-profil.
categorytekstKategori. Standard «lead».
kundeleadprospektleverandorpartnertidligere
statustekstStandard «active».
activeinactive
sourcetekst · kan være nullKilde, f.eks. «Nettside», «Messe».
notestekst · kan være nullNotater.
consent_marketingtrue/falseSamtykke til markedsføring (GDPR). Tidspunktet lagres i «consent_at».
consent_sourcetekst · kan være nullHvor samtykket ble gitt.
consent_atkun lestidspunkt · kan være nullNår samtykke ble gitt.
last_contacted_atkun lestidspunkt · kan være nullSiste samtale/møte/e-post logget.
owner_idUUID · kan være nullAnsvarlig bruker (se GET /users). Standard: eieren av API-nøkkelen.
tagsliste med tekstTagger (navn). Ved PATCH erstattes hele listen. Nye tagger opprettes automatisk.
created_bykun lesUUID · kan være nullBrukeren som opprettet oppføringen (for API-kall: eieren av nøkkelen).
created_atkun lestidspunktOpprettet (ISO 8601, UTC).
updated_atkun lestidspunktSist endret (ISO 8601, UTC).
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/contactsscope: read / write

List kontakter

Personregisteret. En kontakt kan være knyttet til en bedrift. Minst ett av fornavn, etternavn eller e-post må fylles ut. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
company_idUUIDKontakter i denne bedriften.
emaile-postEksakt e-post (uavhengig av store/små bokstaver).
categorytekstKategori.
kundeleadprospektleverandorpartnertidligere
statustekstStatus.
activeinactive
consent_marketingtrue/falsetrue = bare kontakter med markedsføringssamtykke.
owner_idUUIDBare oppføringer med denne ansvarlige.
tagtekstBare oppføringer med denne taggen (navn, uavhengig av store/små bokstaver).

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/contacts?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
      "first_name": "Kari",
      "last_name": "Nordmann",
      "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
      "company_name": "Fjordkraft Konsult AS",
      "email": "kari@fjordkraftkonsult.no",
      "phone": null,
      "mobile": "912 34 567",
      "title": "Daglig leder",
      "department": null,
      "address": null,
      "postal_code": null,
      "city": "Bergen",
      "birthday": null,
      "linkedin": null,
      "category": "kunde",
      "status": "active",
      "source": "Nettside",
      "notes": null,
      "consent_marketing": true,
      "consent_source": "Nyhetsbrev-skjema",
      "consent_at": "2026-09-20T08:15:00.000Z",
      "last_contacted_at": "2026-09-24T10:00:00.000Z",
      "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "tags": [
        "nyhetsbrev"
      ],
      "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "created_at": "2026-09-20T08:15:00.000Z",
      "updated_at": "2026-09-24T10:00:00.000Z",
      "url": "https://crm.webspesialisten.no/app/kontakter/0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/contactsscope: write

Opprett kontakt

Oppretter kontakt. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Contact. Skrivbare felt: first_name, last_name, company_id, email, phone, mobile, title, department, address, postal_code, city, birthday, linkedin, category, status, source, notes, consent_marketing, consent_source, owner_id, tags.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/contacts" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"Kari","last_name":"Nordmann","email":"kari@fjordkraftkonsult.no","mobile":"912 34 567","company_id":"7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c","tags":["nettside"]}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/contacts/{id}scope: read / write

Hent kontakt

Én kontakt med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til kontakt.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/contacts/0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "first_name": "Kari",
    "last_name": "Nordmann",
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "company_name": "Fjordkraft Konsult AS",
    "email": "kari@fjordkraftkonsult.no",
    "phone": null,
    "mobile": "912 34 567",
    "title": "Daglig leder",
    "department": null,
    "address": null,
    "postal_code": null,
    "city": "Bergen",
    "birthday": null,
    "linkedin": null,
    "category": "kunde",
    "status": "active",
    "source": "Nettside",
    "notes": null,
    "consent_marketing": true,
    "consent_source": "Nyhetsbrev-skjema",
    "consent_at": "2026-09-20T08:15:00.000Z",
    "last_contacted_at": "2026-09-24T10:00:00.000Z",
    "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "tags": [
      "nyhetsbrev"
    ],
    "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_at": "2026-09-20T08:15:00.000Z",
    "updated_at": "2026-09-24T10:00:00.000Z",
    "url": "https://crm.webspesialisten.no/app/kontakter/0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10"
  }
}
PATCH /api/v1/contacts/{id}scope: write

Endre kontakt

Delvis oppdatering: bare feltene du sender, endres. Send null for å tømme et felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til kontakt.
Body (JSON) – bare feltene du vil endre

Se feltene under Contact. Skrivbare felt: first_name, last_name, company_id, email, phone, mobile, title, department, address, postal_code, city, birthday, linkedin, category, status, source, notes, consent_marketing, consent_source, owner_id, tags.

Svar

200 Oppdatert. Mulige feil: 400401403404429409

Eksempel
curl -X PATCH "https://crm.webspesialisten.no/api/v1/contacts/0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Daglig leder","category":"kunde"}'

Svaret er hele objektet i data, som ved GET.

DELETE /api/v1/contacts/{id}scope: write

Slett kontakt

Sletter permanent. Svarer 204 uten innhold.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til kontakt.
Svar

204 Slettet. Mulige feil: 401403404409429

Eksempel
curl -X DELETE "https://crm.webspesialisten.no/api/v1/contacts/0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10" \
  -H "Authorization: Bearer $CRM_TOKEN"

Salgsmuligheter

Salgsmuligheter i pipelinen. Flytt en mulighet ved å endre «stage_id»; fasens type (open/won/lost) styrer status, «closed_at» og webhookene deal.won / deal.lost.

Objektet Deal – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for salgsmuligheten.
titletekstTittel.
company_idUUID · kan være nullID til bedriften.
contact_idUUID · kan være nullID til kontaktpersonen. Bedrift fylles ut fra kontakten om den mangler.
stage_idUUIDFase i pipelinen (se GET /pipeline-stages). Standard: første åpne fase.
stage_namekun lestekstNavnet på fasen.
statuskun lestekstUtledet fra fasen.
openwonlost
valuetallVerdi i NOK eks. mva. For «recurring» er dette per måned.
recurringtrue/falseMånedlig gjentakende inntekt (MRR).
probabilityheltall · kan være nullSannsynlighet 0–100 %. null = fasens standard.
effective_probabilitykun lesheltallSannsynligheten som faktisk brukes (egen eller fasens).
expected_closedato · kan være nullForventet lukkedato (YYYY-MM-DD).
closed_atkun lestidspunkt · kan være nullNår muligheten ble vunnet/tapt.
sourcetekst · kan være nullKilde.
lost_reasontekst · kan være nullTapsårsak (for tapte muligheter).
descriptiontekst · kan være nullBeskrivelse.
owner_idUUID · kan være nullAnsvarlig bruker (se GET /users). Standard: eieren av API-nøkkelen.
tagskun lesliste med tekstTagger (navn).
created_bykun lesUUID · kan være nullBrukeren som opprettet oppføringen (for API-kall: eieren av nøkkelen).
created_atkun lestidspunktOpprettet (ISO 8601, UTC).
updated_atkun lestidspunktSist endret (ISO 8601, UTC).
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/dealsscope: read / write

List salgsmuligheter

Salgsmuligheter i pipelinen. Flytt en mulighet ved å endre «stage_id»; fasens type (open/won/lost) styrer status, «closed_at» og webhookene deal.won / deal.lost. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
company_idUUIDBedrift.
contact_idUUIDKontakt.
stage_idUUIDFase.
statustekstÅpne, vunne eller tapte.
openwonlost
owner_idUUIDBare oppføringer med denne ansvarlige.
tagtekstBare oppføringer med denne taggen (navn, uavhengig av store/små bokstaver).

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/deals?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d",
      "title": "Nytt nettsted",
      "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
      "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
      "stage_id": "5d6e7f80-1111-4c2d-8e3f-4a5b6c7d8e9f",
      "stage_name": "Tilbud sendt",
      "status": "open",
      "value": 45000,
      "recurring": false,
      "probability": null,
      "effective_probability": 50,
      "expected_close": "2026-10-15",
      "closed_at": null,
      "source": "Nettside",
      "lost_reason": null,
      "description": null,
      "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "tags": [],
      "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "created_at": "2026-09-21T09:00:00.000Z",
      "updated_at": "2026-09-23T14:30:00.000Z",
      "url": "https://crm.webspesialisten.no/app/muligheter/b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/dealsscope: write

Opprett salgsmulighet

Oppretter salgsmulighet. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Deal. Skrivbare felt: title, company_id, contact_id, stage_id, value, recurring, probability, expected_close, source, lost_reason, description, owner_id.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/deals" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Nytt nettsted","value":45000,"company_id":"7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c","expected_close":"2026-10-15"}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/deals/{id}scope: read / write

Hent salgsmulighet

Én salgsmulighet med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til salgsmulighet.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/deals/b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d",
    "title": "Nytt nettsted",
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "stage_id": "5d6e7f80-1111-4c2d-8e3f-4a5b6c7d8e9f",
    "stage_name": "Tilbud sendt",
    "status": "open",
    "value": 45000,
    "recurring": false,
    "probability": null,
    "effective_probability": 50,
    "expected_close": "2026-10-15",
    "closed_at": null,
    "source": "Nettside",
    "lost_reason": null,
    "description": null,
    "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "tags": [],
    "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_at": "2026-09-21T09:00:00.000Z",
    "updated_at": "2026-09-23T14:30:00.000Z",
    "url": "https://crm.webspesialisten.no/app/muligheter/b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d"
  }
}
PATCH /api/v1/deals/{id}scope: write

Endre salgsmulighet

Delvis oppdatering: bare feltene du sender, endres. Send null for å tømme et felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til salgsmulighet.
Body (JSON) – bare feltene du vil endre

Se feltene under Deal. Skrivbare felt: title, company_id, contact_id, stage_id, value, recurring, probability, expected_close, source, lost_reason, description, owner_id.

Svar

200 Oppdatert. Mulige feil: 400401403404429409

Eksempel
curl -X PATCH "https://crm.webspesialisten.no/api/v1/deals/b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"stage_id":"5d6e7f80-1111-4c2d-8e3f-4a5b6c7d8e9f"}'

Svaret er hele objektet i data, som ved GET.

DELETE /api/v1/deals/{id}scope: write

Slett salgsmulighet

Sletter permanent. Svarer 204 uten innhold.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til salgsmulighet.
Svar

204 Slettet. Mulige feil: 401403404409429

Eksempel
curl -X DELETE "https://crm.webspesialisten.no/api/v1/deals/b1d2c3e4-0000-4a1b-9c2d-3e4f5a6b7c8d" \
  -H "Authorization: Bearer $CRM_TOKEN"

Aktiviteter

Oppgaver, samtaler, møter og notater. Vises på tidslinjen til bedrift, kontakt og salgsmulighet. Notater og aktiviteter opprettet med «completed: true» registreres som utført.

Objektet Activity – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for aktiviteten.
typetekstType. Standard «task».
callemailmeetingtasknotefollow_uplunchdemo
titletekstTittel. Standard: typens navn (f.eks. «Telefonsamtale»).
descriptiontekst · kan være nullBeskrivelse / notat.
due_attidspunkt · kan være nullFrist eller tidspunkt. ISO 8601, eller «YYYY-MM-DDTHH:mm» tolket som norsk tid.
duration_minheltall · kan være nullVarighet i minutter.
locationtekst · kan være nullSted.
prioritytekstPrioritet. Standard «normal».
lownormalhighurgent
outcometekst · kan være nullResultat av samtalen/møtet.
completed_atkun lestidspunkt · kan være nullNår aktiviteten ble utført.
company_idUUID · kan være nullID til bedriften.
contact_idUUID · kan være nullID til kontakten.
deal_idUUID · kan være nullID til salgsmuligheten.
ticket_idUUID · kan være nullID til saken.
owner_idUUID · kan være nullAnsvarlig bruker (se GET /users). Standard: eieren av API-nøkkelen.
created_bykun lesUUID · kan være nullBrukeren som opprettet oppføringen (for API-kall: eieren av nøkkelen).
created_atkun lestidspunktOpprettet (ISO 8601, UTC).
updated_atkun lestidspunktSist endret (ISO 8601, UTC).
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/activitiesscope: read / write

List aktiviteter

Oppgaver, samtaler, møter og notater. Vises på tidslinjen til bedrift, kontakt og salgsmulighet. Notater og aktiviteter opprettet med «completed: true» registreres som utført. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
company_idUUIDBedrift.
contact_idUUIDKontakt.
deal_idUUIDSalgsmulighet.
ticket_idUUIDSak.
owner_idUUIDBare oppføringer med denne ansvarlige.
typetekstType.
callemailmeetingtasknotefollow_uplunchdemo
completedtrue/falsetrue = utførte, false = åpne.
due_fromtidspunktFrist fra og med.
due_totidspunktFrist før.

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/activities?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4",
      "type": "call",
      "title": "Ring om tilbudet",
      "description": null,
      "due_at": "2026-09-29T08:00:00.000Z",
      "duration_min": 15,
      "location": null,
      "priority": "normal",
      "outcome": null,
      "completed_at": null,
      "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
      "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
      "deal_id": null,
      "ticket_id": null,
      "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "created_at": "2026-09-26T10:00:00.000Z",
      "updated_at": "2026-09-26T10:00:00.000Z",
      "url": "https://crm.webspesialisten.no/app/aktiviteter/c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/activitiesscope: write

Opprett aktivitet

Oppretter aktivitet. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Activity. Skrivbare felt: type, title, description, due_at, duration_min, location, priority, outcome, completed, company_id, contact_id, deal_id, ticket_id, participants, owner_id.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/activities" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"call","title":"Ring om tilbudet","due_at":"2026-09-29T10:00:00+02:00","contact_id":"0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10"}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/activities/{id}scope: read / write

Hent aktivitet

Én aktivitet med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til aktivitet.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/activities/c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4",
    "type": "call",
    "title": "Ring om tilbudet",
    "description": null,
    "due_at": "2026-09-29T08:00:00.000Z",
    "duration_min": 15,
    "location": null,
    "priority": "normal",
    "outcome": null,
    "completed_at": null,
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "deal_id": null,
    "ticket_id": null,
    "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_at": "2026-09-26T10:00:00.000Z",
    "updated_at": "2026-09-26T10:00:00.000Z",
    "url": "https://crm.webspesialisten.no/app/aktiviteter/c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4"
  }
}
PATCH /api/v1/activities/{id}scope: write

Endre aktivitet

Delvis oppdatering: bare feltene du sender, endres. Send null for å tømme et felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til aktivitet.
Body (JSON) – bare feltene du vil endre

Se feltene under Activity. Skrivbare felt: type, title, description, due_at, duration_min, location, priority, outcome, completed, company_id, contact_id, deal_id, ticket_id, participants, owner_id.

Svar

200 Oppdatert. Mulige feil: 400401403404429409

Eksempel
curl -X PATCH "https://crm.webspesialisten.no/api/v1/activities/c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"completed":true,"outcome":"Kunden ønsker oppstart i november."}'

Svaret er hele objektet i data, som ved GET.

DELETE /api/v1/activities/{id}scope: write

Slett aktivitet

Sletter permanent. Svarer 204 uten innhold.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til aktivitet.
Svar

204 Slettet. Mulige feil: 401403404409429

Eksempel
curl -X DELETE "https://crm.webspesialisten.no/api/v1/activities/c4a1e2f3-2222-4b5c-9d6e-7f8091a2b3c4" \
  -H "Authorization: Bearer $CRM_TOKEN"

Produkter

Produkt- og tjenestekatalogen som brukes på tilbud og salg. Priser er i NOK eks. mva.

Objektet Product – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for produktet.
nametekstNavn.
skutekst · kan være nullVarenummer (unikt i kontoen).
descriptiontekst · kan være nullBeskrivelse (brukes som linjetekst på tilbud).
unittekstEnhet. Standard «stk».
stktimemndårlisenskmkg
pricetallPris eks. mva.
vat_ratetallMva-sats i prosent. Standard 25.
2515120
recurringtrue/falseGjentakende (abonnement).
activetrue/falseAktiv i katalogen. Standard true.
created_atkun lestidspunktOpprettet.
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/productsscope: read / write

List produkter

Produkt- og tjenestekatalogen som brukes på tilbud og salg. Priser er i NOK eks. mva. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
activetrue/falsetrue = bare aktive produkter.

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/products?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5",
      "name": "Webhotell Pro",
      "sku": "WH-PRO",
      "description": "Webhotell med daglig backup",
      "unit": "mnd",
      "price": 299,
      "vat_rate": 25,
      "recurring": true,
      "active": true,
      "created_at": "2026-09-01T12:00:00.000Z",
      "url": "https://crm.webspesialisten.no/app/produkter/d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/productsscope: write

Opprett produkt

Oppretter produkt. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Product. Skrivbare felt: name, sku, description, unit, price, vat_rate, recurring, active.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/products" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Webhotell Pro","sku":"WH-PRO","unit":"mnd","price":299,"recurring":true}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/products/{id}scope: read / write

Hent produkt

Én produkt med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til produkt.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/products/d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5",
    "name": "Webhotell Pro",
    "sku": "WH-PRO",
    "description": "Webhotell med daglig backup",
    "unit": "mnd",
    "price": 299,
    "vat_rate": 25,
    "recurring": true,
    "active": true,
    "created_at": "2026-09-01T12:00:00.000Z",
    "url": "https://crm.webspesialisten.no/app/produkter/d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5"
  }
}
PATCH /api/v1/products/{id}scope: write

Endre produkt

Delvis oppdatering: bare feltene du sender, endres. Send null for å tømme et felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til produkt.
Body (JSON) – bare feltene du vil endre

Se feltene under Product. Skrivbare felt: name, sku, description, unit, price, vat_rate, recurring, active.

Svar

200 Oppdatert. Mulige feil: 400401403404429409

Eksempel
curl -X PATCH "https://crm.webspesialisten.no/api/v1/products/d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"price":349}'

Svaret er hele objektet i data, som ved GET.

DELETE /api/v1/products/{id}scope: write

Slett produkt

Sletter permanent. Svarer 204 uten innhold.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til produkt.
Svar

204 Slettet. Mulige feil: 401403404409429

Eksempel
curl -X DELETE "https://crm.webspesialisten.no/api/v1/products/d5e6f708-3333-4c5d-8e9f-a0b1c2d3e4f5" \
  -H "Authorization: Bearer $CRM_TOKEN"

Saker

Kundeservicesaker. Hver sak får et løpenummer per konto. Enkeltoppslag inkluderer kommentarer.

Objektet Ticket – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for saken.
numberkun lesheltallSaksnummer.
titletekstTittel.
descriptiontekst · kan være nullBeskrivelse.
company_idUUID · kan være nullID til bedriften.
contact_idUUID · kan være nullID til kontakten.
prioritytekstPrioritet.
lownormalhighurgent
statustekstStatus.
openin_progresswaitingresolvedclosed
categorytekst · kan være nullKategori.
channeltekstKanal saken kom inn fra. Standard «api» ved opprettelse via API-et.
manualemailphonewebapi
due_attidspunkt · kan være nullFrist (SLA). Standard ut fra prioritet: haster 4 t, høy 24 t, normal 72 t, lav 7 dager.
resolved_atkun lestidspunkt · kan være nullNår saken ble løst.
assigned_toUUID · kan være nullSaksbehandler (bruker-ID).
tagsliste med tekstTagger (navn). Ved PATCH erstattes hele listen. Nye tagger opprettes automatisk.
commentskun lesliste med objekterKommentarer (bare i enkeltoppslag).
id UUID – ID.
user_id UUID – Forfatter.
body tekst – Tekst.
internal true/false – Intern kommentar.
created_at tidspunkt – Tidspunkt.
created_bykun lesUUID · kan være nullBrukeren som opprettet oppføringen (for API-kall: eieren av nøkkelen).
created_atkun lestidspunktOpprettet (ISO 8601, UTC).
updated_atkun lestidspunktSist endret (ISO 8601, UTC).
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/ticketsscope: read / write

List saker (kundeservice)

Kundeservicesaker. Hver sak får et løpenummer per konto. Enkeltoppslag inkluderer kommentarer. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
company_idUUIDBedrift.
contact_idUUIDKontakt.
assigned_toUUIDSaksbehandler.
statustekstStatus.
openin_progresswaitingresolvedclosed
prioritytekstPrioritet.
lownormalhighurgent
tagtekstBare oppføringer med denne taggen (navn, uavhengig av store/små bokstaver).

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/tickets?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6",
      "number": 42,
      "title": "Får ikke logget inn",
      "description": "Kunden får feilmelding ved innlogging.",
      "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
      "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
      "priority": "high",
      "status": "open",
      "category": "Innlogging",
      "channel": "api",
      "due_at": "2026-09-27T12:00:00.000Z",
      "resolved_at": null,
      "assigned_to": null,
      "tags": [],
      "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "created_at": "2026-09-26T09:12:00.000Z",
      "updated_at": "2026-09-26T09:12:00.000Z",
      "url": "https://crm.webspesialisten.no/app/saker/e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/ticketsscope: write

Opprett sak

Oppretter sak. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Ticket. Skrivbare felt: title, description, company_id, contact_id, priority, status, category, channel, due_at, assigned_to, tags.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/tickets" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Får ikke logget inn","description":"Kunden får feilmelding ved innlogging.","contact_id":"0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10","priority":"high"}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/tickets/{id}scope: read / write

Hent sak

Én sak med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til sak.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/tickets/e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6",
    "number": 42,
    "title": "Får ikke logget inn",
    "description": "Kunden får feilmelding ved innlogging.",
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "priority": "high",
    "status": "open",
    "category": "Innlogging",
    "channel": "api",
    "due_at": "2026-09-27T12:00:00.000Z",
    "resolved_at": null,
    "assigned_to": null,
    "tags": [],
    "created_by": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "created_at": "2026-09-26T09:12:00.000Z",
    "updated_at": "2026-09-26T09:12:00.000Z",
    "url": "https://crm.webspesialisten.no/app/saker/e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6"
  }
}
PATCH /api/v1/tickets/{id}scope: write

Endre sak

Delvis oppdatering: bare feltene du sender, endres. Send null for å tømme et felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til sak.
Body (JSON) – bare feltene du vil endre

Se feltene under Ticket. Skrivbare felt: title, description, company_id, contact_id, priority, status, category, channel, due_at, assigned_to, tags.

Svar

200 Oppdatert. Mulige feil: 400401403404429409

Eksempel
curl -X PATCH "https://crm.webspesialisten.no/api/v1/tickets/e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"resolved"}'

Svaret er hele objektet i data, som ved GET.

DELETE /api/v1/tickets/{id}scope: write

Slett sak

Sletter permanent. Svarer 204 uten innhold.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til sak.
Svar

204 Slettet. Mulige feil: 401403404409429

Eksempel
curl -X DELETE "https://crm.webspesialisten.no/api/v1/tickets/e6f70819-4444-4d5e-9f0a-b1c2d3e4f5a6" \
  -H "Authorization: Bearer $CRM_TOKEN"

Tilbud

Tilbud med linjer. Summene beregnes av CRM-et. Enkeltoppslag inkluderer linjene («items») og «public_url» – lenken kunden bruker for å se og akseptere tilbudet.

Tilbud kan leses og opprettes via API-et. Endring, sending på e-post og aksept gjøres i CRM-et eller av kunden via «public_url».

Objektet Quote – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for tilbudet.
numberkun lesheltallTilbudsnummer.
titletekstTittel.
company_idUUID · kan være nullID til bedriften.
contact_idUUID · kan være nullID til kontakten.
deal_idUUID · kan være nullID til salgsmuligheten.
statustekstStatus. Ved opprettelse kan du sende «draft» (standard) eller «sent». Sending på e-post gjøres i CRM-et.
draftsentviewedacceptedrejectedexpired
issue_datedatoTilbudsdato. Standard i dag.
valid_untildato · kan være nullGyldig til. Standard 30 dager etter tilbudsdato.
introtekst · kan være nullInnledning.
notestekst · kan være nullMerknader.
termstekst · kan være nullVilkår. Standard: kontoens vilkår.
subtotalkun lestallSum eks. mva før rabatt.
discount_totalkun lestallTotal rabatt.
vat_totalkun lestallMva.
totalkun lestallTotalt inkl. mva.
public_urlkun lesURL · kan være nullKundens lenke til tilbudet.
sent_atkun lestidspunkt · kan være nullSendt.
accepted_atkun lestidspunkt · kan være nullAkseptert.
itemsliste med objekterLinjer.
id UUID – Linje-ID.
product_id UUID – Produkt (valgfritt).
description tekst – Linjetekst.
quantity tall – Antall. Standard 1.
unit tekst – Enhet. Standard «stk».
unit_price tall – Enhetspris eks. mva.
discount_pct tall – Rabatt i prosent.
vat_rate tall – Mva-sats. Standard 25.
line_total tall – Linjesum eks. mva etter rabatt.
sort heltall – Rekkefølge.
owner_idUUID · kan være nullAnsvarlig bruker (se GET /users). Standard: eieren av API-nøkkelen.
created_bykun lesUUID · kan være nullBrukeren som opprettet oppføringen (for API-kall: eieren av nøkkelen).
created_atkun lestidspunktOpprettet (ISO 8601, UTC).
updated_atkun lestidspunktSist endret (ISO 8601, UTC).
urlkun lesURLLenke til oppføringen i CRM-et.
GET /api/v1/quotesscope: read / write

List tilbud

Tilbud med linjer. Summene beregnes av CRM-et. Enkeltoppslag inkluderer linjene («items») og «public_url» – lenken kunden bruker for å se og akseptere tilbudet. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
company_idUUIDBedrift.
contact_idUUIDKontakt.
deal_idUUIDSalgsmulighet.
owner_idUUIDBare oppføringer med denne ansvarlige.
statustekstStatus.
draftsentviewedacceptedrejectedexpired

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/quotes?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "f7081920-5555-4e6f-8a0b-c2d3e4f5a6b7",
      "number": 1001,
      "title": "Nytt nettsted",
      "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
      "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
      "deal_id": null,
      "status": "sent",
      "issue_date": "2026-09-26",
      "valid_until": "2026-10-26",
      "intro": null,
      "notes": null,
      "terms": null,
      "subtotal": 40000,
      "discount_total": 0,
      "vat_total": 10000,
      "total": 50000,
      "public_url": "https://crm.webspesialisten.no/tilbud/abc123",
      "sent_at": "2026-09-26T10:00:00.000Z",
      "accepted_at": null,
      "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "items": [
        {
          "id": "a1b2c3d4-6666-4f70-8b1c-d3e4f5a6b7c8",
          "product_id": null,
          "description": "Design og utvikling",
          "quantity": 40,
          "unit": "time",
          "unit_price": 1000,
          "discount_pct": 0,
          "vat_rate": 25,
          "line_total": 40000,
          "sort": 0
        }
      ],
      "created_at": "2026-09-26T09:40:00.000Z",
      "updated_at": "2026-09-26T10:00:00.000Z",
      "url": "https://crm.webspesialisten.no/app/tilbud/f7081920-5555-4e6f-8a0b-c2d3e4f5a6b7"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
POST /api/v1/quotesscope: write

Opprett tilbud

Oppretter tilbud. Ukjente felt ignoreres. Returnerer hele objektet.

Body (JSON)

Se feltene under Quote. Skrivbare felt: title, company_id, contact_id, deal_id, status, issue_date, valid_until, intro, notes, terms, items, owner_id.

Svar

201 Opprettet. Mulige feil: 400401402403409429

Eksempel
curl -X POST "https://crm.webspesialisten.no/api/v1/quotes" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Nytt nettsted","company_id":"7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c","valid_until":"2026-10-26","items":[{"description":"Design og utvikling","quantity":40,"unit":"time","unit_price":1000}]}'

Svaret er hele objektet i data, som ved GET.

GET /api/v1/quotes/{id}scope: read / write

Hent tilbud

Én tilbud med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til tilbud.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/quotes/f7081920-5555-4e6f-8a0b-c2d3e4f5a6b7" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "f7081920-5555-4e6f-8a0b-c2d3e4f5a6b7",
    "number": 1001,
    "title": "Nytt nettsted",
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "contact_id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "deal_id": null,
    "status": "sent",
    "issue_date": "2026-09-26",
    "valid_until": "2026-10-26",
    "intro": null,
    "notes": null,
    "terms": null,
    "subtotal": 40000,
    "discount_total": 0,
    "vat_total": 10000,
    "total": 50000,
    "public_url": "https://crm.webspesialisten.no/tilbud/abc123",
    "sent_at": "2026-09-26T10:00:00.000Z",
    "accepted_at": null,
    "owner_id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "items": [
      {
        "id": "a1b2c3d4-6666-4f70-8b1c-d3e4f5a6b7c8",
        "product_id": null,
        "description": "Design og utvikling",
        "quantity": 40,
        "unit": "time",
        "unit_price": 1000,
        "discount_pct": 0,
        "vat_rate": 25,
        "line_total": 40000,
        "sort": 0
      }
    ],
    "created_at": "2026-09-26T09:40:00.000Z",
    "updated_at": "2026-09-26T10:00:00.000Z",
    "url": "https://crm.webspesialisten.no/app/tilbud/f7081920-5555-4e6f-8a0b-c2d3e4f5a6b7"
  }
}

Brukere

Brukerne i kontoen (skrivebeskyttet). Brukes for å finne ID-er til «owner_id», «assigned_to» osv.

Objektet User – alle felt
FeltTypeBeskrivelse
idkun lesUUIDUnik ID for brukeren.
emailkun lese-postE-post.
first_namekun lestekstFornavn.
last_namekun lestekstEtternavn.
phonekun lestekst · kan være nullTelefon.
titlekun lestekst · kan være nullStilling.
rolekun lestekstRolle.
owneradminuserreadonly
activekun lestrue/falsefalse = deaktivert.
created_atkun lestidspunktOpprettet.
updated_atkun lestidspunktSist endret.
GET /api/v1/usersscope: read / write

List brukere

Brukerne i kontoen (skrivebeskyttet). Brukes for å finne ID-er til «owner_id», «assigned_to» osv. Sidevis med cursor, nyeste først.

Parametere
ParameterTypeBeskrivelse
roletekstRolle.
owneradminuserreadonly
activetrue/falsetrue = bare aktive brukere.

Støtter også standard listeparametere: q, limit, cursor, order, updated_since.

Svar

200 En side med resultater. Mulige feil: 400401403429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/users?limit=20" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": [
    {
      "id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
      "email": "ola@firma.no",
      "first_name": "Ola",
      "last_name": "Nordmann",
      "phone": null,
      "title": "Selger",
      "role": "user",
      "active": true,
      "created_at": "2026-09-01T08:00:00.000Z",
      "updated_at": "2026-09-01T08:00:00.000Z"
    }
  ],
  "next_cursor": "WyIyMDI2LTA5LTIwIDA4OjE1OjAwKzAwIiwiLi4uIl0",
  "has_more": true
}
GET /api/v1/users/{id}scope: read / write

Hent bruker

Én bruker med alle felt.

Parametere
ParameterTypeBeskrivelse
idi URLUUIDID til bruker.
Svar

200 Funnet. Mulige feil: 401403404429

Eksempel
curl "https://crm.webspesialisten.no/api/v1/users/33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f" \
  -H "Authorization: Bearer $CRM_TOKEN"
Svar 200
{
  "data": {
    "id": "33a10e0f-3dbf-4d63-b2e8-81a9ac8bf75f",
    "email": "ola@firma.no",
    "first_name": "Ola",
    "last_name": "Nordmann",
    "phone": null,
    "title": "Selger",
    "role": "user",
    "active": true,
    "created_at": "2026-09-01T08:00:00.000Z",
    "updated_at": "2026-09-01T08:00:00.000Z"
  }
}

Nettskjema rett inn i CRM-et

Med POST /api/v1/leads blir en henvendelse fra nettsiden til en komplett lead med ett kall:

  1. Bedriften finnes eller opprettes (matcher på org.nr., deretter navn).
  2. Kontakten finnes eller opprettes (matcher på e-post) og knyttes til bedriften. Samtykke til markedsføring lagres med tidspunkt.
  3. Hvis du sender deal_title eller deal_value, opprettes en salgsmulighet i første fase.
  4. Meldingen lagres som notat på tidslinjen, og webhooks sendes som vanlig.

Lag en nøkkel med tilgangen «Kun skjema (leads)». Den kan bare sende inn henvendelser – ikke lese eller endre noe – og kan derfor brukes direkte fra nettsiden. Enda bedre er å sende skjemaet via egen server.

FeltTypeBeskrivelse
nametekstFullt navn (deles i fornavn/etternavn). Alternativ til first_name/last_name.
first_nametekstFornavn.
last_nametekstEtternavn.
emaile-postE-post. Brukes til å finne eksisterende kontakt. E-post eller telefon er påkrevd.
phonetekstTelefon.
mobiletekstMobil.
titletekstStilling.
company_nametekstFirmanavn. Eksisterende bedrift matches på org.nr., deretter navn.
org_numbertekstOrg.nr. (9 siffer, valideres).
websiteURLFirmaets nettside (ved ny bedrift).
messagetekstMeldingen fra skjemaet. Lagres som notat på tidslinjen.
subjecttekstTittel på notatet. Standard «Henvendelse via nettskjema».
sourcetekstKilde. Standard «Nettskjema».
deal_titletekstOpprett en salgsmulighet med denne tittelen.
deal_valuetallVerdi på salgsmuligheten (NOK eks. mva). Oppretter salgsmulighet selv uten tittel.
consent_marketingtrue/falseSamtykke til markedsføring (avkrysset i skjemaet).
consent_sourcetekstHvor samtykket ble gitt. Standard = source.
tagsliste med tekstTagger på ny kontakt/bedrift.
<form id="kontakt">
  <input name="name" placeholder="Navn" required>
  <input name="email" type="email" placeholder="E-post" required>
  <input name="company_name" placeholder="Firma">
  <textarea name="message" placeholder="Hva kan vi hjelpe med?"></textarea>
  <label><input type="checkbox" name="consent_marketing"> Ja takk til nyhetsbrev</label>
  <button>Send</button>
</form>
<script>
  // Bruk en nøkkel med tilgang «Kun skjema (leads)» – den kan ikke lese data.
  const LEADS_TOKEN = "wcrm_…";
  document.getElementById("kontakt").addEventListener("submit", async (e) => {
    e.preventDefault();
    const f = Object.fromEntries(new FormData(e.target));
    const res = await fetch("https://crm.webspesialisten.no/api/v1/leads", {
      method: "POST",
      headers: { Authorization: "Bearer " + LEADS_TOKEN, "Content-Type": "application/json" },
      body: JSON.stringify({ ...f, consent_marketing: !!f.consent_marketing, source: "Nettside" }),
    });
    e.target.innerHTML = res.ok ? "<p>Takk! Vi tar kontakt snart.</p>" : "<p>Noe gikk galt. Prøv igjen.</p>";
  });
</script>

Webhooks

Webhooks gir systemet deres beskjed med en gang noe skjer i CRM-et – uten å spørre API-et hele tiden. Legg til en URL under Innstillinger → API og webhooks, velg hendelser, og ta vare på hemmeligheten (vises én gang).

Slik ser en levering ut

HeaderVerdi
Content-Typeapplication/json
User-AgentWebspesialisten-CRM-Webhook/1.0
X-Webhook-EventHendelsen, f.eks. contact.created
X-Webhook-Signaturesha256=<HMAC-SHA256 av rå body med hemmeligheten, hex>
POST-body
{
  "event": "contact.created",
  "created_at": "2026-09-26T10:15:00.000Z",
  "data": {
    "id": "0f3c6a4e-2d71-4f7b-8f65-2e4c1d9b7a10",
    "first_name": "Kari",
    "last_name": "Nordmann",
    "email": "kari@firma.no",
    "company_id": "7c0e7f1e-5b8e-4a55-9b7e-3f7f0f0a1b2c",
    "category": "lead",
    "created_at": "2026-09-26T10:15:00.000Z"
  }
}
  • Vi sender en POST med JSON til URL-en deres. Svar med 2xx innen 8 sekunder.
  • «data» er raden slik den ser ut etter endringen. Ved *.deleted inneholder «data» bare «id».
  • Leveringer prøves ikke på nytt automatisk. Siste status og feilmelding vises under Innstillinger → API og webhooks.
  • Bekreft alltid signaturen, og sammenlign i konstant tid.

Verifiser signaturen

Hver levering er signert med HMAC-SHA256 av den rå request-bodyen, med webhookens hemmelighet som nøkkel: X-Webhook-Signature: sha256=<hex>. Avvis forespørsler der signaturen ikke stemmer, og sammenlign i konstant tid.

import { createHmac, timingSafeEqual } from "node:crypto";

// Next.js route handler / Express med rå body. Bruk ALLTID rå body – ikke JSON.stringify(req.body).
export async function POST(req) {
  const raw = await req.text();
  const expected = "sha256=" + createHmac("sha256", process.env.CRM_WEBHOOK_SECRET).update(raw).digest("hex");
  const got = req.headers.get("x-webhook-signature") ?? "";
  const ok = got.length === expected.length && timingSafeEqual(Buffer.from(got), Buffer.from(expected));
  if (!ok) return new Response("Ugyldig signatur", { status: 401 });

  const { event, data } = JSON.parse(raw);
  if (event === "contact.created") {
    // … synk til nyhetsbrev, regnskap osv.
  }
  return new Response("ok");
}

Knappen «Send test» i innstillingene sender hendelsen ping, signert på samme måte, så du kan teste mottakeren.

Hendelser

HendelseSendes når
company.createdBedrift opprettet
company.updatedBedrift endret
company.deletedBedrift slettet
contact.createdKontakt opprettet
contact.updatedKontakt endret
contact.deletedKontakt slettet
deal.createdSalgsmulighet opprettet
deal.updatedSalgsmulighet endret
deal.wonSalgsmulighet vunnet
deal.lostSalgsmulighet tapt
deal.deletedSalgsmulighet slettet
activity.createdAktivitet opprettet
activity.completedAktivitet fullført
quote.createdTilbud opprettet
quote.sentTilbud sendt
quote.acceptedTilbud akseptert av kunden
quote.rejectedTilbud avslått av kunden
ticket.createdSak opprettet
ticket.updatedSak endret
sale.createdSalg registrert
contract.createdKontrakt opprettet

Velg «Alle hendelser» (*) for også å få nye hendelser vi legger til senere.

OpenAPI 3.1 – Importer openapi.json i Postman, Insomnia eller en kodegenerator for å få ferdige klienter. Spørsmål? Kontakt oss – vi hjelper gjerne med integrasjonen.