{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Ads Scraper",
    "description": "See what competitors advertise on Google. Per ad: title, body, CTA, landing URL, thumbnail, YouTube preview, regions, platforms, days-active. Sort by days-active to find their winners. Search by keyword, domain or advertiser ID — strict word-boundary match, no `nikey` for `nike`.",
    "version": "1.0",
    "x-build-id": "HdnT1MO3RogGdb7Lq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/vortex_data~google-ads/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-vortex_data-google-ads",
        "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/vortex_data~google-ads/runs": {
      "post": {
        "operationId": "runs-sync-vortex_data-google-ads",
        "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/vortex_data~google-ads/run-sync": {
      "post": {
        "operationId": "run-sync-vortex_data-google-ads",
        "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": [
          "searchTargets"
        ],
        "properties": {
          "searchTargets": {
            "title": "🎯 What to scrape",
            "type": "array",
            "description": "Each line is one target:\n\n• **Keyword** — `nike`, `shopify`, `tesla`. Resolved to advertisers whose **display name contains the keyword as a whole word** (`\\bnike\\b`). So `nike` matches `Nike, Inc.` / `Nike SRL` / `Nike Lee` but NOT `nikey` or `Nikena`. If you need a substring match, use the exact name (e.g. `nikey`).\n• **Domain** — `nike.com`, `www.shopify.com`, `shop.nike.com`. The brand part (`nike`, `shopify`) is extracted and searched as a keyword.\n• **Advertiser ID** — `AR08888592736429539329` (Niantic) — exact, no ambiguity\n• **Advertiser URL** — `https://adstransparency.google.com/advertiser/AR…`\n• **Single creative URL** — `https://adstransparency.google.com/advertiser/AR…/creative/CR…`\n\nURL-embedded filters (`?region=US&format=VIDEO&platform=YouTube`) override the global filters below per-target.",
            "items": {
              "type": "string"
            }
          },
          "resultsLimit": {
            "title": "📊 Results limit",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum ads to return per advertiser. 0 = unlimited.",
            "default": 50
          },
          "maxAdvertisersPerQuery": {
            "title": "👥 Max advertisers per keyword",
            "minimum": 1,
            "type": "integer",
            "description": "When a target is a keyword or domain, fetch creatives for at most this many matched advertisers (in Google's typeahead order, after the word-boundary filter).",
            "default": 5
          },
          "filterRegion": {
            "title": "🌍 Region filter",
            "type": "string",
            "description": "ISO-2 country code (US, GB, DE, FR, JP, …) or 'ALL' for worldwide.",
            "default": "ALL"
          },
          "filterFormat": {
            "title": "🎬 Ad format filter",
            "enum": [
              "ALL",
              "TEXT",
              "IMAGE",
              "VIDEO"
            ],
            "type": "string",
            "description": "Restrict to a specific creative format.",
            "default": "ALL"
          },
          "timeRangePreset": {
            "title": "📅 Quick date range",
            "enum": [
              "ALL_TIME",
              "LAST_7_DAYS",
              "LAST_30_DAYS",
              "LAST_90_DAYS",
              "THIS_YEAR"
            ],
            "type": "string",
            "description": "Pre-defined time window. Custom dates below override this.",
            "default": "ALL_TIME"
          },
          "customStartDate": {
            "title": "📅 Custom start date",
            "type": "string",
            "description": "YYYY-MM-DD. Overrides the preset above when set."
          },
          "customEndDate": {
            "title": "📅 Custom end date",
            "type": "string",
            "description": "YYYY-MM-DD. Overrides the preset above when set."
          },
          "skipDetails": {
            "title": "⚡ Speed mode (skip ad copy decoding)",
            "type": "boolean",
            "description": "Returns only listing-level data (IDs, format, dates, advertiser name). Skips the per-creative deep lookup that pulls regions, decoded title/body/CTA, landing URL and video preview. ~4× faster, ~4× cheaper — useful when you only need the list of creatives, not their content.",
            "default": false
          },
          "maxConcurrency": {
            "title": "⚙️ Max concurrent RPC calls",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Higher = faster. Default 8 works well with Residential proxy (each request from a different IP, no per-IP rate-limit). If you switch to Datacenter, drop to 3 since the IP pool is much smaller.",
            "default": 8
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Residential + country=US by default. Google's Transparency Center is hosted in US datacenters — US residential IPs have clean reputation, lowest round-trip latency, and the smallest chance of hitting the 15s timeout that kills slow overseas exit nodes. The US Apify residential pool is still hundreds of thousands of IPs, so per-IP rate-limit isn't a concern. Drop the country filter only if you specifically need a non-US perspective. Switch to Datacenter only for small fast tests where you don't want to pay residential traffic.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}