{
  "openapi": "3.0.3",
  "info": {
    "title": "Novoterm Agent API",
    "description": "Read-only, public JSON API exposing Novoterm Translation's services, industries, team, case studies, and FAQ for AI agents and automated systems. No authentication required.",
    "version": "1.0.0",
    "x-modified": "2026-07-28",
    "contact": {
      "name": "Novoterm Translation",
      "email": "info@novoterm.se",
      "url": "https://www.novoterm.se/kontakta-oss"
    }
  },
  "servers": [
    {
      "url": "https://www.novoterm.se"
    }
  ],
  "externalDocs": {
    "description": "Machine-readable agent page",
    "url": "https://www.novoterm.se/agent"
  },
  "x-api-base-url": "https://www.novoterm.se/agent/v1",
  "paths": {
    "/agent/v1/index.json": {
      "get": {
        "summary": "Directory of every /agent/v1 endpoint with its HTTP method, canonical URL, and a plain-language description.",
        "description": "Directory of every /agent/v1 endpoint with its HTTP method, canonical URL, and a plain-language description.",
        "operationId": "index",
        "tags": [
          "read-only",
          "discovery"
        ],
        "responses": {
          "200": {
            "description": "Directory of every /agent/v1 endpoint with its HTTP method, canonical URL, and a plain-language description.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IndexResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/schema.json": {
      "get": {
        "summary": "Response shape definitions for each /agent/v1 endpoint, so agents know the fields to expect before fetching.",
        "description": "Response shape definitions for each /agent/v1 endpoint, so agents know the fields to expect before fetching.",
        "operationId": "schema",
        "tags": [
          "read-only",
          "schema"
        ],
        "responses": {
          "200": {
            "description": "Response shape definitions for each /agent/v1 endpoint, so agents know the fields to expect before fetching.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SchemaResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/company.json": {
      "get": {
        "summary": "Novoterm Translation company identity: founding year, headquarters, team size, languages, philosophy, and contact pathways.",
        "description": "Novoterm Translation company identity: founding year, headquarters, team size, languages, philosophy, and contact pathways.",
        "operationId": "company",
        "tags": [
          "read-only",
          "company"
        ],
        "responses": {
          "200": {
            "description": "Novoterm Translation company identity: founding year, headquarters, team size, languages, philosophy, and contact pathways.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/services.json": {
      "get": {
        "summary": "All translation and language-review services, each with a description, benefits, and service-specific FAQs.",
        "description": "All translation and language-review services, each with a description, benefits, and service-specific FAQs.",
        "operationId": "services",
        "tags": [
          "read-only",
          "services"
        ],
        "responses": {
          "200": {
            "description": "All translation and language-review services, each with a description, benefits, and service-specific FAQs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicesResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/industries.json": {
      "get": {
        "summary": "All 15 industries Novoterm serves, each with a description of the sector-specific expertise offered.",
        "description": "All 15 industries Novoterm serves, each with a description of the sector-specific expertise offered.",
        "operationId": "industries",
        "tags": [
          "read-only",
          "industries"
        ],
        "responses": {
          "200": {
            "description": "All 15 industries Novoterm serves, each with a description of the sector-specific expertise offered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IndustriesResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/case-studies.json": {
      "get": {
        "summary": "Client case studies, each with the client, industry, services used, challenge, solution, and results.",
        "description": "Client case studies, each with the client, industry, services used, challenge, solution, and results.",
        "operationId": "case_studies",
        "tags": [
          "read-only",
          "case-studies"
        ],
        "responses": {
          "200": {
            "description": "Client case studies, each with the client, industry, services used, challenge, solution, and results.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseStudiesResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/team.json": {
      "get": {
        "summary": "Novoterm's in-house team: name, role, and bio for each team member.",
        "description": "Novoterm's in-house team: name, role, and bio for each team member.",
        "operationId": "team",
        "tags": [
          "read-only",
          "team"
        ],
        "responses": {
          "200": {
            "description": "Novoterm's in-house team: name, role, and bio for each team member.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/faq.json": {
      "get": {
        "summary": "Frequently asked questions, combining the general FAQ page with every per-service FAQ.",
        "description": "Frequently asked questions, combining the general FAQ page with every per-service FAQ.",
        "operationId": "faq",
        "tags": [
          "read-only",
          "faq"
        ],
        "responses": {
          "200": {
            "description": "Frequently asked questions, combining the general FAQ page with every per-service FAQ.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FaqResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agent/v1/articles.json": {
      "get": {
        "summary": "Novoterm's article library: all published articles with their full text, for on-topic questions about translation, AI translation, proofreading, and industry-specific advice.",
        "description": "Novoterm's article library: all published articles with their full text, for on-topic questions about translation, AI translation, proofreading, and industry-specific advice.",
        "operationId": "articles",
        "tags": [
          "read-only",
          "articles"
        ],
        "responses": {
          "200": {
            "description": "Novoterm's article library: all published articles with their full text, for on-topic questions about translation, AI translation, proofreading, and industry-specific advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArticlesResponse"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while producing the response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ResponseEnvelope": {
        "type": "object",
        "description": "Standard metadata envelope wrapping every /agent/v1 response.",
        "required": [
          "name",
          "description",
          "url",
          "modified",
          "usage"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Machine-friendly name of the endpoint."
          },
          "description": {
            "type": "string",
            "description": "Plain-language description of what the endpoint returns."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical absolute URL of the endpoint."
          },
          "modified": {
            "type": "string",
            "format": "date",
            "description": "Freshness signal (YYYY-MM-DD); agents use it to detect stale data."
          },
          "usage": {
            "type": "string",
            "description": "Usage and licensing note for the payload."
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "description": "Typed error payload returned when a request cannot be fulfilled.",
        "required": [
          "status",
          "title"
        ],
        "properties": {
          "status": {
            "type": "integer",
            "description": "HTTP status code duplicated in the body for convenience.",
            "example": 404
          },
          "title": {
            "type": "string",
            "description": "Short, stable, machine-comparable summary of the error.",
            "example": "Not Found"
          },
          "detail": {
            "type": "string",
            "description": "Optional longer, human-readable explanation of the error."
          }
        }
      },
      "Faq": {
        "type": "object",
        "description": "A single question/answer pair.",
        "required": [
          "question",
          "answer",
          "scope"
        ],
        "properties": {
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "scope": {
            "type": "string",
            "description": "\"general\" for the master FAQ, or a service slug for a service-specific FAQ."
          }
        }
      },
      "Service": {
        "type": "object",
        "description": "A single Novoterm translation or language-review service.",
        "required": [
          "slug",
          "title",
          "url",
          "heading",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "heading": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "benefits": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                }
              }
            }
          },
          "faqs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Faq"
            }
          },
          "process": {
            "type": "array",
            "description": "The 4-step delivery process (Analys/Uppstart/Översättning/Leverans), where present.",
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "integer"
                },
                "tag": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Industry": {
        "type": "object",
        "description": "A single industry Novoterm serves.",
        "required": [
          "slug",
          "title",
          "url",
          "heading",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "heading": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "whyNovoterm": {
            "type": "object",
            "nullable": true,
            "properties": {
              "heading": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            }
          },
          "expertise": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                }
              }
            }
          },
          "whatWeTranslate": {
            "type": "object",
            "nullable": true,
            "properties": {
              "heading": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            }
          },
          "documentExamples": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Example document types translated within this industry."
          }
        }
      },
      "CaseStudy": {
        "type": "object",
        "description": "A single client case study.",
        "required": [
          "slug",
          "title",
          "url",
          "client",
          "industry"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "client": {
            "type": "string"
          },
          "industry": {
            "type": "string"
          },
          "servicesUsed": {
            "type": "string"
          },
          "heroHeading": {
            "type": "string"
          },
          "heroSubheading": {
            "type": "string"
          },
          "introHeading": {
            "type": "string"
          },
          "narrative": {
            "type": "string",
            "description": "The substantive narrative: what was actually delivered for the client."
          },
          "aboutClient": {
            "type": "string",
            "description": "Short 'about the client' sidebar blurb."
          },
          "challenges": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "solution": {
            "type": "object"
          },
          "results": {
            "type": "object"
          }
        }
      },
      "TeamMember": {
        "type": "object",
        "description": "A single Novoterm in-house team member.",
        "required": [
          "slug",
          "name",
          "position"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "position": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "bio": {
            "type": "string"
          },
          "quote": {
            "type": "string"
          }
        }
      },
      "Company": {
        "type": "object",
        "description": "Novoterm Translation company identity.",
        "required": [
          "name",
          "url",
          "description",
          "foundingDate"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "legalName": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "description": {
            "type": "string"
          },
          "foundingDate": {
            "type": "string"
          },
          "headquarters": {
            "type": "string"
          },
          "inHouseTeamSize": {
            "type": "integer"
          },
          "freelanceNetworkSize": {
            "type": "string"
          },
          "languages": {
            "type": "string"
          },
          "ceo": {
            "type": "string"
          },
          "philosophy": {
            "type": "string"
          },
          "pricingModel": {
            "type": "string"
          },
          "contact": {
            "type": "object"
          },
          "about": {
            "type": "object",
            "description": "CEO's letter, company philosophy, and founding history, sourced from the /om-oss page.",
            "properties": {
              "heroTagline": {
                "type": "string"
              },
              "heroLead": {
                "type": "string"
              },
              "ceo": {
                "type": "object",
                "nullable": true,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "role": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                }
              },
              "philosophy": {
                "type": "object",
                "nullable": true,
                "properties": {
                  "heading": {
                    "type": "string"
                  },
                  "text": {
                    "type": "string"
                  }
                }
              },
              "history": {
                "type": "object",
                "nullable": true,
                "properties": {
                  "heading": {
                    "type": "string"
                  },
                  "text": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "Article": {
        "type": "object",
        "description": "A single Novoterm article, with full body text.",
        "required": [
          "slug",
          "title",
          "url",
          "content"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "excerpt": {
            "type": "string"
          },
          "content": {
            "type": "string",
            "description": "Full plain-text article body."
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "IndexResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "description": "Directory of every /agent/v1 endpoint."
              }
            }
          }
        ]
      },
      "SchemaResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "description": "Response shape definitions for each endpoint."
              }
            }
          }
        ]
      },
      "CompanyResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Company"
              }
            }
          }
        ]
      },
      "ServicesResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Service"
                }
              }
            }
          }
        ]
      },
      "IndustriesResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Industry"
                }
              }
            }
          }
        ]
      },
      "CaseStudiesResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/CaseStudy"
                }
              }
            }
          }
        ]
      },
      "TeamResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TeamMember"
                }
              }
            }
          }
        ]
      },
      "FaqResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Faq"
                }
              }
            }
          }
        ]
      },
      "ArticlesResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResponseEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Article"
                }
              }
            }
          }
        ]
      }
    }
  }
}
