{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "OpenSpeaker public catalog API",
    "version": "1.0.0",
    "description": "Read-only metadata for the AI tools currently active on OpenSpeaker. This catalog specification is separate from the authenticated generation API and does not expose generation endpoints or secrets.",
    "contact": {
      "name": "OpenSpeaker support",
      "email": "vivoo.global.network@gmail.com",
      "url": "https://openspeaker.ai/privacy"
    }
  },
  "externalDocs": {
    "description": "OpenSpeaker generation API documentation",
    "url": "https://openspeaker.ai/app/api-document"
  },
  "servers": [
    {
      "url": "https://openspeaker.ai"
    }
  ],
  "tags": [
    {
      "name": "Catalog",
      "description": "Source-verified metadata for active OpenSpeaker tools and connected models."
    }
  ],
  "paths": {
    "/api/catalog.json": {
      "get": {
        "operationId": "getActiveOpenSpeakerCatalog",
        "summary": "Get the source-verified active OpenSpeaker tool catalog",
        "description": "Returns bilingual product metadata, current entry pricing, connected providers and explicit legacy exclusions. This endpoint does not create AI content.",
        "tags": [
          "Catalog"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Active catalog in English and Vietnamese",
            "headers": {
              "Cache-Control": {
                "description": "Public cache policy for the catalog response.",
                "schema": {
                  "type": "string",
                  "example": "public, max-age=3600"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "Cross-origin read access.",
                "schema": {
                  "type": "string",
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "LocalizedText": {
        "type": "object",
        "required": [
          "en",
          "vi"
        ],
        "properties": {
          "en": {
            "type": "string"
          },
          "vi": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "LocalizedStringList": {
        "type": "object",
        "required": [
          "en",
          "vi"
        ],
        "properties": {
          "en": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "vi": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "Money": {
        "type": "object",
        "required": [
          "usd",
          "vnd"
        ],
        "properties": {
          "usd": {
            "type": "number",
            "minimum": 0
          },
          "vnd": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "Publisher": {
        "type": "object",
        "required": [
          "@type",
          "name",
          "legalName",
          "url",
          "email",
          "sameAs"
        ],
        "properties": {
          "@type": {
            "type": "string",
            "const": "Organization"
          },
          "name": {
            "type": "string"
          },
          "legalName": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "sameAs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          }
        },
        "additionalProperties": false
      },
      "Pricing": {
        "type": "object",
        "required": [
          "currency",
          "startsAt",
          "premiumCreditsPerBasePackage",
          "purchaseRange",
          "volumeCreditFormula",
          "validityOptions",
          "flatPricePromotion",
          "earlyStageRationale",
          "dataUseNotice"
        ],
        "properties": {
          "currency": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "USD",
                "VND"
              ]
            }
          },
          "startsAt": {
            "$ref": "#/components/schemas/Money"
          },
          "premiumCreditsPerBasePackage": {
            "type": "integer",
            "minimum": 1
          },
          "purchaseRange": {
            "type": "object",
            "required": [
              "min",
              "max"
            ],
            "properties": {
              "min": {
                "type": "integer",
                "minimum": 1
              },
              "max": {
                "type": "integer",
                "minimum": 1
              }
            },
            "additionalProperties": false
          },
          "volumeCreditFormula": {
            "type": "string"
          },
          "validityOptions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "duration",
                "usd",
                "vnd"
              ],
              "properties": {
                "duration": {
                  "type": "string"
                },
                "usd": {
                  "type": "number",
                  "minimum": 0
                },
                "vnd": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "additionalProperties": false
            }
          },
          "flatPricePromotion": {
            "type": "object",
            "required": [
              "endsAt",
              "unitPrice"
            ],
            "properties": {
              "endsAt": {
                "type": "string",
                "format": "date-time"
              },
              "unitPrice": {
                "$ref": "#/components/schemas/Money"
              }
            },
            "additionalProperties": false
          },
          "earlyStageRationale": {
            "type": "string"
          },
          "dataUseNotice": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "Tool": {
        "type": "object",
        "required": [
          "slug",
          "status",
          "category",
          "name",
          "description",
          "capabilities",
          "connectedProviders",
          "web",
          "applicationUrl"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
          },
          "status": {
            "type": "string",
            "const": "active"
          },
          "category": {
            "type": "string",
            "enum": [
              "voice",
              "music",
              "image"
            ]
          },
          "name": {
            "$ref": "#/components/schemas/LocalizedText"
          },
          "description": {
            "$ref": "#/components/schemas/LocalizedText"
          },
          "capabilities": {
            "$ref": "#/components/schemas/LocalizedStringList"
          },
          "connectedProviders": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "web": {
            "type": "object",
            "required": [
              "en",
              "vi"
            ],
            "properties": {
              "en": {
                "type": "string",
                "format": "uri"
              },
              "vi": {
                "type": "string",
                "format": "uri"
              }
            },
            "additionalProperties": false
          },
          "applicationUrl": {
            "type": "string",
            "format": "uri"
          }
        },
        "additionalProperties": false
      },
      "ImageModelGroup": {
        "type": "object",
        "required": [
          "provider",
          "models"
        ],
        "properties": {
          "provider": {
            "type": "string"
          },
          "models": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "Catalog": {
        "type": "object",
        "required": [
          "@context",
          "@type",
          "name",
          "url",
          "publisher",
          "lastVerified",
          "defaultLanguage",
          "supportedLanguages",
          "pricing",
          "policies",
          "counts",
          "tools",
          "imageModels",
          "notInActiveCatalog",
          "sourceOfTruthNote"
        ],
        "properties": {
          "@context": {
            "type": "string",
            "const": "https://schema.org"
          },
          "@type": {
            "type": "string",
            "const": "ItemList"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "lastVerified": {
            "type": "string",
            "format": "date"
          },
          "defaultLanguage": {
            "type": "string",
            "const": "en"
          },
          "supportedLanguages": {
            "type": "array",
            "minItems": 2,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "en",
                "vi"
              ]
            }
          },
          "pricing": {
            "$ref": "#/components/schemas/Pricing"
          },
          "policies": {
            "type": "object",
            "required": [
              "privacy",
              "terms",
              "cookies",
              "aiDataUse"
            ],
            "properties": {
              "privacy": {
                "type": "string",
                "format": "uri"
              },
              "terms": {
                "type": "string",
                "format": "uri"
              },
              "cookies": {
                "type": "string",
                "format": "uri"
              },
              "aiDataUse": {
                "type": "string",
                "format": "uri"
              }
            },
            "additionalProperties": false
          },
          "counts": {
            "type": "object",
            "required": [
              "activeTools",
              "activeImageModels",
              "connectedBrands"
            ],
            "properties": {
              "activeTools": {
                "type": "integer",
                "minimum": 0
              },
              "activeImageModels": {
                "type": "integer",
                "minimum": 0
              },
              "connectedBrands": {
                "type": "integer",
                "minimum": 0
              }
            },
            "additionalProperties": false
          },
          "tools": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tool"
            }
          },
          "imageModels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImageModelGroup"
            }
          },
          "notInActiveCatalog": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sourceOfTruthNote": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  }
}