Hopp til hovedinnhold
Symfoni docs Virksomhetslommebok
Innhold

EUCC: API-kontrakt til Brreg

Utsted EU Company Certificate gjennom Brregs Paradym-prosjekt med versjonsfestet validering.

Kjerneside Oppdatert 9. september 2026 · 6 min lesetid

Omfang og status

EUCC er et vanlig bevis. EBWOID er fortsatt virksomhetsidentitet og styrer tilgang. Malen heter EUCC, har slug eucc og tilhører Brregs eksisterende utstederprofil. Både malen og signeringen ligger i Brregs Paradym-prosjekt.

Kontrakten bygger på vedlegget WE BUILD – EU Company Certificate 0.9.0. Valideringsprofilen er eucc/0.9.0. Sandkassestandarden er én kalendermåneds gyldighet fra utstedelse, med tilbakekalling og prosjektets P-256-utstedersertifikat. Dette angir ikke at sandkasseutstederen er kvalifisert; testeksempelet bruker EAA.

Live-testen 9. september 2026 passerte for begge representantvariantene og en blandet liste, inkludert mottak, presentasjon og tilbakekalling. Symfoni har akseptert følgende to forskjeller for piloten:

  • Status følger status.status_list: { idx, uri }, mens skjema 0.9.0 krever type, status_list_credential, status_list_index og status_purpose under status.
  • Utstederen identifiseres med X.509-sertifikatet; iss fra eksempelvedlegget er ikke inkludert. iss er valgfritt i selve JSON-skjemaet.

Forskjellene blokkerer ikke pilotbruk. Originalskjemaet og beviset beholdes uendret. Koden og pilotbindingen må deployes før adressen under brukes mot pilot. Se docs/eucc-brreg.md for testbevis og oppsett.

Utstedelse

POST https://www.symfoni.dev/api/issuers/brreg/credentials/eucc/issue?offerUrlFormat=symfoni
Authorization: Bearer <Brregs Symfoni-API-nøkkel>
Content-Type: application/json

Nøkkelen i denne requesten er Brregs Symfoni-API-nøkkel. Symfoni bruker Paradym-nøkkelen på serveren for å utstede i Brregs prosjekt.

Eksempelet bruker syntetiske virksomhets- og representantdata fra vedleggene. Feltene for utstedermyndighet og autentisk kilde sendes av Brreg som virksomhetsdata. iss er et teknisk felt som ikke kan sendes av klienten. I det testede sertifikatoppsettet identifiseres utstederen gjennom X.509-sertifikatet; Paradym utsteder uten et eget iss-felt.

{
  "attributes": {
    "attestation_legal_category": "EAA",
    "issuing_authority": "Brønnøysundregistrene",
    "issuing_authority_id": "NOFOR.974760673",
    "issuing_country": "NO",
    "authentic_source_id": "NOFOR.974760673",
    "authentic_source_name": "Brønnøysundregistrene",
    "legal_person_name": "EUDI WALLET SOLUTIONS AS",
    "legal_person_id": "NOFOR.987654321",
    "legal_form_type": "Aksjeselskap (AS)",
    "registration_member_state": "NO",
    "registered_address": {
      "full_address": "Storgata 1; 9008; Tromsø; NO",
      "thorough_fare": "Storgata",
      "locator_designator": "1",
      "post_code": "9008",
      "post_name": "Tromsø",
      "admin_unit_level_1": "NO",
      "admin_unit_level_2": "Troms"
    },
    "registration_date": "2020-05-20",
    "share_capital": {
      "amount": "30000",
      "currency": "NOK"
    },
    "legal_person_status": "active",
    "legal_person_activity": {
      "code": "62.010",
      "description": "Computer programming activities"
    },
    "digital_contact_point": {
      "website": "https://www.example-eudi-wallet.no",
      "email": "[email protected]"
    },
    "legal_representative": [
      {
        "natural_person": {
          "full_name": "Lysende Blomst",
          "date_of_birth": "1980-01-01",
          "nationality": "Norwegian",
          "signatory_rule": "sole"
        }
      },
      {
        "legal_person": {
          "name": "PARENT HOLDING AS",
          "id": "NOFOR.123456789",
          "legal_form_type": "Aksjeselskap (AS)",
          "signatory_rule": "sole"
        }
      }
    ],
    "trust_anchor": "https://trust.example.org/anchors/eidas"
  }
}

Dette eksempelet finnes også i docs/examples/eucc/issue-request.json:

curl --fail-with-body   'https://www.symfoni.dev/api/issuers/brreg/credentials/eucc/issue?offerUrlFormat=symfoni'   -H "Authorization: Bearer $SYMFONI_BRREG_API_KEY"   -H 'Content-Type: application/json'   --data-binary @docs/examples/eucc/issue-request.json

Illustrerende respons; adressen er ikke et aktivt tilbud:

{
  "issuanceId": "issuance-example",
  "offerUri": "https://www.symfoni.dev/app/credential/offer?credential_offer_uri=https%3A%2F%2Fissuer.example%2Foffers%2Feucc-example",
  "status": "offered",
  "templateSlug": "eucc",
  "offerUrlFormat": "symfoni"
}

