Öppet API · v2026-10-13
Bygg på era möten.
Möten, transkript, åtgärder, risk och coachning som REST — med testnycklar som rullar tillbaka, signerade webhooks och en referens som genereras ur koden som kör.
curl https://api.notetaker.se/v1/meetings?limit=1 \
-H "Authorization: Bearer $TELINK_API_KEY"
{
"ok": true,
"data": {
"items": [{
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"one_liner": "Genomgång av offert, kunden vill se referenser.",
"duration_seconds": 2712,
"open_task_count": 3,
"state": "done"
}],
"has_more": true,
"next_cursor": "MjAyNi0xMC0xM1QwOTo0Njo1Mi4wMDBa…"
},
"warnings": [],
"errors": []
}Stockholm
All data i AWS eu-north-1. Den lämnar aldrig EU — inte heller loggar eller kopior.
600 anrop/min
Per nyckel. Webhooks väntar högst 10 sekunder på ert svar.
Testläge på riktigt
Skrivningar körs fullt ut och rullas sedan tillbaka — samma fel i test som i drift.
Kom igång
Kom igång på tre minuter
- 1
Skapa en testnyckel
Till Inställningar → APIUnder Inställningar → API. Testnycklar börjar med
tmi_test_och kör varje skrivning fullt ut innan den rullas tillbaka. - 2
Kontrollera nyckeln
/v1/mevisar nyckelns namn, läge och scopes.curlcurl https://api.notetaker.se/v1/me \ -H "Authorization: Bearer $TELINK_API_KEY" - 3
Läs de senaste mötena
Nyaste först, med sammanfattningens första mening och antal öppna åtgärder.
curlcurl "https://api.notetaker.se/v1/meetings?limit=5" \ -H "Authorization: Bearer $TELINK_API_KEY" - 4
Lägg till en webhook
Ange en https-adress, välj händelser och tryck Skicka test. Leveransen syns i loggen inom sekunder.
Grunderna
Det som gäller för alla anrop
Autentisering
Skicka nyckeln som Bearer. tmi_live_ för drift, tmi_test_ för test. Nyckeln visas en gång när den skapas — vi sparar bara ett hash.
Authorization: Bearer tmi_live_3f9a1c2e…Svarskuvertet
Alla svar har samma form. ok säger om anropet lyckades, errors har en stabil code och ett svenskt message.
{ "ok": true, "data": { … }, "warnings": [], "errors": [] }Paginering
Listor ger has_more och next_cursor. Skicka cursor tills has_more är false.
let cursor = null;
do {
const res = await fetch(`https://api.notetaker.se/v1/meetings?limit=100${cursor ? `&cursor=${cursor}` : ""}`, {
headers: { Authorization: `Bearer ${process.env.TELINK_API_KEY}` },
});
const { data } = await res.json();
for (const m of data.items) console.log(m.title);
cursor = data.has_more ? data.next_cursor : null;
} while (cursor);Idempotens
Skicka Idempotency-Key på skrivningar. Samma nyckel och kropp inom 24 h ger samma svar utan att köras igen; en annan kropp ger 409 idempotency_mismatch. Omspelade svar har Idempotent-Replayed: true.
Idempotency-Key: 6f1c2a4e-8b3d-4f5a-9c7e-1d2b3a4c5e6fRatelimit
600 anrop per minut och nyckel. X-RateLimit-Remaining visar hur många som återstår; vid 429 säger Retry-After hur många sekunder du ska vänta.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Remaining: 0Version
Varje svar bär Telink-Version. Vi bryter aldrig ett befintligt fält inom en version; nya fält kan tillkomma.
Telink-Version: 2026-10-13Referens
Alla anrop
Inbyggd kopia · OpenAPI 3.1.0
Kom igång
Första anropet.
Vem är jag
/meBekräftar att nyckeln fungerar och visar vilka scopes den har. Börja här.
Svar · 200 · data
- keyobject
- key.idstringNyckel-id
- key.prefixstringPrefix
- key.namestringNamn
- key.modestringlive eller test
- scopesobject[]
- scopes[].scopestringScope
- scopes[].descriptionstringBeskrivning
- organizationobject
- organization.idstringId
- organization.namestringNamn
- organization.slugstringSlug
- organization.timezonestringTidszon
- organization.localestringSpråk
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
curl https://api.notetaker.se/v1/me \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"key": {
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"prefix": "tmi_test_3f9a1c2e",
"name": "Affärssystemet",
"mode": "test"
},
"scopes": [
{
"scope": "meetings:read",
"description": "Läsa möten, sammanfattningar, kapitel och höjdpunkter"
}
],
"organization": {
"id": "a1b2c3d4-0000-4000-8000-000000000001",
"name": "Nordbolaget AB",
"slug": "nordbolaget",
"timezone": "Europe/Stockholm",
"locale": "sv-SE"
}
},
"warnings": [],
"errors": []
}Möten
Hållna möten med sammanfattning, kapitel, höjdpunkter, transkript och inspelning.
Lista möten
/meetingsmeetings:readHållna möten med innehåll som standard, nyaste först. Listan bär inte transkriptet — hämta det per möte. Sök med q (svensk fulltext).
Parametrar
- statusstringqueryheld (standard), upcoming, failed eller any.
- fromstringqueryPlanerad start från och med (ISO 8601).
- tostringqueryPlanerad start före (ISO 8601).
- ownerstringqueryBara mötesägaren med detta användar-id.
- categorystringqueryBara denna kategori.
- qstringqueryFritext i titel, sammanfattning och transkript.
- limitintegerqueryAntal per sida, 1–100. Standard 50.
- cursorstringquerynext_cursor från föregående sida.
Svar · 200 · data
- items*MeetingListItem[]
- has_more*booleanFler finns
- next_cursorstring | nullSkicka som cursor för nästa sida
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/meetings \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"items": [
{
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"one_liner": "Genomgång av offert, kunden vill se referenser.",
"scheduled_at": "2026-10-13T09:00:00.000Z",
"started_at": "2026-10-13T09:01:40.000Z",
"ended_at": "2026-10-13T09:46:52.000Z",
"duration_seconds": 2712,
"category": "sälj",
"meeting_type": "uppföljning",
"platform": "teams",
"source": "calendar",
"owner": {
"id": "c0ffee00-1111-4222-8333-444455556666",
"display_name": "Alex Persson",
"email": "alex@exempel.se"
},
"participant_count": 4,
"open_task_count": 3,
"objection_count": 2,
"has_media": true,
"state": "done",
"state_label": "Klart"
}
],
"has_more": true,
"next_cursor": "MjAyNi0xMC0xM1QwOTo0Njo1Mi4wMDBafDNmMmExYjlj"
},
"warnings": [],
"errors": []
}Hämta ett möte
/meetings/{id}meetings:readHela mötet: sammanfattning, kapitel, höjdpunkter, taltid, insikter. Transkriptet hämtas separat.
Parametrar
- id*stringstigMötes-id
Svar · 200 · data
- id*stringMötes-id
- titlestring | nullTitel
- one_linerstring | nullEn mening
- scheduled_atstring | nullPlanerad start
- started_atstring | nullStart
- ended_atstring | nullSlut
- duration_secondsinteger | nullSekunder
- categorystring | nullKategori
- meeting_typestring | nullTyp
- ownerUser
- participantsobject[]Deltagare med namn, e-post och is_internal
- summaryanySammanfattning (objekt med text och bullets)
- chaptersobject[]Kapitel med start_s/end_s
- highlightsobject[]Höjdpunkter: kind (objection, decision, question, commitment …), text, at_s, speaker
- talk_statsanyAndel taltid per talare
- insightsanyÖvriga insikter
- has_mediabooleanInspelning finns
- sourcestring | nullKälla
- transcript_enginestring | nullTranskriberingsmotor
- retention_delete_atstring | nullNär mötet raderas enligt organisationens gallringstid
- state*stringTillstånd
- state_labelstringEtikett
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/meetings/$ID \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"one_liner": "Genomgång av offert, kunden vill se referenser.",
"scheduled_at": "2026-10-13T09:00:00.000Z",
"started_at": "2026-10-13T09:01:40.000Z",
"ended_at": "2026-10-13T09:46:52.000Z",
"duration_seconds": 2712,
"category": "sälj",
"meeting_type": "uppföljning",
"platform": "teams",
"source": "calendar",
"owner": {
"id": "c0ffee00-1111-4222-8333-444455556666",
"display_name": "Alex Persson",
"email": "alex@exempel.se"
},
"participant_count": 4,
"open_task_count": 3,
"objection_count": 2,
"has_media": true,
"state": "done",
"state_label": "Klart",
"participants": [
{
"name": "Alex Persson",
"email": "alex@exempel.se",
"is_internal": true
},
{
"name": "Maria Nord",
"email": "maria@nordbolaget.se",
"is_internal": false
}
],
"summary": {
"text": "Kunden är positiv till offerten men vill se två referenser i samma bransch innan beslut.",
"bullets": [
"Offerten på 180 000 kr gicks igenom",
"Beslut väntas vecka 44"
]
},
"chapters": [
{
"title": "Inledning",
"start_s": 0,
"end_s": 180
},
{
"title": "Offertgenomgång",
"start_s": 180,
"end_s": 1900
}
],
"highlights": [
{
"kind": "objection",
"text": "Priset ligger över vad vi räknat med.",
"at_s": 1240,
"speaker": "Maria Nord"
}
],
"talk_stats": {
"Alex Persson": 0.58,
"Maria Nord": 0.42
},
"insights": {
"sentiment": "positiv",
"next_step": "Skicka två referenser senast fredag"
},
"transcript_engine": "elevenlabs-scribe-v2",
"retention_delete_at": "2027-10-13T09:00:00.000Z"
},
"warnings": [],
"errors": []
}Ändra titel eller kategori
/meetings/{id}meetings:writeMed en testnyckel körs ändringen fullt ut och rullas sedan tillbaka; svaret får dry_run: true.
Parametrar
- id*stringstigMötes-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- titlestringNy titel, max 300 tecken
- categorystringNy kategori, max 50 tecken
Svar · 200 · data
- idstringId
- titlestring | nullTitel
- categorystring | nullKategori
- changedbooleanÄndrad
- dry_runbooleanBara med testnyckel
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
- 409idempotency_mismatchSamma Idempotency-Key har redan använts för ett annat anrop.
curl -X PATCH https://api.notetaker.se/v1/meetings/$ID \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"title":"Kundmöte Nord – offert","category":"sälj"}'{
"ok": true,
"data": {
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord – offert",
"category": "sälj",
"changed": true
},
"warnings": [],
"errors": []
}Radera ett möte
/meetings/{id}meetings:writeRaderar hela kedjan — inspelning, transkript, sammanfattning, åtgärder, betyg. Loggas i revisionsspåret och skickar meeting.deleted. Går inte att ångra.
Parametrar
- id*stringstigMötes-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Svar · 200 · data
- idstringId
- deletedbooleanRaderat
- dry_runbooleanBara med testnyckel
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X DELETE https://api.notetaker.se/v1/meetings/$ID \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"ok": true,
"data": {
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"deleted": true
},
"warnings": [],
"errors": []
}Hämta transkriptet
/meetings/{id}/transcripttranscripts:readSegment i ordning med talare och tid. Paginera med offset/limit för långa möten. status är pending, running, done, failed eller skipped.
Parametrar
- id*stringstigMötes-id
- offsetintegerqueryFörsta segment. Standard 0.
- limitintegerquery1–2000. Standard 1000.
Svar · 200 · data
- segmentsTranscriptSegment[]
- statusstringTranskriptets status
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/meetings/$ID/transcript \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"segments": [
{
"idx": 0,
"start_s": 0,
"end_s": 4.2,
"speaker": "Alex Persson",
"text": "Hej Maria, kul att ses igen."
},
{
"idx": 1,
"start_s": 4.4,
"end_s": 9.1,
"speaker": "Maria Nord",
"text": "Hej! Ja, vi har sett över offerten."
}
],
"status": "done"
},
"warnings": [],
"errors": []
}Signerad länk till inspelningen
/meetings/{id}/recording-urlrecordings:readLänken gäller i en timme och skapas vid varje anrop. Cacha den aldrig. Varje uppslag skrivs i organisationens revisionsspår.
Parametrar
- id*stringstigMötes-id
Svar · 200 · data
- urlstringSignerad adress
- expires_atstringGiltig till
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/meetings/$ID/recording-url \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"url": "https://telink-mi-prod-media.s3.eu-north-1.amazonaws.com/t/…?X-Amz-Signature=…",
"expires_at": "2026-10-13T10:47:12.000Z"
},
"warnings": [],
"errors": []
}Åtgärder
Det som ska göras efter mötet.
Lista åtgärder
/taskstasks:readÅtgärder som analysen hittat i mötena. Öppna som standard.
Parametrar
- statusstringqueryopen (standard), done, dropped eller any.
- assigneestringqueryBara denna användare.
- meeting_idstringqueryBara detta möte.
- limitintegerqueryAntal per sida, 1–200. Standard 100.
- cursorstringquerynext_cursor från föregående sida.
Svar · 200 · data
- items*Task[]
- has_more*booleanFler finns
- next_cursorstring | nullSkicka som cursor för nästa sida
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/tasks \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"items": [
{
"id": "9e8d7c6b-5a49-4382-9170-6f5e4d3c2b1a",
"title": "Skicka två referenser till Nord",
"detail": null,
"due_on": "2026-10-17",
"at_second": 1402,
"status": "open",
"created_at": "2026-10-13T09:50:00.000Z",
"done_at": null,
"assignee": {
"id": "c0ffee00-1111-4222-8333-444455556666",
"display_name": "Alex Persson",
"email": "alex@exempel.se"
},
"meeting": {
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"scheduled_at": "2026-10-13T09:00:00.000Z"
}
}
],
"has_more": false,
"next_cursor": null
},
"warnings": [],
"errors": []
}Bocka av eller återöppna
/tasks/{id}tasks:writeSvarar 200 med changed: true eller 404 — aldrig 200 utan ändring. Skickar task.updated.
Parametrar
- id*stringstigÅtgärds-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- status*stringopen, done eller dropped
Svar · 200 · data
- idstringId
- meeting_idstringMöte
- statusstringStatus
- done_atstring | nullAvbockad
- changedbooleanÄndrad
- dry_runbooleanBara med testnyckel
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
- 409idempotency_mismatchSamma Idempotency-Key har redan använts för ett annat anrop.
curl -X PATCH https://api.notetaker.se/v1/tasks/$ID \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"status":"done"}'{
"ok": true,
"data": {
"id": "9e8d7c6b-5a49-4382-9170-6f5e4d3c2b1a",
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"status": "done",
"done_at": "2026-10-13T11:02:00.000Z",
"changed": true
},
"warnings": [],
"errors": []
}Kalender
Kommande möten och botens läge per möte.
Kommande kalendermöten
/calendar/eventscalendar:readMöten ur de kopplade kalendrarna med botens läge per möte. Standard: nu till 14 dagar framåt.
Parametrar
- fromstringqueryFrån (ISO 8601). Standard nu.
- tostringqueryTill (ISO 8601). Standard +14 dagar.
Svar · 200 · data
- itemsCalendarEvent[]
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/calendar/events \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"items": [
{
"id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"subject": "Demo Nordbolaget",
"starts_at": "2026-10-15T13:00:00.000Z",
"ends_at": "2026-10-15T13:45:00.000Z",
"platform": "teams",
"organizer_email": "alex@exempel.se",
"is_internal": false,
"notetaker_opt_out": false,
"joinable": true,
"bot_booked": true
}
]
},
"warnings": [],
"errors": []
}Stäng av eller sätt på boten
/calendar/events/{id}calendar:writenotetaker_opt_out: true hindrar boten från att gå in i mötet.
Parametrar
- id*stringstigKalendermötes-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- notetaker_opt_out*booleantrue = boten håller sig borta
Svar · 200 · data
- idstringId
- notetaker_opt_outbooleanLäge
- changedbooleanÄndrad
- dry_runbooleanBara med testnyckel
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X PATCH https://api.notetaker.se/v1/calendar/events/$ID \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"notetaker_opt_out":true}'{
"ok": true,
"data": {
"id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"notetaker_opt_out": true,
"changed": true
},
"warnings": [],
"errors": []
}Bot
Skicka boten till ett möte nu.
Skicka boten till ett kalendermöte nu
/calendar/events/{id}/botbots:writeFör möten som redan börjat. Sitter en bot redan i mötet svarar vi med den i stället för att skicka en till. Testnycklar validerar men skickar inget.
Parametrar
- id*stringstigKalendermötes-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Svar · 200 · data
- okbooleanBoten är på väg
- meeting_idstringMötet som skapades eller redan fanns
- existingbooleanEn bot satt redan där
- dry_runbooleanBara med testnyckel
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 409cap_reachedMånadens inspelningstak är nått.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/calendar/events/$ID/bot \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"ok": true,
"data": {
"ok": true,
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"existing": false
},
"warnings": [],
"errors": []
}Skicka boten till en möteslänk
/botsbots:writeTeams, Zoom, Google Meet och Webex. Mötet skapas i Telink och följer samma kedja som kalendermöten.
Parametrar
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- join_url*stringMöteslänk
- titlestringTitel, valfri
Svar · 200 · data
- okbooleanBoten är på väg
- meeting_idstringMötes-id
- existingbooleanEn bot satt redan där
- dry_runbooleanBara med testnyckel
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 409cap_reachedMånadens inspelningstak är nått.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/bots \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"join_url":"https://teams.microsoft.com/l/meetup-join/19%3ameeting_…","title":"Avstämning leverans"}'{
"ok": true,
"data": {
"ok": true,
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"existing": false
},
"warnings": [],
"errors": []
}Fråga
Fråga om mötena i klartext.
Ställ en fråga om mötena
/askask:readSamma motor som Fråga i appen. Datum, "senaste" och invändningar slås upp i databasen; modellen formulerar bara svaret. route säger hur svaret togs fram.
Parametrar
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- question*stringFrågan på svenska
- scopestringall (standard) eller mine
Svar · 200 · data
- answerstringSvar
- sourcesobject[]
- sources[].meeting_idstringMöte
- sources[].titlestring | nullTitel
- sources[].at_secondnumber | null
- sources[].quotestring | nullCitat
- routestringlatest, highlights, tasks, stats, risk, coaching, search, semantic eller mixed
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/ask \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"question":"Vilka invändningar fick vi i september?"}'{
"ok": true,
"data": {
"answer": "I september kom tre invändningar, alla om pris: Nordbolaget (13/9), Vestia (20/9) och Kalmar Bygg (27/9).",
"sources": [
{
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"at_second": 1240,
"quote": "Priset ligger över vad vi räknat med."
}
],
"route": "highlights"
},
"warnings": [],
"errors": []
}Affärsrisk
Motparter som riskerar att tappas.
Motparter med öppna risksignaler
/riskrisk:readSortera på risk_points. labels översätter signaltyper till svenska.
Parametrar
- min_pointsintegerqueryMinsta risk_points. Standard 0.
Svar · 200 · data
- counterpartiesCounterparty[]
- labelsobject
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/risk \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"counterparties": [
{
"counterparty_id": "11112222-3333-4444-8555-666677778888",
"domain": "nordbolaget.se",
"name": "Nordbolaget AB",
"last_seen_at": "2026-10-13T09:46:52.000Z",
"open_signals": 2,
"risk_points": 5,
"kinds": [
"price_objection",
"silence"
]
}
],
"labels": {
"price_objection": "Prisinvändning",
"silence": "Tystnad"
}
},
"warnings": [],
"errors": []
}Signaler för en motpart
/risk/{id}risk:readÖppna och stängda signaler med belägg, plus mötena med motparten.
Parametrar
- id*stringstigMotparts-id
Svar · 200 · data
- counterpartyobject
- signalsobject[]
- meetingsobject[]
- labelsobject
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/risk/$ID \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"counterparty": {
"id": "11112222-3333-4444-8555-666677778888",
"domain": "nordbolaget.se",
"name": "Nordbolaget AB",
"first_seen_at": "2026-08-01T08:00:00.000Z",
"last_seen_at": "2026-10-13T09:46:52.000Z",
"is_muted": false
},
"signals": [
{
"kind": "price_objection",
"severity": 2,
"detail": "Priset ifrågasattes utan att besvaras.",
"evidence_quote": "Priset ligger över vad vi räknat med.",
"evidence_at_s": 1240,
"evidence_meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"evidence_meeting_title": "Kundmöte Nord",
"detected_at": "2026-10-13T10:00:00.000Z",
"resolved_at": null,
"resolved_reason": null
}
],
"meetings": [
{
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"scheduled_at": "2026-10-13T09:00:00.000Z",
"one_liner": "Genomgång av offert.",
"attendee_emails": [
"maria@nordbolaget.se"
]
}
],
"labels": {
"price_objection": "Prisinvändning"
}
},
"warnings": [],
"errors": []
}Coachning
Scorekort per möte.
Scorekortet för ett möte
/meetings/{id}/scorecoaching:readVisa aldrig ett betyg utan dess citat. gaps är inte nollor — de är kriterier som inte kunde bedömas.
Parametrar
- id*stringstigMötes-id
Svar · 200 · data
- scoresobject[]
- scores[].keystringKriterienyckel
- scores[].labelstringEtikett
- scores[].scoreintegerPoäng
- scores[].max_scoreintegerMax
- scores[].evidence_quotestringCitat som belägger betyget
- scores[].evidence_at_snumber | null
- scores[].rationalestring | nullMotivering
- gapsobject[]
- gaps[].keystringKriterienyckel
- gaps[].labelstringEtikett
- gaps[].reasonstringno_evidence, quote_not_found eller not_applicable
- gaps[].detailstring | nullDetalj
- summaryobject | null
- summary.scored_criteriaintegerBedömda kriterier
- summary.weighted_pointsnumber
- summary.weighted_maxnumber
- summary.pctnumber
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/meetings/$ID/score \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"scores": [
{
"key": "discovery",
"label": "Behovsanalys",
"score": 4,
"max_score": 5,
"evidence_quote": "Vad är det viktigaste för er att få löst i höst?",
"evidence_at_s": 312,
"rationale": "Öppen fråga tidigt i mötet."
}
],
"gaps": [
{
"key": "closing",
"label": "Avslut",
"reason": "no_evidence",
"detail": null
}
],
"summary": {
"scored_criteria": 4,
"weighted_points": 15,
"weighted_max": 20,
"pct": 75
}
},
"warnings": [],
"errors": []
}Användare
Organisationens personer.
Organisationens användare
/usersusers:readFör att översätta owner- och assignee-id till personer, och för att filtrera möten per säljare.
Svar · 200 · data
- itemsobject[]
- items[].idstringId
- items[].emailstringE-post
- items[].display_namestring | nullNamn
- items[].rolestringplatform_admin, tenant_admin, manager eller member
- items[].statusstringinvited eller active
- items[].created_atstringSkapad
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/users \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"items": [
{
"id": "c0ffee00-1111-4222-8333-444455556666",
"email": "alex@exempel.se",
"display_name": "Alex Persson",
"role": "member",
"status": "active",
"created_at": "2026-09-01T07:00:00.000Z"
}
]
},
"warnings": [],
"errors": []
}Webhooks
Händelser till er server, signerade.
Lista webhooks
/webhookswebhooks:manageHögst tio per organisation.
Svar · 200 · data
- itemsWebhookEndpoint[]
- limitintegerMax antal
- eventsstring[]
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/webhooks \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"items": [
{
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"url": "https://example.se/telink/webhook",
"description": "Affärssystemet",
"events": [
"meeting.completed",
"task.updated"
],
"active": true,
"test_mode": false,
"last_status": 200,
"last_error": null,
"last_delivery_at": "2026-10-13T09:47:13.000Z",
"gave_up_at": null,
"created_at": "2026-10-01T08:00:00.000Z"
}
],
"limit": 10,
"events": [
"meeting.started",
"meeting.completed",
"meeting.failed",
"meeting.deleted",
"task.updated",
"score.ready",
"risk.signal_detected",
"webhook.test"
]
},
"warnings": [],
"errors": []
}Skapa en webhook
/webhookswebhooks:manageSvaret innehåller secret — enda gången den visas. Verifiera Telink-Signature med den. Adressen måste vara https och publik.
Parametrar
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- url*stringMottagaradress, https
- events*string[]Minst en händelse
- descriptionstringValfri beskrivning
Svar · 201 · data
- id*stringWebhook-id
- url*stringMottagaradress, https
- descriptionstring | nullBeskrivning
- events*string[]Prenumererade händelser
- active*booleanAktiv
- test_modebooleanSkapad med testnyckel — får aldrig skarpa händelser
- last_statusinteger | nullSenaste HTTP-status från mottagaren
- last_errorstring | nullSenaste fel
- last_delivery_atstring | nullSenaste leverans
- gave_up_atstring | nullSatt när åtta försök misslyckats; nollställs vid återaktivering
- created_atstringSkapad
- secretstringSigneringshemligheten. Bara i svaret vid skapande och rullning.
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 409limit_reachedHögst 10 webhooks per organisation.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/webhooks \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.se/telink/webhook","events":["meeting.completed","task.updated"],"description":"Affärssystemet"}'{
"ok": true,
"data": {
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"url": "https://example.se/telink/webhook",
"description": "Affärssystemet",
"events": [
"meeting.completed",
"task.updated"
],
"active": true,
"test_mode": false,
"last_status": null,
"last_error": null,
"last_delivery_at": null,
"gave_up_at": null,
"created_at": "2026-10-13T09:00:00.000Z",
"secret": "tmi_whsec_4f6d…"
},
"warnings": [],
"errors": []
}Hämta en webhook
/webhooks/{id}webhooks:manageUtan hemligheten.
Parametrar
- id*stringstigWebhook-id
Svar · 200 · data
- id*stringWebhook-id
- url*stringMottagaradress, https
- descriptionstring | nullBeskrivning
- events*string[]Prenumererade händelser
- active*booleanAktiv
- test_modebooleanSkapad med testnyckel — får aldrig skarpa händelser
- last_statusinteger | nullSenaste HTTP-status från mottagaren
- last_errorstring | nullSenaste fel
- last_delivery_atstring | nullSenaste leverans
- gave_up_atstring | nullSatt när åtta försök misslyckats; nollställs vid återaktivering
- created_atstringSkapad
- secretstringSigneringshemligheten. Bara i svaret vid skapande och rullning.
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/webhooks/$ID \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"url": "https://example.se/telink/webhook",
"description": "Affärssystemet",
"events": [
"meeting.completed"
],
"active": true,
"test_mode": false,
"last_status": 200,
"last_error": null,
"last_delivery_at": "2026-10-13T09:47:13.000Z",
"gave_up_at": null,
"created_at": "2026-10-01T08:00:00.000Z"
},
"warnings": [],
"errors": []
}Ändra eller pausa en webhook
/webhooks/{id}webhooks:manageactive: true återaktiverar också en webhook som gett upp efter åtta misslyckade försök.
Parametrar
- id*stringstigWebhook-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Kropp
- urlstringNy adress
- eventsstring[]
- descriptionstringBeskrivning
- activebooleanAktiv
Svar · 200 · data
- id*stringWebhook-id
- url*stringMottagaradress, https
- descriptionstring | nullBeskrivning
- events*string[]Prenumererade händelser
- active*booleanAktiv
- test_modebooleanSkapad med testnyckel — får aldrig skarpa händelser
- last_statusinteger | nullSenaste HTTP-status från mottagaren
- last_errorstring | nullSenaste fel
- last_delivery_atstring | nullSenaste leverans
- gave_up_atstring | nullSatt när åtta försök misslyckats; nollställs vid återaktivering
- created_atstringSkapad
- secretstringSigneringshemligheten. Bara i svaret vid skapande och rullning.
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X PATCH https://api.notetaker.se/v1/webhooks/$ID \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"active":false}'{
"ok": true,
"data": {
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"url": "https://example.se/telink/webhook",
"description": "Affärssystemet",
"events": [
"meeting.completed"
],
"active": false,
"test_mode": false,
"last_status": 200,
"last_error": null,
"last_delivery_at": "2026-10-13T09:47:13.000Z",
"gave_up_at": null,
"created_at": "2026-10-01T08:00:00.000Z"
},
"warnings": [],
"errors": []
}Ta bort en webhook
/webhooks/{id}webhooks:manageTar bort endpointen och dess leveranslogg.
Parametrar
- id*stringstigWebhook-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Svar · 200 · data
- idstringId
- deletedbooleanBorttagen
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X DELETE https://api.notetaker.se/v1/webhooks/$ID \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"ok": true,
"data": {
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"deleted": true
},
"warnings": [],
"errors": []
}Ny signeringshemlighet
/webhooks/{id}/rotate-secretwebhooks:manageDen gamla slutar gälla direkt.
Parametrar
- id*stringstigWebhook-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Svar · 200 · data
- idstringId
- secretstringNy hemlighet
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/webhooks/$ID/rotate-secret \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"ok": true,
"data": {
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"secret": "tmi_whsec_9a1c…"
},
"warnings": [],
"errors": []
}Skicka en testhändelse
/webhooks/{id}/testwebhooks:manageGår genom hela kedjan: kö, signatur, leveranslogg. Händelsetypen är webhook.test.
Parametrar
- id*stringstigWebhook-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Svar · 200 · data
- event_idstringHändelse
- delivery_idstringLeverans
- queuedbooleanKöad
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 409inactiveWebhooken är pausad.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/webhooks/$ID/test \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"ok": true,
"data": {
"event_id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"delivery_id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"queued": true
},
"warnings": [],
"errors": []
}Leveranslogg
/webhooks/{id}/deliverieswebhooks:manageSenaste leveranserna med status, svar och fel.
Parametrar
- id*stringstigWebhook-id
- limitintegerquery1–200. Standard 50.
Svar · 200 · data
- itemsWebhookDelivery[]
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/webhooks/$ID/deliveries \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"items": [
{
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"status": "delivered",
"attempts": 1,
"max_attempts": 8,
"next_attempt_at": "2026-10-13T09:47:12.000Z",
"response_status": 200,
"response_ms": 212,
"last_error": null,
"delivered_at": "2026-10-13T09:47:13.000Z",
"created_at": "2026-10-13T09:47:12.000Z",
"event_id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"event_type": "meeting.completed",
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b"
}
]
},
"warnings": [],
"errors": []
}Hämta en händelse
/webhook-events/{id}webhooks:manageHändelsens innehåll, för felsökning och för att hämta det som en missad leverans bar.
Parametrar
- id*stringstigHändelse-id
Svar · 200 · data
- id*stringHändelse-id
- type*stringHändelsetyp En av: meeting.started, meeting.completed, meeting.failed, meeting.deleted, task.updated, score.ready, risk.signal_detected, webhook.test.
- created_at*stringSkapad
- tenant_idstringOrganisation
- meeting_idstring | nullMöte
- data*objectHändelsens innehåll
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl https://api.notetaker.se/v1/webhook-events/$ID \
-H "Authorization: Bearer $TELINK_API_KEY"{
"ok": true,
"data": {
"id": "7d4e8a2b-1c3f-4e5a-9b6d-2f1a3c4e5b6d",
"type": "meeting.completed",
"created_at": "2026-10-13T09:47:12.000Z",
"tenant_id": "a1b2c3d4-0000-4000-8000-000000000001",
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"data": {
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"one_liner": "Genomgång av offert, kunden vill se referenser.",
"scheduled_at": "2026-10-13T09:00:00.000Z",
"started_at": "2026-10-13T09:01:40.000Z",
"ended_at": "2026-10-13T09:46:52.000Z",
"duration_seconds": 2712,
"category": "sälj",
"meeting_type": "uppföljning",
"platform": "teams",
"source": "calendar",
"owner_user_id": "c0ffee00-1111-4222-8333-444455556666",
"participant_count": 4,
"has_media": true,
"join_failure_kind": null,
"summary_available": true,
"open_task_count": 3,
"objection_count": 2
}
},
"warnings": [],
"errors": []
}Leverera igen
/webhook-deliveries/{id}/redeliverwebhooks:manageNollställer försöken och köar leveransen på nytt. Återaktiverar endpointen om den gett upp.
Parametrar
- id*stringstigLeverans-id
- Idempotency-KeystringhuvudValfri men rekommenderad. Samma nyckel + samma kropp inom 24 h ger samma svar utan att köras igen.
Svar · 200 · data
- idstringId
- queuedbooleanKöad
Fel
- 401unauthorizedNyckeln känns inte igen.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 404not_foundMötet finns inte.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
curl -X POST https://api.notetaker.se/v1/webhook-deliveries/$ID/redeliver \
-H "Authorization: Bearer $TELINK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"ok": true,
"data": {
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"queued": true
},
"warnings": [],
"errors": []
}Webhooks
Händelser till er server
- 01
Händelsen skrivs i samma transaktion som tillståndet den beskriver — finns mötet som klart, finns händelsen.
- 02
Leveransen går ut inom sekunder, signerad med endpointens hemlighet.
- 03
Svarar ni inte 2xx försöker vi igen upp till åtta gånger med backoff: 1, 2, 4 … 128 minuter.
- 04
Efter åtta misslyckade försök sätts
gave_up_atoch endpointen pausas. Återaktivera eller omleverera med en knapp.
Händelser
- meeting.startedBoten är inne i mötet och spelar in.
- meeting.completedTranskript, sammanfattning och åtgärder är klara.
- meeting.failedBoten kom inte in (lobby, nekad, ingen dök upp).
- meeting.deletedMötet raderades — av en användare eller av retention.
- task.updatedEn åtgärd bockades av, återöppnades eller ströks.
- score.readyScorekortet för mötet är satt.
- risk.signal_detectedEn ny risksignal på en motpart.
- webhook.testTesthändelse från portalen.
Huvuden vi skickar
- Telink-Signaturet=<unix>,v1=<hex> — HMAC-SHA256 av t + "." + råkroppen
- Telink-Event-IdHändelsens id. Använd för idempotens.
- Telink-Event-TypeT.ex. meeting.completed
- Telink-Delivery-IdLeveransens id, samma vid omförsök
- Telink-AttemptFörsök 1–8
- User-AgentTelink-Webhooks/1.0
Regler
- Svara 2xx inom 10 sekunder och gör arbetet asynkront.
- Var idempotent på
Telink-Event-Id— samma händelse kan komma mer än en gång. - Omdirigeringar följs inte.
- Adressen måste vara https och nåbar från internet.
- Avvisa leveranser vars
tär äldre än 5 minuter.
{
"id": "7d4e8a2b-1c3f-4e5a-9b6d-2f1a3c4e5b6d",
"type": "meeting.completed",
"created_at": "2026-10-13T09:47:12.000Z",
"tenant_id": "a1b2c3d4-0000-4000-8000-000000000001",
"meeting_id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"data": {
"id": "3f2a1b9c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"title": "Kundmöte Nord",
"one_liner": "Genomgång av offert, kunden vill se referenser.",
"scheduled_at": "2026-10-13T09:00:00.000Z",
"started_at": "2026-10-13T09:01:40.000Z",
"ended_at": "2026-10-13T09:46:52.000Z",
"duration_seconds": 2712,
"category": "sälj",
"meeting_type": "uppföljning",
"platform": "teams",
"source": "calendar",
"owner_user_id": "c0ffee00-1111-4222-8333-444455556666",
"participant_count": 4,
"has_media": true,
"join_failure_kind": null,
"summary_available": true,
"open_task_count": 3,
"objection_count": 2
}
}import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyTelink(header, rawBody, secret, toleranceSec = 300) {
const parts = Object.fromEntries(header.split(",").map((p) => p.trim().split("=")));
const t = Number(parts.t);
if (!parts.v1 || !Number.isFinite(t) || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
const got = Buffer.from(parts.v1, "hex");
return got.length === expected.length && timingSafeEqual(got, expected);
}
// app.post("/telink/webhook", express.raw({ type: "application/json" }), (req, res) => {
// if (!verifyTelink(req.get("Telink-Signature"), req.body.toString(), process.env.TELINK_WEBHOOK_SECRET)) return res.sendStatus(401);
// const event = JSON.parse(req.body); /* event.type, event.data */ res.sendStatus(200);
// });Fel
Felkoder
- 401unauthorizedNyckeln känns inte igen.
- 401key_expiredNyckeln har gått ut. Skapa en ny under Inställningar → API.
- 401key_revokedNyckeln är återkallad.
- 403insufficient_scopeNyckeln saknar behörigheten meetings:read.
- 403forbiddenDu har inte behörighet till det här.
- 404not_foundMötet finns inte.
- 400validationlimit måste vara ett heltal mellan 1 och 100.
- 409idempotency_mismatchSamma Idempotency-Key har redan använts för ett annat anrop.
- 409limit_reachedHögst 10 webhooks per organisation.
- 409cap_reachedMånadens inspelningstak är nått.
- 409inactiveWebhooken är pausad.
- 429rate_limitedHögst 600 anrop per minut och nyckel.
- 500internalNågot gick fel hos oss.
code är stabil och gjord för att programmera mot. message är på svenska och kan visas för användaren som den är.
Bifoga X-Request-Id från svaret när ni kontaktar support — då hittar vi anropet direkt.
Ändringslogg
Ändringslogg
- 2026-10-13v1 lanserad: möten, transkript, inspelningar, åtgärder, kalender, bot, Fråga, affärsrisk, coachning, användare, webhooks med åtta händelser, OpenAPI 3.1.