{
  "openapi": "3.1.0",
  "x-vctra-protocol": {
    "name": "VCTRA Business Identity & AI Resolution Protocol",
    "path": "/tjenester/business-identity-ai-resolution-protocol",
    "updatedAt": "2026-09-09",
    "headline": "Gjør virksomhetens kunnskap forståelig for AI-systemer, agenter og det nye nettet.",
    "definition": "VCTRA strukturerer, verifiserer og kobler virksomhetens kilder til én styrt identitet og kontekst — slik at AI kan finne, forstå og bruke riktig informasjon, med riktig kildegrunnlag og riktig tilgang.",
    "dataOwnership": "Kunden eier sine data. VCTRA leverer og drifter programvaren i henhold til avtalen.",
    "limitations": [
      "Tilgang, integrasjoner og leveranseomfang avtales med kunden.",
      "Ingen garanti for søkerangering, AI-sitering eller kommersielle resultater.",
      "Kundespesifikke sikkerhets- og fagkrav må vurderes før leveranse."
    ]
  },
  "externalDocs": {
    "description": "VCTRA Business Identity & AI Resolution Protocol",
    "url": "https://vctra.no/tjenester/business-identity-ai-resolution-protocol"
  },
  "info": {
    "title": "VCTRA API",
    "version": "v1",
    "description": "Public-safe contract. Protected operations require scoped credentials and tenant scope is resolved server-side."
  },
  "servers": [
    {
      "url": "https://api.vctra.no"
    }
  ],
  "paths": {
    "/api/version": {
      "get": {
        "summary": "API version",
        "responses": {
          "200": {
            "description": "Version and status"
          }
        }
      }
    },
    "/api/health": {
      "get": {
        "summary": "Service health",
        "responses": {
          "200": {
            "description": "Health state"
          }
        }
      }
    },
    "/api/answer": {
      "post": {
        "summary": "Resolve a rate-limited public VCTRA platform answer",
        "description": "Accepts only the VCTRA public platform scope. Client-provided tenant, organization or Evidence assertions are rejected.",
        "security": [],
        "responses": {
          "200": {
            "description": "Public-safe answer or explicit insufficient result"
          },
          "400": {
            "description": "Invalid request"
          },
          "403": {
            "description": "Forbidden scope assertion"
          },
          "429": {
            "description": "Runtime guard limit reached"
          },
          "503": {
            "description": "Answer runtime unavailable"
          }
        }
      }
    },
    "/api/public/profile/{orgNr}/answer": {
      "post": {
        "summary": "Resolve an Evidence-gated public profile answer",
        "security": [],
        "parameters": [
          {
            "name": "orgNr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{9}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Public-safe profile answer or explicit insufficient result"
          },
          "400": {
            "description": "Invalid organization number or question"
          },
          "404": {
            "description": "No published canonical profile"
          },
          "409": {
            "description": "Profile is not Answer-ready"
          },
          "429": {
            "description": "Runtime guard limit reached"
          },
          "503": {
            "description": "Canonical source or Answer runtime unavailable"
          }
        }
      }
    },
    "/api/public/customer-front/answer": {
      "post": {
        "summary": "Resolve an entitled customer-front answer",
        "security": [
          {
            "customerFrontToken": []
          },
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Tenant-bound customer-front answer"
          },
          "400": {
            "description": "Required fields missing"
          },
          "401": {
            "description": "Customer-front token required or invalid"
          },
          "403": {
            "description": "Token scope or tenant binding mismatch"
          },
          "429": {
            "description": "Quota or runtime guard limit reached"
          },
          "503": {
            "description": "Answer runtime unavailable"
          }
        }
      }
    },
    "/api/public/embed/profile/{orgNr}": {
      "get": {
        "summary": "Read a public-safe free-profile embed projection",
        "security": [],
        "parameters": [
          {
            "name": "orgNr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{9}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Embed data"
          },
          "400": {
            "description": "Invalid organization number"
          },
          "404": {
            "description": "Profile not found"
          },
          "503": {
            "description": "Projection unavailable"
          }
        }
      }
    },
    "/embed/profile/{orgNr}.js": {
      "get": {
        "summary": "Load the public profile embed script",
        "security": [],
        "parameters": [
          {
            "name": "orgNr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{9}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "JavaScript embed loader"
          },
          "400": {
            "description": "Invalid organization number"
          }
        }
      }
    },
    "/.well-known/agent-card.json": {
      "get": {
        "summary": "Read the A2A Agent Card",
        "security": [],
        "responses": {
          "200": {
            "description": "A2A Agent Card"
          }
        }
      }
    },
    "/api/a2a/v1": {
      "post": {
        "summary": "Invoke an entitled A2A skill over JSON-RPC",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "JSON-RPC result or protocol error"
          },
          "400": {
            "description": "Invalid A2A request"
          },
          "401": {
            "description": "Bearer token required or invalid"
          },
          "403": {
            "description": "Required scope not granted"
          }
        }
      }
    },
    "/api/mcp/v1": {
      "post": {
        "summary": "Use the authenticated MCP JSON-RPC transport",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "MCP JSON-RPC result or protocol error"
          },
          "401": {
            "description": "Bearer token required or invalid"
          },
          "403": {
            "description": "Required scope not granted"
          }
        }
      }
    },
    "/api/mcp/v1/tools/call": {
      "post": {
        "summary": "Use the authenticated MCP compatibility call",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "MCP tool result"
          },
          "400": {
            "description": "Unsupported tool"
          },
          "401": {
            "description": "Bearer token required or invalid"
          },
          "403": {
            "description": "Required scope or consumer binding mismatch"
          }
        }
      }
    },
    "/api/public/framework-go": {
      "get": {
        "summary": "Versioned VCTRA product, ICP, source and public-proof manifest",
        "responses": {
          "200": {
            "description": "Public-safe external framework manifest"
          }
        }
      }
    },
    "/api/public/proof/vctra-self-resolution": {
      "get": {
        "summary": "Controlled public VCTRA self-resolution proof",
        "responses": {
          "200": {
            "description": "Source-traced public proof projection"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      },
      "customerFrontToken": {
        "type": "apiKey",
        "in": "header",
        "name": "x-customer-front-token"
      }
    }
  },
  "x-vctra-governance": {
    "tenantScope": "server_resolved",
    "sourceFreshness": "returned where supported by the underlying object",
    "outcomeSemantics": "outcomes are governed observations, not automatic truth",
    "secretExamplesIncluded": false
  }
}