Brreg bruker offerUri uendret som lenke for «Åpne beviset i Symfoni». offered betyr at tilbudet er opprettet; beviset er ennå ikke nødvendigvis mottatt. Et POST-kall oppretter et nytt tilbud. Endepunktet har ingen idempotensnøkkel; x-request-id er kun korrelasjon i historikken.

Felt og validering

Ingen verdier konverteres til tekst eller andre datatyper. Ukjente felt avvises, også inne i objekter og listeelementer. Valgfrie felt utelates når de ikke finnes; null er ikke en gyldig erstatning. Land- og valutakoder kontrolleres mot mønstrene i vedlegget (henholdsvis to og tre store bokstaver), ikke mot et eksternt koderegister. Skjemaet definerer ikke ytterligere formatkontroll for EUID, NACE-kode eller beløp.

Hvert element i legal_representative må inneholde nøyaktig én av natural_person og legal_person. Begge varianter kan forekomme i samme liste. Listen må ha minst ett element.

«Ja» på et underfelt betyr påkrevd når det overordnede objektet er til stede.

Felt Type Påkrevd Format eller tillatte verdier
issuing_authority string Ja
issuing_authority_id string Ja
issuing_country string Ja ^[A-Z]2$
authentic_source_id string Ja
authentic_source_name string Ja
attestation_legal_category string Ja EAA, PUB-EAA, QEAA
legal_person_name string Ja
legal_person_id string Ja
legal_form_type string Ja
registration_member_state string Ja ^[A-Z]2$
registered_address object Ja
registered_address.care_of string Nei
registered_address.full_address string Ja
registered_address.thorough_fare string Nei
registered_address.locator_designator string Nei
registered_address.post_code string Nei
registered_address.post_name string Nei
registered_address.post_office_box string Nei
registered_address.locator_name string Nei
registered_address.admin_unit_level_1 string Nei
registered_address.admin_unit_level_2 string Nei
registration_date string Ja date
share_capital object Nei
share_capital.amount string Ja
share_capital.currency string Ja ^[A-Z]3$
legal_person_status string Ja active, inactive
legal_person_activity object Ja
legal_person_activity.code string Ja
legal_person_activity.description string Ja
legal_person_duration string Nei date
digital_contact_point object Nei
digital_contact_point.website string Nei uri
digital_contact_point.email string Nei email
legal_representative array Ja Minst ett element; nøyaktig én representantvariant per element
trust_anchor string Nei uri
legal_representative[].natural_person object Én variant
legal_representative[].natural_person.full_name string Ja
legal_representative[].natural_person.date_of_birth string Ja date
legal_representative[].natural_person.nationality string Nei
legal_representative[].natural_person.signatory_rule string Ja sole, joint, joint_two, joint_all, limited
legal_representative[].legal_person object Én variant
legal_representative[].legal_person.name string Ja
legal_representative[].legal_person.id string Ja
legal_representative[].legal_person.legal_form_type string Ja
legal_representative[].legal_person.signatory_rule string Ja sole, joint, joint_two, joint_all, limited

Systemfelter

Brreg skal ikke sende vct, issuance_date, iss, sub, jti, cnf, iat, nbf, exp eller status i attributes. Disse avvises fremfor å overstyres. Symfoni genererer issuance_date som UTC-tid når tilbudet opprettes. Paradym håndterer signatur, faktisk JWT-utstedelsestid og utløp, holderbinding og status. Derfor kan issuance_date være litt tidligere enn iat når tilbudet innløses senere. Eventuelle sub, jti og nbf må vurderes ut fra det faktisk utstedte beviset; vedleggets eksempelnøkler og faste tidspunkter kopieres aldri.

Malen må ha eksakt vct = uri:eu:eudi:eucc:1. Oppsett og utstedelse stopper ved avvik; en automatisk Paradym-type brukes ikke som erstatning.

Feil

Ugyldige virksomhetsdata gir HTTP 400 før Paradym kalles:

{
  "error": {
    "code": "invalid_payload",
    "message": "registered_address.full_address must have required property 'full_address'",
    "path": "registered_address.full_address"
  }
}

HTTP 409 med error.code = "issuance_profile_mismatch" betyr at den versjonsfestede profilen eller Paradym-malen avviker fra oppsettet. Ingen tilbud opprettes. Eksisterende 401/404-feil for API-nøkkel, utsteder, mal og utstedelse er uendret.

Status og tilbakekalling

GET https://www.symfoni.dev/api/issuers/brreg/issuances/<issuanceId>?offerUrlFormat=symfoni
Authorization: Bearer <Brregs Symfoni-API-nøkkel>
POST https://www.symfoni.dev/api/issuers/brreg/issuances/<issuanceId>/revoke
Authorization: Bearer <Brregs Symfoni-API-nøkkel>

Tilbakekalling krever et faktisk utstedt bevis. Respons:

{ "issuanceId": "issuance-example", "status": "revoked" }

Statuser omfatter offered, completed, partiallyIssued, failed og revoked. Statusendepunktet og tilbakekallingsendepunktet bruker eksisterende tilgangskontroll.