{"openapi":"3.1.0","info":{"title":"CVR Lookup API","version":"1.0.0","description":"REST API for danske virksomhedsdata fra Det Centrale Virksomhedsregister (CVR). Slå virksomheder og personer op, søg på navn, og følg dit forbrug. Alle planer — også Gratis — har API-adgang; kvoten er månedlig og suppleres af en pr.-minut grænse."},"servers":[{"url":"https://cvrlookup.dk"}],"security":[{"bearerAuth":[]}],"paths":{"/api/v1/company/search":{"get":{"operationId":"companySearch","summary":"Søg virksomheder (navn)","description":"Søg på virksomhedsnavn og få virksomhedernes identitet tilbage (CVR, navn, adresse, status, branche) — nok til at disambiguere og slå videre op. Tilgængelig på alle planer, også Gratis. Dette er det anbefalede endpoint til navnesøgning.\n\n- Søgningen tæller som 1 kvote-enhed mod den månedlige kvote og pr.-minut grænsen — samme søgestreng gentaget samme dag er gratis.\n- Ugyldig 'limit' eller 'offset' (ikke-numerisk eller uden for grænserne) afvises med 400 INVALID_REQUEST.\n- Svaret er identitetsdata — brug 'GET /api/v1/company/{cvr}' for fulde detaljer, eller 'GET /api/v1/search/advanced' (Basic/Pro) for fulde objekter direkte i søgningen.\n\n**Data-felter:**\n- `companies[].cvr` (string): 8-cifret CVR-nummer.\n- `companies[].companyName` (string): Officielt virksomhedsnavn.\n- `companies[].status` (\"ACTIVE\" | \"DISSOLVED\" | \"BANKRUPTCY\" | \"RECONSTRUCTION\" | \"UNKNOWN\"): Normaliseret status.\n- `companies[].isActive` (boolean): Hurtig flag for aktiv-status.\n- `companies[].address.city` (string?): Postdistrikt / by.\n- `companies[].address.postalCode` (string?): Postnummer.\n- `companies[].address.municipality` (string?): Kommunenavn.\n- `companies[].address.fullAddress` (string?): Sammenfletning af adressefelter.\n- `companies[].industry.code` (string?): Branchekode (NACE).\n- `companies[].industry.description` (string?): Branchetekst.\n- `total` (number): Samlet antal matchende virksomheder.\n- `query` (string): Den brugte søgestreng.\n- `limit` (number): Anvendt limit.\n- `offset` (number): Anvendt offset.\n- `took` (number): Eksekveringstid (ms).\n- `meta.page` (number): Aktuel side (1-indekseret).\n- `meta.hasMore` (boolean): Findes der flere resultater?","parameters":[{"name":"q","in":"query","required":true,"description":"Søgetekst — virksomhedsnavn (max 100 tegn). Aliaset 'name' accepteres også.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Antal resultater (1-50).","schema":{"type":"integer","default":10}},{"name":"offset","in":"query","required":false,"description":"Pagination offset (mindst 0).","schema":{"type":"integer","default":0}},{"name":"status","in":"query","required":false,"description":"Filtrer på aktiv-status.","schema":{"type":"string","enum":["all","active","inactive"],"default":"all"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"companies":[{"cvr":"43269070","companyName":"codepilots ApS","status":"ACTIVE","isActive":true,"address":{"city":"Odense C","postalCode":"5000","municipality":"ODENSE","fullAddress":"Kochsgade 31B, 5000 Odense C"},"industry":{"code":"622000","description":"Computerkonsulentbistand og forvaltning af computerfaciliteter"}}],"total":1,"query":"codepilots","limit":10,"offset":0,"took":38},"meta":{"page":1,"limit":10,"total":1,"hasMore":false}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/search/advanced":{"get":{"operationId":"searchAdvanced","summary":"Avanceret søgning","description":"Søg på virksomhedsnavn og få FULDE virksomhedsobjekter tilbage (samme skema som 'GET /api/v1/company/{cvr}') med statusfiltrering og pagination. Kræver Basic eller Pro.\n\n- Kræver Basic eller Pro — på Gratis-planen svares med 403 FORBIDDEN (brug 'GET /api/v1/company/search' i stedet).\n- Søgningen tæller som 1 kvote-enhed mod den månedlige kvote og pr.-minut grænsen — samme søgestreng gentaget samme dag er gratis.\n- Ugyldig 'limit' eller 'offset' (ikke-numerisk eller uden for grænserne) afvises med 400 INVALID_REQUEST.\n\n**Data-felter:**\n- `companies[]` (CVRCompany[]): Fulde virksomhedsobjekter — samme skema som 'GET /api/v1/company/{cvr}'.\n- `total` (number): Samlet antal matchende virksomheder.\n- `query` (string): Den brugte søgestreng.\n- `limit` (number): Anvendt limit.\n- `offset` (number): Anvendt offset.\n- `took` (number): Eksekveringstid (ms).\n- `meta.page` (number): Aktuel side (1-indekseret).\n- `meta.hasMore` (boolean): Findes der flere resultater?","parameters":[{"name":"q","in":"query","required":true,"description":"Søgetekst — virksomhedsnavn (max 100 tegn). Aliaset 'name' accepteres også.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Antal resultater (1-50).","schema":{"type":"integer","default":10}},{"name":"offset","in":"query","required":false,"description":"Pagination offset (mindst 0).","schema":{"type":"integer","default":0}},{"name":"status","in":"query","required":false,"description":"Filtrer på aktiv-status.","schema":{"type":"string","enum":["all","active","inactive"],"default":"all"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"companies":[{"cvr":"43269070","companyName":"codepilots ApS","status":"ACTIVE","isActive":true,"companyType":{"code":80,"shortDescription":"APS","longDescription":"Anpartsselskab"},"address":{"street":"Kochsgade","houseNumber":"31B","postalCode":"5000","city":"Odense C","country":"Danmark","fullAddress":"Kochsgade 31B, 5000 Odense C"},"industry":{"code":"622000","description":"Computerkonsulentbistand og forvaltning af computerfaciliteter"},"shareCapital":{"amount":40000,"currency":"DKK"},"owners":[{"name":"INTERNET FACTORY ApS","role":"Ejer","ownershipShare":"50%","ownershipInterval":{"floor":50,"ceiling":66.66,"label":"50-66,66%"},"entityType":"VIRKSOMHED"}],"foundedDate":"2022-05-17","lastUpdated":"2025-05-21"}],"total":1,"query":"codepilots","limit":10,"offset":0,"took":47},"meta":{"page":1,"limit":10,"total":1,"hasMore":false}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/search":{"get":{"operationId":"search","summary":"Søg virksomheder (legacy)","description":"Ældre kombineret endpoint: søg på virksomhedsnavn (minimal data) eller slå op på et 8-cifret CVR-nummer (fuld data). Begge dele forbruger 1 månedlig kvote-enhed — gentagelser samme dag er gratis. Anvend enten 'name' eller 'cvr'. Til navnesøgning anbefales 'GET /api/v1/company/search' i stedet.\n\n- Navnesøgning er metered som en 'search'-kvote-enhed (månedlig kvote + minut-grænse) — samme søgestreng gentaget samme dag er gratis.\n- Ugyldig 'limit'/'offset' afvises IKKE her: værdier uden for grænserne klippes lempeligt (limit til 1-50, offset til ≥ 0) af hensyn til eksisterende klienter. De nyere søge-endpoints svarer 400 i stedet.\n- Navnesøgning returnerer minimal data — brug 'GET /api/v1/company/{cvr}' for fulde detaljer.\n- CVR-opslag via dette endpoint returnerer fuldt CVRCompany-objekt (samme skema som /company/{cvr}).\n\n**Data-felter:**\n- `companies[].cvr` (string): 8-cifret CVR-nummer.\n- `companies[].companyName` (string): Virksomhedsnavn.\n- `companies[].companyType` (string?): Virksomhedsform (lang eller kort beskrivelse).\n- `companies[].city` (string?): By / postdistrikt.\n- `companies[].isActive` (boolean): Aktiv-status.\n- `total` (number): Samlet antal matchende virksomheder.\n- `query` (string): Den brugte søgestreng.\n- `limit` (number): Anvendt limit.\n- `offset` (number): Anvendt offset.\n- `took` (number): Eksekveringstid (ms).\n- `meta.page` (number): Aktuel side (1-indekseret).\n- `meta.hasMore` (boolean): Findes der flere resultater?","parameters":[{"name":"name","in":"query","required":false,"description":"Søg på virksomhedsnavn (max 100 tegn). Returnerer minimal data. Tæller som 1 kvote-enhed (søgning). (Enten 'name' eller 'cvr')","schema":{"type":"string"}},{"name":"cvr","in":"query","required":false,"description":"8-cifret CVR-nummer. Returnerer fuld virksomhedsdata. Tæller mod månedlig kvote (kun ved første opslag pr. dag). (Enten 'name' eller 'cvr')","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Antal resultater (1-50). Kun relevant for navnesøgning.","schema":{"type":"integer","default":10}},{"name":"offset","in":"query","required":false,"description":"Pagination offset. Kun relevant for navnesøgning.","schema":{"type":"integer","default":0}},{"name":"status","in":"query","required":false,"description":"Filtrer på aktiv-status.","schema":{"type":"string","enum":["all","active","inactive"],"default":"all"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"companies":[{"cvr":"43269070","companyName":"codepilots ApS","companyType":"Anpartsselskab","city":"Odense C","isActive":true}],"total":1,"query":"codepilots","limit":10,"offset":0,"took":42},"meta":{"page":1,"limit":10,"total":1,"hasMore":false}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/company/{cvr}":{"get":{"operationId":"company","summary":"Hent virksomhed efter CVR","description":"Returnerer fulde detaljer for én virksomhed. Forbruger 1 månedlig kvote-enhed pr. unikt CVR pr. dag — gentagne opslag samme dag er gratis.\n\n- Felter markeret med '?' kan være null/undefined hvis CVR-registret ikke har data for dem.\n- Tilføj 'Accept: application/xml' for at få svaret i XML i stedet for JSON.\n\n**Data-felter:**\n- `cvr` (string): 8-cifret CVR-nummer.\n- `companyName` (string): Officielt virksomhedsnavn (nyeste).\n- `tradeNames` (string[]?): Binavne / alternative navne.\n- `status` (\"ACTIVE\" | \"DISSOLVED\" | \"BANKRUPTCY\" | \"RECONSTRUCTION\" | \"UNKNOWN\"): Normaliseret status.\n- `statusText` (string?): Original statustekst fra CVR.\n- `isActive` (boolean): Hurtig flag for aktiv-status.\n- `creditStatus.code` (number?): Kreditoplysningskode.\n- `creditStatus.text` (string?): Kreditoplysningstekst.\n- `companyType.code` (number?): Virksomhedsformskode.\n- `companyType.shortDescription` (string?): Kort beskrivelse, fx \"A/S\".\n- `companyType.longDescription` (string?): Lang beskrivelse, fx \"Aktieselskab\".\n- `address.street` (string?): Vejnavn.\n- `address.houseNumber` (string?): Husnummer.\n- `address.floor` (string?): Etage.\n- `address.door` (string?): Side/dør.\n- `address.postalCode` (string?): Postnummer.\n- `address.city` (string?): Postdistrikt / by.\n- `address.coName` (string?): C/O-navn.\n- `address.municipality` (string?): Kommunenavn.\n- `address.municipalityCode` (number?): Kommunekode.\n- `address.country` (string): Landenavn som API'et returnerer det, fx \"Danmark\".\n- `address.fullAddress` (string?): Sammenfletning af adressefelter.\n- `postalAddress.*` (object?): Separat postadresse hvis forskellig fra beliggenhedsadresse.\n- `industry.code` (string?): Branchekode (NACE).\n- `industry.description` (string?): Branchetekst.\n- `secondaryIndustries[].code` (string?): Sekundære branchekoder.\n- `secondaryIndustries[].description` (string?): Sekundære branchetekster.\n- `employeeInfo.year` (number?): År for senest rapporterede beskæftigelse.\n- `employeeInfo.quarter` (number?): Kvartal (1-4).\n- `employeeInfo.employees` (number?): Antal ansatte.\n- `employeeInfo.employeesIncludingOwners` (number?): Antal inkl. ejere.\n- `employeeInfo.fullTimeEquivalent` (number?): Årsværk.\n- `employeeInfo.employeeInterval` (string?): Intervalkode for ansatte (fx \"10-19\").\n- `contact.phone` (string?): Telefonnummer.\n- `contact.secondaryPhone` (string?): Sekundær telefon.\n- `contact.fax` (string?): Fax.\n- `contact.email` (string?): E-mail.\n- `contact.mandatoryEmail` (string?): Obligatorisk e-mail (digital post).\n- `contact.website` (string?): Hjemmeside.\n- `registrationNumbers` (string[]?): Reg.numre (P-numre, banker mv.).\n- `signatureRule` (string?): Tegningsregel.\n- `owners[].name` (string?): Ejer-navn.\n- `owners[].role` (string?): Rolle.\n- `owners[].address` (string?): Adresse.\n- `owners[].ownershipShare` (string?): Ejerandel — Ejerregisterets interval-BUND (fx \"15%\" for båndet 15-19,99%). Legale ejerandele registreres i lovbestemte intervaller, aldrig som eksakte andele, så summen på tværs af ejere er ofte under 100%.\n- `owners[].votingShare` (string?): Stemmeandel — samme interval-bund-semantik som ownershipShare.\n- `owners[].ownershipInterval` (object?): Det lovbestemte ejerandelsinterval bunden tilhører: { floor: 15, ceiling: 19.99, label: \"15-19,99%\" }. Udelades hvis værdien ikke matcher et kendt interval.\n- `owners[].votingInterval` (object?): Interval for stemmeandel, samme form som ownershipInterval.\n- `owners[].startDate` (string?): Startdato (ISO).\n- `owners[].entityType` (\"PERSON\" | \"VIRKSOMHED\"?): Type af ejer.\n- `owners[].cvr` (string?): CVR hvis ejer er virksomhed.\n- `boardMembers[]` (object[]?): Bestyrelse / direktion. Felter: name, role, title, address, entityType, cvr.\n- `founders[]` (object[]?): Stiftere. Felter: name, address, entityType, cvr.\n- `auditors[]` (object[]?): Revisorer. Felter: name, address, entityType, cvr.\n- `accountants[]` (object[]?): Regnskabsfolk.\n- `foundedDate` (string?): Stiftelsesdato (ISO).\n- `dissolvedDate` (string?): Opløsningsdato (ISO).\n- `endDate` (string?): Ophørsdato fra livsforløb — sat for virksomheder der er ophørt uden formel opløsning (ISO).\n- `startDate` (string?): Første registreringsdato.\n- `effectDate` (string?): Virkningsdato.\n- `lastUpdated` (string): Sidst opdateret (ISO).\n- `lastLoaded` (string?): Sidst indlæst i CVR-distribution.\n- `advertisingProtection` (boolean?): Reklamebeskyttet.\n- `productionUnits` (number?): Antal P-enheder.\n- `unitNumber` (number?): EnhedsNummer (intern).\n- `shareCapital.amount` (number?): Selskabskapital.\n- `shareCapital.currency` (string?): Valuta (fx \"DKK\").\n- `companyPurpose` (string?): Formål.\n- `accountingPeriod.startMonth` (number?): Regnskabsår startmåned (1-12).\n- `accountingPeriod.startDay` (number?): Regnskabsår startdag.\n- `accountingPeriod.endMonth` (number?): Regnskabsår slutmåned.\n- `accountingPeriod.endDay` (number?): Regnskabsår slutdag.\n- `firstAccountingPeriod.start` (string?): Første regnskabsår start.\n- `firstAccountingPeriod.end` (string?): Første regnskabsår slut.\n- `auditExempt` (boolean?): Revision fravalgt.\n- `latestArticlesDate` (string?): Seneste vedtægtsdato.","parameters":[{"name":"cvr","in":"path","required":true,"description":"Præcis 8 cifre, fx 43269070.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"cvr":"43269070","companyName":"codepilots ApS","status":"ACTIVE","isActive":true,"companyType":{"code":80,"shortDescription":"APS","longDescription":"Anpartsselskab"},"address":{"street":"Kochsgade","houseNumber":"31B","postalCode":"5000","city":"Odense C","country":"Danmark","fullAddress":"Kochsgade 31B, 5000 Odense C"},"industry":{"code":"622000","description":"Computerkonsulentbistand og forvaltning af computerfaciliteter"},"shareCapital":{"amount":40000,"currency":"DKK"},"owners":[{"name":"INTERNET FACTORY ApS","role":"Ejer","ownershipShare":"50%","ownershipInterval":{"floor":50,"ceiling":66.66,"label":"50-66,66%"},"entityType":"VIRKSOMHED"}],"foundedDate":"2022-05-17","lastUpdated":"2025-05-21"}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/company/{cvr}/financials":{"get":{"operationId":"companyFinancials","summary":"Hent regnskabstal efter CVR","description":"Returnerer strukturerede regnskabstal (resultatopgørelse og balance) parset fra virksomhedens offentliggjorte årsrapporter, nyeste periode først. Kræver Pro. Forbruger 1 månedlig kvote-enhed pr. unikt CVR pr. dag — gentagne kald samme dag er gratis.\n\n- Kræver Pro — på Gratis- og Basic-planen svares med 403 FORBIDDEN.\n- Alle beløb er i hele DKK som indberettet i årsrapportens XBRL. Alle figures-felter er valgfri: hvad en virksomhed indberetter afhænger af regnskabsklassen — fx må klasse B-virksomheder udelade omsætning (ÅRL §32), så 'grossProfit' er den gennemgående toplinje.\n- Svaret dækker typisk virksomhedens fulde digitale indberetningshistorik (op til de 10 nyeste årsrapporter, inkl. sammenligningstal). En omgørelse (korrigeret årsrapport) erstatter automatisk den oprindelige for samme periode.\n- 404 COMPANY_NOT_FOUND betyder at virksomheden ikke har nogen maskinlæsbar årsrapport — fx nystiftede virksomheder uden aflagt regnskab.\n- Regnskabstal måles som sin egen 'financials'-kvote-enhed: et virksomhedsopslag og et regnskabskald på samme CVR samme dag tæller som to enheder.\n\n**Data-felter:**\n- `cvr` (string): 8-cifret CVR-nummer.\n- `count` (number): Antal regnskabsperioder i svaret.\n- `syncedAt` (string?): Tidspunkt for seneste vellykkede synkronisering mod registret. Ved midlertidige registerfejl serveres data fra cache — syncedAt viser hvor friske tallene er.\n- `periods[].periodStart` (string): Regnskabsperiodens start (ISO-dato). Tom streng for perioder der kun kendes som sammenligningstal.\n- `periods[].periodEnd` (string): Regnskabsperiodens slutdato (ISO-dato). Unik pr. periode; nyeste først.\n- `periods[].publishedAt` (string?): Offentliggørelsestidspunkt for den årsrapport tallene stammer fra.\n- `periods[].figures` (object): Parsede regnskabstal i hele DKK fra årsrapportens XBRL. ALLE felter er valgfri — hvad en virksomhed indberetter afhænger af regnskabsklassen. Se felterne nedenfor.\n- `…figures.revenue` (number?): Nettoomsætning. Ofte udeladt: regnskabsklasse B må undlade omsætning (ÅRL §32) — brug grossProfit som gennemgående toplinje.\n- `…figures.grossProfit` (number?): Bruttofortjeneste/-tab — det mest konsistent tilgængelige resultattal på tværs af virksomheder.\n- `…figures.employeeBenefitsExpense` (number?): Personaleomkostninger.\n- `…figures.depreciationAmortisation` (number?): Af- og nedskrivninger.\n- `…figures.ebit` (number?): Resultat af primær drift (EBIT).\n- `…figures.financialIncome` (number?): Finansielle indtægter.\n- `…figures.financialExpenses` (number?): Finansielle omkostninger.\n- `…figures.profitBeforeTax` (number?): Resultat før skat.\n- `…figures.taxExpense` (number?): Skat af årets resultat.\n- `…figures.netResult` (number?): Årets resultat.\n- `…figures.totalAssets` (number?): Aktiver i alt (balancesum).\n- `…figures.noncurrentAssets` (number?): Anlægsaktiver i alt.\n- `…figures.currentAssets` (number?): Omsætningsaktiver i alt.\n- `…figures.inventories` (number?): Varebeholdninger.\n- `…figures.cashAndCashEquivalents` (number?): Likvide beholdninger.\n- `…figures.equity` (number?): Egenkapital i alt.\n- `…figures.contributedCapital` (number?): Selskabskapital.\n- `…figures.retainedEarnings` (number?): Overført resultat.\n- `…figures.proposedDividend` (number?): Foreslået udbytte.\n- `…figures.provisions` (number?): Hensatte forpligtelser.\n- `…figures.longtermLiabilities` (number?): Langfristede gældsforpligtelser i alt.\n- `…figures.shorttermLiabilities` (number?): Kortfristede gældsforpligtelser i alt.\n- `…figures.employees` (number?): Gennemsnitligt antal ansatte i perioden.","parameters":[{"name":"cvr","in":"path","required":true,"description":"Præcis 8 cifre, fx 43269070.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"cvr":"43269070","count":4,"syncedAt":"2026-07-17T10:43:26.487Z","periods":[{"periodStart":"2025-01-01","periodEnd":"2025-12-31","publishedAt":"2026-05-20T10:40:38.000Z","figures":{"grossProfit":2042685,"employeeBenefitsExpense":1536189,"ebit":506496,"profitBeforeTax":489638,"taxExpense":64438,"netResult":425200,"totalAssets":1747314,"currentAssets":1747314,"cashAndCashEquivalents":1271470,"equity":1193023,"contributedCapital":40000,"shorttermLiabilities":554291,"employees":3}}]}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/company/batch":{"post":{"operationId":"companyBatch","summary":"Batch-opslag af virksomheder","description":"Slår op til 50 CVR-numre op i ét kald og returnerer fulde virksomhedsobjekter. Opslagene udføres parallelt. Kræver Basic eller Pro.\n\n- Kræver Basic eller Pro — på Gratis-planen svares med 403 FORBIDDEN.\n- Hvert nyt CVR forbruger 1 månedlig kvote-enhed og tæller mod minut-grænsen; et CVR der allerede er slået op samme dag er gratis. Opslag der ikke findes eller fejler faktureres ikke.\n- Delvis succes: rammes en grænse undervejs, svares stadig 200 med de behandlede resultater — 'stoppedReason' angiver om det var månedskvoten (\"quota\") eller minut-grænsen (\"rate_limit\"), og 'quotaExhausted' fortæller uafhængigt om månedskvoten blev opbrugt.\n- Kan intet CVR behandles overhovedet, svares 429 med QUOTA_EXCEEDED eller RATE_LIMIT_EXCEEDED. Fejler alle behandlede opslag mod registret (uden én succes), svares 503 SERVICE_UNAVAILABLE.\n- Svaret bærer de månedlige X-RateLimit-headers ligesom de øvrige endpoints.\n\n**Data-felter:**\n- `results[].cvr` (string): CVR-nummeret fra anmodningen.\n- `results[].found` (boolean): Blev virksomheden fundet?\n- `results[].company` (CVRCompany?): Fuldt virksomhedsobjekt (samme skema som 'GET /api/v1/company/{cvr}'). Udeladt når found=false.\n- `results[].error` (boolean?): true hvis netop dette opslag fejlede (tælles i 'errors'); de øvrige resultater påvirkes ikke.\n- `requested` (number): Antal unikke CVR-numre i anmodningen (dubletter fjernes).\n- `returned` (number): Antal CVR-numre der blev behandlet. Kan være lavere end 'requested', hvis en kvote-grænse afbrød batchen.\n- `errors` (number): Antal opslag der fejlede uden at vælte resten af batchen.\n- `stoppedReason` (\"quota\" | \"rate_limit\" | null): Sat når en grænse afbrød batchen, før alle CVR-numre var behandlet — årsagen til at der blev stoppet.\n- `quotaExhausted` (boolean): Den månedlige kvote blev opbrugt undervejs. Uafhængig af 'stoppedReason' — en batch kan stoppes af minut-grænsen og samtidig have opbrugt månedskvoten.\n- `took` (number): Eksekveringstid (ms).","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"results":[{"cvr":"43269070","found":true,"company":{"cvr":"43269070","companyName":"codepilots ApS","status":"ACTIVE","isActive":true,"companyType":{"code":80,"shortDescription":"APS","longDescription":"Anpartsselskab"},"address":{"street":"Kochsgade","houseNumber":"31B","postalCode":"5000","city":"Odense C","country":"Danmark","fullAddress":"Kochsgade 31B, 5000 Odense C"},"industry":{"code":"622000","description":"Computerkonsulentbistand og forvaltning af computerfaciliteter"},"shareCapital":{"amount":40000,"currency":"DKK"},"owners":[{"name":"INTERNET FACTORY ApS","role":"Ejer","ownershipShare":"50%","ownershipInterval":{"floor":50,"ceiling":66.66,"label":"50-66,66%"},"entityType":"VIRKSOMHED"}],"foundedDate":"2022-05-17","lastUpdated":"2025-05-21"}},{"cvr":"99999999","found":false}],"requested":2,"returned":2,"errors":0,"stoppedReason":null,"quotaExhausted":false,"took":412}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cvrs"],"properties":{"cvrs":{"type":"array","items":{"type":"string"},"description":"Liste af 8-cifrede CVR-numre (1-50). Dubletter fjernes, så et gentaget CVR kun slås op — og faktureres — én gang."}}}}}}}},"/api/v1/usage":{"get":{"operationId":"usage","summary":"Forbrug og kvoter","description":"Returnerer aktuel kvote-status (måned + minut-grænse) samt aggregeret forbrug for den valgte periode. Fri at kalde — tæller ikke mod kvoten.\n\n- Den månedlige kvote er den grænse der håndhæves (sammen med minut-grænsen). 'quota.daily' og det øverste 'quota.resetTime' er kun informative og beholdt for bagudkompatibilitet.\n- X-RateLimit-headerne på alle endpoints afspejler den månedlige kvote.\n\n**Data-felter:**\n- `quota.daily.limit` (number): Dagligt tal ifølge dit abonnement. Kun informativt — den daglige grænse håndhæves ikke længere (beholdt for bagudkompatibilitet).\n- `quota.daily.used` (number): Antal unikke opslag i dag (informativt).\n- `quota.daily.remaining` (number): Resterende af det daglige tal (informativt).\n- `quota.monthly.limit` (number): Månedlig kvote — den grænse der håndhæves.\n- `quota.monthly.used` (number): Forbrug i indeværende måned.\n- `quota.monthly.remaining` (number): Resterende månedlig kvote.\n- `quota.monthly.resetTime` (string): ISO-tidsstempel for næste månedlige reset.\n- `quota.rateLimit.perMinute` (number): Tilladte opslag pr. minut.\n- `quota.rateLimit.currentUsage` (number): Forbrug i de seneste 60 sekunder.\n- `quota.rateLimit.remaining` (number): Resterende minut-kvote.\n- `quota.resetTime` (string): ISO-tidsstempel for næste midnatsreset (bagudkompatibilitet — hører til den informative daglige tæller).\n- `quota.monthlyResetTime` (string): ISO-tidsstempel for næste månedlige reset (samme som quota.monthly.resetTime).\n- `usage.period` (\"day\" | \"week\" | \"month\"): Anvendt periode.\n- `usage.startDate` (string): Start på rapportperiode (YYYY-MM-DD).\n- `usage.endDate` (string): Slut (YYYY-MM-DD).\n- `usage.totalCalls` (number): Samlet antal API-kald.\n- `usage.successfulCalls` (number): Antal succesfulde kald (HTTP 2xx eller 404).\n- `usage.failedCalls` (number): Antal fejlede kald.\n- `usage.successRate` (string): Procent som tekst (fx \"98.50\").\n- `usage.avgResponseTime` (number): Gennemsnitlig svartid (ms).\n- `usage.totalResultsReturned` (number): Samlet antal returnerede resultater.\n- `breakdown.byQueryType` (Record<string, number>): Antal kald grupperet på queryType (\"cvr\" / \"search\" / \"person\").\n- `breakdown.daily[].date` (string): YYYY-MM-DD.\n- `breakdown.daily[].calls` (number): Kald den dag.\n- `breakdown.daily[].successfulCalls` (number): Succesfulde kald den dag.","parameters":[{"name":"period","in":"query","required":false,"description":"Hvor langt tilbage opsummering skal dække.","schema":{"type":"string","enum":["day","week","month"],"default":"day"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"quota":{"daily":{"limit":100,"used":12,"remaining":88},"monthly":{"limit":25000,"used":240,"remaining":24760,"resetTime":"2026-08-01T00:00:00.000Z"},"rateLimit":{"perMinute":20,"currentUsage":0,"remaining":20},"resetTime":"2026-07-16T00:00:00.000Z","monthlyResetTime":"2026-08-01T00:00:00.000Z"},"usage":{"period":"day","startDate":"2026-07-15","endDate":"2026-07-15","totalCalls":14,"successfulCalls":14,"failedCalls":0,"successRate":"100.00","avgResponseTime":122,"totalResultsReturned":14},"breakdown":{"byQueryType":{"cvr":12,"search":2},"daily":[{"date":"2026-07-15","calls":14,"successfulCalls":14}]}}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/person/{id}":{"get":{"operationId":"person","summary":"Hent person efter enhedsnummer","description":"Returnerer detaljer om en person og deres virksomhedsrelationer (ejer, ledelse, stifter mv.). Forbruger 1 månedlig kvote-enhed pr. unikt enhedsnummer pr. dag — gentagne opslag samme dag er gratis.\n\n- Felter markeret med '?' kan mangle, hvis CVR-registret ikke har data for dem.\n- Adressen kan være udeladt, hvis personen har adressebeskyttelse.\n\n**Data-felter:**\n- `enhedsNummer` (string): 10-cifret enhedsnummer for personen.\n- `name` (string): Personens fulde navn.\n- `address` (string?): Adresse (kan være udeladt ved beskyttelse).\n- `protectedAddress` (boolean?): Adressebeskyttelse aktiv.\n- `advertisingProtection` (boolean?): Reklamebeskyttet.\n- `companies[].cvr` (string): CVR for relateret virksomhed.\n- `companies[].companyName` (string): Virksomhedsnavn.\n- `companies[].role` (\"owner\" | \"boardMember\" | \"founder\" | \"auditor\" | \"accountant\"): Personens rolle i virksomheden.\n- `companies[].roleLabel` (string?): Dansk etiket for rollen.\n- `companies[].title` (string?): Titel (fx \"Direktør\").\n- `companies[].ownershipShare` (string?): Ejerandel — Ejerregisterets interval-bund (fx \"15%\" for båndet 15-19,99%).\n- `companies[].votingShare` (string?): Stemmeandel — samme interval-bund-semantik.\n- `companies[].ownershipInterval` (object?): Det lovbestemte ejerandelsinterval: { floor, ceiling, label }, fx { floor: 15, ceiling: 19.99, label: \"15-19,99%\" }.\n- `companies[].votingInterval` (object?): Interval for stemmeandel, samme form som ownershipInterval.\n- `companies[].startDate` (string?): Startdato (ISO).\n- `companies[].endDate` (string | null?): Slutdato (ISO), eller null hvis aktiv.\n- `companies[].active` (boolean): Er relationen aktiv.","parameters":[{"name":"id","in":"path","required":true,"description":"Præcis 10 cifre (enhedsNummer), fx 4000012345.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"enhedsNummer":"4000012345","name":"Eksempel Person","address":"Eksempelgade 1, 1050 København K","companies":[{"cvr":"43269070","companyName":"codepilots ApS","role":"owner","roleLabel":"Reel ejer","ownershipShare":"50%","ownershipInterval":{"floor":50,"ceiling":66.66,"label":"50-66,66%"},"active":true}]}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/watchlists":{"get":{"operationId":"watchlistsList","summary":"List watchlists","description":"Returnerer brugerens watchlists samt forbrug mod plan-grænserne.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n\n**Data-felter:**\n- `watchlists[]` (Watchlist[]): Brugerens watchlists (samme skema som ovenfor).\n- `quota.watchlistsUsed` (number): Antal watchlists i brug.\n- `quota.watchlistLimit` (number): Maks antal watchlists for planen.\n- `quota.entitiesUsed` (number): Antal entiteter i brug.\n- `quota.entityLimit` (number): Maks antal entiteter for planen.","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"watchlists":[{"id":"wl_2x9a1c","name":"Leverandører","description":"Vigtige leverandører","tag":"suppliers","cadence":"daily","webhookUrl":null,"createdAt":"2026-06-01T10:00:00.000Z","updatedAt":"2026-06-15T08:30:00.000Z"}],"quota":{"watchlistsUsed":1,"watchlistLimit":10,"entitiesUsed":3,"entityLimit":100}}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}},"post":{"operationId":"watchlistCreate","summary":"Opret watchlist","description":"Opretter en ny watchlist for brugeren.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n- Returnerer 403 hvis plan-grænsen for antal watchlists er nået.\n\n**Data-felter:**\n- `id` (string): Watchlist-id (præfiks \"wl_\").\n- `name` (string): Navn (1-120 tegn).\n- `description` (string?): Beskrivelse.\n- `tag` (string?): Frit tag (fx \"suppliers\").\n- `cadence` (\"daily\" | \"weekly\"): Overvågningsfrekvens.\n- `webhookUrl` (string?): Webhook-URL for hændelser.\n- `createdAt` (string): Oprettet (ISO).\n- `updatedAt` (string): Sidst ændret (ISO).","parameters":[],"responses":{"201":{"description":"Created","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"id":"wl_2x9a1c","name":"Leverandører","description":"Vigtige leverandører","tag":"suppliers","cadence":"daily","webhookUrl":null,"createdAt":"2026-06-01T10:00:00.000Z","updatedAt":"2026-06-15T08:30:00.000Z"}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Navn (1-120 tegn)."},"description":{"type":"string","description":"Beskrivelse (max 500 tegn)."},"tag":{"type":"string","description":"Frit tag (max 40 tegn)."},"cadence":{"type":"string","enum":["daily","weekly"],"default":"daily","description":"Overvågningsfrekvens."}}}}}}}},"/api/v1/watchlists/{id}":{"get":{"operationId":"watchlistGet","summary":"Hent watchlist","description":"Returnerer én watchlist efter id.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n\n**Data-felter:**\n- `id` (string): Watchlist-id (præfiks \"wl_\").\n- `name` (string): Navn (1-120 tegn).\n- `description` (string?): Beskrivelse.\n- `tag` (string?): Frit tag (fx \"suppliers\").\n- `cadence` (\"daily\" | \"weekly\"): Overvågningsfrekvens.\n- `webhookUrl` (string?): Webhook-URL for hændelser.\n- `createdAt` (string): Oprettet (ISO).\n- `updatedAt` (string): Sidst ændret (ISO).","parameters":[{"name":"id","in":"path","required":true,"description":"Watchlist-id (\"wl_...\").","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"id":"wl_2x9a1c","name":"Leverandører","description":"Vigtige leverandører","tag":"suppliers","cadence":"daily","webhookUrl":null,"createdAt":"2026-06-01T10:00:00.000Z","updatedAt":"2026-06-15T08:30:00.000Z"}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}},"patch":{"operationId":"watchlistUpdate","summary":"Opdater watchlist","description":"Opdaterer felter på en watchlist. Kun medsendte felter ændres.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n\n**Data-felter:**\n- `id` (string): Watchlist-id (præfiks \"wl_\").\n- `name` (string): Navn (1-120 tegn).\n- `description` (string?): Beskrivelse.\n- `tag` (string?): Frit tag (fx \"suppliers\").\n- `cadence` (\"daily\" | \"weekly\"): Overvågningsfrekvens.\n- `webhookUrl` (string?): Webhook-URL for hændelser.\n- `createdAt` (string): Oprettet (ISO).\n- `updatedAt` (string): Sidst ændret (ISO).","parameters":[{"name":"id","in":"path","required":true,"description":"Watchlist-id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"id":"wl_2x9a1c","name":"Leverandører","description":"Vigtige leverandører","tag":"suppliers","cadence":"daily","webhookUrl":null,"createdAt":"2026-06-01T10:00:00.000Z","updatedAt":"2026-06-15T08:30:00.000Z"}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Nyt navn (1-120 tegn)."},"description":{"type":"string","description":"Ny beskrivelse (eller null for at rydde)."},"tag":{"type":"string","description":"Nyt tag (eller null for at rydde)."},"cadence":{"type":"string","enum":["daily","weekly"],"description":"Ny frekvens."}}}}}}},"delete":{"operationId":"watchlistDelete","summary":"Slet watchlist","description":"Sletter en watchlist og dens entiteter. Svarer med 204 No Content.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n\n**Data-felter:**\n","parameters":[{"name":"id","in":"path","required":true,"description":"Watchlist-id.","schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}},"/api/v1/watchlists/{id}/entities":{"get":{"operationId":"watchlistEntitiesList","summary":"List entiteter","description":"Returnerer entiteterne (virksomheder/personer) på en watchlist.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n- data er et array af entiteter.\n\n**Data-felter:**\n- `id` (string): Entitet-id (præfiks \"wle_\").\n- `watchlistId` (string): Watchlist-id entiteten hører til.\n- `entityType` (\"company\" | \"person\"): Type af overvåget entitet.\n- `entityRef` (string): CVR (virksomhed) eller enhedsNummer (person).\n- `displayName` (string): Visningsnavn.\n- `addedAt` (string): Tilføjet (ISO).","parameters":[{"name":"id","in":"path","required":true,"description":"Watchlist-id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"id":"wle_7p4k2","watchlistId":"wl_2x9a1c","entityType":"company","entityRef":"43269070","displayName":"codepilots ApS","addedAt":"2026-06-10T12:00:00.000Z"}]}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}},"post":{"operationId":"watchlistEntityAdd","summary":"Tilføj entitet","description":"Tilføjer en virksomhed (CVR) eller person (enhedsNummer) til en watchlist.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n- Virksomheds-entiteter skal bruge et 8-cifret CVR-nummer.\n- Returnerer 409 hvis entiteten allerede findes på listen, eller 403 hvis entitets-grænsen er nået.\n\n**Data-felter:**\n- `id` (string): Entitet-id (præfiks \"wle_\").\n- `watchlistId` (string): Watchlist-id entiteten hører til.\n- `entityType` (\"company\" | \"person\"): Type af overvåget entitet.\n- `entityRef` (string): CVR (virksomhed) eller enhedsNummer (person).\n- `displayName` (string): Visningsnavn.\n- `addedAt` (string): Tilføjet (ISO).","parameters":[{"name":"id","in":"path","required":true,"description":"Watchlist-id.","schema":{"type":"string"}}],"responses":{"201":{"description":"Created","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Tilladte opslag i vinduet."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Resterende opslag i vinduet."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix-tidsstempel for reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"id":"wle_7p4k2","watchlistId":"wl_2x9a1c","entityType":"company","entityRef":"43269070","displayName":"codepilots ApS","addedAt":"2026-06-10T12:00:00.000Z"}}}}},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["entityType","entityRef","displayName"],"properties":{"entityType":{"type":"string","enum":["company","person"],"description":"Type af entitet."},"entityRef":{"type":"string","description":"8-cifret CVR for virksomhed, ellers enhedsNummer for person."},"displayName":{"type":"string","description":"Visningsnavn (1-200 tegn)."}}}}}}}},"/api/v1/watchlists/{id}/entities/{wleId}":{"delete":{"operationId":"watchlistEntityDelete","summary":"Fjern entitet","description":"Fjerner en entitet fra en watchlist. Svarer med 204 No Content.\n\n- Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.\n\n**Data-felter:**\n","parameters":[{"name":"id","in":"path","required":true,"description":"Watchlist-id.","schema":{"type":"string"}},{"name":"wleId","in":"path","required":true,"description":"Entitet-id (\"wle_...\").","schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"description":"Mulige fejlkoder: INVALID_REQUEST, INVALID_CVR, MISSING_PARAMETER, INVALID_PERSON_ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INVALID_REQUEST","message":"Beskrivelse af fejlen."}}}}},"401":{"description":"Mulige fejlkoder: UNAUTHORIZED, INVALID_API_KEY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Beskrivelse af fejlen."}}}}},"403":{"description":"Mulige fejlkoder: FORBIDDEN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"FORBIDDEN","message":"Beskrivelse af fejlen."}}}}},"404":{"description":"Mulige fejlkoder: COMPANY_NOT_FOUND, PERSON_NOT_FOUND, NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"COMPANY_NOT_FOUND","message":"Beskrivelse af fejlen."}}}}},"429":{"description":"Mulige fejlkoder: RATE_LIMIT_EXCEEDED, QUOTA_EXCEEDED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Beskrivelse af fejlen."}}}}},"500":{"description":"Mulige fejlkoder: INTERNAL_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Beskrivelse af fejlen."}}}}},"503":{"description":"Mulige fejlkoder: SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"SERVICE_UNAVAILABLE","message":"Beskrivelse af fejlen."}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-nøgle med præfiks `cvr_`, sendt som Bearer-token. Kan oprettes på alle planer, også Gratis."}},"schemas":{"SuccessEnvelope":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","description":"Endpoint-specifikt payload — se det enkelte endpoints eksempel og felt-liste."},"meta":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"hasMore":{"type":"boolean"}}}}},"ErrorEnvelope":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED","INVALID_API_KEY","FORBIDDEN","INVALID_REQUEST","INVALID_CVR","MISSING_PARAMETER","RATE_LIMIT_EXCEEDED","QUOTA_EXCEEDED","COMPANY_NOT_FOUND","PERSON_NOT_FOUND","INVALID_PERSON_ID","NOT_FOUND","SERVICE_UNAVAILABLE","INTERNAL_ERROR"]},"message":{"type":"string"},"details":{}}}}}}}}