# REST-API

> HTTP-ytan för skript och integrationer: endpoints med parametrar och svarsformat, vad som bara finns över MCP, och vad som är spärrat för maskiner.
> Källa: https://astrid.so/utvecklare/api · Uppdaterad 2026-08-18

MCP är förstahandsvalet för agenter. REST-API:et finns för skript, egna
integrationer och allt som inte talar MCP. Bakom båda ligger samma tjänstelager:
en endpoint här och motsvarande MCP-verktyg returnerar samma data.

Basadress: `https://astrid.so`. Alla svar är JSON. Paginerade listor svarar
`{ "data": [...], "total": n, "page": n, "totalPages": n }` och tar `page` och
`limit` som frågeparametrar (`limit` 1 till 100, standard 50).

En ärlighet om stabilitet: MCP-verktygen är det kontrakt vi vårdar. REST-svaren
delar form med webbappen och kan få nya fält över tid, så ignorera fält du inte
känner igen i stället för att anta att listan är komplett.

## Autentisering

Samma API-nyckel som MCP-servern använder:

```
Authorization: Bearer astrid_sk_…
```

Nyckeln bär organisationen, så det finns ingen parameter för org-id någonstans.
Roller, planer och gränser fungerar precis som i [Anslut en agent](/utvecklare/anslut).
Alla läs-endpoints fungerar med både läsnyckel och föreslå-nyckel.

## Det här finns bara över MCP

REST har ingen motsvarighet till följande. Leta inte efter en endpoint, använd
[verktyget](/utvecklare/verktyg):

| Vill du ha | MCP-verktyg |
|---|---|
| Ekonomisk översikt: likviditet, momsskuld, resultat | `get_overview` |
| Momsrapport (SKV 4700) | `get_moms_report` |
| Bokföringsstatus i ett svep | `get_bookkeeping_status` |
| Köra en ny genomgång | `get_genomgang` |
| Föreslå en verifikation | `propose_verification` |

## Läsa

### `GET /api/transactions?view=todo`

Den riktiga att-bokföra-kön: avstämda rader är dolda och rader som redan har ett
förslag i granskningskön är flaggade.

| Parameter | Värde |
|---|---|
| `view` | `todo`. Utelämnar du den får du råa listan där avstämda rader ingår, och den som konterar råa listan föreslår dubbelt |
| `limit` | 1 till 100, standard 50 |

```json
{
  "data": [
    {
      "id": "…",
      "date": "2026-08-12",
      "description": "GOOGLE CLOUD EMEA",
      "amount": -1234.5,
      "currency": "SEK",
      "bankAccount": "Företagskonto",
      "pendingReview": false
    }
  ],
  "view": "todo"
}
```

Råa listan (`view` utelämnad) tar `status`, `page` och `limit` och svarar med
det paginerade standardformatet.

### `GET /api/journal`

Bokförda verifikationer, paginerat standardformat.

| Parameter | Värde |
|---|---|
| `series` | Verifikationsserie, till exempel `A` |
| `from`, `to` | `ÅÅÅÅ-MM-DD` |
| `page`, `limit` | Standardpaginering |

Varje rad: `id`, `voucherNumber` (till exempel `"A0052"`), `series`, `date`,
`description`, `status`, `totalDebit`, `lineCount`, samt `correctsEntryId` och
`replacesEntryId` när verifikationen ingår i en rättelsekedja.

### `GET /api/journal/{id}`

En verifikation med alla rader (konto och kontonamn), kostnadsställen och
underlag. `id` från listan ovan.

### `GET /api/review`

Granskningskön. Svarar `{ "data": [...] }`.

| Parameter | Värde |
|---|---|
| `status` | `PENDING` (standard), `APPROVED`, `REJECTED` eller `MODIFIED` |

### `GET /api/underlag/missing`

Bokförda utbetalningar som saknar kvitto eller faktura. Grunden för
[kvittojakt](/utvecklare/arbetsfloden). Utan parametrar: innevarande
räkenskapsår.

| Parameter | Värde |
|---|---|
| `from`, `to` | `ÅÅÅÅ-MM-DD` |
| `limit` | 1 till 200 |

```bash
curl -s "https://astrid.so/api/underlag/missing" \
  -H "Authorization: Bearer $ASTRID_API_KEY"
```

```json
{
  "period": { "from": "2026-01-01", "to": "2026-12-31" },
  "total": 4,
  "hasMore": false,
  "matchedToVendor": 3,
  "rows": [
    {
      "transactionId": "…",
      "date": "2026-07-03",
      "description": "GOOGLE CLOUD EMEA",
      "amount": -1234.5,
      "vendor": {
        "id": "google",
        "name": "Google",
        "portalUrl": "https://…",
        "steps": ["…"],
        "agentPlaybook": "…"
      }
    }
  ]
}
```

