{
  "openapi": "3.0.1",
  "info": {
    "title": "GDPR Cookie Consent Verifier (Cookie Banner Checker)",
    "description": "Test cookie banners like EU regulators do: each page is loaded before consent, after Reject and after Accept. Flags trackers before consent, tracking after reject, missing reject button, pre-ticked boxes and Consent Mode v2. EN/NL HTML + PDF report.",
    "version": "0.1",
    "x-build-id": "1s2INYjDQR1N58akJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/mrdexter4~cookie-consent-verifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-mrdexter4-cookie-consent-verifier",
        "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/mrdexter4~cookie-consent-verifier/runs": {
      "post": {
        "operationId": "runs-sync-mrdexter4-cookie-consent-verifier",
        "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/mrdexter4~cookie-consent-verifier/run-sync": {
      "post": {
        "operationId": "run-sync-mrdexter4-cookie-consent-verifier",
        "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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Pages to check",
            "type": "array",
            "description": "One or more page URLs (usually the homepage). Each distinct domain gets its own summary. The prefilled URL is a fictional demo shop with a deliberately non-compliant banner (its /compliant page shows a correct one).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxPagesPerSite": {
            "title": "Max pages per site",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "1 = only the start URL(s). Higher values also test internal pages linked from the first page (a different template can load different tags). Each page is charged as one 'page checked' event.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy (use an EU country)",
            "type": "object",
            "description": "Strongly recommended: Apify Proxy with an EU country (e.g. NL, DE, FR). Without a European IP many consent platforms hide the banner or apply US rules, and the results are only indicative (failures are then reported as warnings). Every row reports the country the site saw (visitorCountry).",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "NL"
            }
          },
          "locale": {
            "title": "Browser language / region",
            "enum": [
              "nl-NL",
              "nl-BE",
              "en-GB",
              "en-IE",
              "de-DE",
              "de-AT",
              "fr-FR",
              "fr-BE",
              "es-ES",
              "it-IT",
              "pt-PT",
              "da-DK",
              "sv-SE",
              "pl-PL"
            ],
            "type": "string",
            "description": "Browser locale (Accept-Language and navigator.language), e.g. nl-NL, de-DE, fr-FR, en-GB. Banner buttons are recognised in EN, NL, DE, FR, ES, IT and PT.",
            "default": "nl-NL"
          },
          "language": {
            "title": "Report language",
            "enum": [
              "en",
              "nl"
            ],
            "type": "string",
            "description": "Language of the findings, fix guidance and HTML/PDF report.",
            "default": "en"
          },
          "generateReport": {
            "title": "Generate HTML report",
            "type": "boolean",
            "description": "Client-ready HTML report (report.html in the key-value store) with screenshots, findings, fix guidance and sources.",
            "default": true
          },
          "generatePdf": {
            "title": "Also generate PDF",
            "type": "boolean",
            "description": "PDF version of the report (report.pdf).",
            "default": true
          },
          "includeScreenshots": {
            "title": "Screenshots",
            "type": "boolean",
            "description": "Save a screenshot of each page before consent (embedded in the report for runs up to 25 pages).",
            "default": true
          },
          "monitorMode": {
            "title": "Monitor mode (only changes)",
            "type": "boolean",
            "description": "Compare with the previous run (stored in a named key-value store) and output only pages whose result, trackers or non-essential cookies changed. Use with a schedule. The first run outputs every page as 'new'.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor history store name",
            "type": "string",
            "description": "Named key-value store with the previous results. Use different names to keep separate baselines (e.g. per client).",
            "default": "cookie-consent-monitor"
          },
          "webhookUrl": {
            "title": "Webhook URL for changes",
            "type": "string",
            "description": "Optional. In monitor mode, a JSON summary of changes is POSTed here (Slack/Zapier/Make/n8n compatible)."
          },
          "customBannerSelector": {
            "title": "Custom banner selector",
            "type": "string",
            "description": "Optional CSS selector of the cookie banner, for home-made banners that are not recognised automatically."
          },
          "customAcceptSelector": {
            "title": "Custom 'Accept' button selector",
            "type": "string",
            "description": "Optional CSS selector of the accept button."
          },
          "customRejectSelector": {
            "title": "Custom 'Reject' button selector",
            "type": "string",
            "description": "Optional CSS selector of the reject / only-necessary button."
          },
          "customSettingsSelector": {
            "title": "Custom 'Settings' button selector",
            "type": "string",
            "description": "Optional CSS selector of the button that opens the preferences layer."
          },
          "viewport": {
            "title": "Device",
            "enum": [
              "desktop",
              "mobile"
            ],
            "type": "string",
            "description": "Desktop (1366×900) or mobile (412×915) browser.",
            "default": "desktop"
          },
          "blockImagesAndMedia": {
            "title": "Skip images, video and fonts",
            "type": "boolean",
            "description": "Faster and cheaper. Requests to tracker domains (including tracking pixels) are never blocked.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Pages in parallel",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Pages tested at the same time (each uses three browser contexts one after another).",
            "default": 2
          },
          "pageTimeoutSecs": {
            "title": "Page load timeout (seconds)",
            "minimum": 15,
            "maximum": 180,
            "type": "integer",
            "description": "How long to wait for a page to load before giving up.",
            "default": 45
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}