{
  "openapi": "3.1.0",
  "info": {
    "title": "Antla website API",
    "version": "1.0.0",
    "summary": "Machine-readable surface for antla.io",
    "description": "Public HTTP API for the Antla marketing site and agent-facing files (site metadata, docs/blog discovery, and structured errors). antla.io is informational only and does not expose the Shopify try-on backend. Merchants who need the product should install the app from https://apps.shopify.com/antla. Storefront try-on runs inside that app on the merchant's Shopify store.",
    "contact": {
      "name": "Antla",
      "email": "aaron@antla.io",
      "url": "https://antla.io"
    },
    "license": {
      "name": "Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://antla.io",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Discovery",
      "description": "Find the site map, docs, and this description."
    },
    {
      "name": "Site",
      "description": "Small JSON resources about Antla."
    }
  ],
  "paths": {
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApi",
        "tags": [
          "Discovery"
        ],
        "summary": "OpenAPI description",
        "description": "This document. Agents should start here to learn available operations.",
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 document",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "openapi": "3.1.0",
                  "info": {
                    "title": "Antla website API",
                    "version": "1.0.0"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/site": {
      "get": {
        "operationId": "getSite",
        "tags": [
          "Site"
        ],
        "summary": "Site metadata",
        "description": "Canonical name, product summary, and links to docs, llms.txt, sitemap, and OpenAPI.",
        "responses": {
          "200": {
            "description": "Site metadata",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Site"
                },
                "example": {
                  "name": "Antla",
                  "url": "https://antla.io",
                  "description": "Antla is an AI virtual try-on app for Shopify. Shoppers upload a photo and see themselves wearing a merchant's products, which lifts conversions and reduces returns.",
                  "product": "AI virtual try-on for Shopify Plus and enterprise fashion brands",
                  "origin": "marketing-site",
                  "scope": "antla.io is an informational marketing and docs site. It does not host the Shopify try-on backend. Install the app from the Shopify App Store to run try-on on a merchant store.",
                  "contact": "aaron@antla.io",
                  "install": "https://apps.shopify.com/antla",
                  "links": {
                    "home": "https://antla.io/",
                    "docs": "https://antla.io/docs",
                    "blog": "https://antla.io/blog",
                    "faq": "https://antla.io/faq",
                    "llms": "https://antla.io/llms.txt",
                    "openapi": "https://antla.io/openapi.json",
                    "sitemap": "https://antla.io/sitemap-index.xml",
                    "rss": "https://antla.io/rss.xml"
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/api/v1/health": {
      "get": {
        "operationId": "getHealth",
        "tags": [
          "Site"
        ],
        "summary": "Liveness",
        "description": "Returns status=ok when the site origin is serving API responses.",
        "responses": {
          "200": {
            "description": "Health",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                },
                "example": {
                  "status": "ok",
                  "service": "antla.io"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "tags": [
          "Discovery"
        ],
        "summary": "llms.txt site guide",
        "description": "Curated markdown index of Antla for language models.",
        "responses": {
          "200": {
            "description": "llms.txt",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap-index.xml": {
      "get": {
        "operationId": "getSitemapIndex",
        "tags": [
          "Discovery"
        ],
        "summary": "XML sitemap index",
        "responses": {
          "200": {
            "description": "Sitemap index",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/rss.xml": {
      "get": {
        "operationId": "getRss",
        "tags": [
          "Discovery"
        ],
        "summary": "Blog RSS feed",
        "responses": {
          "200": {
            "description": "RSS 2.0 feed of blog posts",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Site": {
        "type": "object",
        "required": [
          "name",
          "url",
          "description",
          "links"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "description": {
            "type": "string"
          },
          "product": {
            "type": "string"
          },
          "origin": {
            "type": "string",
            "enum": [
              "marketing-site"
            ]
          },
          "scope": {
            "type": "string"
          },
          "contact": {
            "type": "string"
          },
          "install": {
            "type": "string",
            "format": "uri"
          },
          "links": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "Health": {
        "type": "object",
        "required": [
          "status",
          "service"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok"
            ]
          },
          "service": {
            "type": "string"
          }
        }
      },
      "ProblemDetails": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "code",
          "hint"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Stable URI identifying this error class."
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation of this occurrence."
          },
          "instance": {
            "type": "string",
            "description": "The request path that failed."
          },
          "code": {
            "type": "string",
            "enum": [
              "not_found",
              "method_not_allowed",
              "not_acceptable",
              "bad_request"
            ],
            "description": "Machine-readable error code agents can branch on."
          },
          "hint": {
            "type": "string",
            "description": "What to try next (OpenAPI, llms.txt, docs, or a different method)."
          }
        }
      }
    },
    "responses": {
      "NotFound": {
        "description": "The path is not a documented operation.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            },
            "example": {
              "type": "https://antla.io/errors/not-found",
              "title": "Not Found",
              "status": 404,
              "detail": "No API operation exists at /api/v1/unknown.",
              "instance": "/api/v1/unknown",
              "code": "not_found",
              "hint": "See https://antla.io/openapi.json for available operations."
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Use GET or HEAD.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            },
            "example": {
              "type": "https://antla.io/errors/method-not-allowed",
              "title": "Method Not Allowed",
              "status": 405,
              "detail": "This endpoint does not support the requested HTTP method.",
              "instance": "/api/v1/site",
              "code": "method_not_allowed",
              "hint": "Use GET (or HEAD). Documented operations live at https://antla.io/openapi.json."
            }
          }
        }
      }
    }
  }
}
