{
  "openapi": "3.0.1",
  "info": {
    "title": "Answer Engine Optimization & GEO Audit - ChatGPT Fix Plan",
    "description": "AEO with a fix plan, not just a score: for each buyer question, see which page ChatGPT, Perplexity or Google AI Overviews would quote, why competitors win, and what to add. Plus a GEO audit of AI crawler access and firewalls. $0.01/question, $0.03/site.",
    "version": "0.1",
    "x-build-id": "yAkICA46LVr1BqCrM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~geo-readiness-audit/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-geo-readiness-audit",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/tidytools~geo-readiness-audit/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-geo-readiness-audit",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/tidytools~geo-readiness-audit/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-geo-readiness-audit",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "websites"
        ],
        "properties": {
          "websites": {
            "title": "Websites",
            "type": "array",
            "description": "Websites to audit (home page or domain), e.g. https://example.com or example.com, one per line. The audit covers the site root: a path in a URL is noted but not audited separately. Lines that are not websites get an error row and are not charged. Add your competitors to compare: multi-site runs also get a ranking row and a comparison report.",
            "items": {
              "type": "string"
            }
          },
          "samplePages": {
            "title": "Pages to sample per site",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "How many pages (including the home page) are analyzed per site. Pages are picked from different sections of the sitemap or home page links. Each page after the home page costs $0.004.",
            "default": 5
          },
          "targetQuestions": {
            "title": "Target questions (optional)",
            "maxItems": 20,
            "type": "array",
            "description": "Up to 20 questions your buyers ask ChatGPT, Perplexity or Google, e.g. \"bulk audio transcription api\" or \"how to check if GPTBot is blocked\". For each question and each website, the Actor finds the page and passage an answer engine would most likely quote, scores it 0-100 and writes concrete fixes (what to add or rewrite, and where). Add \" | https://...\" after a question to check one specific page. Questions in English, German, French, Spanish and other languages written with spaces between words; Chinese, Japanese and Thai questions get a free error row. $0.01 per question per website; questions with no readable page are free.",
            "items": {
              "type": "string"
            }
          },
          "competitorPages": {
            "title": "Competitor pages to compare (optional)",
            "maxItems": 20,
            "type": "array",
            "description": "Pages that answer engines cite (or that rank) for your questions, e.g. the sources ChatGPT or Perplexity showed you. A plain URL is compared on every question; \"question | https://...\" on that question only. Each site's answers are ranked against them and fixes that competitors already do better are moved up. Other websites in the same run are compared automatically. No extra charge.",
            "items": {
              "type": "string"
            }
          },
          "testUserAgents": {
            "title": "Test AI crawler user agents",
            "type": "boolean",
            "description": "Request the home page as GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, PerplexityBot and Perplexity-User to detect CDN or firewall rules that block AI crawlers even when robots.txt allows them. Bot challenge pages served with HTTP 200 (Cloudflare \"Just a moment\", Turnstile, CAPTCHA) count as blocked.",
            "default": true
          },
          "htmlReport": {
            "title": "Save HTML report",
            "type": "boolean",
            "description": "Save a shareable, self-contained HTML report per site (REPORT-<host>.html) and REPORT.html (overview for multi-site runs) in the key-value store. No extra charge.",
            "default": true
          },
          "summaryRow": {
            "title": "Add a summary row to the dataset",
            "type": "boolean",
            "description": "Multi-site runs add one extra dataset row (type \"summary\") with the ranking and common issues. Turn off to keep the dataset to one row per site (for Google Sheets, n8n or Make); the summary is still saved in the SUMMARY record.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Parallel websites",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many websites are audited at the same time.",
            "default": 5
          },
          "httpVia": {
            "title": "Plain HTTP requests from",
            "enum": [
              "auto",
              "backend",
              "direct",
              "vm"
            ],
            "type": "string",
            "description": "Some sites block requests from data centers. Auto retries from a second network before falling back to a real browser. Sample pages are read from Apify's network first (to see the raw HTML crawlers get); robots.txt, llms.txt and the firewall test always use Apify's network. If those routes are refused, Auto also tries our second server (Oracle, different IP) before a real browser.",
            "default": "auto"
          },
          "siteTimeoutSecs": {
            "title": "Time limit per website (seconds)",
            "minimum": 0,
            "maximum": 1800,
            "type": "integer",
            "description": "A website whose audit (robots.txt, firewall test, sitemap, llms.txt and sample pages, all retries and the browser fallback included) takes longer than this is reported with errorType \"timeout\" and not charged. The optional AI Overview check is not part of it. 0 = no limit.",
            "default": 300
          },
          "pagesPerQuestion": {
            "title": "Candidate pages per question",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many pages of each site are checked per target question: the home page plus the sitemap or home-page URLs whose path matches the question best. Ignored for questions pinned to a URL.",
            "default": 4
          },
          "semanticMatch": {
            "title": "Semantic matching for target questions",
            "type": "boolean",
            "description": "Also compare the question and passages with a text-embedding model, so a passage that answers in other words (\"speech to text\" for \"transcription\") is credited. Off = word matching only. No extra charge.",
            "default": true
          },
          "fixPlan": {
            "title": "Fix plan per question",
            "type": "boolean",
            "description": "For each target question: 2-4 related sub-questions that answer engines also search (query fan-out) with how well your pages cover each, a rewrite draft of your best page's opening passage (answer first, built only from facts already on your page; missing facts are marked [ADD: ...], never invented) and a short \"what to add\" list. Uses a language model on our backend; included in the per-question price. Off = analysis and fixes only (faster).",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Only used for requests sent from Apify's network (robots.txt, llms.txt, the firewall test and raw page HTML). Apify proxy usage is billed to your Apify account."
          },
          "checkAiOverviews": {
            "title": "Check Google AI Overview citations",
            "type": "boolean",
            "description": "For each query below, fetch Google's AI Overview with Apify's official Google AI Overviews Scraper (apify/google-ai-overviews-scraper) and report whether each audited site is cited and at which position. That Actor runs on your Apify account and bills by its own pricing (about $0.003 per AI Overview on the Free plan, September 2026); this Actor adds no fee. One scraper run covers all sites, capped at $0.01 per query (at least $0.05) and 10 minutes.",
            "default": false
          },
          "aiOverviewQueries": {
            "title": "AI Overview queries",
            "maxItems": 20,
            "type": "array",
            "description": "Up to 20 search queries your customers would ask Google, e.g. \"best crm for small business\". Used only with \"Check Google AI Overview citations\". Not every query shows an AI Overview.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}