{
  "openapi": "3.0.1",
  "info": {
    "title": "Franchise FDD & Filing Change Monitor",
    "description": "Track the franchise pages you already know state filing portals, FDD libraries, and franchisor opportunity pages and get structured evidence when disclosure PDFs, filing status, fees, dates, territories, contacts, or application CTAs change.",
    "version": "1.0",
    "x-build-id": "Kc7Uy9EdSFcSqfL3y"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/n0geegee~franchise-filing-offer-change-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-n0geegee-franchise-filing-offer-change-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/n0geegee~franchise-filing-offer-change-monitor/runs": {
      "post": {
        "operationId": "runs-sync-n0geegee-franchise-filing-offer-change-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/n0geegee~franchise-filing-offer-change-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-n0geegee-franchise-filing-offer-change-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",
        "required": [
          "targets"
        ],
        "properties": {
          "targets": {
            "title": "Pages to monitor",
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "description": "Known public HTTP(S) franchise registry, filing, FDD-link, disclosure, or opportunity pages.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "title": "Public page URL",
                  "description": "A public http:// or https:// URL. Private networks, localhost, credentials, and non-HTTP schemes are rejected.",
                  "type": "string",
                  "editor": "textfield"
                },
                "label": {
                  "title": "Label",
                  "description": "Human-readable name included in the output row.",
                  "type": "string",
                  "editor": "textfield"
                },
                "pageRole": {
                  "title": "Page role",
                  "description": "Business context used to classify detected changes.",
                  "type": "string",
                  "enum": [
                    "pricing",
                    "courses",
                    "camps",
                    "open_days",
                    "franchise",
                    "locations",
                    "contact",
                    "recruitment",
                    "generic_offer"
                  ],
                  "enumTitles": [
                    "Pricing",
                    "Courses",
                    "Camps",
                    "Open days",
                    "Franchise",
                    "Locations",
                    "Contact",
                    "Recruitment",
                    "Generic offer"
                  ],
                  "default": "generic_offer",
                  "editor": "select"
                }
              }
            },
            "default": [
              {
                "url": "https://www.franchisedirect.com/",
                "label": "Franchise Direct",
                "pageRole": "franchise"
              }
            ]
          },
          "runMode": {
            "title": "Run mode",
            "enum": [
              "compare_with_previous",
              "baseline_only"
            ],
            "type": "string",
            "description": "Create/refresh a baseline only, or compare each page with its previous persistent snapshot.",
            "default": "compare_with_previous"
          },
          "snapshotNamespace": {
            "title": "Snapshot namespace",
            "minLength": 1,
            "maxLength": 100,
            "type": "string",
            "description": "Use a different namespace for each independent monitoring campaign.",
            "default": "default"
          },
          "snapshotStoreName": {
            "title": "Persistent snapshot store",
            "minLength": 1,
            "maxLength": 63,
            "type": "string",
            "description": "Named Apify Key-Value Store used to persist normalized page snapshots between runs.",
            "default": "franchise-filing-offer-monitor-state"
          },
          "maxPages": {
            "title": "Maximum pages per run",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Hard cap on successfully attempted targets in this run.",
            "default": 20
          },
          "maxBytesPerPage": {
            "title": "Maximum response size",
            "minimum": 10000,
            "maximum": 2000000,
            "type": "integer",
            "description": "Maximum bytes downloaded from one page.",
            "default": 2000000
          },
          "requestDelayMs": {
            "title": "Delay between requests",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Polite delay in milliseconds between target requests.",
            "default": 1000
          },
          "timeoutSecs": {
            "title": "Per-page timeout",
            "minimum": 5,
            "maximum": 60,
            "type": "integer",
            "description": "HTTP timeout for each target page in seconds.",
            "default": 30
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages disallowed by the target site's robots.txt.",
            "default": true
          },
          "noisePatterns": {
            "title": "Noise patterns",
            "type": "array",
            "description": "Case-insensitive regular expressions for lines to exclude before comparison, such as cookie banners or timestamps.",
            "items": {
              "type": "string"
            },
            "default": [
              "cookie",
              "last updated",
              "©",
              "privacy policy"
            ]
          },
          "blockedUrlPatterns": {
            "title": "Additional blocked URL patterns",
            "type": "array",
            "description": "Case-insensitive regular expressions for URL paths that should be skipped.",
            "items": {
              "type": "string"
            },
            "default": [
              "/login",
              "/account",
              "/cart",
              "/checkout",
              "/admin"
            ]
          },
          "includeSignalsWhenUnchanged": {
            "title": "Extract signals from unchanged pages",
            "type": "boolean",
            "description": "Include documents, fees, dates, contacts, locations, and CTAs even when no change is detected.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}