{
  "openapi": "3.0.1",
  "info": {
    "title": "SpyFu Alternative: PPC Keywords & Competitor Google Ads",
    "description": "PPC competitor research and MCP tool: the keywords any website buys on Google Ads, with ad position, landing page, ad title and text, CPC, volume and estimated monthly ad spend. Bulk domains, 94 countries, organic keywords too. Pay per domain and keyword found, plus a $0.012 start fee per run.",
    "version": "0.1",
    "x-build-id": "lJu4nfaIECO9adkVe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/plainrows~ppc-competitor-keywords/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-plainrows-ppc-competitor-keywords",
        "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/plainrows~ppc-competitor-keywords/runs": {
      "post": {
        "operationId": "runs-sync-plainrows-ppc-competitor-keywords",
        "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/plainrows~ppc-competitor-keywords/run-sync": {
      "post": {
        "operationId": "run-sync-plainrows-ppc-competitor-keywords",
        "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": [
          "domains"
        ],
        "properties": {
          "domains": {
            "title": "Domains or URLs",
            "minItems": 1,
            "maxItems": 10000,
            "type": "array",
            "description": "One website per line: example.com, https://www.example.com/page or blog.example.com. Up to 5,000 per run. URLs are reduced to their domain (subdomains other than www are kept). Duplicates are removed for free.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country",
            "enum": [
              "US",
              "GB",
              "CA",
              "AU",
              "IE",
              "IN",
              "DE",
              "AT",
              "CH",
              "FR",
              "BE",
              "ES",
              "MX",
              "IT",
              "NL",
              "PT",
              "BR",
              "PL",
              "SE",
              "JP",
              "AL",
              "DZ",
              "AO",
              "AR",
              "AM",
              "AZ",
              "BH",
              "BD",
              "BO",
              "BA",
              "BG",
              "BF",
              "KH",
              "CM",
              "CL",
              "CO",
              "CR",
              "CI",
              "HR",
              "CY",
              "CZ",
              "DK",
              "EC",
              "EG",
              "SV",
              "EE",
              "FI",
              "GH",
              "GR",
              "GT",
              "HK",
              "HU",
              "ID",
              "IL",
              "JO",
              "KZ",
              "KE",
              "LV",
              "LT",
              "MY",
              "MT",
              "MD",
              "MC",
              "MA",
              "MM",
              "NZ",
              "NI",
              "NG",
              "MK",
              "NO",
              "PK",
              "PA",
              "PY",
              "PE",
              "PH",
              "RO",
              "SA",
              "SN",
              "RS",
              "SG",
              "SK",
              "SI",
              "ZA",
              "KR",
              "LK",
              "TW",
              "TH",
              "TN",
              "TR",
              "UA",
              "AE",
              "UY",
              "VE",
              "VN"
            ],
            "type": "string",
            "description": "Country whose Google search data you want.",
            "default": "US"
          },
          "languageCode": {
            "title": "Language (optional)",
            "pattern": "^([a-zA-Z]{2}(-[a-zA-Z]{2})?)?$",
            "type": "string",
            "description": "Language code, e.g. \"en\", \"fr\" or \"zh-TW\". Leave empty to use the country's main language (for example German for Switzerland, French for Belgium). Only languages offered by the data source for that country work; others stop the run with a clear message and no charge."
          },
          "topKeywords": {
            "title": "Top keywords per domain",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "How many of the keywords bringing the most organic traffic to return per domain (position, URL, volume, CPC, difficulty, intent). 0 = traffic metrics only, otherwise 10 to 1,000. Each keyword returned is billed; see Pricing.",
            "default": 10
          },
          "keywordType": {
            "title": "Keyword type",
            "enum": [
              "paid",
              "organic"
            ],
            "type": "string",
            "description": "Organic = the keywords bringing the most Google search traffic to the domain. Paid = the keywords the domain shows Google Ads for (PPC competitor research, a SpyFu-style view), with the ad position, landing page, ad title and ad text, plus its estimated monthly ad spend. Same price per keyword either way.",
            "default": "paid"
          },
          "minSearchVolume": {
            "title": "Minimum search volume (optional)",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Only return top keywords searched at least this many times a month. Filtered by the data source: keywords left out are not returned and not billed. 0 = no filter."
          },
          "maxPosition": {
            "title": "Maximum position (optional)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Only return top keywords where the domain ranks (or its ad shows) at this position or better, e.g. 10 = first page. Keywords left out are not billed. 100 = no filter."
          },
          "excludeKeywords": {
            "title": "Exclude keywords containing (optional)",
            "maxItems": 6,
            "type": "array",
            "description": "Up to 6 words: top keywords containing any of them are left out (not billed), e.g. the brand name to see non-branded keywords only. With any filter set, organicPositions, organicTrafficValueUsd and paidTrafficCostUsd stay empty (the source computes them on the kept keywords only).",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}