{
  "openapi": "3.1.0",
  "info": {
    "title": "DadSEO API",
    "version": "1",
    "description": "REST API for DadSEO — Strategic SEO Intelligence. Manage sites, run 20+ SEO audit types, track rankings and keywords, and read Google Search Console and Google Analytics data programmatically.\n\n**Authentication.** Every endpoint requires `Authorization: Bearer <api key>`. Create and rotate keys at https://getdadseo.com/settings.\n\n**Rate limits.** 60 requests per 60 seconds per API key, sliding window. Every response carries `RateLimit-Policy`; responses that passed the limiter also carry `RateLimit`, `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`. A 429 adds `Retry-After` in seconds.\n\n**Errors.** Always JSON, never HTML — including 404s on unknown paths. Every error body is `{ error: { code, message, hint, documentation } }`. Match on `code`, which is stable; `message` is for humans.\n\n**Long-running work.** Audit endpoints are asynchronous: `POST` starts a run and returns immediately, `GET` on the same path returns the latest result and its status.\n\nNarrative docs: https://getdadseo.com/docs/api · Developer portal: https://getdadseo.com/developers · MCP server: https://getdadseo.com/docs/mcp",
    "contact": {
      "name": "DadSEO support",
      "email": "hello@getdadseo.com",
      "url": "https://getdadseo.com/contact"
    },
    "summary": "Strategic SEO intelligence: audit any site, track rankings, and read first-party Search Console and Analytics data.",
    "termsOfService": "https://getdadseo.com/terms",
    "license": {
      "name": "Proprietary",
      "url": "https://getdadseo.com/terms"
    }
  },
  "servers": [
    {
      "url": "https://getdadseo.com/api/v1"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "dadseo_sk_...",
        "description": "Generate a key from Settings → Developer API in the DadSEO dashboard."
      }
    },
    "parameters": {
      "siteId": {
        "name": "siteId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "auditId": {
        "name": "auditId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "taskId": {
        "name": "taskId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "alertId": {
        "name": "alertId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "page": {
        "name": "page",
        "in": "query",
        "schema": {
          "type": "integer",
          "default": 1
        },
        "description": "Page number"
      },
      "perPage": {
        "name": "perPage",
        "in": "query",
        "schema": {
          "type": "integer",
          "default": 20,
          "maximum": 100
        },
        "description": "Results per page"
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "description": "Uniform error envelope returned by every non-2xx response.",
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable identifier. Match on this, not on `message`.",
                "examples": [
                  "UNAUTHORIZED",
                  "RATE_LIMITED",
                  "NOT_FOUND",
                  "ENDPOINT_NOT_FOUND",
                  "VALIDATION_ERROR",
                  "LIMIT_EXCEEDED"
                ]
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation."
              },
              "hint": {
                "type": "string",
                "description": "How to resolve the error without a human reading the message."
              },
              "retryAfterSeconds": {
                "type": "integer",
                "description": "Present on 429. Seconds to wait before retrying."
              },
              "documentation": {
                "type": "string",
                "format": "uri",
                "description": "Link to the relevant documentation."
              }
            }
          }
        }
      },
      "PaginationMeta": {
        "type": "object",
        "properties": {
          "page": {
            "type": "integer"
          },
          "perPage": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "totalPages": {
            "type": "integer"
          }
        }
      },
      "AuditRunSummary": {
        "type": "object",
        "description": "A single audit run as returned by the per-type list/trigger endpoints.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "siteId": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "running",
              "completed",
              "failed"
            ]
          },
          "auditType": {
            "type": "string"
          },
          "progress": {
            "type": "integer"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "AuditDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AuditRunSummary"
          },
          {
            "type": "object",
            "properties": {
              "score": {
                "type": "integer"
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "category": {
                      "type": "string"
                    },
                    "severity": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "affectedPages": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "AnyObject": {
        "type": "object",
        "additionalProperties": true,
        "description": "Shape not yet documented — response is a JSON object; see https://getdadseo.com/docs/api for updates."
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "Missing or invalid API key.",
        "headers": {
          "RateLimit-Policy": {
            "schema": {
              "type": "string",
              "example": "\"default\";q=60;w=60"
            },
            "description": "The quota policy in force. Present on every response."
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "UNAUTHORIZED",
                "message": "Invalid or missing API key",
                "hint": "Send `Authorization: Bearer <key>`. Create or rotate a key at https://getdadseo.com/settings.",
                "documentation": "https://getdadseo.com/docs/api"
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "Resource does not exist or is not reachable by this key.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "NOT_FOUND",
                "message": "Site not found or access denied",
                "hint": "List the sites this key can reach with GET /api/v1/sites.",
                "documentation": "https://getdadseo.com/docs/api"
              }
            }
          }
        }
      },
      "RateLimited": {
        "description": "Rate limit exceeded. Wait `Retry-After` seconds before retrying.",
        "headers": {
          "RateLimit-Policy": {
            "schema": {
              "type": "string",
              "example": "\"default\";q=60;w=60"
            },
            "description": "The quota policy in force. Present on every response."
          },
          "RateLimit": {
            "schema": {
              "type": "string",
              "example": "\"default\";r=57;t=60"
            },
            "description": "Remaining requests (r) and seconds until the window resets (t)."
          },
          "RateLimit-Remaining": {
            "schema": {
              "type": "integer",
              "example": 57
            },
            "description": "Requests remaining in the current window."
          },
          "RateLimit-Reset": {
            "schema": {
              "type": "integer",
              "example": 60
            },
            "description": "Seconds until the window resets."
          },
          "Retry-After": {
            "schema": {
              "type": "integer",
              "example": 12
            },
            "description": "Seconds to wait before retrying."
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "RATE_LIMITED",
                "message": "Too many requests (limit 60 per 60s)",
                "hint": "Wait 12s and retry. Read the RateLimit header to self-throttle.",
                "retryAfterSeconds": 12,
                "documentation": "https://getdadseo.com/docs/api"
              }
            }
          }
        }
      }
    }
  },
  "paths": {
    "/me": {
      "get": {
        "operationId": "getMe",
        "summary": "Get current user",
        "description": "Returns the authenticated user's profile, plan, and usage limits.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnyObject"
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/keys": {
      "get": {
        "operationId": "getKeys",
        "summary": "List API keys",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createKeys",
        "summary": "Create an API key",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "delete": {
        "operationId": "deleteKeys",
        "summary": "Revoke an API key",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/keys/rotate": {
      "post": {
        "operationId": "createKeysRotate",
        "summary": "Rotate API key",
        "description": "Invalidates the current key and returns a new one. Store it securely — it is shown only once.",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites": {
      "get": {
        "operationId": "getSites",
        "summary": "List sites",
        "parameters": [
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/perPage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSites",
        "summary": "Create a site",
        "description": "Creates a new site and begins syncing data from Google Search Console.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain",
                  "name"
                ],
                "properties": {
                  "domain": {
                    "type": "string",
                    "description": "Domain exactly as it appears in GSC, e.g. sc-domain:example.com"
                  },
                  "name": {
                    "type": "string"
                  },
                  "businessType": {
                    "type": "string",
                    "enum": [
                      "saas",
                      "ecommerce",
                      "blog",
                      "agency",
                      "other"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}": {
      "get": {
        "operationId": "getSitesBySiteId",
        "summary": "Get a site",
        "description": "Returns site details plus 28-day GSC performance stats.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "delete": {
        "operationId": "deleteSitesBySiteId",
        "summary": "Delete a site",
        "description": "Permanently deletes a site and all associated data. Irreversible.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/context": {
      "get": {
        "operationId": "getSitesBySiteIdContext",
        "summary": "Get site business context",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "patch": {
        "operationId": "updateSitesBySiteIdContext",
        "summary": "Update site business context",
        "description": "Updates the grounding context (business type, competitors, key pages) used by AI-powered audits and the assistant.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/audits": {
      "get": {
        "operationId": "getSitesBySiteIdAudits",
        "summary": "List audits",
        "description": "Returns audits run for the site, most recent first.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/perPage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdAudits",
        "summary": "Trigger a full audit",
        "description": "Triggers a new SEO audit for the site. Runs asynchronously — poll GET /audits/{auditId} for progress.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "auditType": {
                    "type": "string",
                    "enum": [
                      "full",
                      "quick",
                      "technical"
                    ],
                    "default": "full"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/audits/{auditId}": {
      "get": {
        "operationId": "getAuditsByAuditId",
        "summary": "Get audit detail",
        "description": "Returns full audit details: score, findings by category, recommendations.",
        "parameters": [
          {
            "$ref": "#/components/parameters/auditId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuditDetail"
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/audits/{auditId}/share": {
      "post": {
        "operationId": "createAuditsByAuditIdShare",
        "summary": "Create/get public share link",
        "description": "Idempotent — returns the existing link if one was already created. No DadSEO login needed to view the shared report.",
        "parameters": [
          {
            "$ref": "#/components/parameters/auditId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "delete": {
        "operationId": "deleteAuditsByAuditIdShare",
        "summary": "Revoke public share link",
        "parameters": [
          {
            "$ref": "#/components/parameters/auditId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/pages": {
      "get": {
        "operationId": "getSitesBySiteIdPages",
        "summary": "List crawled pages",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/perPage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/queries": {
      "get": {
        "operationId": "getSitesBySiteIdQueries",
        "summary": "Get Search Console query data",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/perPage"
          },
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 28,
              "maximum": 90
            },
            "description": "Lookback window in days"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/kpi": {
      "get": {
        "operationId": "getSitesBySiteIdKpi",
        "summary": "Get KPI history",
        "description": "Daily time series of clicks, impressions, CTR, and average position.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/rankings": {
      "get": {
        "operationId": "getSitesBySiteIdRankings",
        "summary": "List tracked keywords",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdRankings",
        "summary": "Track a new keyword",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "keyword"
                ],
                "properties": {
                  "keyword": {
                    "type": "string"
                  },
                  "targetUrl": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "delete": {
        "operationId": "deleteSitesBySiteIdRankings",
        "summary": "Stop tracking a keyword",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          },
          {
            "name": "keywordId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/saved-keywords": {
      "get": {
        "operationId": "getSitesBySiteIdSavedKeywords",
        "summary": "List saved keyword research results",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdSavedKeywords",
        "summary": "Save keyword research results",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "delete": {
        "operationId": "deleteSitesBySiteIdSavedKeywords",
        "summary": "Delete a saved keyword",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/alerts": {
      "get": {
        "operationId": "getSitesBySiteIdAlerts",
        "summary": "List alerts",
        "description": "Traffic drops, ranking changes, crawl errors, and audit findings, most recent first.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/alerts/{alertId}": {
      "patch": {
        "operationId": "updateSitesBySiteIdAlertsByAlertId",
        "summary": "Update an alert",
        "description": "Mark an alert read/dismissed.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          },
          {
            "$ref": "#/components/parameters/alertId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/actions": {
      "get": {
        "operationId": "getSitesBySiteIdActions",
        "summary": "List action tasks",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdActions",
        "summary": "Create an action task",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title"
                ],
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "low",
                      "medium",
                      "high",
                      "critical"
                    ],
                    "default": "medium"
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "content",
                      "technical",
                      "links",
                      "performance",
                      "other"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/actions/generate": {
      "post": {
        "operationId": "createSitesBySiteIdActionsGenerate",
        "summary": "Generate action tasks from an audit",
        "description": "Converts audit findings into prioritized tasks on the action board.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/actions/generate-from-plan": {
      "post": {
        "operationId": "createSitesBySiteIdActionsGenerateFromPlan",
        "summary": "Generate action tasks from a strategy plan",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/actions/{taskId}": {
      "patch": {
        "operationId": "updateActionsByTaskId",
        "summary": "Update an action task",
        "parameters": [
          {
            "$ref": "#/components/parameters/taskId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "open",
                      "in_progress",
                      "completed",
                      "dismissed"
                    ]
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "low",
                      "medium",
                      "high",
                      "critical"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/stats": {
      "get": {
        "operationId": "getStats",
        "summary": "Aggregate dashboard stats",
        "description": "GSC performance (last 28 days) across all sites, plus per-site totals.",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/posts": {
      "post": {
        "operationId": "createPosts",
        "summary": "Receive a published post (Inkwire webhook)",
        "description": "Ingests a blog post from the Inkwire publishing integration.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/keywords/ideas": {
      "post": {
        "operationId": "createKeywordsIdeas",
        "summary": "Get keyword ideas",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/keywords/volume": {
      "post": {
        "operationId": "createKeywordsVolume",
        "summary": "Get keyword search volume",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/keywords/difficulty": {
      "post": {
        "operationId": "createKeywordsDifficulty",
        "summary": "Get keyword difficulty score",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/keywords/serp": {
      "get": {
        "operationId": "getKeywordsSerp",
        "summary": "Get live SERP results for a keyword",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/backlinks/summary": {
      "get": {
        "operationId": "getBacklinksSummary",
        "summary": "Backlink profile summary",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/backlinks/list": {
      "get": {
        "operationId": "getBacklinksList",
        "summary": "List backlinks",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/backlinks/referring-domains": {
      "get": {
        "operationId": "getBacklinksReferringDomains",
        "summary": "List referring domains",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/backlinks/anchors": {
      "get": {
        "operationId": "getBacklinksAnchors",
        "summary": "Backlink anchor text distribution",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/backlinks/verify": {
      "get": {
        "operationId": "getBacklinksVerify",
        "summary": "Verify a backlink still exists",
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/competitors/domain-overview": {
      "post": {
        "operationId": "createCompetitorsDomainOverview",
        "summary": "Get a domain overview for a competitor",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnyObject"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/optimizer": {
      "get": {
        "operationId": "getSitesBySiteIdOptimizer",
        "summary": "List page-optimizer runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdOptimizer",
        "summary": "Trigger page optimizer",
        "description": "On-page optimization recommendations for a specific URL and target keyword.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url",
                  "keyword"
                ],
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "keyword": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/plan": {
      "get": {
        "operationId": "getSitesBySiteIdPlan",
        "summary": "List strategy plan runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdPlan",
        "summary": "Trigger strategy plan",
        "description": "AI-generated action plan (Diagnosis, Guiding Policy, Coherent Actions) based on site data and audit findings.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/topics": {
      "get": {
        "operationId": "getSitesBySiteIdTopics",
        "summary": "List topic-clustering runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdTopics",
        "summary": "Trigger topic clustering",
        "description": "Groups Search Console queries into semantic topic clusters for content strategy.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/writer": {
      "get": {
        "operationId": "getSitesBySiteIdWriter",
        "summary": "List writer runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdWriter",
        "summary": "Draft SEO content",
        "description": "Generates a publication-ready article draft from a target keyword and audience brief.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/quick-audit": {
      "get": {
        "operationId": "getSitesBySiteIdQuickAudit",
        "summary": "List quick-audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdQuickAudit",
        "summary": "Trigger a quick audit",
        "description": "A fast single-page eyeball audit: title, meta, headings, content depth, image alt text.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/schema-audit": {
      "get": {
        "operationId": "getSitesBySiteIdSchemaAudit",
        "summary": "List schema audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdSchemaAudit",
        "summary": "Trigger schema audit",
        "description": "Detect, validate, and suggest Schema.org / JSON-LD improvements.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/sitemap-audit": {
      "get": {
        "operationId": "getSitesBySiteIdSitemapAudit",
        "summary": "List sitemap audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdSitemapAudit",
        "summary": "Trigger sitemap audit",
        "description": "Validates XML sitemaps and checks for missing or orphaned pages.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/technical": {
      "get": {
        "operationId": "getSitesBySiteIdTechnical",
        "summary": "List technical audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdTechnical",
        "summary": "Trigger technical audit",
        "description": "Crawlability, performance, security headers, mobile-friendliness, Core Web Vitals.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/competitors": {
      "get": {
        "operationId": "getSitesBySiteIdCompetitors",
        "summary": "List competitor-analysis runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdCompetitors",
        "summary": "Trigger competitor analysis",
        "description": "Identifies competing domains, shared keywords, and competitive gaps.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/content-audit": {
      "get": {
        "operationId": "getSitesBySiteIdContentAudit",
        "summary": "List content audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdContentAudit",
        "summary": "Trigger content audit",
        "description": "Detects thin content, duplicate content, and content-quality issues.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/content-intel": {
      "get": {
        "operationId": "getSitesBySiteIdContentIntel",
        "summary": "List content-intelligence runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdContentIntel",
        "summary": "Trigger content intelligence",
        "description": "JTBD framework analysis, query fan-out, and passage-level content evaluation.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/geo": {
      "get": {
        "operationId": "getSitesBySiteIdGeo",
        "summary": "List GEO (AI-search) audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdGeo",
        "summary": "Trigger GEO audit",
        "description": "Checks AI-search visibility across Google AI Overviews, ChatGPT, and Perplexity.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/hreflang": {
      "get": {
        "operationId": "getSitesBySiteIdHreflang",
        "summary": "List hreflang audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdHreflang",
        "summary": "Trigger hreflang audit",
        "description": "Validates hreflang tags for international SEO targeting.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/internal-links": {
      "get": {
        "operationId": "getSitesBySiteIdInternalLinks",
        "summary": "List internal-links audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdInternalLinks",
        "summary": "Trigger internal-links audit",
        "description": "Maps link structure, finds orphan pages, and analyzes link-equity distribution.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/offpage": {
      "get": {
        "operationId": "getSitesBySiteIdOffpage",
        "summary": "List off-page audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdOffpage",
        "summary": "Trigger off-page audit",
        "description": "Backlink profile, domain-authority signals, and brand-mention opportunities.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/images": {
      "get": {
        "operationId": "getSitesBySiteIdImages",
        "summary": "List image audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdImages",
        "summary": "Trigger image audit",
        "description": "Checks alt text, file sizes, modern formats, and lazy loading.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/social": {
      "get": {
        "operationId": "getSitesBySiteIdSocial",
        "summary": "List social-metadata audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdSocial",
        "summary": "Trigger social-metadata audit",
        "description": "Checks Open Graph and Twitter Card tags and preview snippets.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/programmatic": {
      "get": {
        "operationId": "getSitesBySiteIdProgrammatic",
        "summary": "List programmatic-SEO audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdProgrammatic",
        "summary": "Trigger programmatic-SEO audit",
        "description": "Analyzes template-based pages, parameter URLs, and scalable content patterns for cannibalization.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/topical-authority": {
      "get": {
        "operationId": "getSitesBySiteIdTopicalAuthority",
        "summary": "List topical-authority audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdTopicalAuthority",
        "summary": "Trigger topical-authority audit",
        "description": "Evaluates topical authority, semantic coverage, and entity depth.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/brand-presence": {
      "get": {
        "operationId": "getSitesBySiteIdBrandPresence",
        "summary": "List brand-presence audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdBrandPresence",
        "summary": "Trigger brand-presence audit",
        "description": "Analyzes AI-search citation share and brand sentiment across LLM search engines.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/sites/{siteId}/local": {
      "get": {
        "operationId": "getSitesBySiteIdLocal",
        "summary": "List local-SEO audit runs",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "operationId": "createSitesBySiteIdLocal",
        "summary": "Trigger local-SEO audit",
        "description": "Audits local SEO signals, NAP consistency, and Google Business Profile factors.",
        "parameters": [
          {
            "$ref": "#/components/parameters/siteId"
          }
        ],
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "RateLimit-Policy": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";q=60;w=60"
                },
                "description": "The quota policy in force. Present on every response."
              },
              "RateLimit": {
                "schema": {
                  "type": "string",
                  "example": "\"default\";r=57;t=60"
                },
                "description": "Remaining requests (r) and seconds until the window resets (t)."
              },
              "RateLimit-Remaining": {
                "schema": {
                  "type": "integer",
                  "example": 57
                },
                "description": "Requests remaining in the current window."
              },
              "RateLimit-Reset": {
                "schema": {
                  "type": "integer",
                  "example": 60
                },
                "description": "Seconds until the window resets."
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    }
  },
  "externalDocs": {
    "description": "Developer portal: quickstart, auth, rate limits, error format and discovery endpoints.",
    "url": "https://getdadseo.com/developers"
  }
}