`vendor` är `null` för okända mottagare. Följer du en `agentPlaybook`: endast
fakturerings- och kvittosidor i användarens egen inloggade webbläsare, aldrig
kontoinställningar, aldrig inloggningsuppgifter.

### Övriga läsningar

| Endpoint | Ger |
|---|---|
| `GET /api/receipts` | De 100 senaste kvittona med kopplad transaktion. Inga parametrar |
| `GET /api/invoices` | Kundfakturor. `type`, `status`, `q` (sök), standardpaginering |
| `GET /api/invoices/{id}` | En faktura med alla rader. Motsvarar MCP-verktyget `get_invoice` |
| `GET /api/customers` | Alla kunder, namnsorterade. Inga parametrar |
| `GET /api/genomgang` | Senast körda genomgången, eller `null` om ingen körts. Vill du köra en ny: MCP-verktyget `get_genomgang` |
| `GET /api/radgivning` | Deadlines, 3:12, preliminärskatt. Inga parametrar |
| `GET /api/dashboard` | Bokföringsstatistik: antal transaktioner, andel bokförda, poster i Granska, senaste transaktioner |

## Ladda upp underlag

Den enda skrivoperation som är fullt öppen för en nyckel, eftersom ett arkiverat
dokument är ett underlag och inte ett beslut.

```bash
curl -s -X POST https://astrid.so/api/receipts \
  -H "Authorization: Bearer $ASTRID_API_KEY" \
  -F "file=@faktura.pdf" \
  -F "transactionId=<transactionId>" \
  -F "src=agent"
```

| Fält | Krav | Värde |
|---|---|---|
| `file` | Ja | pdf, jpeg, png, webp eller gif. Max 10 MB |
| `transactionId` | Nej, men skicka den när du vet | Transaktionen dokumentet är underlag för, från `/api/underlag/missing`. Riktad koppling, ingen gissning på servern |
| `src` | Ja för agenter | `agent`. Attribution i revisionsloggen |
| `userNote` | Nej | Kort anteckning om dokumentet |

Kräver föreslå-nyckel (`MEMBER`); en läsnyckel får 403. Uppladdningen kör
AI-avläsning och räknas mot samma budget som MCP:s AI-verktyg, 20 anrop per
timme. Originalet arkiveras alltid innan det tolkas, enligt Bokföringslagen.

## Vad som är spärrat för nycklar

Följande avvisas med `403` för alla API-nycklar, oavsett roll. Det är
human-review-always genomdriven i tjänstelagret, inte i klienten.

| Endpoint | Svar |
|---|---|
| `PATCH /api/review` | `Granskningsbeslut kräver en inloggad användare, inte en API-nyckel` |
| `POST /api/journal` | `Bokföring kräver en inloggad användare, inte en API-nyckel` |
| `POST /api/journal/{id}/ratta` | `Bokföring kräver en inloggad användare, inte en API-nyckel` |
| `POST /api/genomgang` | `Genomgång via API-nyckel körs genom MCP-endpointen (utan AI-narrativ).` |
| `POST /api/invoices` | `Fakturering kräver en inloggad användare, inte en API-nyckel` |
| `POST /api/receipts/{id}/book` | `Bokföring från kvitto stöds inte via API-nyckel` |
| `POST /api/receipts/{id}/attach` | `Koppling av kvitto stöds inte via API-nyckel` |
| `DELETE /api/receipts/{id}` | `Borttagning av kvitto stöds inte via API-nyckel` |

Det finns ingen kringgång, ingen flagga och ingen behörighetsnivå som öppnar
dem. Föreslå i stället: `propose_verification` över MCP, eller
`POST /api/receipts` med `transactionId`.

`/api/admin/*` avvisar varje `Authorization`-header av princip och är inte en
del av produktytan.

## Fel

| Kod | Betyder |
|---|---|
| `400` | Valideringsfel, meddelande på svenska |
| `401` | Ogiltig eller återkallad nyckel, eller plan utan agentåtkomst |
| `403` | Rollen räcker inte, eller operationen kräver en inloggad människa |
| `404` | Finns inte i den här organisationen |
| `413` | Filen eller begäran är för stor |
| `429` | Timgräns nådd. Rapportera hur långt du kom och stanna |

Felkroppen är `{ "error": "…" }` med ett meddelande skrivet för att läsas och
återges för användaren.

## Skillnad mot MCP

REST ger dig råa endpoints. MCP ger dig samma data plus verktygsbeskrivningar,
reglerna vid anslutningen, färdiga recept, dokumentationen som läsbara resurser
under `astrid://docs/` och kvittojaktens leverantörsplaybooks.

Bygger du en agent: använd MCP. Bygger du en integration eller ett skript:
REST är rätt.
