{
  "openapi": "3.1.0",
  "info": {
    "title": "LargitData Public Content API",
    "version": "1.0.0",
    "summary": "Read-only access to the LargitData product catalog, knowledge base and blog.",
    "description": "The LargitData Public Content API exposes the same catalog that www.largitdata.com publishes as HTML: products and services, the knowledge / solutions / use-case / comparison / case-study page index, and the blog. It is read-only and needs no credentials.\n\nLargitData also operates two commercial, key-gated data services — the Social Media API and the Cross-border Ecommerce Data API. Those are not part of this document; see the \"Commercial APIs\" tag for how to request access.\n\nErrors follow RFC 9457 and are served as `application/problem+json` with a stable `code` field and a `hint` describing how to recover.",
    "termsOfService": "https://www.largitdata.com/policy/",
    "contact": {
      "name": "LargitData (大數軟體股份有限公司)",
      "url": "https://www.largitdata.com/developers/",
      "email": "david@largitdata.com"
    },
    "license": {
      "name": "LargitData Website Content Terms",
      "url": "https://www.largitdata.com/policy/"
    }
  },
  "servers": [
    {
      "url": "https://www.largitdata.com",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "LargitData developer portal",
    "url": "https://www.largitdata.com/developers/"
  },
  "tags": [
    {
      "name": "Service",
      "description": "Service discovery and capability listing."
    },
    {
      "name": "Catalog",
      "description": "Products, services and published site content."
    },
    {
      "name": "Commercial APIs",
      "description": "The Social Media API and the Cross-border Ecommerce Data API are commercial services delivered on a per-contract basis. Endpoints, fields, quotas and hosts are agreed during onboarding and authenticated with an `X-API-Key` header, so they are described here rather than specified as callable operations. Request a trial key at https://www.largitdata.com/developers/#commercial-apis.",
      "externalDocs": {
        "description": "Commercial API overview",
        "url": "https://www.largitdata.com/developers/#commercial-apis"
      }
    }
  ],
  "security": [],
  "paths": {
    "/api/v1/": {
      "get": {
        "operationId": "getServiceIndex",
        "summary": "Service index",
        "description": "Lists the available endpoints, supported languages and the error contract.",
        "tags": [
          "Service"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Service index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceIndex"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/products": {
      "get": {
        "operationId": "listProducts",
        "summary": "List products",
        "description": "The LargitData product and service catalog, with the canonical URL of each product page in every supported language.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned titles and descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "zh-tw",
                "en",
                "ja"
              ],
              "default": "zh-tw"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "page_size",
            "in": "query",
            "required": false,
            "description": "Items per page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List products",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Product"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/products/{product_id}": {
      "get": {
        "operationId": "getProduct",
        "summary": "Get one product",
        "description": "Look up a single product by its stable id, for example `infominer`.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "parameters": [
          {
            "name": "product_id",
            "in": "path",
            "required": true,
            "description": "Stable product identifier.",
            "schema": {
              "type": "string",
              "enum": [
                "infominer",
                "ragi",
                "qubicx",
                "aimochi",
                "social-media-api",
                "ecommerce-data-api",
                "ai-content-analysis",
                "ocr",
                "asr"
              ]
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned titles and descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "zh-tw",
                "en",
                "ja"
              ],
              "default": "zh-tw"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Get one product",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Product"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No such resource.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pages": {
      "get": {
        "operationId": "listPages",
        "summary": "List content pages",
        "description": "The knowledge, solutions, use-case, comparison, case-study, about and resources pages published on the site.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned titles and descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "zh-tw",
                "en",
                "ja"
              ],
              "default": "zh-tw"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "page_size",
            "in": "query",
            "required": false,
            "description": "Items per page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "section",
            "in": "query",
            "required": false,
            "description": "Restrict results to one section, for example `knowledge`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List content pages",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Page"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pages/{page_key}": {
      "get": {
        "operationId": "getPage",
        "summary": "Get one content page",
        "description": "Look up a single page by its key, for example `knowledge/what-is-rag`.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "parameters": [
          {
            "name": "page_key",
            "in": "path",
            "required": true,
            "description": "Page key, i.e. the site path without leading or trailing slashes.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned titles and descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "zh-tw",
                "en",
                "ja"
              ],
              "default": "zh-tw"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Get one content page",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Page"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No such resource.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/posts": {
      "get": {
        "operationId": "listPosts",
        "summary": "List blog posts",
        "description": "Blog posts ordered newest first. The HTML body is omitted from the list; fetch a single post to get it.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned titles and descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "zh-tw",
                "en",
                "ja"
              ],
              "default": "zh-tw"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "page_size",
            "in": "query",
            "required": false,
            "description": "Items per page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List blog posts",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PostSummary"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/posts/{slug}": {
      "get": {
        "operationId": "getPost",
        "summary": "Get one blog post",
        "description": "A single blog post including its HTML body.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Blog post slug.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned titles and descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "zh-tw",
                "en",
                "ja"
              ],
              "default": "zh-tw"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Get one blog post",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Post"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No such resource.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Write methods are not supported.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Used by the commercial Social Media API and Cross-border Ecommerce Data API. The public content API in this document requires no credentials."
      }
    },
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem document. Every error from this API uses this shape.",
        "required": [
          "type",
          "title",
          "status",
          "code",
          "detail",
          "hint"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Link to the documented error code."
          },
          "title": {
            "type": "string",
            "description": "Short, human-readable summary."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable error code.",
            "enum": [
              "invalid_parameter",
              "method_not_allowed",
              "not_found",
              "page_not_found",
              "post_not_found",
              "product_not_found",
              "server_error"
            ]
          },
          "detail": {
            "type": "string",
            "description": "What went wrong with this specific request."
          },
          "instance": {
            "type": "string",
            "description": "Path of the failing request."
          },
          "hint": {
            "type": "string",
            "description": "How to recover."
          },
          "documentation_url": {
            "type": "string",
            "format": "uri"
          },
          "parameter": {
            "type": "string",
            "description": "Offending query parameter, when applicable."
          },
          "allowed_methods": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "PaginationMeta": {
        "type": "object",
        "required": [
          "total",
          "page",
          "page_size",
          "total_pages"
        ],
        "properties": {
          "total": {
            "type": "integer"
          },
          "page": {
            "type": "integer"
          },
          "page_size": {
            "type": "integer"
          },
          "total_pages": {
            "type": "integer"
          },
          "lang": {
            "type": [
              "string",
              "null"
            ]
          },
          "section": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Links": {
        "type": "object",
        "properties": {
          "self": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "prev": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ServiceIndex": {
        "type": "object",
        "required": [
          "service",
          "version",
          "endpoints"
        ],
        "properties": {
          "service": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "terms_of_service": {
            "type": "string",
            "format": "uri"
          },
          "contact": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "errors": {
            "type": "object"
          }
        }
      },
      "Product": {
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "url",
          "urls"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "category": {
            "type": "string",
            "enum": [
              "platform",
              "data-api",
              "service"
            ]
          },
          "description": {
            "type": "string"
          },
          "commercial_api": {
            "type": "boolean",
            "description": "True when the product is a key-gated commercial data service."
          },
          "lang": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "urls": {
            "type": "object",
            "description": "The same value in each supported language, keyed by language code.",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "Page": {
        "type": "object",
        "required": [
          "key",
          "section",
          "title",
          "url"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "section": {
            "type": "string"
          },
          "lang": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "type": {
            "type": "string",
            "description": "schema.org type of the page."
          },
          "is_index": {
            "type": "boolean"
          },
          "published_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "urls": {
            "type": "object",
            "description": "The same value in each supported language, keyed by language code.",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "PostSummary": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": [
              "string",
              "null"
            ]
          },
          "lang": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "published_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Post": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PostSummary"
          },
          {
            "type": "object",
            "properties": {
              "answer_summary": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Self-contained plain-text answer block written for citation by AI assistants."
              },
              "content_html": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          }
        ]
      }
    }
  }
}