{
  "openapi": "3.0.1",
  "info": {
    "title": "GDPR Subprocessor List Monitor (DPA) · SiteVerdict",
    "description": "Watch SaaS vendors' published subprocessor lists. Parses tables, lists, JSON and CSV, then alerts your DPO to new, removed or renamed subprocessors, location and purpose changes and new transfers outside the EEA/UK. History, Slack/webhook alerts, optional AI note.",
    "version": "1.0",
    "x-build-id": "SuK5FVXE4edoABe3c"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/siteverdict~siteverdict-subprocessor-list-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-siteverdict-siteverdict-subprocessor-list-monitor",
        "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/siteverdict~siteverdict-subprocessor-list-monitor/runs": {
      "post": {
        "operationId": "runs-sync-siteverdict-siteverdict-subprocessor-list-monitor",
        "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/siteverdict~siteverdict-subprocessor-list-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-siteverdict-siteverdict-subprocessor-list-monitor",
        "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": {
          "targets": {
            "title": "Subprocessor list pages",
            "type": "array",
            "description": "One object per vendor: <code>{\"url\": \"https://vendor.com/legal/subprocessors\", \"vendor\": \"Vendor name\", \"selector\": \"optional CSS selector of the table/list\"}</code>. Plain URL strings also work. HTML pages (tables, bullet lists, definition lists), JSON and CSV exports are supported. Max 200 per run."
          },
          "urls": {
            "title": "Simple URL list (optional)",
            "type": "array",
            "description": "Alternative to the JSON above: one URL per line. The vendor name defaults to the host name.",
            "items": {
              "type": "string"
            }
          },
          "stateStoreName": {
            "title": "History store name",
            "type": "string",
            "description": "Named key-value store that keeps the last snapshot and change history per vendor between runs. Use a different name per client or portfolio.",
            "default": "siteverdict-subprocessor-monitor"
          },
          "historySize": {
            "title": "History entries kept per vendor",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many past checks (with their changes) to keep per vendor.",
            "default": 20
          },
          "onlyChanged": {
            "title": "Only output changed vendors (and problems)",
            "type": "boolean",
            "description": "Skip dataset rows for baseline/unchanged vendors. Errors, blocked pages and unparseable pages are always output.",
            "default": false
          },
          "includeEntries": {
            "title": "Include the full parsed list per vendor",
            "type": "boolean",
            "description": "Adds every parsed subprocessor (name, purpose, location, countries, transfer class) to each row (see the 'Entries' view). ENTRIES.csv in the key-value store always has them.",
            "default": false
          },
          "includeContactDetails": {
            "title": "Keep contact details",
            "type": "boolean",
            "description": "Off by default: contact columns and e-mail addresses found on lists are removed (UK GDPR data minimisation). Turn on only if you need them and have a lawful basis.",
            "default": false
          },
          "webhookUrl": {
            "title": "Alert webhook (HTTPS)",
            "type": "string",
            "description": "Optional HTTPS endpoint that receives a JSON payload for every changed vendor (Zapier, Make, n8n, your SIEM...). Stored as a secret."
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook (HTTPS)",
            "type": "string",
            "description": "Optional Slack incoming-webhook URL for a DPO-friendly change message. Stored as a secret."
          },
          "alertOnErrors": {
            "title": "Also alert when a list cannot be checked",
            "type": "boolean",
            "description": "Send an alert when a page errors, is blocked or can no longer be parsed (useful when vendors move their list).",
            "default": false
          },
          "aiProvider": {
            "title": "AI impact note: provider (optional)",
            "enum": [
              "none",
              "anthropic",
              "openai"
            ],
            "type": "string",
            "description": "Off by default. With your OWN API key, writes a short DPO impact note for each changed vendor (charged as 'ai-summary' only when it succeeds; your provider bills the tokens).",
            "default": "none"
          },
          "aiApiKey": {
            "title": "AI provider API key (your own)",
            "type": "string",
            "description": "Your Anthropic or OpenAI API key. Stored as a secret, never logged or output."
          },
          "aiModel": {
            "title": "AI model (optional)",
            "type": "string",
            "description": "Model id. Defaults: Anthropic claude-sonnet-5-5, OpenAI gpt-4.1-mini."
          },
          "timeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Request timeout (seconds).",
            "default": 30
          },
          "maxConcurrency": {
            "title": "Parallel vendors",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Requests to the same host are always spaced at least 1.5 s apart.",
            "default": 3
          },
          "sampleMode": {
            "title": "Sample mode (no network, free)",
            "type": "boolean",
            "description": "Runs on two bundled fictional vendor lists (baseline + changed version) to show the output: one new subprocessor in India, one removal and one location change. Nothing is charged.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}