{
  "openapi": "3.1.1",
  "info": {
    "title": "BestillElektriker oppdragsutkast",
    "version": "1.2.0",
    "description": "Gratis anonymt API for å forberede oppdrag. Ingen e-post, SMS, administrator- eller firmavarsling ved opprettelse. Kunden må selv åpne lenken, kontrollere feltene, oppgi kontaktdata, fullføre Turnstile og bekrefte e-post. Token er kun tilgang til utkast, aldri identitet eller samtykke. Ikke send personopplysninger i fritekst. Ingen autentisering, API-nøkkel eller OAuth. Parallell offentlig MCP på /mcp bruker samme tjenester; se /mcp.json."
  },
  "servers": [
    {
      "url": "https://bestillelektriker.no"
    }
  ],
  "security": [],
  "externalDocs": {
    "url": "https://bestillelektriker.no/for-agenter/"
  },
  "paths": {
    "/api/v1/request-drafts": {
      "post": {
        "operationId": "create_request_draft",
        "summary": "Opprett et anonymt, midlertidig oppdragsutkast",
        "description": "Maks 16384 byte JSON. recipient er et objekt; øvrige verdier er strenger; tekst trimmes og kontrolleres for kontrolltegn. Ukjente felt avvises. 30 forsøk/time/IP, 120/time per IPv4 /24 eller IPv6 /64, 1000/time og 5000/døgn globalt. Maks 20 utkast/IP og 5000 totalt, inkludert innsendte tombstones frem til 48 timer. Idempotens gjelder samme IP i utkastets levetid. Uten nøkkel gjenbrukes identiske normaliserte felt fra samme IP. Nettleser-CORS støttes ikke; bruk server-til-server. Fristen håndheves ved hvert oppslag, fysisk opprydding hver time og ved opprettelse.",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Valgfri tilfeldig nøkkel. Ikke bruk navn, e-post eller andre personopplysninger. Samme nøkkel+IP+innhold gir samme lenke i 48 timer. Etter utløp kan et nytt utkast opprettes.",
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]{8,128}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDraft"
              },
              "examples": {
                "general": {
                  "value": {
                    "recipient": {
                      "mode": "general"
                    },
                    "service": "EV_CHARGER",
                    "postal_code": "3400",
                    "description": "Installere elbillader i garasje",
                    "preferred_time": "Innen 30 dager"
                  }
                },
                "specific_company": {
                  "description": "Erstatt organisasjonsnummeret med et faktisk treff fra firmaoppslaget.",
                  "value": {
                    "recipient": {
                      "mode": "specific_company",
                      "organization_number": "000000000"
                    },
                    "service": "EV_CHARGER",
                    "postal_code": "3400",
                    "description": "Installere elbillader i garasje",
                    "preferred_time": "Innen 30 dager"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Eksisterende utkast gjenbrukt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Draft"
                }
              }
            }
          },
          "201": {
            "description": "Midlertidig utkast opprettet. Ingen meldinger eller oppdrag opprettet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Draft"
                }
              }
            }
          },
          "400": {
            "description": "Ugyldig JSON-objekt eller query-parametre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Kun POST støttes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "const": "POST"
                }
              }
            }
          },
          "409": {
            "description": "Samme idempotensnøkkel med annet innhold, eller utkastet er allerede innsendt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Maksimal JSON-størrelse 16384 byte overskredet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Krever ukomprimert application/json (eventuelt charset=utf-8).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Ugyldige felt, tekstlengder, tjenestekode eller Idempotency-Key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "IP-, nettverks-, global- eller kapasitetsgrense nådd.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Vent minst dette antallet sekunder før et nytt forsøk; kapasitet kan kreve lengre ventetid.",
                "schema": {
                  "type": "integer",
                  "const": 3600
                }
              }
            }
          },
          "503": {
            "description": "Midlertidig utilgjengelig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Vent minst dette antallet sekunder før et nytt forsøk; kapasitet kan kreve lengre ventetid.",
                "schema": {
                  "type": "integer",
                  "const": 3600
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/companies": {
      "get": {
        "operationId": "search_companies",
        "summary": "Finn offentlig firma etter navn, organisasjonsnummer eller registrert sted",
        "description": "Registeroppslag, maks 10 treff. query søker i navn, org.nr. og registrerte steder. Valgfrie municipality_code/postal_code filtrerer samme registrerte adresse. Ingen tjeneste-/kapasitetsgaranti eller eksternt nettsøk. 100 kall/time/IP, 500/time/nettverk og 5000/time globalt deles med firmaoppslag og MCP. Kildeobservasjon, lokal oppdatering og registrert geografi returneres. Andre query-parametere avvises.",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "description": "Søk i registrert firmanavn, organisasjonsnummer eller registrert sted. Ikke et søk etter udokumenterte tjenester."
            }
          },
          {
            "name": "municipality_code",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{4}$",
              "description": "Valgfritt norsk kommunenummer; filtrerer registrert adresse, ikke tjenestedekning."
            }
          },
          {
            "name": "postal_code",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{4}$",
              "description": "Valgfritt postnummer på registrert adresse, ikke ønsket tjenestedekning. Bevar null."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Offentlige firmaer; tom liste er et gyldig resultat.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanySearch"
                }
              }
            }
          },
          "422": {
            "description": "Ugyldige felt, tekstlengder, tjenestekode eller Idempotency-Key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "IP-, nettverks-, global- eller kapasitetsgrense nådd.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Vent minst dette antallet sekunder før et nytt forsøk; kapasitet kan kreve lengre ventetid.",
                "schema": {
                  "type": "integer",
                  "const": 3600
                }
              }
            }
          },
          "503": {
            "description": "Midlertidig utilgjengelig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Vent minst dette antallet sekunder før et nytt forsøk; kapasitet kan kreve lengre ventetid.",
                "schema": {
                  "type": "integer",
                  "const": 3600
                }
              }
            }
          },
          "405": {
            "description": "Kun GET støttes.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "const": "GET"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/companies/{organization_number}": {
      "get": {
        "operationId": "get_company",
        "summary": "Hent offentlig firma med kildeinformasjon og dokumenterte registerkategorier",
        "description": "Samme tilgjengelighetskriterier som firmasøk. Maks 20 registreringer og 100 kategorier per registrering; eksplisitte trunkeringsflagg. Bare registreringer i gjeldende offentlige kildescope. Ingen kontaktpersoner, private oppdrag eller fritekst fra nettsøk. Deler rategrenser med firmasøk.",
        "parameters": [
          {
            "name": "organization_number",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{9}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Offentlig firma; registerdata er ikke dokumentert tjenestedekning eller kapasitet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "404": {
            "description": "Firmaet finnes ikke som offentlig tilgjengelig mottaker.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Ugyldige felt, tekstlengder, tjenestekode eller Idempotency-Key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "IP-, nettverks-, global- eller kapasitetsgrense nådd.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Vent minst dette antallet sekunder før et nytt forsøk; kapasitet kan kreve lengre ventetid.",
                "schema": {
                  "type": "integer",
                  "const": 3600
                }
              }
            }
          },
          "503": {
            "description": "Midlertidig utilgjengelig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Vent minst dette antallet sekunder før et nytt forsøk; kapasitet kan kreve lengre ventetid.",
                "schema": {
                  "type": "integer",
                  "const": 3600
                }
              }
            }
          },
          "405": {
            "description": "Kun GET støttes.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "const": "GET"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CreateDraft": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "recipient",
          "postal_code",
          "description"
        ],
        "properties": {
          "recipient": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "mode"
                ],
                "properties": {
                  "mode": {
                    "type": "string",
                    "const": "general"
                  }
                }
              },
              {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "mode",
                  "organization_number"
                ],
                "properties": {
                  "mode": {
                    "type": "string",
                    "const": "specific_company"
                  },
                  "organization_number": {
                    "type": "string",
                    "pattern": "^[0-9]{9}$",
                    "minLength": 9,
                    "maxLength": 9
                  }
                }
              }
            ],
            "description": "Obligatorisk mottakervalg. general skal ikke ha organisasjonsnummer. specific_company krever ni sifre som finnes i offentlig BE-katalog. Lagres med intern firma-ID; aldri automatisk fallback. Firmanavn i beskrivelsen endrer ikke mottaker."
          },
          "service": {
            "type": "string",
            "enum": [
              "EV_CHARGER",
              "FUSE_BOX",
              "TROUBLESHOOTING",
              "LIGHTING",
              "SMART_HOME",
              "OUTLETS_SWITCHES",
              "HEATING",
              "KITCHEN_APPLIANCE",
              "RENOVATION",
              "NEW_BUILD",
              "SOLAR_ENERGY",
              "DATA_NETWORK",
              "INSPECTION",
              "OTHER"
            ],
            "description": "Valgfri kode fra eksisterende tjenesteregister. Utelat hvis ukjent."
          },
          "postal_code": {
            "type": "string",
            "pattern": "^[0-9]{4}$",
            "minLength": 4,
            "maxLength": 4,
            "description": "Norsk postnummer; bevare innledende null."
          },
          "description": {
            "type": "string",
            "minLength": 10,
            "maxLength": 4000,
            "description": "Beskriv arbeidet. Ikke send kontaktdata, full gateadresse, sensitive personopplysninger eller opplysninger om andre."
          },
          "preferred_time": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Valgfri vanlig tekst, f.eks. Innen 30 dager; ikke en enum."
          },
          "locality": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Valgfritt stedsnavn; ikke gateadresse."
          }
        }
      },
      "Draft": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status",
          "draft_id",
          "completion_url",
          "expires_at"
        ],
        "properties": {
          "status": {
            "type": "string",
            "const": "draft"
          },
          "draft_id": {
            "type": "string",
            "pattern": "^req_[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$"
          },
          "completion_url": {
            "type": "string",
            "format": "uri",
            "description": "Privat lenke med #fragment. Bevar hele lenken og presenter den til kunden. Må ikke logges eller deles offentlig. JavaScript kreves for å åpne utkastet."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "UTC, 48 timer etter opprettelse; gjenbruk forlenger ikke fristen."
          }
        }
      },
      "Error": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_json",
                  "method_not_allowed",
                  "idempotency_conflict",
                  "payload_too_large",
                  "unsupported_media_type",
                  "validation_failed",
                  "rate_limited",
                  "unavailable",
                  "not_found"
                ]
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "CompanySearch": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "companies",
          "limit",
          "location_note"
        ],
        "properties": {
          "companies": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "name",
                "organization_number",
                "registered_locations",
                "profile_url",
                "registered_geography",
                "catalogue_updated_at",
                "source_records"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "organization_number": {
                  "type": "string",
                  "pattern": "^[0-9]{9}$"
                },
                "registered_locations": {
                  "type": "array",
                  "maxItems": 10,
                  "items": {
                    "type": "string"
                  }
                },
                "profile_url": {
                  "type": "string",
                  "format": "uri"
                },
                "registered_geography": {
                  "type": "array",
                  "maxItems": 10,
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "postal_code",
                      "postal_city",
                      "municipality_code",
                      "municipality_name"
                    ],
                    "properties": {
                      "postal_code": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "postal_city": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "municipality_code": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "municipality_name": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    }
                  }
                },
                "catalogue_updated_at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Lokal projeksjonsoppdatering; ikke ny kildeverifisering."
                },
                "source_records": {
                  "type": "array",
                  "maxItems": 5,
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "source",
                      "observed_at",
                      "source_updated_at",
                      "last_seen_at",
                      "source_url"
                    ],
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "observed_at": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "source_updated_at": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "last_seen_at": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "source_url": {
                        "type": "string",
                        "format": "uri"
                      }
                    }
                  }
                }
              }
            }
          },
          "limit": {
            "type": "integer",
            "const": 10
          },
          "location_note": {
            "type": "string"
          }
        }
      },
      "Company": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "organization_number",
          "registered_locations",
          "profile_url",
          "registered_geography",
          "catalogue_updated_at",
          "source_records",
          "registrations",
          "registrations_truncated",
          "data_note"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "organization_number": {
            "type": "string",
            "pattern": "^[0-9]{9}$"
          },
          "registered_locations": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string"
            }
          },
          "profile_url": {
            "type": "string",
            "format": "uri"
          },
          "registered_geography": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "postal_code",
                "postal_city",
                "municipality_code",
                "municipality_name"
              ],
              "properties": {
                "postal_code": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "postal_city": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "municipality_code": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "municipality_name": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "catalogue_updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Lokal projeksjonsoppdatering; ikke ny kildeverifisering."
          },
          "source_records": {
            "type": "array",
            "maxItems": 5,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "source",
                "observed_at",
                "source_updated_at",
                "last_seen_at",
                "source_url"
              ],
              "properties": {
                "source": {
                  "type": "string"
                },
                "observed_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "source_updated_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "last_seen_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "source_url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "registrations": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "source",
                "observed_at",
                "source_updated_at",
                "last_seen_at",
                "source_url",
                "registration_type",
                "registration_number",
                "status",
                "source_status",
                "identity_status",
                "capabilities_truncated",
                "capabilities"
              ],
              "properties": {
                "source": {
                  "type": "string"
                },
                "observed_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "source_updated_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "last_seen_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "source_url": {
                  "type": "string",
                  "format": "uri"
                },
                "registration_type": {
                  "type": "string"
                },
                "registration_number": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "status": {
                  "type": "string"
                },
                "source_status": {
                  "type": "string"
                },
                "identity_status": {
                  "type": "string"
                },
                "capabilities_truncated": {
                  "type": "boolean"
                },
                "capabilities": {
                  "type": "array",
                  "maxItems": 100,
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "category",
                      "code",
                      "label"
                    ],
                    "properties": {
                      "category": {
                        "type": "string"
                      },
                      "code": {
                        "type": "string"
                      },
                      "label": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "registrations_truncated": {
            "type": "boolean"
          },
          "data_note": {
            "type": "string"
          }
        }
      }
    }
  },
  "x-prefill-link": {
    "version": 1,
    "base_url": "https://bestillelektriker.no/oppdrag/lenke/",
    "transport": "URL fragment, not query parameters",
    "template": "https://bestillelektriker.no/oppdrag/lenke/#be_mode={general|specific_company}&be_description={percent_encoded_description}[&be_postal_code={four_digits}][&be_service={code}][&be_time={percent_encoded_time}][&be_org={nine_digits_if_specific_company}]",
    "requires_api_call": false,
    "requires_authentication": false,
    "requires_javascript": true,
    "max_encoded_fragment_bytes": 8000,
    "rate_limit": "100 åpninger/time/IP. Ingen databaseutkast opprettes.",
    "encoding": "UTF-8 prosentkoding av hver verdi én gang; parameternavn er bokstavelige. Bruk %20 for mellomrom (+ aksepteres). Kod &, =, #, + og % i verdier. Skilj felter med &. Utelat valgfrie felt i stedet for tomme verdier. Ukjente og gjentatte parametere, ugyldig UTF-8/koding og kontrolltegn avvises (LF og TAB tillates). Lengder måles i Unicode-kodepunkter etter trimming. Forkort beskrivelsen hvis kodet fragment overstiger 8000 ASCII-tegn.",
    "privacy": "Ingen navn, e-post, telefon, gateadresse, sensitive data eller opplysninger om andre i URL. Fritekst kan ikke automatisk garanteres fri for personopplysninger. Ikke publiser lenken. Fragmentet er lesbart for alle som får lenken og kan lagres av samtaletjenesten eller nettleseren. BE rydder adressen før skjema/Turnstile og sender opplysningene med samme-opprinnelse POST til nettleserøkten. Ingen API-kall kreves fra assistenten.",
    "behavior": "GET-landingen er statisk uten session eller database. Forhåndsutfylling bruker bare privat serverøkt, ingen DB-skriving, meldinger, administratoroppgaver, identitet eller samtykke. Kunden kontrollerer, fyller kontaktdata på BE og fullfører ordinær Turnstile, e-postbekreftelse og godkjenning før deling. Ugyldig firma blokkerer innsending til kunden uttrykkelig retter mottaker; aldri fallback. Firmanavn i fritekst endrer ikke mottaker. Økten utløper etter 30 minutter uten aktivitet; original lenke kan åpnes på nytt.",
    "workflow": [
      "Spør hva slags elektrikerarbeid brukeren ønsker utført.",
      "Samle manglende postnummer, tidspunkt og beskrivelse.",
      "Avklar generelt oppdrag eller ett bestemt firma. Bruk kjent organisasjonsnummer fra BE-katalogen; ikke gjett.",
      "Ikke be om kontaktopplysninger som skal plasseres i URL-en.",
      "Oppsummer oppdraget kort for brukeren.",
      "Generer en gyldig prosentkodet lenke med hele fragmentet.",
      "Forklar at kunden må åpne lenken, kontrollere opplysningene, fylle kontaktdata og fullføre innsendingen selv."
    ],
    "schema": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "be_mode",
        "be_description"
      ],
      "properties": {
        "be_mode": {
          "type": "string",
          "enum": [
            "general",
            "specific_company"
          ],
          "description": "Obligatorisk mottakervalg. general: BE finner relevante firmaer. specific_company: bare valgt firma."
        },
        "be_org": {
          "type": "string",
          "pattern": "^[0-9]{9}$",
          "description": "Påkrevd ved specific_company; forbudt ved general. Organisasjonsnummer fra BE-katalogen, aldri firmanavn eller intern UUID."
        },
        "be_description": {
          "type": "string",
          "minLength": 10,
          "maxLength": 1500,
          "description": "Obligatorisk kort beskrivelse av arbeidet, uten personopplysninger. Forkort ved lang URL; kunden kan redigere videre."
        },
        "be_postal_code": {
          "type": "string",
          "pattern": "^[0-9]{4}$",
          "description": "Valgfritt postnummer med fire sifre. Bevar innledende null."
        },
        "be_service": {
          "type": "string",
          "enum": [
            "EV_CHARGER",
            "FUSE_BOX",
            "TROUBLESHOOTING",
            "LIGHTING",
            "SMART_HOME",
            "OUTLETS_SWITCHES",
            "HEATING",
            "KITCHEN_APPLIANCE",
            "RENOVATION",
            "NEW_BUILD",
            "SOLAR_ENERGY",
            "DATA_NETWORK",
            "INSPECTION",
            "OTHER"
          ],
          "description": "Valgfri tjenestekode. Utelat hvis ukjent."
        },
        "be_time": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100,
          "description": "Valgfritt ønsket tidspunkt i vanlig tekst. Ikke en bekreftet avtale."
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "be_mode": {
                "const": "specific_company"
              }
            }
          },
          "then": {
            "required": [
              "be_org"
            ]
          },
          "else": {
            "not": {
              "required": [
                "be_org"
              ]
            }
          }
        }
      ]
    },
    "examples": {
      "general": {
        "parameters": {
          "be_mode": "general",
          "be_postal_code": "0340",
          "be_description": "Montere elbillader og undersøke strømtilførsel i garasje.",
          "be_service": "EV_CHARGER",
          "be_time": "Innen 30 dager"
        },
        "url": "https://bestillelektriker.no/oppdrag/lenke/#be_mode=general&be_postal_code=0340&be_description=Montere%20elbillader%20og%20unders%C3%B8ke%20str%C3%B8mtilf%C3%B8rsel%20i%20garasje.&be_service=EV_CHARGER&be_time=Innen%2030%20dager"
      },
      "specific_company": {
        "company_name": "3D-ELEKTRONIKK AS",
        "profile_url": "https://bestillelektriker.no/firma/3d-elektronikk-as-995003163/",
        "parameters": {
          "be_mode": "specific_company",
          "be_postal_code": "0340",
          "be_description": "Montere elbillader og undersøke strømtilførsel i garasje.",
          "be_service": "EV_CHARGER",
          "be_time": "Innen 30 dager",
          "be_org": "995003163"
        },
        "url": "https://bestillelektriker.no/oppdrag/lenke/#be_mode=specific_company&be_postal_code=0340&be_description=Montere%20elbillader%20og%20unders%C3%B8ke%20str%C3%B8mtilf%C3%B8rsel%20i%20garasje.&be_service=EV_CHARGER&be_time=Innen%2030%20dager&be_org=995003163"
      }
    }
  },
  "x-mcp": {
    "endpoint": "https://bestillelektriker.no/mcp",
    "transport": "Streamable HTTP",
    "manifest": "https://bestillelektriker.no/mcp.json",
    "tools": [
      "search_companies",
      "get_company",
      "create_request_draft"
    ]
  }
}
