{
  "openapi": "3.1.0",
  "info": {
    "title": "Smarto jämförelse-API",
    "version": "1.0.0",
    "summary": "Färdigräknad, belagd jämförelse av mobilabonnemang för ett hushåll.",
    "description": "Ett anrop, ingen nyckel. Svaret är Smartos rangordning för hushållet: totalkostnad över 12 och 24 månader, operatör och nät var för sig, täckning i vald kommun (PTS), villkor, verifieringsdatum och köplänk. Priserna läses från operatörernas egna sidor. Ett okänt läge skrivs ut som \"unknown\". Grupppriser tas bara med när parametern grupp anges. Operatörens ersättning till Smarto påverkar aldrig ordningen.\n\nVillkor: https://www.smarto.se/om/datavillkor — ange Smarto som källa med länk och verifieringsdatum, och använd köplänkarna oförändrade.",
    "contact": {
      "email": "info@smarto.se",
      "url": "https://www.smarto.se/data-och-metod/api"
    },
    "license": {
      "name": "Villkor för Smartos data",
      "url": "https://www.smarto.se/om/datavillkor"
    }
  },
  "externalDocs": {
    "description": "Fältförklaringar och beräkningsregler",
    "url": "https://www.smarto.se/data-och-metod/api"
  },
  "servers": [
    {
      "url": "https://www.smarto.se"
    }
  ],
  "paths": {
    "/api/jamfor": {
      "get": {
        "operationId": "jamfor",
        "summary": "Jämför mobilabonnemang för ett hushåll",
        "description": "Surfkravet per person är behovet × 1,2, avrundat uppåt. Sorteras på pris över vald period; med kommun flyttas abonnemang på nät med svagare täckning i kommunen ner (10 Mbit/s inomhus, PTS). Svaret innehåller alltid båda horisonterna.",
        "parameters": [
          {
            "name": "gb",
            "in": "query",
            "required": true,
            "description": "Behov per person i GB per månad, kommaseparerat. Antalet värden är antalet personer (1–8). \"obegransad\" tillåts.",
            "schema": {
              "type": "string"
            },
            "example": "13,12,9,2"
          },
          {
            "name": "kommun",
            "in": "query",
            "required": false,
            "description": "SCB:s kommunkod eller kommunens namn som i Smartos adresser. Styr täckningssorteringen. Utan kommun: ren prissortering och inget fält tackning.",
            "schema": {
              "type": "string"
            },
            "examples": {
              "kod": {
                "value": "0182"
              },
              "namn": {
                "value": "nacka"
              }
            }
          },
          {
            "name": "period",
            "in": "query",
            "required": false,
            "description": "Horisonten i månader som styr sorteringen.",
            "schema": {
              "type": "integer",
              "enum": [
                12,
                24
              ],
              "default": 12
            }
          },
          {
            "name": "bindning",
            "in": "query",
            "required": false,
            "description": "\"ingen\" utesluter allt med bindningstid.",
            "schema": {
              "type": "string",
              "enum": [
                "tillaten",
                "ingen"
              ],
              "default": "tillaten"
            }
          },
          {
            "name": "nat",
            "in": "query",
            "required": false,
            "description": "Bara abonnemang på det här nätet.",
            "schema": {
              "type": "string",
              "enum": [
                "telia",
                "tele2",
                "telenor",
                "tre"
              ]
            }
          },
          {
            "name": "grupp",
            "in": "query",
            "required": false,
            "description": "Ta med gruppens priser och märk dem. Utan parameter är inga grupppriser med.",
            "schema": {
              "type": "string",
              "enum": [
                "student",
                "under18",
                "over55"
              ]
            }
          },
          {
            "name": "antal",
            "in": "query",
            "required": false,
            "description": "Antal alternativ i svaret.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 5
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Hushållets alternativ, rangordnade.",
            "headers": {
              "Link": {
                "description": "Villkoren, rel=\"license\".",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Jamforsvar"
                }
              }
            }
          },
          "400": {
            "description": "Ogiltig parameter. Feltexten är på svenska.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fel"
                },
                "example": {
                  "fel": "Okänd kommun \"atlantis\". Ange SCB:s fyrsiffriga kommunkod (0182) eller kommunens namn som i adressen (nacka).",
                  "dokumentation": "https://www.smarto.se/data-och-metod/api"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Fel": {
        "type": "object",
        "required": [
          "fel",
          "dokumentation"
        ],
        "properties": {
          "fel": {
            "type": "string"
          },
          "dokumentation": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "Surfkrav": {
        "oneOf": [
          {
            "type": "number"
          },
          {
            "enum": [
              "obegransad"
            ]
          }
        ]
      },
      "Prisperiod": {
        "type": "object",
        "required": [
          "franManad",
          "tillManad",
          "manadsprisSek",
          "typ"
        ],
        "additionalProperties": false,
        "properties": {
          "franManad": {
            "type": "integer"
          },
          "tillManad": {
            "type": [
              "integer",
              "null"
            ],
            "description": "null = gäller tills vidare."
          },
          "manadsprisSek": {
            "type": "number"
          },
          "typ": {
            "enum": [
              "kampanj",
              "ordinarie"
            ],
            "description": "Ett kampanjpris följs alltid av en period med priset därefter."
          }
        }
      },
      "Linje": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "person",
          "kravGb",
          "varumarke",
          "nat",
          "planId",
          "planNamn",
          "surfGb",
          "prisperioder",
          "kampanjGallerTill",
          "engangsavgiftSek",
          "bindningManader",
          "uppsagningstid",
          "euSurf",
          "maxHastighet",
          "grupp",
          "kopLank",
          "sida",
          "verifierad"
        ],
        "properties": {
          "person": {
            "type": "integer"
          },
          "kravGb": {
            "$ref": "#/components/schemas/Surfkrav"
          },
          "varumarke": {
            "type": "string",
            "description": "Operatören som säljer abonnemanget."
          },
          "nat": {
            "enum": [
              "telia",
              "tele2",
              "telenor",
              "tre"
            ],
            "description": "Nätet abonnemanget går i — skilt från operatören."
          },
          "planId": {
            "type": "string"
          },
          "planNamn": {
            "type": "string"
          },
          "surfGb": {
            "$ref": "#/components/schemas/Surfkrav"
          },
          "prisperioder": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Prisperiod"
            }
          },
          "kampanjGallerTill": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kampanjens sista teckningsdag när operatören skriver ut den."
          },
          "engangsavgiftSek": {
            "type": "number"
          },
          "bindningManader": {
            "type": "integer"
          },
          "uppsagningstid": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "lage",
                  "manader"
                ],
                "properties": {
                  "lage": {
                    "enum": [
                      "known"
                    ]
                  },
                  "manader": {
                    "type": "integer"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "required": [
                  "lage"
                ],
                "properties": {
                  "lage": {
                    "enum": [
                      "unknown"
                    ]
                  }
                },
                "additionalProperties": false
              }
            ]
          },
          "euSurf": {
            "description": "EU-surf med samma lägen, form och mappning som katalogexporten (/data/katalog.json): full, capped (med gb), none eller unknown.",
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "lage",
                  "belagg"
                ],
                "properties": {
                  "lage": {
                    "enum": [
                      "full",
                      "none",
                      "unknown"
                    ]
                  },
                  "villkor": {
                    "type": "string",
                    "description": "Operatörens villkor för läget, när det finns. Aldrig på unknown."
                  },
                  "belagg": {
                    "type": "object",
                    "required": [
                      "kallaId",
                      "verifierad"
                    ],
                    "properties": {
                      "kallaId": {
                        "type": "string"
                      },
                      "verifierad": {
                        "type": "string"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "required": [
                  "lage",
                  "gb",
                  "belagg"
                ],
                "properties": {
                  "lage": {
                    "enum": [
                      "capped"
                    ]
                  },
                  "gb": {
                    "type": "number"
                  },
                  "villkor": {
                    "type": "string",
                    "description": "Operatörens villkor för läget, när det finns. Aldrig på unknown."
                  },
                  "belagg": {
                    "type": "object",
                    "required": [
                      "kallaId",
                      "verifierad"
                    ],
                    "properties": {
                      "kallaId": {
                        "type": "string"
                      },
                      "verifierad": {
                        "type": "string"
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              }
            ]
          },
          "maxHastighet": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "lage"
                ],
                "properties": {
                  "lage": {
                    "enum": [
                      "inget-tak",
                      "unknown"
                    ]
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "required": [
                  "lage",
                  "mbit"
                ],
                "properties": {
                  "lage": {
                    "enum": [
                      "tak"
                    ]
                  },
                  "mbit": {
                    "type": "number"
                  }
                },
                "additionalProperties": false
              }
            ]
          },
          "grupp": {
            "type": [
              "string",
              "null"
            ],
            "description": "Prisgruppen när priset bara gäller den."
          },
          "kopLank": {
            "type": "string",
            "description": "Använd oförändrad."
          },
          "sida": {
            "type": [
              "string",
              "null"
            ],
            "description": "Abonnemangets sida på Smarto."
          },
          "verifierad": {
            "type": "string",
            "description": "Datumet priset senast kontrollerades mot operatörens sida."
          }
        }
      },
      "Tackning": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kommun",
          "matt",
          "perNat",
          "klass",
          "kalla",
          "sida"
        ],
        "properties": {
          "kommun": {
            "type": "string"
          },
          "matt": {
            "enum": [
              "mbit10_inomhus"
            ]
          },
          "perNat": {
            "type": "object",
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "number"
                },
                {
                  "enum": [
                    "unknown"
                  ]
                }
              ]
            },
            "description": "Andel av kommunens yta, 0–1."
          },
          "klass": {
            "enum": [
              "likvardig",
              "svagare",
              "svagt"
            ],
            "description": "Mot kommunens bästa nät: minst 90 %, minst 75 %, under 75 %."
          },
          "kalla": {
            "enum": [
              "PTS"
            ]
          },
          "sida": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Alternativ": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "rang",
          "typ",
          "rubrik",
          "totalkostnadSek",
          "manadsprisSek",
          "verifierad",
          "linjer",
          "flyttadNerForTackning"
        ],
        "properties": {
          "rang": {
            "type": "integer"
          },
          "typ": {
            "enum": [
              "familj",
              "var-for-sig-blandat",
              "var-for-sig-samma-operator"
            ]
          },
          "rubrik": {
            "type": "string"
          },
          "totalkostnadSek": {
            "type": "object",
            "required": [
              "12",
              "24"
            ],
            "properties": {
              "12": {
                "type": "number"
              },
              "24": {
                "type": "number"
              }
            },
            "additionalProperties": false
          },
          "manadsprisSek": {
            "type": "object",
            "required": [
              "forsta",
              "darefter"
            ],
            "properties": {
              "forsta": {
                "type": "number"
              },
              "darefter": {
                "type": "number"
              }
            },
            "additionalProperties": false
          },
          "verifierad": {
            "type": "string",
            "description": "Äldsta verifieringsdatumet bland alternativets priser."
          },
          "linjer": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Linje"
            }
          },
          "tackning": {
            "$ref": "#/components/schemas/Tackning"
          },
          "flyttadNerForTackning": {
            "type": "boolean",
            "description": "Sant när alternativet står lägre än priset ensamt hade satt det, för att nätet når sämre i kommunen."
          }
        }
      },
      "Jamforsvar": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "fraga",
          "antaganden",
          "genererad",
          "alternativ",
          "ejRaknade",
          "kalla"
        ],
        "properties": {
          "fraga": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "gb",
              "kommun",
              "period",
              "bindning",
              "nat",
              "grupp",
              "antal"
            ],
            "properties": {
              "gb": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Surfkrav"
                }
              },
              "kommun": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "SCB:s kommunkod."
              },
              "period": {
                "enum": [
                  12,
                  24
                ]
              },
              "bindning": {
                "enum": [
                  "tillaten",
                  "ingen"
                ]
              },
              "nat": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "grupp": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "antal": {
                "type": "integer"
              }
            }
          },
          "antaganden": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "genererad": {
            "type": "string"
          },
          "alternativ": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Alternativ"
            }
          },
          "ejRaknade": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "erbjudande",
                "varumarke",
                "skal"
              ],
              "properties": {
                "erbjudande": {
                  "type": "string"
                },
                "varumarke": {
                  "type": "string"
                },
                "skal": {
                  "type": "string"
                }
              }
            }
          },
          "kalla": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "namn",
              "url",
              "villkor",
              "attribution"
            ],
            "properties": {
              "namn": {
                "enum": [
                  "Smarto"
                ]
              },
              "url": {
                "type": "string"
              },
              "villkor": {
                "type": "string"
              },
              "attribution": {
                "type": "string"
              },
              "avvikelse": {
                "type": "string",
                "description": "Varför sidan i url inte visar exakt samma urval som svaret, till exempel när sidan har en gemensam surfnivå för alla personer. Utelämnas när sidan återskapar frågan."
              }
            }
          }
        }
      }
    }
  }
}
