{
  "openapi": "3.0.1",
  "info": {
    "title": "PageWeave API",
    "version": "v1",
    "description": "API for managing PageWeave websites, pages, forms, tables, and OAuth integration."
  },
  "components": {
    "schemas": {
      "PaginationMeta": {
        "type": "object",
        "properties": {
          "current_page": {
            "type": "integer",
            "nullable": true
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          },
          "prev_page": {
            "type": "integer",
            "nullable": true
          },
          "total_pages": {
            "type": "integer"
          },
          "total_count": {
            "type": "integer"
          }
        }
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "API key or OAuth access token. Use OAuth2 flow to obtain a token for MCP clients."
      },
      "OAuth2": {
        "type": "oauth2",
        "description": "OAuth 2.0 authorization code flow with PKCE (S256). Used by MCP clients.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://pageweave.dev/oauth/authorize",
            "tokenUrl": "https://pageweave.dev/oauth/token",
            "refreshUrl": "https://pageweave.dev/oauth/token",
            "scopes": {
              "website:read": "View your websites",
              "website:write": "Create and edit your websites",
              "website:delete": "Delete your websites",
              "page:read": "View your pages",
              "page:write": "Create and edit your pages",
              "page:delete": "Delete your pages",
              "component:read": "View your website components",
              "component:write": "Edit your website components",
              "component:delete": "Delete your website components",
              "html_head:read": "View your html_head content",
              "html_head:write": "Edit your html_head content",
              "html_head:delete": "Delete your html_head content",
              "asset:read": "View your uploaded assets",
              "asset:write": "Upload new assets",
              "asset:delete": "Delete your assets",
              "snippet:read": "View your text files",
              "snippet:write": "Create and edit your text files",
              "snippet:delete": "Delete your text files",
              "form:read": "View your forms",
              "form:write": "Create and edit your forms",
              "form:delete": "Delete your forms",
              "table:read": "View your tables",
              "table:write": "Create and edit your tables",
              "table:delete": "Delete your tables",
              "row:read": "View your table rows",
              "row:write": "Create and edit your table rows",
              "row:delete": "Delete your table rows",
              "submission:read": "View form submissions",
              "submission:delete": "Delete form submissions",
              "preview:start": "Start preview sessions",
              "preview:stop": "Stop preview sessions",
              "version:read": "View version history",
              "version:pin": "Pin any version as live",
              "version:unpin": "Unpin, reverting to latest version",
              "version:revert": "Revert to previous versions",
              "webhook:read": "View webhook endpoints",
              "webhook:write": "Create and edit webhook endpoints",
              "webhook:delete": "Delete webhook endpoints",
              "domain:read": "View custom domains",
              "domain:write": "Add and edit custom domains",
              "domain:delete": "Remove custom domains",
              "domain:purchase": "Purchase domains",
              "dns:read": "View DNS records",
              "dns:write": "Manage DNS records",
              "access:read": "View team access",
              "access:delete": "Remove team access",
              "invitation:read": "View invitations",
              "invitation:write": "Invite team members",
              "invitation:delete": "Cancel invitations",
              "redirect:read": "View path redirects",
              "redirect:write": "Create and edit path redirects",
              "redirect:delete": "Delete path redirects",
              "analytics:read": "View analytics"
            }
          }
        }
      }
    }
  },
  "paths": {
    "/api/v1/domains/availability_check": {
      "post": {
        "summary": "check domain availability",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "batch results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "vat_note": {
                      "type": "string",
                      "description": "VAT disclaimer, always present."
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "available": {
                            "type": "boolean"
                          },
                          "registration_price": {
                            "type": "object",
                            "nullable": true,
                            "properties": {
                              "amount": {
                                "type": "string"
                              },
                              "currency": {
                                "type": "string"
                              }
                            }
                          },
                          "transfer_price": {
                            "type": "object",
                            "nullable": true,
                            "properties": {
                              "amount": {
                                "type": "string"
                              },
                              "currency": {
                                "type": "string"
                              }
                            }
                          },
                          "premium": {
                            "type": "boolean"
                          },
                          "whois_privacy_supported": {
                            "type": "boolean",
                            "nullable": true
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "vat_note",
                    "rows"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "unauthorized"
          },
          "400": {
            "description": "missing names"
          },
          "422": {
            "description": "checker failure"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "names": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "names"
                ]
              }
            }
          },
          "required": true
        }
      }
    },
    "/api/v1/domains/{domain_id}/dns_records": {
      "parameters": [
        {
          "name": "domain_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list DNS records",
        "tags": [
          "DNS Records"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Filter by record type",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "host",
            "in": "query",
            "required": false,
            "description": "Filter by host",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "503": {
            "description": "DNS provider unavailable"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "add DNS record",
        "tags": [
          "DNS Records"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "invalid record type"
          },
          "503": {
            "description": "DNS provider unavailable"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "A",
                      "AAAA",
                      "ALIAS",
                      "CNAME",
                      "MX",
                      "TXT",
                      "NS",
                      "SRV"
                    ]
                  },
                  "host": {
                    "type": "string"
                  },
                  "record": {
                    "type": "string"
                  },
                  "ttl": {
                    "type": "integer"
                  },
                  "priority": {
                    "type": "integer"
                  },
                  "weight": {
                    "type": "integer"
                  },
                  "port": {
                    "type": "integer"
                  }
                },
                "required": [
                  "type",
                  "host",
                  "record",
                  "ttl"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/domains/{domain_id}/dns_records/{id}": {
      "parameters": [
        {
          "name": "domain_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        },
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show DNS record",
        "tags": [
          "DNS Records"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "503": {
            "description": "DNS provider unavailable"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update DNS record",
        "tags": [
          "DNS Records"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "503": {
            "description": "DNS provider unavailable"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "record": {
                    "type": "string"
                  },
                  "ttl": {
                    "type": "integer"
                  },
                  "priority": {
                    "type": "integer"
                  },
                  "weight": {
                    "type": "integer"
                  },
                  "port": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete DNS record",
        "tags": [
          "DNS Records"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "503": {
            "description": "DNS provider unavailable"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/domains/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show domain",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update domain",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dns_managed": {
                    "type": "boolean",
                    "description": "Enable DNS management"
                  },
                  "auto_renew": {
                    "type": "boolean",
                    "description": "Enable auto-renewal (purchased domains only)"
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "update domain",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dns_managed": {
                    "type": "boolean",
                    "description": "Enable DNS management"
                  },
                  "auto_renew": {
                    "type": "boolean",
                    "description": "Enable auto-renewal (purchased domains only)"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete domain",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          },
          "422": {
            "description": "purchased domain cannot be deleted"
          }
        }
      }
    },
    "/api/v1/websites/accesses/{access_id}/invitations": {
      "parameters": [
        {
          "name": "access_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list invitations",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "invite user",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string"
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "admin",
                      "editor",
                      "viewer"
                    ]
                  }
                },
                "required": [
                  "email",
                  "role"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/accesses/invitations/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show invitation",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "delete": {
        "summary": "delete invitation",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/accesses": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list accesses",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/accesses/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show access (flat)",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "delete": {
        "summary": "remove access (flat)",
        "tags": [
          "Accesses"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "removed"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/analytics": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "retrieve analytics",
        "tags": [
          "Analytics"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "ISO date (default: 7 days ago)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "ISO date (default: today)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "granularity",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "daily",
                "hourly"
              ]
            }
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "overview",
                  "time_series",
                  "top_pages",
                  "top_referrers",
                  "top_countries",
                  "top_cities",
                  "live_visitors",
                  "bot_overview",
                  "bot_time_series",
                  "top_bots",
                  "ai_agent_pages"
                ]
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "with date range",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "bad request — invalid date format",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/assets": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        },
        {
          "name": "asset_id",
          "in": "query",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": false,
          "description": "Optional existing asset UUID. When set, replaces that asset's bytes (URL/filename preserved, content_type must match). Returns 200 instead of 201."
        }
      ],
      "get": {
        "summary": "list assets",
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page (default: 50, uncapped)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "content_type",
            "in": "query",
            "required": false,
            "description": "Filter by MIME type: a category alias (image, font, document, audio, video, text) or a raw prefix (e.g. image/png).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filename",
            "in": "query",
            "required": false,
            "description": "Case-insensitive substring search on filename.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "description": "Returns only assets whose filename contains the substring (case-insensitive).",
        "responses": {
          "200": {
            "description": "filtered by filename"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "upload asset directly",
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "description": "Returns the updated asset when asset_id is provided. Same schema as 201 created.",
        "responses": {
          "201": {
            "description": "created"
          },
          "200": {
            "description": "asset replaced",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "filename",
                    "content_type",
                    "byte_size",
                    "relative_url",
                    "storage"
                  ],
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "filename": {
                      "type": "string"
                    },
                    "content_type": {
                      "type": "string"
                    },
                    "byte_size": {
                      "type": "integer"
                    },
                    "relative_url": {
                      "type": "string",
                      "description": "Includes ?v=<cache_bust_token> query param"
                    },
                    "storage": {
                      "type": "object",
                      "properties": {
                        "used_bytes": {
                          "type": "integer"
                        },
                        "limit_bytes": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "content type mismatch"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "string"
              }
            }
          },
          "required": true
        }
      }
    },
    "/api/v1/websites/{website_id}/assets/request_upload_url": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        },
        {
          "name": "asset_id",
          "in": "query",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": false,
          "description": "Optional existing asset UUID. When set, the PUT replaces that asset's bytes (URL/filename preserved, content_type must match)."
        }
      ],
      "post": {
        "summary": "request session-based upload URL",
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "description": "When asset_id does not exist or belongs to a different website.",
        "responses": {
          "200": {
            "description": "success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "upload_url",
                    "expires_at",
                    "storage"
                  ],
                  "properties": {
                    "upload_url": {
                      "type": "string"
                    },
                    "expires_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "storage": {
                      "type": "object",
                      "properties": {
                        "used_bytes": {
                          "type": "integer"
                        },
                        "limit_bytes": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "asset not found"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/assets/upload": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "upload asset from URL",
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "description": "When replacing via base64, content_type is required to match the existing asset.",
        "responses": {
          "422": {
            "description": "base64 replace without content_type"
          },
          "200": {
            "description": "asset replaced",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "filename",
                    "content_type",
                    "byte_size",
                    "relative_url",
                    "storage"
                  ],
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "filename": {
                      "type": "string"
                    },
                    "content_type": {
                      "type": "string"
                    },
                    "byte_size": {
                      "type": "integer"
                    },
                    "relative_url": {
                      "type": "string",
                      "description": "Includes ?v=<cache_bust_token> query param"
                    },
                    "storage": {
                      "type": "object",
                      "properties": {
                        "used_bytes": {
                          "type": "integer"
                        },
                        "limit_bytes": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "HTTPS URL to fetch the file from"
                  },
                  "base64": {
                    "type": "string",
                    "description": "Base64-encoded content (≤20KB decoded)"
                  },
                  "filename": {
                    "type": "string",
                    "description": "Required for base64 mode"
                  },
                  "content_type": {
                    "type": "string",
                    "description": "Required for base64 mode"
                  },
                  "asset_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Optional existing asset UUID. When set, replaces that asset's bytes (URL/filename preserved, content_type must match). Returns 200 instead of 201."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/assets/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show asset (flat)",
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "delete": {
        "summary": "delete asset (flat)",
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/domains": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list domains",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "add domain",
        "tags": [
          "Domains"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created on pro plan"
          },
          "422": {
            "description": "account domain limit reached"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/footers/{footer_id}/versions": {
      "parameters": [
        {
          "name": "footer_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list footer versions",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/footers/versions/{id}/pin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "patch": {
        "summary": "pin footer version",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "pinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/footers/versions/{id}/revert": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "revert footer version",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "reverted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/footers": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list footers",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "empty"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create footer",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "invalid"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "default_on_page_language": {
                    "type": "string",
                    "nullable": true
                  },
                  "html_content": {
                    "type": "string"
                  }
                },
                "required": [
                  "html_content"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/footers/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show footer (flat)",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update footer (flat)",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "default_on_page_language": {
                    "type": "string",
                    "nullable": true
                  },
                  "html_content": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete footer (flat)",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/footers/{id}/unpin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "unpin footer (flat)",
        "tags": [
          "Footers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "unpinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/forms/{form_id}/submissions": {
      "parameters": [
        {
          "name": "form_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list form submissions",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/forms/submissions/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show submission",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "delete": {
        "summary": "delete submission",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/forms/{form_id}/versions": {
      "parameters": [
        {
          "name": "form_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list form versions",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/forms": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list forms",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create form",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  },
                  "success_message": {
                    "type": "string"
                  },
                  "redirect_path": {
                    "type": "string"
                  },
                  "notification_email": {
                    "type": "string"
                  }
                },
                "required": [
                  "name",
                  "fields"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/forms/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show form (flat)",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update form (flat)",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete form (flat)",
        "tags": [
          "Forms"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/headers/{header_id}/versions": {
      "parameters": [
        {
          "name": "header_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list header versions",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/headers/versions/{id}/pin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "patch": {
        "summary": "pin header version",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "pinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/headers/versions/{id}/revert": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "revert header version",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "reverted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/headers": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list headers",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "empty"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create header",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "invalid"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "default_on_page_language": {
                    "type": "string",
                    "nullable": true
                  },
                  "html_content": {
                    "type": "string"
                  }
                },
                "required": [
                  "html_content"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/headers/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show header (flat)",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update header (flat)",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated via old_html edit"
          },
          "422": {
            "description": "edit fails when old_html not found"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "default_on_page_language": {
                    "type": "string",
                    "nullable": true
                  },
                  "html_content": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete header (flat)",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/headers/{id}/unpin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "unpin header (flat)",
        "tags": [
          "Headers"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "unpinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/html_heads/{html_head_id}/versions": {
      "parameters": [
        {
          "name": "html_head_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list html_head versions",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/html_heads/versions/{id}/pin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "patch": {
        "summary": "pin html_head version",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "pinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/html_heads/versions/{id}/revert": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "revert html_head version",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "reverted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/html_heads": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list html_heads",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "empty"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create html_head",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "invalid"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "default_on_page_language": {
                    "type": "string",
                    "nullable": true
                  },
                  "html_content": {
                    "type": "string"
                  }
                },
                "required": [
                  "html_content"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/html_heads/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show html_head (flat)",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update html_head (flat)",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "default_on_page_language": {
                    "type": "string",
                    "nullable": true
                  },
                  "html_content": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete html_head (flat)",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/html_heads/{id}/unpin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "unpin html_head (flat)",
        "tags": [
          "HtmlHeads"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "unpinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/pages/{page_id}/versions": {
      "parameters": [
        {
          "name": "page_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list page versions",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/pages/versions/{id}/pin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "patch": {
        "summary": "pin page version",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "pinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/pages/versions/{id}/revert": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "revert page version",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "reverted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/pages": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list pages",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "description": "Path prefix filter",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "recursive",
            "in": "query",
            "required": false,
            "description": "Direct children only (default: true)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "pattern",
            "in": "query",
            "required": false,
            "description": "Glob on full path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "content_query",
            "in": "query",
            "required": false,
            "description": "Regex over live content",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "directories with recursive=false"
          },
          "422": {
            "description": "invalid content_query regex"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create page",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "invalid"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "path": {
                    "type": "string"
                  },
                  "html_content": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "additional_html_head_html": {
                    "type": "string"
                  },
                  "language": {
                    "type": "string"
                  },
                  "indexable": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "path",
                  "html_content"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/pages/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show page (flat)",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update page (flat)",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated indexable only"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "html_content": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "additional_html_head_html": {
                    "type": "string"
                  },
                  "indexable": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete page (flat)",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/pages/{id}/unpin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "unpin page (flat)",
        "tags": [
          "Pages"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "unpinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/preview_sessions": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "start preview session",
        "tags": [
          "Preview Sessions"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "201": {
            "description": "created"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/preview_sessions/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "stop preview session (flat)",
        "tags": [
          "Preview Sessions"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "stopped"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/redirects": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list redirects",
        "tags": [
          "Redirects"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "empty"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create redirect",
        "tags": [
          "Redirects"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "target page missing"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source_path": {
                    "type": "string"
                  },
                  "target_path": {
                    "type": "string"
                  },
                  "status_code": {
                    "type": "integer",
                    "enum": [
                      301,
                      302
                    ]
                  }
                },
                "required": [
                  "source_path",
                  "target_path"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/redirects/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show redirect (flat)",
        "tags": [
          "Redirects"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update redirect (flat)",
        "tags": [
          "Redirects"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "re-targets via target_path"
          },
          "422": {
            "description": "invalid target_path"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source_path": {
                    "type": "string"
                  },
                  "target_path": {
                    "type": "string"
                  },
                  "status_code": {
                    "type": "integer",
                    "enum": [
                      301,
                      302
                    ]
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete redirect (flat)",
        "tags": [
          "Redirects"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "no content"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/snippets/{snippet_id}/versions": {
      "parameters": [
        {
          "name": "snippet_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list snippet versions",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/snippets/versions/{id}/pin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "patch": {
        "summary": "pin snippet version",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "pinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/snippets/versions/{id}/revert": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "revert snippet to version",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "reverted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/snippets": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list snippets",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "description": "Directory prefix filter (e.g. 'css')",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create snippet",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "duplicate path"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "path": {
                    "type": "string"
                  },
                  "content_type": {
                    "type": "string"
                  },
                  "content": {
                    "type": "string"
                  }
                },
                "required": [
                  "path",
                  "content"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/snippets/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show snippet (flat)",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update snippet (flat)",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "path-only update"
          },
          "422": {
            "description": "content failure rolls back path change"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "content": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete snippet (flat)",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/snippets/{id}/unpin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "unpin snippet (flat)",
        "tags": [
          "Snippets"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "unpinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/tables/{table_id}/rows/export": {
      "parameters": [
        {
          "name": "table_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "export rows as CSV",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "csv export"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/tables/{table_id}/rows/import": {
      "parameters": [
        {
          "name": "table_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "import rows",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "synchronous import"
          },
          "202": {
            "description": "asynchronous import"
          },
          "400": {
            "description": "missing source"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source_url": {
                    "type": "string"
                  },
                  "content": {
                    "type": "string",
                    "description": "Inline CSV content"
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "create",
                      "upsert"
                    ]
                  },
                  "column_mapping": {
                    "type": "object"
                  },
                  "dry_run": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/tables/rows/import/{run_id}": {
      "parameters": [
        {
          "name": "run_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "import status",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "status"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/tables/rows/{id}/versions": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list row versions",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/tables/{table_id}/rows": {
      "parameters": [
        {
          "name": "table_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list rows",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create row",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created as draft by default"
          },
          "422": {
            "description": "row limit reached"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "data": {
                    "type": "object"
                  },
                  "published_at": {
                    "type": "string",
                    "description": "'now', ISO 8601 datetime, or 'draft' (default: draft)"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/tables/rows/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show row",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update row",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "unpublishes via published_at draft"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "data": {
                    "type": "object"
                  },
                  "published_at": {
                    "type": "string",
                    "description": "'now', ISO 8601 datetime, or 'draft'. Omit to leave unchanged."
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete row",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/tables": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list tables",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create table",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "table limit reached"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "slug": {
                    "type": "string"
                  },
                  "display_column_key": {
                    "type": "string"
                  },
                  "fields_schema": {
                    "type": "object"
                  }
                },
                "required": [
                  "name",
                  "display_column_key"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/tables/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show table (flat)",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update table (flat)",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete table (flat)",
        "tags": [
          "Tables"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/theme/versions": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list theme versions",
        "tags": [
          "Theme"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/theme/versions/{id}/pin": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "patch": {
        "summary": "pin theme version",
        "tags": [
          "Theme"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "pinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/theme/versions/{id}/revert": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "post": {
        "summary": "revert theme version",
        "tags": [
          "Theme"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "reverted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/theme": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "get theme",
        "tags": [
          "Theme"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update theme",
        "tags": [
          "Theme"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "bare CSS without [data-theme] rejected — REST stays strict, no MCP normalization"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "config": {
                    "type": "object"
                  }
                },
                "required": [
                  "config"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/theme/unpin": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "delete": {
        "summary": "unpin theme version",
        "tags": [
          "Theme"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "unpinned"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites/{website_id}/webhook_endpoints": {
      "parameters": [
        {
          "name": "website_id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "list webhook endpoints",
        "tags": [
          "Webhook Endpoints"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create webhook endpoint",
        "tags": [
          "Webhook Endpoints"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "url",
                  "events"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/webhook_endpoints/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show webhook endpoint (flat)",
        "tags": [
          "Webhook Endpoints"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "patch": {
        "summary": "update webhook endpoint (flat)",
        "tags": [
          "Webhook Endpoints"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete webhook endpoint (flat)",
        "tags": [
          "Webhook Endpoints"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    },
    "/api/v1/websites": {
      "get": {
        "summary": "list websites",
        "tags": [
          "Websites"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number (default: 1)",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per",
            "in": "query",
            "required": false,
            "description": "Items per page",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "rows": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized"
          }
        }
      },
      "post": {
        "summary": "create website",
        "tags": [
          "Websites"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "201": {
            "description": "created"
          },
          "422": {
            "description": "invalid"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "subdomain": {
                    "type": "string",
                    "nullable": true
                  },
                  "indexable": {
                    "type": "boolean"
                  },
                  "language": {
                    "type": "string",
                    "nullable": true
                  }
                },
                "required": [
                  "indexable"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/websites/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "required": true
        }
      ],
      "get": {
        "summary": "show website",
        "tags": [
          "Websites"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "success with pro plan"
          },
          "401": {
            "description": "unauthorized"
          },
          "404": {
            "description": "not found"
          }
        }
      },
      "patch": {
        "summary": "update website",
        "tags": [
          "Websites"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "updated defaults"
          },
          "422": {
            "description": "invalid"
          },
          "401": {
            "description": "unauthorized"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "subdomain": {
                    "type": "string"
                  },
                  "indexable": {
                    "type": "boolean"
                  },
                  "language": {
                    "type": "string"
                  },
                  "default_header_id": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true
                  },
                  "default_footer_id": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true
                  },
                  "default_html_head_id": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete website",
        "tags": [
          "Websites"
        ],
        "security": [
          {
            "Bearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "deleted"
          },
          "401": {
            "description": "unauthorized"
          }
        }
      }
    }
  },
  "security": [
    {
      "Bearer": [],
      "OAuth2": []
    }
  ],
  "servers": [
    {
      "url": "https://pageweave.dev",
      "description": "Production"
    }
  ]
}