{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Ad Copy Scraper — Ads Transparency Center, CTAs & OCR",
    "description": "Google Ads scraper for the Transparency Center: what competitor ads actually say — headline, body, CTA and all visible text from Ads Transparency Center creatives, image ads read by OCR, by advertiser or domain. No start fee. Charged only when ad content is extracted, never for unreadable creatives.",
    "version": "1.0",
    "x-build-id": "IQFMct3CowKGQekzd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~google-ads-creative-text-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-google-ads-creative-text-scraper",
        "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/steadyfetch~google-ads-creative-text-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-google-ads-creative-text-scraper",
        "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/steadyfetch~google-ads-creative-text-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-google-ads-creative-text-scraper",
        "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",
        "properties": {
          "advertisers": {
            "title": "Advertisers",
            "type": "array",
            "description": "Brand names (resolved via Transparency Center search) or exact AR… advertiser IDs, e.g. [\"HelloFresh\"] — up to 20. Finding advertisers is never charged, and neither is a creative whose text cannot be read. Video ads are listed uncharged here; their transcripts come from steadyfetch/google-ads-video-transcript-scraper. Leave this untouched and click Start to run a 3-creative sample (HelloFresh, US).",
            "items": {
              "type": "string"
            }
          },
          "domains": {
            "title": "Domains",
            "type": "array",
            "description": "Website domains (like amazon.com) — spans every advertiser verified for that domain. Up to 10.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset ID (chain a Google Ads scraper run)",
            "type": "string",
            "description": "The default dataset ID of a finished run of any Google Ads / Transparency Center scraper — the video-transcript companion included. Each row's AR… advertiser ID, advertiser name, domain, or adstransparency.google.com ad-page link becomes a target, one per row, with no re-searching. With Apify's 'Connect actor' integration this is filled automatically."
          },
          "datasetItems": {
            "title": "Dataset items (paste rows)",
            "type": "array",
            "description": "Rows from another scraper's output, pasted directly — the same shapes \"Dataset ID\" reads. Handy from n8n, Make, or an agent that already holds the rows."
          },
          "formats": {
            "title": "Creative formats",
            "type": "array",
            "description": "Which creative formats to process. TEXT and IMAGE creatives get their text extracted; VIDEO creatives are listed with their metadata uncharged (no video is downloaded).",
            "items": {
              "type": "string",
              "enum": [
                "TEXT",
                "IMAGE",
                "VIDEO"
              ],
              "enumTitles": [
                "Text ads",
                "Image ads",
                "Video ads (listed, not transcribed)"
              ]
            },
            "default": [
              "TEXT",
              "IMAGE",
              "VIDEO"
            ]
          },
          "region": {
            "title": "Region",
            "type": "string",
            "description": "2-letter country code the ads were shown in (US, GB, DE, …). Regions differ a lot — an advertiser can be empty in one country and huge in another. Ordinary spellings work (US, us, USA, United States). A value we cannot place is never swapped for another market: the run stops and returns uncharged rows naming the region field, the searchable regions, and every advertiser or domain it did not search.",
            "default": "US"
          },
          "maxCreativesPerAdvertiser": {
            "title": "Max creatives per advertiser/domain",
            "minimum": 1,
            "type": "integer",
            "description": "Cap per target. Up to 500 per advertiser or domain; ask for a bigger number and the run continues at 500, with one uncharged row saying so. With \"Advertisers to open per name\" above 1, each opened advertiser gets its own cap.",
            "default": 30
          },
          "maxAdvertisersPerName": {
            "title": "Advertisers to open per name",
            "minimum": 1,
            "type": "integer",
            "description": "How many same-name advertisers each brand name in \"Advertisers\" may open. Big brands register several advertiser accounts and share their name with unrelated ones — \"Nike\" matches ten advertisers in the US alone. At 1 (the default) the name resolves to the single advertiser running the most ads in your region; raise it to also cover the next-largest namesakes, largest first. Each opened advertiser gets its own \"Max creatives per advertiser/domain\" allowance, so raising this raises what a run can cost. This matches advertiser NAMES, not ad text — Google's Transparency Center has no ad-text search. AR… advertiser IDs and domains are unaffected. Finding advertisers is never charged. Up to 10 per name; ask for a bigger number and the run continues at 10, with one uncharged row saying so.",
            "default": 1
          },
          "watchlistId": {
            "title": "Watchlist name",
            "type": "string",
            "description": "A short name for the list, e.g. `acme-competitors` (letters, numbers and hyphens). The list lives in a named key-value store in your account called `google-ads-watch-<name>`, so you can inspect or clear it any time. Leave empty for a one-off run — your account's memory of delivered creatives still applies."
          },
          "newCreativesOnly": {
            "title": "New creatives only",
            "type": "boolean",
            "description": "OFF (default): every creative runs as usual; one your account already has comes back from the earlier run, not charged (`repeat: true`), and every row carries `isNew` / `firstSeenAt`. ON: creatives already on your watchlist — or, with no list name, already delivered to your account — are skipped before any screenshot is fetched: not fetched, not read, not charged, and they do not count against \"Max creatives per advertiser/domain\", so a scheduled run walks past what you already have to the new ones. The run's status line and OUTPUT say how many were new and how many were skipped. Only a creative the actor actually answered counts (an extracted creative, or a final uncharged verdict such as no public screenshot or a video creative); one it could not answer — a screenshot the host did not serve, an outage on our side — does not, so the next run tries it again.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}