API för utvecklare
Senast uppdaterad 3 oktober 2026
Med Sammlas API läser ni möten och uppgifter ur er arbetsyta som JSON, med en nyckel. Det räcker för att koppla Sammla till Zapier, Make, Power Automate eller ett eget system, utan att vänta på att vi bygger en färdig integration. Version 1 är bara läsning.
Nycklar och behörighet
En administratör slår först på API:t för arbetsytan under Inställningar, Kopplingar. Det är avstängt tills någon gör det. Därefter skapar varje användare sin egen nyckel på samma ställe. Nyckeln visas en gång, när den skapas, och sparas sedan bara som en kontrollsumma hos oss. Den som tappar bort sin nyckel skapar en ny.
Nyckeln är du. Den ser exakt de möten och uppgifter du ser i appen, i den arbetsyta där den skapades, och inget mer. Är du spärrad från möten i arbetsytan ser nyckeln inga möten, och uppgifter som kommer från ett möte, ett mail eller ett dokument du inte når syns inte heller.
Nyckeln slutar fungera direkt om du återkallar den, om en administratör återkallar den, om du lämnar arbetsytan eller om API:t stängs av. Nycklar till Claude och ChatGPT fungerar inte i API:t, och API-nycklar fungerar inte där.
Autentisering
Skicka nyckeln i huvudet Authorization med Bearer framför. Lägg den aldrig i adressen: en nyckel i en adress hamnar i loggar på vägen, och API:t läser den inte därifrån.
curl https://www.sammla.se/api/v1/me \
-H "Authorization: Bearer sammla_din_nyckel"Alla svar är JSON i UTF-8. Tider är ISO 8601 i UTC.
Endpoints
Basadressen är https://www.sammla.se/api/v1. Alla endpoints svarar på GET.
GET /me
Vilken arbetsyta, användare och nyckel anropet gäller. Använd den för att pröva anslutningen. access.meetings är false om du är spärrad från möten.
{
"data": {
"workspace": { "id": "…", "name": "Bolaget AB" },
"user": { "id": "…", "name": "Anna Andersson", "email": "anna@bolaget.se" },
"key": { "id": "…", "name": "Zapier", "last_four": "x9Qa", "created_at": "2026-10-01T08:00:00Z" },
"access": { "meetings": true, "tasks": true }
}
}GET /meetings
Färdiga möten, alltså möten där transkript och sammanfattning är klara. Möten som spelas in eller bearbetas kommer med när de är färdiga. Parametrar: since, limit och cursor, se nedan.
curl "https://www.sammla.se/api/v1/meetings?limit=20" \
-H "Authorization: Bearer sammla_din_nyckel"{
"data": [
{
"id": "6f1c…",
"title": "Veckomöte sälj",
"started_at": "2026-10-02T08:00:00+00:00",
"duration_seconds": 1860,
"status": "completed",
"tldr": "Vi byter CRM i november.",
"url": "https://www.sammla.se/meetings/6f1c…",
"created_at": "2026-10-02T08:00:00+00:00",
"updated_at": "2026-10-02T08:41:12.512345+00:00"
}
],
"next_cursor": "eyJrIjoidSIs…"
}GET /meetings/{id}
Ett helt möte: allt från listan plus deltagare, översikt, ämnen, beslut, åtgärdspunkter och risker. Transkriptet följer bara med om du ber om det med include=transcript, eftersom det kan vara stort. Ett möte som inte är färdigt, eller som inte finns i arbetsytan, ger 404.
curl "https://www.sammla.se/api/v1/meetings/6f1c…?include=transcript" \
-H "Authorization: Bearer sammla_din_nyckel"{
"data": {
"id": "6f1c…",
"title": "Veckomöte sälj",
"started_at": "2026-10-02T08:00:00+00:00",
"duration_seconds": 1860,
"status": "completed",
"tldr": "Vi byter CRM i november.",
"url": "https://www.sammla.se/meetings/6f1c…",
"created_at": "2026-10-02T08:00:00+00:00",
"updated_at": "2026-10-02T08:41:12.512345+00:00",
"participants": ["Anna", "Bo"],
"overview": "Teamet gick igenom …",
"key_topics": [{ "topic": "CRM", "detail": "Byte till nytt system" }],
"decisions": ["Byta CRM i november"],
"action_items": [{ "text": "Begär offert", "owner": "Anna", "due_date": "2026-10-10" }],
"risks": ["Migreringen kan ta längre tid"],
"transcript": [{ "speaker": "Anna", "start": 0.0, "end": 4.2, "text": "Då kör vi." }]
}
}| Fält | Typ | Betydelse |
|---|---|---|
| started_at | tid | När mötet började. |
| duration_seconds | heltal eller null | Mötets längd i sekunder. |
| tldr | text eller null | Sammanfattningen på en rad. |
| overview | text eller null | Några meningar om mötet. |
| action_items[].owner | text eller null | Den som ska göra det, som namnet uppfattades i mötet. |
| action_items[].due_date | datum eller null | Senast, om ett datum nämndes. |
| transcript[].start, end | sekunder | Tid från mötets början. |
| url | adress | Mötet i Sammla. Kräver inloggning. |
GET /tasks
Uppgifter i arbetsytan, från möten, mail och dokument och de som skapats för hand. Parametrar: since, limit, cursor och status (open eller done).
curl "https://www.sammla.se/api/v1/tasks?status=open" \
-H "Authorization: Bearer sammla_din_nyckel"{
"data": [
{
"id": "a41e…",
"text": "Begär offert från två leverantörer",
"assignee": "Anna",
"due_date": "2026-10-10",
"status": "open",
"completed_at": null,
"created_at": "2026-10-02T08:41:12.512345+00:00",
"source": "meeting",
"meeting_id": "6f1c…",
"meeting_url": "https://www.sammla.se/meetings/6f1c…"
}
],
"next_cursor": null
}| Fält | Typ | Betydelse |
|---|---|---|
| assignee | text eller null | Ansvarig, som namnet står på uppgiften. |
| due_date | datum eller null | Datumet uppgiften ska vara klar. |
| status | open eller done | Om uppgiften är avbockad. |
| completed_at | tid eller null | När den bockades av. |
| source | text | meeting, mail, document eller manual. |
| meeting_id, meeting_url | eller null | Mötet uppgiften kom ifrån. |
Fältnamnen är stabila i version 1. Nya fält kan tillkomma, så låt er kod tåla fält den inte känner igen. Befintliga fält byter inte namn eller betydelse utan en ny version i adressen.
Sidbläddring
limit anger hur många poster en sida har, från 1 till 100. Standard är 50. Finns det fler poster innehåller svaret next_cursor. Skicka den som cursor i nästa anrop, med samma övriga parametrar, och fortsätt tills next_cursor är null.
curl "https://www.sammla.se/api/v1/meetings?limit=100&cursor=eyJrIjoidSIs…" \
-H "Authorization: Bearer sammla_din_nyckel"Sidorna bygger på den sista postens tid och id, inte på ett radnummer. Därför hoppas ingen post över och ingen kommer två gånger när nya möten blir färdiga medan ni bläddrar. En sida med uppgifter kan ha färre poster än limit fast det finns fler, när några av dem inte är synliga för dig. Det är next_cursor, inte antalet, som säger om det finns mer.
Polling med since
since begränsar svaret till poster efter en tidpunkt, i ISO 8601 med tidszon, till exempel 2026-10-03T08:00:00Z. Ett datum som 2026-10-03 betyder midnatt UTC. Svaren är sorterade med det senaste först, och since gäller samma tid som sorteringen:
- Möten sorteras på updated_at. Den sätts när mötet blir färdigt och varje gång referatet ändras i efterhand, så ett rättat möte kommer med igen med samma id. Det är med flit: ett möte spelas in vid en tid men blir färdigt senare, och en hämtning på starttiden hade missat det för gott.
- Uppgifter sorteras på created_at, så since ger nya uppgifter. Med status=done sorteras de i stället på completed_at, och since ger då uppgifter som bockats av efter tidpunkten. Ändrad text eller ändrat datum syns inte via since i version 1.
För ett eget system: spara den högsta updated_at (eller created_at, completed_at) ni sett, och skicka den som since nästa gång. Känn igen poster på id, så att ett möte som kommer tillbaka efter en ändring uppdaterar det ni redan har i stället för att bli en dubblett.
Zapier
Det finns ingen färdig Sammla-app i Zapier. I stället använder ni Zapiers eget verktyg för att hämta från en adress, Webhooks by Zapier, som finns i Zapiers betalda planer. Så här startar en Zap för varje nytt möte:
- Skapa en Zap och välj Webhooks by Zapier som trigger, med händelsen Retrieve Poll.
- URL:
https://www.sammla.se/api/v1/meetings - Key:
data, alltså fältet som håller listan. - Deduplication Key:
id - Headers: Authorization med värdet Bearer och din nyckel.
- Testa triggern. Zapier hämtar de senaste mötena och kommer ihåg deras id, och därefter startar Zappen en gång för varje nytt id. Ett möte som rättas i efterhand startar den inte om.
- Behöver nästa steg hela mötet med beslut och åtgärdspunkter: lägg till ett steg med Webhooks by Zapier, händelsen GET, adressen https://www.sammla.se/api/v1/meetings/ följd av id från triggern, och samma header.
Samma sätt fungerar för nya uppgifter med https://www.sammla.se/api/v1/tasks, och för avbockade uppgifter med https://www.sammla.se/api/v1/tasks?status=done. Zapier läser bara första sidan, så since och cursor behövs inte här.
Make
Det finns ingen färdig Sammla-modul i Make. Ni använder Makes HTTP-modul och kör scenariot på ett schema:
- Skapa ett scenario och lägg till modulen HTTP, Make a request.
- URL:
https://www.sammla.se/api/v1/meetings, metod GET. - Headers: Authorization med värdet Bearer och din nyckel.
- Query String: since med ett värde en bit bakåt i tiden, till exempel
{{formatDate(addMinutes(now; -20); "YYYY-MM-DDTHH:mm:ssZ")}}om scenariot körs var 15:e minut. - Slå på Parse response, så att svaret blir fält i stället för text.
- Lägg till en Iterator på data, så att resten av scenariot körs en gång per möte.
- Schemalägg scenariot, till exempel var 15:e minut.
Fönstret överlappar med flit, så att inget faller bort om en körning blir sen. Ska varje möte hanteras exakt en gång: spara id i ett datalager i Make och hoppa över de id som redan finns.
Power Automate och egna system
I Power Automate fungerar det på samma sätt som i Make: en återkommande utlösare och åtgärden HTTP (en premiumåtgärd i Power Automate) med samma adress, header och since. Ett eget system anropar API:t direkt, enligt avsnitten om sidbläddring och polling ovan.
Gränser
- 60 anrop per minut och nyckel. Över gränsen svarar API:t 429 med Retry-After: 60, och då räcker det att vänta en minut.
- Högst 100 poster per sida.
- Transkriptet följer bara med när ni ber om det med include=transcript.
- Tio aktiva API-nycklar per person och arbetsyta.
Felkoder
Fel har alltid samma form: en stabil kod på engelska för er kod och ett meddelande på svenska för den som ser felet i Zapier eller Make.
{ "error": { "code": "revoked_api_key", "message": "Nyckeln är återkallad. …" } }| Status | Kod | Betydelse |
|---|---|---|
| 400 | invalid_parameter | En parameter är fel, till exempel limit över 100, since utan tidszon eller en cursor som inte kommer från förra svaret. |
| 401 | missing_api_key | Ingen nyckel i Authorization. |
| 401 | invalid_api_key | Nyckeln finns inte, eller personen som skapade den är inte längre medlem. |
| 401 | revoked_api_key | Nyckeln är återkallad. |
| 401 | expired_api_key | Nyckeln har gått ut. |
| 403 | wrong_key_type | Nyckeln är till Claude och ChatGPT, inte till API:t. |
| 403 | api_disabled | API:t är avstängt för arbetsytan. |
| 403 | no_meeting_access | Du är spärrad från möten i arbetsytan. |
| 404 | not_found | Mötet finns inte i arbetsytan, eller är inte färdigt. |
| 429 | rate_limited | För många anrop, se Retry-After. |
| 500 | internal_error | Fel hos oss. Försök igen om en stund. |
Det som inte finns i version 1
API:t läser, det skriver inte. Mail, dokument och chattar finns inte i API:t, och Sammla skickar inga händelser till er; ni hämtar. Frågor och önskemål: gabriel [snabel-a] sammla.se.