Åtkomst till er Asstio-data för egna appar, dashboards, automatiseringar och AI-assistenter. REST för servrar och script, MCP för Claude, Cursor och andra AI-klienter. Varje anrop görs med en persons behörigheter, och v1 är stabil.
Samma underliggande data, samma versioneringskontrakt, samma authmodell. Skillnaden är vem som anropar.
Versionerade endpoints under /api/v1/*, beskrivna i ett OpenAPI 3.1-dokument. Bygg dashboards, hämta data till Power BI, mata Slack-bottar eller kör nattliga jobb mot er Asstio-data med en API-nyckel.
# Hämta orderboken med en API-nyckel (asstio_…) curl https://api.asstio.com/api/v1/sales-orders \ -H "Authorization: Bearer $ASSTIO_KEY"
v1 är stabil)
OpenAPI 3.1
API-nycklar: Läs eller Läs och skriv
Cursor-pagineringSamma data som verktyg en AI-assistent kan anropa, för att läsa och för att skriva. Implementerar Model Context Protocol över streamable-HTTP. Claude Desktop, Cline och Cursor sköter inloggningen själva, och verktygen körs med den inloggade användarens behörigheter.
// claude_desktop_config.json { "mcpServers": { "asstio": { "url": "https://mcp.asstio.com/mcp" } } }
Gå till Inställningar → API-nycklar i Asstio. Ge nyckeln ett namn (t.ex. "Power BI"), välj Läs eller Läs och skriv och, om ni vill, ett utgångsdatum. Nyckeln visas bara en gång, så kopiera den direkt. Att skapa nycklar kräver behörigheten api_keys eller user_admin.
Skicka nyckeln som Authorization: Bearer asstio_…. Den tas bara emot i headern, aldrig i URL:en. Förvara den på servern, inte i kod som körs i webbläsaren.
Gör en GET mot /api/v1/customers?q=Acme. Bolaget följer med nyckeln, så ni skickar aldrig något tenant-id i URL eller header. Alla operationer går att prova med er egen nyckel i den interaktiva referensen.
/api/v1/customers?q=Acme# Sök efter en kund curl -G "$ASSTIO/api/v1/customers" \ --data-urlencode "q=Acme" \ -H "Authorization: Bearer $TOKEN"
// Response { "items": [{ "id": 412, "contactNumber": 10042, "name": "Acme Ltd", "orgno": "556677-8899", "openOrderCount": 3 }], "nextCursor": null, "pageSizeApplied": 50, "truncated": false }
/api/v1/sales-invoice-lines# Vad sålde vi till Acme i april? curl -X POST "$ASSTIO/api/v1/sales-invoice-lines" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "from": "2026-04-01", "to": "2026-04-30", "customerId": 412, "pageSize": 100 }'
// Response (1 av 23 rader) { "productNumber": "WID-12", "quantity": 4.0, "sumExVat": 12000.00, "currencyIsoCode": "SEK" }
tools/call// Be Claude i en chatt: "Visa öppna leverans-rader till Kraft Group" // Claude anropar: { "method": "tools/call", "params": { "name": "list_open_order_lines", "arguments": { "customerId": 412 } } }
// Claude svarar i naturligt språk "Kraft Group har 6 orderrader öppna, totalt 18 enheter kvar att leverera — främst Widget WID-12 och Skruv M8."
Säljordrar, säljfakturor, kreditfakturor och inköpsordrar är alla rader i samma tabell. Tre boolska flaggor på OrderStatus avgör vad som räknas som vad i rapporter.
OrderStatusType.SystemNameSALESORDERSäljorder (bokad, ej skickad)SALESINVOICESäljfaktura (skickad/fakturerad)SALESCREDITKreditfaktura (retur/återbetalning)PURCHASEORDERInköpsorder mot leverantörIsOrderIntake, IsSales, IsPurchaseIsOrderIntake = 1 — Räknas som orderintag. Inkluderar både SALESORDER (väntar leverans) och SALESINVOICE (redan skickad). Definierar orderboken.IsSales = 1 — Räknas som omsättning. Exkluderar preview-/draft-/void-statusar.IsPurchase = 1 — Aktiv inköpsorder (öppen eller pågående), inte stängd/avbruten.Huvud-endpoints (/sales-orders, /sales-invoices, /purchase-orders) defaultar till den naturliga flaggan för sitt dokumenttyp, så out-of-the-box-siffror matchar Asstios BI. Override via statusKind-parametern eller pinna till en specifik statusId.
Här är några av de vanligaste läsanropen och de tre för matchning av leverantörsfakturor. Klicka på en endpoint för att se request- och response-exempel. Hela v1, med parametrar, svar och felkoder för varje operation, finns i OpenAPI-dokumentet och i den interaktiva referensen. Båda går att läsa utan nyckel.
Base URL: https://api.asstio.com/api/v1/
/api/v1/sales-orders
list_sales_ordersstatusKind=intake (statusar med IsOrderIntake=1). Filter på kund, status, datum, valuta, total. Hitta en kunds ordrar med email (adressen på ordern) eller shopOrderNumber (webbutikens ordernummer); då söks alla statusar. Med include=lines,fulfilment får varje order med sina rader och sin lager- och fraktstatus i samma svar, precis som /lines och /fulfilment ger dem, högst 25 ordrar per sida.curl -G "$ASSTIO/api/v1/sales-orders" \ --data-urlencode "customerId=412" \ --data-urlencode "orderDateFrom=2026-05-01" \ -H "Authorization: Bearer $TOKEN"
// 200 OK · X-Asstio-Api-Version: v1 { "id": 18743, "name": "Webshop order 2026-05", "customerId": 412, "customerName": "Acme Ltd", "customerOrgno": "556677-8899", "statusId": 31, "statusName": "Bekräftad", "dateOrder": "2026-05-12T00:00:00Z", "dateDelivery": "2026-05-25T00:00:00Z", "dateInvoice": null, "dateDue": null, "totalExVat": 18250.00, "totalVat": 4562.50, "totalIncVat": 22812.50, "openAmount": 22812.50, "isLate": false, "isFullyPaid": false, "hasShipmentDiscrepancy": false, "currencyIsoCode": "SEK" }
/api/v1/sales-orders/{id}/fulfilment
get_sales_order_fulfilment/contact (orderns e-post, telefon och adresser) och /payment (betalstatus, kräver payment_manage).curl "$ASSTIO/api/v1/sales-orders/18743/fulfilment" \ -H "Authorization: Bearer $TOKEN"
{
"warehouseOrders": [{
"orderNumber": "441147",
"status": "shipped",
"statusText": "Skickad",
"shippedAt": "2026-09-30T14:02:00Z",
"partial": false,
"observedAt": "2026-09-30T14:05:12Z"
}],
"shipments": [{
"carrier": "PostNord",
"service": "MyPack Home",
"parcelNumber": "00370…",
"trackingUrl": "https://…",
"returnParcelNumber": null
}]
}/api/v1/purchase-orders
list_purchase_ordersIsPurchase=1). Filter på vendor, datum, valuta, mottaget värde och kvar-att-fakturera.curl -G "$ASSTIO/api/v1/purchase-orders" \ --data-urlencode "vendorId=78" \ -H "Authorization: Bearer $TOKEN"
{
"id": 92044,
"purchaseNumber": 2026131,
"vendorId": 78,
"vendorName": "Northwind Components AB",
"vendorOrgno": "112233-4455",
"statusId": 64,
"statusName": "Beställd",
"dateOrder": "2026-05-02T00:00:00Z",
"dateDelivery": "2026-05-30T00:00:00Z",
"orderTotalExVat": 42500.00,
"orderTotalIncVat": 53125.00,
"receivedQtyPercent": null,
"receivedValueExVat": 12700.00,
"invoicedValueExVat": 0.00,
"openToInvoiceExVat": 12700.00,
"currencyIsoCode": "SEK"
}/api/v1/sales-invoices
list_sales_invoicesIsSales=1). Sätt documentType=credit för kreditfakturor, both för kombinerat.curl -G "$ASSTIO/api/v1/sales-invoices" \ --data-urlencode "customerId=412" \ --data-urlencode "dueDateTo=2026-05-20" \ -H "Authorization: Bearer $TOKEN"
{
"id": 88312,
"invoiceNumber": 2026301,
"customerId": 412,
"customerName": "Acme Ltd",
"customerOrgno": "556677-8899",
"statusName": "Skickad",
"dateInvoice": "2026-05-01T00:00:00Z",
"dateDue": "2026-05-31T00:00:00Z",
"dateOrder": "2026-04-28T00:00:00Z",
"totalExVat": 12000.00,
"totalVat": 3000.00,
"totalIncVat": 15000.00,
"openAmount": 15000.00,
"paidAmount": 0.00,
"isLate": false,
"isFullyPaid": false,
"currencyIsoCode": "SEK",
"documentType": "invoice"
}/api/v1/sales-invoice-lines
list_sales_invoice_linesIsSales=1-fakturor.{
"from": "2026-01-01T00:00:00Z",
"to": "2026-05-20T00:00:00Z",
"customerId": 412,
"productId": null,
"statusId": null,
"includeNonSales": false,
"pageSize": 100
}
{
"invoiceId": 88312,
"invoiceNumber": 2026301,
"lineId": 410551,
"productNumber": "WID-12",
"description": "Widget, large",
"quantity": 4.0,
"qtyDelivered": 4.0,
"price": 3000.00,
"sumExVat": 12000.00,
"sumIncVat": 15000.00,
"currencyIsoCode": "SEK"
}/api/v1/open-order-lines
list_open_order_linesqtyLeftToDeliver > 0. Filter per kund, produkt eller lager. Sätt includeFullyDelivered=true för att även se färdigleveranser.curl -G "$ASSTIO/api/v1/open-order-lines" \ --data-urlencode "customerId=412" \ -H "Authorization: Bearer $TOKEN"
{
"orderId": 18743,
"orderName": "Webshop order 2026-05",
"lineId": 411099,
"productNumber": "WID-12",
"description": "Widget, large",
"qtyOrdered": 10.0,
"qtyDelivered": 4.0,
"qtyLeftToDeliver": 6.0,
"dateDelivery": "2026-05-25T00:00:00Z",
"customerName": "Acme Ltd",
"statusName": "Bekräftad"
}/api/v1/warehouse-stock
get_warehouse_stockqtyDistributable färdigräknad på servern. pageSize max 200.curl -G "$ASSTIO/api/v1/warehouse-stock" \ --data-urlencode "productId=9921" \ -H "Authorization: Bearer $TOKEN"
{
"productId": 9921,
"productNumber": "WID-12",
"warehouseName": "Main",
"locationName": "A-12-3",
"qtyInStock": 47.0,
"qtyIncoming": 20.0,
"qtyOutgoing": 6.0,
"qtyDistributable": 61.0
// qtyInStock - qtyOutgoing + qtyIncoming
}/api/v1/vendor-prices
list_product_vendor_pricesproductId är obligatorisk. Filter på supplierId och currencyCode.curl -G "$ASSTIO/api/v1/vendor-prices" \ --data-urlencode "productId=9921" \ -H "Authorization: Bearer $TOKEN"
{
"productId": 9921,
"productNumber": "WID-12",
"supplierId": 78,
"supplierName": "Northwind Components AB",
"supplierProductNumber": "NW-W-LRG",
"price": 850.00,
"currencyIsoCode": "SEK",
"leadTimeDays": null,
"validFrom": null,
"validTo": null
}/api/v1/products/find
search_productsq obligatorisk. Returnerar upp till limit kandidater (1–20, default 10) — array, inte PageResponse.curl -G "$ASSTIO/api/v1/products/find" \ --data-urlencode "q=WID" \ --data-urlencode "limit=10" \ -H "Authorization: Bearer $TOKEN"
[
{
"productId": 9921,
"productNumber": "WID-12",
"description": "Widget, large",
"barcode": null,
"isActive": true
}
]/api/v1/customers
list_customersinactive=true för att inkludera inaktiva.curl -G "$ASSTIO/api/v1/customers" \ --data-urlencode "q=Acme" \ -H "Authorization: Bearer $TOKEN"
{
"id": 412,
"contactNumber": 10042,
"name": "Acme Ltd",
"orgno": "556677-8899",
"currencyIsoCode": null,
"inactive": false,
"openOrderCount": 3
}/api/v1/customers/{customerId}
get_customercurl "$ASSTIO/api/v1/customers/412" \ -H "Authorization: Bearer $TOKEN"
{
"id": 412,
"contactNumber": 10042,
"name": "Acme Ltd",
"orgno": "556677-8899",
"creditLimit": 250000.00,
"overdueOrderSum": 4200.00,
"creditStop": false,
"paymentTermName": "30 dagar netto",
"deliveryTermName": "Fritt vårt lager",
"priceListName": "Standard",
"orderCount": 84,
"inactive": false
}/api/v1/purchase-invoice-matches/{invoiceId}
suggest_purchase_invoice_matchesVendorSku, PriceExact, …), variances och isAutoEligible-flagga. Read-only, memory-cachad 30 sek per draft.curl "$ASSTIO/api/v1/purchase-invoice-matches/5012" \ -H "Authorization: Bearer $TOKEN"
{
"invoiceId": 5012,
"tolerances": {
"qtyPercent": 0.02,
"pricePercent": 0.01,
"dateWindowDays": 14,
"autoEligibleScore": 70
},
"suggestions": [{
"invoiceLineIndex": 0,
"productNumber": "PROD-A",
"quantity": 100,
"candidates": [{
"orderId": 9001,
"orderItemId": 88012,
"score": 100,
"reasons": ["VendorSku", "QtyExact", "PriceExact"],
"isAutoEligible": true
}]
}]
}/api/v1/purchase-invoice-matches/{invoiceId}/confirm
invoiceLineIndex. Bokar inte verifikationen — det är fortfarande ett separat manuellt steg.{
"matches": [
{
"invoiceLineIndex": 0,
"orderItemId": 88012,
"invTransactionId": 130045
}
]
}
{
"invoiceId": 5012
}/api/v1/purchase-invoice-matches/{invoiceId}/match-whole-order
{
"orderId": 9001
}
{
"invoiceId": 5012
}Hämta säljorder, fakturarader och lagerstatus med en API-nyckel med behörigheten Läs, utan export eller mellanlager.
"Visa mig de tre största kunderna med förfallna fakturor över 10 000 kr" — Claude anropar list_customers + list_sales_invoices och svarar direkt.
Pollera open-order-lines nattligt och posta i Slack om något ligger över 30 dagar utan delleverans.
Kör vendor-prices för varje aktiv artikel — flagga när bästa pris ligger hos en leverantör ni inte använt på 6 månader.
Be Cursor / Claude generera personliga uppföljningsmejl baserat på kundens specifika orderhistorik från sales-invoice-lines.
Bygg en egen koppling mellan Asstio och ert CRM, BI-verktyg, e-postutskick eller supportverktyg.
Varje anrop bär en API-nyckel eller en inloggningstoken (JWT) i Authorization: Bearer-headern. Bolaget följer med nyckeln eller inloggningen, så ni skickar aldrig något tenant-id.
Användare i Asstios egna webbgränssnitt har redan en token i sessionen. Er in-browser-kod kan läsa den och göra API-anrop direkt.
Skapa en API-nyckel under Inställningar → API-nycklar och skicka den som Authorization: Bearer asstio_…. Nyckeln agerar som en person, med exakt den personens behörigheter, och ändringar som görs med den loggas på personen. Nyckeln visas en gång, och Asstio sparar bara en hash av den. Byt nyckel genom att skapa en ny, flytta integrationen och återkalla den gamla.
Claude Desktop, Cline och liknande loggar in själva via discovery-endpointen (RFC 9728) på https://mcp.asstio.com. Klienter utan OAuth kan få en inloggningstoken inklistrad i sin konfiguration. API-nycklar fungerar inte mot MCP-servern. Skrivande verktyg körs med användarens behörigheter, och Asstio lägger inget eget bekräftelsesteg ovanpå, så det är er MCP-klient som avgör om ni tillfrågas först.
En nyckel är Läs eller Läs och skriv, och valet går inte att ändra efteråt. En nyckel med Läs får 403 på anrop som skriver. Nycklar som agerar som er själva kräver behörigheten api_keys. Den som har user_admin kan låta en nyckel agera som en annan inloggningsanvändare, t.ex. en egen "Power BI"-användare, och ser och återkallar alla bolagets nycklar. En återkallad eller utgången nyckel, eller en nyckel vars person har inaktiverats, slutar fungera inom 60 sekunder.
Inuti v1 gör vi bara additiva ändringar — nya endpoints, nya valbara fält, nya query-parametrar. Existerande fältnamn, typer och default-beteenden ändras inte. Ett undantag görs bara med avsikt och står i ändringsloggen i /llms-api.txt. Hittills finns ett: i september 2026 ändrades skrivanropen för butikens filterinställningar, som bara Asstios MCP-server anropar. Breaking changes landar i v2 på en separat URL-prefix. v1 fortsätter köra tills sista integratorn flyttat över.
Varje response under /api/v1/* bär headern X-Asstio-Api-Version: v1 — pin emot den om ni vill ha försvar mot oavsiktliga uppgraderingar.
De flesta fel returnerar samma struktur — code, message och valfritt traceId. 401 = saknad eller ogiltig token eller nyckel, och för operationerna i OpenAPI-dokumentet alltid med den här strukturen. 403 = giltig token men behörighet saknas, eller en nyckel med Läs på ett skrivande anrop. 404 = id:t finns inte hos bolaget. 429 = MCP:s gräns på 60 anrop per minut är nådd, eller en API-nyckel kunde inte kontrolleras för stunden; försök igen efter Retry-After. 500 = serverfel, utan garanterad body. Några operationer har egna felformat, och OpenAPI-dokumentet anger vilka.
{
"code": "not_found",
"message": "Customer 99999 not found",
"traceId": null
}Skapa en nyckel under Inställningar → API-nycklar och börja i den interaktiva referensen. Säg gärna till vad ni vill bygga, så pekar vi mot rätt endpoints.