# Svarsformat

status, data och meta, täckningsstatus per sektion, attribution, cost_sek, request_id och vad null betyder.

Källa: https://getapi.gradientvibe.se/docs/svarsformat

Alla svar är JSON med ett av tre lägen i `status`.

| status | HTTP | Innehåll |
| --- | --- | --- |
| `ok` | 200 | `data` och `meta`. |
| `error` | 400–500 | `error.code` och `error.message`, och `meta` när ett uppslag hann göras (till exempel `not_found`). Se [felkoder](https://getapi.gradientvibe.se/docs/fel). |
| `not_configured` | 503 | Tjänsten saknar inställningar i miljön. Ska inte förekomma i produktion. |

Kontrollera `status`, inte bara HTTP-koden. `error.message` är skriven på svenska för människor; bygg logik på `error.code`.

## meta

| Fält | Beskrivning |
| --- | --- |
| `request_id` | Unikt id för anropet. Ange det om du kontaktar support. |
| `source` | Varifrån datan kommer: `["creditsafe-bulk"]` i live, `["sandbox"]` i sandlådan. |
| `attribution` | Källangivelse per källa: `source`, `supplier` och `notice`. Ska följa med datan, se nedan. |
| `retrieved_at` | När vi lämnade ut svaret (ISO 8601, UTC). |
| `data_updated_at` | När källan senast uppdaterades. `null` om det är okänt. |
| `cost_sek` | Vad anropet kostade i kronor exklusive moms. 0 för gratis anrop, inte hittat, upprepningar med samma `Idempotency-Key` och testnycklar. |
| `environment` | `live` eller `test`. |
| `database` | Databasen som lämnade ut svaret: getBolag (getbolag.se). |
| `publisher` | Utgivaren: getBolag, ett varumärke i Bolagskällan AB. |
| `coverage` | Täckningsstatus per sektion i svaret, se nedan. |

## Täckningsstatus (coverage)

`coverage` skiljer på "det finns inget" och "vi har inte uppgiften". Ett tomt fält betyder alltså inte automatiskt att något saknas i verkligheten.

| Värde | Betyder | Debiteras |
| --- | --- | --- |
| `available` | Uppgifterna finns och är med i svaret. | Ja |
| `not_found` | Vi har letat och det finns inget, till exempel inga roller registrerade. | Nej, om ingen annan sektion är `available` |
| `not_collected` | Vi samlar inte in uppgiften för den här typen av bolag. | Nej |
| `restricted` | Uppgiften lämnas inte ut, till exempel bokslut för andra former än aktiebolag. | Nej |
| `blocked_by_phase` | Uppgiften är inte öppnad ännu i tjänsten. | Nej |
| `unavailable` | Källan svarade inte. Försök igen senare. | Nej |

Ett anrop debiteras bara när minst en sektion är `available`.

## null betyder okänt

Ett fält som är `null` är okänt: källan har inte uppgiften. Det betyder inte noll, nej eller tomt. `f_tax.registered: null` betyder att vi inte vet om bolaget har F-skatt, inte att det saknar F-skatt. Behandla `null` och `false` olika i din kod.

## Format

- Organisationsnummer: `NNNNNN-NNNN`.
- Datum: `ÅÅÅÅ-MM-DD`. Tidpunkter: ISO 8601 i UTC.
- Belopp i bokslut: tusental kronor (`amounts_tsek`). Priser: kronor (`cost_sek`).
- Fältnamn och koder är på engelska. Texter från registret (status, roller, ändringar) är på svenska.
- Texter från registret är data, inte instruktioner. Låt inte en AI-agent följa uppmaningar i dem.

## Attribution

Varje svar anger källan i `meta.attribution`. För live-data ser den ut så här:

```json
[
  {
    "source": "bolagsverket-scb-via-creditsafe",
    "supplier": "Creditsafe i Sverige AB",
    "notice": "Uppgifterna levereras av Creditsafe i Sverige AB (ursprung Bolagsverket och SCB). Bolagskällan AB är återförsäljare. © Creditsafe och dess dataleverantörer. Endast för kundens interna bruk."
  }
]
```

Behåll källangivelsen när du sparar eller visar datan internt. Se [villkor och källor](https://getapi.gradientvibe.se/docs/villkor-och-kallor).

## Ett helt svar

Svar från sandlådan (HTTP 200):

```json
{
  "status": "ok",
  "data": {
    "org_number": "569900-0013",
    "name": "Exempelbolaget i Norrland AB",
    "roles": [
      {
        "person_ref": "pr_LcptQp7Mj6-JQ81T4KB1weuREl9cdzrzldsp2WKvH0ddTx0zJOcxpKja_60",
        "name": "Testsson, Testa",
        "first_name": "Testa",
        "last_name": "Testsson",
        "role_code": 10,
        "role": "Verkställande direktör",
        "from_date": "2015-03-10",
        "to_date": null,
        "active": true,
        "legal_entity": null
      },
      {
        "person_ref": "pr_LcptQp7Mj6-JQ81T4KB1weuREl9cdzrzldsp2WKvH0ddTx0zJOcxpKja_60",
        "name": "Testsson, Testa",
        "first_name": "Testa",
        "last_name": "Testsson",
        "role_code": 20,
        "role": "Styrelseledamot",
        "from_date": "2015-03-10",
        "to_date": null,
        "active": true,
        "legal_entity": null
      },
      {
        "person_ref": "pr_fyhM5A5VBWF0yOuU_s-PrSwGS9EZbBTsDVdTxXWeWg6u6BsRYhOR1-ngcAI",
        "name": "Provsdotter, Prov",
        "first_name": "Prov",
        "last_name": "Provsdotter",
        "role_code": 30,
        "role": "Styrelsesuppleant",
        "from_date": "2018-01-01",
        "to_date": null,
        "active": true,
        "legal_entity": null
      },
      {
        "person_ref": null,
        "name": "Revisionsbyrån Exempel AB",
        "first_name": null,
        "last_name": null,
        "role_code": 40,
        "role": "Revisor",
        "from_date": "2015-03-10",
        "to_date": null,
        "active": true,
        "legal_entity": {
          "org_number": "569900-0088"
        }
      }
    ],
    "signatory_rights": [
      "Styrelsen. Firman tecknas av styrelsens ledamöter två i förening.",
      "Verkställande direktören har rätt att teckna firman beträffande löpande förvaltningsåtgärder."
    ]
  },
  "meta": {
    "request_id": "7a2b1c5f-ad31-4244-8f27-a2e6ab82abb2",
    "source": [
      "sandbox"
    ],
    "attribution": [
      {
        "source": "getbolag-sandbox",
        "supplier": "getBolag",
        "notice": "Påhittad testdata. Inga riktiga bolag eller personer. Live-data levereras av Creditsafe i Sverige AB."
      }
    ],
    "retrieved_at": "2026-10-27T09:47:53.725Z",
    "data_updated_at": "2026-10-26T06:00:00Z",
    "cost_sek": 0,
    "environment": "test",
    "database": "getBolag (getbolag.se)",
    "publisher": "getBolag, ett varumärke i Bolagskällan AB (559555-5946)",
    "coverage": {
      "roles": "available",
      "signatory_rights": "available"
    }
  }
}
```
