{"openapi":"3.1.0","info":{"title":"Taxcalc API","version":"1.0.0-fase1","description":"Beregninger af bilafgifter (registreringsafgift, periodeafgift, fri bil m.fl.) og satssæt fra taxcalc.dk, Dansk Motor Finans A/S. Kald uden nøgle er tilladt med en grænse pr. IP (120 beregninger pr. minut). Med en API-nøgle gælder nøglens egen grænse (standard 120 kald pr. minut, op til 6000), og kald tælles pr. nøgle. Specielle talværdier i resultater (Infinity, NaN, -0 og manglende felter) kodes som {\"$tc\": \"Infinity\"} osv.","contact":{"name":"Dansk Motor Finans A/S","email":"tax@danskmotorfinans.dk","url":"https://www.taxcalc.dk/udviklere"}},"servers":[{"url":"https://api.taxcalc.dk","description":"Produktion"}],"tags":[{"name":"Beregninger"},{"name":"Satser"},{"name":"Status"}],"paths":{"/v1/registration-fee":{"post":{"operationId":"registrationFee","summary":"Registreringsafgift (personbil/varebil)","description":"Registreringsafgift for en ny eller brugt personbil eller varebil.","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"versionYear":{"type":"integer","description":"Satsår (fx 2026). Ukendte år bruger standardsættet."},"vehicleType":{"type":"integer","description":"Køretøjstype: 1 = personbil, 2 = varebil.","enum":[1,2]},"isHighWeight":{"type":"boolean","description":"Varebil over 3.000 kg (kun varebil)."},"isNew":{"type":"boolean","description":"true = ny bil, false = brugt bil."},"taxableValueCustom":{"type":"number","description":"Afgiftspligtig værdi i kr. Ny bil (isNew = true): skal sendes (0 er gyldig; mangler, null eller tom giver 400 ugyldigt-input) og bruges direkte (beregnes ikke ud fra newPrice). Brugt bil: bruges ikke. Sendt værdi skal være et endeligt tal (tal eller numerisk tekst), ellers 400 ugyldigt-input."},"newPrice":{"type":"number","description":"Nypris i kr. inkl. moms."},"tradePrice":{"type":"number","description":"Handelspris i kr. (brugt bil)."},"emissionValue":{"type":"number","description":"CO2-udledning i g/km efter målenormen i emissionUnit."},"emissionUnit":{"type":"integer","description":"Målenorm: 2 = WLTP, 1 = NEDC (omregnes ×1,21), 3 = NEDC-2 (omregnes ×1,1).","enum":[1,2,3]},"electricConsumption":{"type":"number","description":"Elforbrug (Wh/km) for plug-in-hybrider."},"electricRange":{"type":"number","description":"Elektrisk rækkevidde (km) for plug-in-hybrider."},"version":{"type":"integer","description":"Formularversion. Brug 3.","enum":[2,3]}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"versionYear":2027,"vehicleType":1,"isHighWeight":false,"isNew":true,"taxableValueCustom":400000,"newPrice":400000,"tradePrice":400000,"emissionValue":120,"emissionUnit":2,"electricConsumption":0,"electricRange":0,"version":3}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["taxAfterAllDeductions","taxableValue","energyType","baseDeduction"],"properties":{"taxAfterAllDeductions":{"description":"Registreringsafgift i kr. efter alle fradrag."},"taxableValue":{"description":"Afgiftspligtig værdi i kr."},"energyType":{"description":"Energiklasse (tekst)."},"baseDeduction":{"description":"Bundfradrag i kr."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/motorcycle":{"post":{"operationId":"motorcycle","summary":"Motorcykel","description":"Registreringsafgift for en ny eller brugt motorcykel.","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"versionYear":{"type":"integer","description":"Satsår (fx 2026). Ukendte år bruger standardsættet."},"isNew":{"type":"boolean","description":"true = ny, false = brugt."},"taxableValueCustom":{"type":"number","description":"Afgiftspligtig værdi i kr. Ny (isNew = true): skal sendes (0 er gyldig; mangler, null eller tom giver 400 ugyldigt-input) og bruges direkte (beregnes ikke ud fra newPrice). Brugt: bruges ikke. Sendt værdi skal være et endeligt tal (tal eller numerisk tekst), ellers 400 ugyldigt-input."},"newPrice":{"type":"number","description":"Nypris i kr. inkl. moms."},"tradePrice":{"type":"number","description":"Handelspris i kr. (brugt)."},"isElectric":{"type":"boolean","description":"Elmotorcykel."},"version":{"type":"integer","description":"Formularversion. Brug 3.","enum":[2,3]}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"versionYear":2026,"isNew":true,"taxableValueCustom":150000,"newPrice":150000,"tradePrice":150000,"isElectric":false,"version":3}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["taxAfterAllDeductions","taxableValue"],"properties":{"taxAfterAllDeductions":{"description":"Registreringsafgift i kr. efter alle fradrag."},"taxableValue":{"description":"Afgiftspligtig værdi i kr."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/veteran-car":{"post":{"operationId":"veteranCar","summary":"Veteranbil","description":"Registreringsafgift for en veteranbil (laveste af handelspris og afgiftspligtig værdi).","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"versionYear":{"type":"integer","description":"Satsår (fx 2026). Ukendte år bruger standardsættet."},"taxableValueCustom":{"type":"number","description":"Afgiftspligtig værdi i kr."},"newPrice":{"type":"number","description":"Nypris i kr."},"tradePrice":{"type":"number","description":"Handelspris i kr."},"version":{"type":"integer","description":"Formularversion. Brug 3.","enum":[2,3]}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"versionYear":2026,"taxableValueCustom":200000,"newPrice":300000,"tradePrice":200000,"version":3}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["lowestTax","taxFromTradePrice","taxFromTaxableValue"],"properties":{"lowestTax":{"description":"Laveste afgift i kr."},"taxFromTradePrice":{"description":"Beregning ud fra handelsprisen."},"taxFromTaxableValue":{"description":"Beregning ud fra den afgiftspligtige værdi."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/free-car-tax":{"post":{"operationId":"freeCarTax","summary":"Beskatning af fri bil","description":"Skat af fri bil pr. år og måned (satser for 2021–2027).","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"year":{"type":"integer","description":"Indkomstår (2021–2027). Andre år giver intet-resultat (422)."},"taxBasis":{"type":"number","description":"Beregningsgrundlag i kr. (bilens værdi)."},"ownershipTax":{"type":"number","description":"Ejerafgift/vægtafgift pr. år i kr."},"taxMargin":{"type":"number","description":"Marginalskat i procent (fx 42)."}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"year":2026,"taxBasis":400000,"ownershipTax":2000,"taxMargin":42}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["totalGrossTax","monthlyGrossTax","monthlyNetTax"],"properties":{"totalGrossTax":{"description":"Skattepligtig værdi pr. år i kr."},"monthlyGrossTax":{"description":"Skattepligtig værdi pr. måned i kr."},"monthlyNetTax":{"description":"Skat pr. måned i kr. efter marginalskat."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/period-tax":{"post":{"operationId":"periodTax","summary":"Periodeafgift","description":"Periodeafgift ved leasing (inkl. rente af restafgift pr. halvår).","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"registrationFee":{"type":"number","description":"Fuld registreringsafgift i kr."},"leasingPeriodInMonths":{"type":"integer","description":"Leasingperiode i måneder."},"vehicleAgeInMonths":{"type":"integer","description":"Bilens alder i måneder ved start."},"wasInterrupted":{"type":"boolean","description":"Er leasingen afbrudt før tid?"},"leasingPeriodRunWhenInterrupted":{"type":"integer","description":"Antal kørte måneder ved afbrydelse."},"beregningsdato":{"type":"string","description":"Valgfri dato (YYYY-MM-DD) for renteopslaget. Standard: i dag (dansk tid).","format":"date"}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"registrationFee":100000,"leasingPeriodInMonths":12,"vehicleAgeInMonths":24,"wasInterrupted":false,"leasingPeriodRunWhenInterrupted":0}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["full","interestOfRestTaxRate"],"properties":{"full":{"description":"Periodeafgift for hele perioden."},"interestOfRestTaxRate":{"description":"Rente af restafgift (decimal, fx 0.038)."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/new-price":{"post":{"operationId":"newPrice","summary":"Nypris","description":"Vejledende udsalgspris inkl. ekstraudstyr.","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"newPriceWithoutEquipment":{"type":"number","description":"Nypris uden ekstraudstyr i kr."},"equipmentPrice":{"type":"number","description":"Ekstraudstyr i kr."},"technicalNewPrice":{"type":"number","description":"Teknisk nypris i kr. (valgfri)."}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"newPriceWithoutEquipment":300000,"equipmentPrice":20000,"technicalNewPrice":310000}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["totalSalesPrice"],"properties":{"totalSalesPrice":{"description":"Vejledende udsalgspris inkl. ekstraudstyr i kr."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/trade-price":{"post":{"operationId":"tradePrice","summary":"Handelspris","description":"Handelspris ud fra sammenlignelige annoncer (højst 50).","tags":["Beregninger"],"security":[{},{"bearer":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"type":"object","properties":{"firstRegDate":{"type":"string","description":"Første registreringsdato (ISO 8601).","format":"date-time"},"mileage":{"type":"number","description":"Kilometerstand."},"equipmentPrice":{"type":"number","description":"Ekstraudstyr i kr."},"qualityId":{"type":"integer","description":"Stand: 1 = under middel (−2 %), 2 = middel, 3 = over middel (+2 %).","enum":[1,2,3]},"specialUseId":{"type":"integer","description":"Særlig anvendelse: 0 = nej, 1 = ja.","enum":[0,1]},"adverts":{"type":"array","maxItems":50,"items":{"type":"object","properties":{"firstRegDate":{"type":"string","format":"date-time"},"mileage":{"type":"number"},"salesPrice":{"type":"number"},"equipmentPrice":{"type":"number"},"vehicleSold":{"type":"boolean"},"advertActive":{"type":"boolean"}}},"description":"Sammenlignelige annoncer."}},"additionalProperties":false},"kontekst":{"type":"object","description":"Valgfri. nu = tidspunkt (unix-ms) for beregningen; tidszone (standard Europe/Copenhagen).","properties":{"nu":{"type":"number"},"tidszone":{"type":"string"}}}}},"example":{"input":{"firstRegDate":"2022-03-01T00:00:00.000Z","mileage":45000,"equipmentPrice":10000,"qualityId":2,"specialUseId":0,"adverts":[{"firstRegDate":"2022-01-15T00:00:00.000Z","mileage":50000,"salesPrice":250000,"equipmentPrice":8000,"vehicleSold":false,"advertActive":true},{"firstRegDate":"2021-11-01T00:00:00.000Z","mileage":60000,"salesPrice":235000,"equipmentPrice":12000,"vehicleSold":true,"advertActive":false}]}}}}},"responses":{"200":{"description":"Beregningen lykkedes.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/Reset"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BeregningOk"},{"type":"object","properties":{"resultat":{"type":"object","additionalProperties":true,"required":["finalTradePriceTotal","tradingPriceTotal"],"properties":{"finalTradePriceTotal":{"description":"Handelspris i kr."},"tradingPriceTotal":{"description":"Gennemsnitlig handelspris for annoncerne i kr."}}}}}]}}}},"400":{"description":"Ugyldigt input (fx ugyldig JSON, forkert type, eller taxableValueCustom mangler ved ny bil eller ikke er et endeligt tal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UgyldigtInput"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"422":{"description":"Beregningen gav intet resultat eller en fejl (fx fri bil for et år uden satser).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeregningUdfald"}}}},"429":{"description":"For mange kald (pr. nøgle eller pr. IP uden nøgle).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}},"headers":{"Retry-After":{"description":"Sekunder før næste forsøg: med nøgle til næste minut, uden nøgle 60 (IP-grænsens vindue).","schema":{"type":"integer"}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/rate-sets":{"get":{"operationId":"rateSets","summary":"Satssæt","description":"Alle satssæt, fælles regler og rente af restafgift pr. halvår (som de bruges i beregningerne i dag).","tags":["Satser"],"security":[{},{"bearer":[]},{"apiKey":[]}],"responses":{"200":{"description":"Satssæt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Satssaet"}}}},"401":{"description":"Ugyldig, ukendt eller slettet API-nøgle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Unauthorized","besked":"Ugyldig API-nøgle."}}}}},"403":{"description":"API-nøglen er deaktiveret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"Forbidden","besked":"API-nøglen er deaktiveret."}}}}},"429":{"description":"For mange kald for nøglen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"RateLimit","besked":"For mange forespørgsler. Prøv igen om lidt."}}}}},"503":{"description":"API-nøglen kunne ikke kontrolleres lige nu (fail closed). Prøv igen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fejl"},"example":{"status":"fejl","fejl":{"navn":"ServiceUnavailable","besked":"Prøv igen om lidt."}}}}}}}},"/v1/health":{"get":{"operationId":"health","summary":"Status","tags":["Status"],"security":[{}],"responses":{"200":{"description":"Tjenesten kører.","content":{"application/json":{"schema":{"type":"object","required":["tjeneste","engineVersion"],"properties":{"tjeneste":{"type":"string"},"engineVersion":{"type":"string"},"commit":{"type":"string"}}}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Authorization: Bearer tc_<prefix>_<hemmelighed>"},"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"}},"headers":{"Limit":{"description":"Nøglens grænse (kald pr. minut). Kun ved kald med nøgle.","schema":{"type":"integer"}},"Remaining":{"description":"Kald tilbage i det aktuelle minut. Kun ved kald med nøgle.","schema":{"type":"integer"}},"Reset":{"description":"Unix-tid (sekunder), hvor minuttet nulstilles. Kun ved kald med nøgle.","schema":{"type":"integer"}}},"schemas":{"Fejl":{"type":"object","required":["status","fejl"],"properties":{"status":{"const":"fejl"},"fejl":{"type":"object","required":["navn","besked"],"properties":{"navn":{"type":"string"},"besked":{"type":"string"}}}}},"UgyldigtInput":{"type":"object","required":["status","besked"],"properties":{"status":{"const":"ugyldigt-input"},"besked":{"type":"string"}}},"BeregningOk":{"type":"object","required":["status","resultat","engineVersion","rateSetId"],"properties":{"status":{"const":"ok"},"resultat":{"type":"object"},"engineVersion":{"type":"string"},"rateSetId":{"type":"string"},"rente":{"type":["object","null"],"description":"Kun periodeafgift: renteversion, dato og sats."}}},"BeregningUdfald":{"type":"object","required":["status","fejl","engineVersion"],"properties":{"status":{"enum":["fejl","intet-resultat"]},"fejl":{"type":"object","properties":{"navn":{"type":"string"},"besked":{"type":"string"}}},"engineVersion":{"type":"string"},"rateSetId":{"type":"string"}}},"Satssaet":{"type":"object","required":["engineVersion","satssaet","faelles","renteAfRestafgift"],"properties":{"engineVersion":{"type":"string"},"satssaet":{"type":"array","items":{"type":"object"}},"faelles":{"type":"object"},"renteAfRestafgift":{"type":"array","items":{"type":"object"}}}}}}}