{
  "openapi": "3.0.1",
  "info": {
    "title": "Evidence-Quoted Page Classifier — SEO + Your Own Labels, No AI",
    "description": "Give it your own labels and a list of pages; it tells you which pages say which, quoting the exact sentence every time. It never guesses: no words on the page means it says nothing. Includes a marketing-and-SEO lens plus full on-page SEO signals. No AI — your content never leaves.",
    "version": "0.1",
    "x-build-id": "JqjnF8Mj8Rj8EcfVq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/equ1n0x~seo-marketing-framing-analyzer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-equ1n0x-seo-marketing-framing-analyzer",
        "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/equ1n0x~seo-marketing-framing-analyzer/runs": {
      "post": {
        "operationId": "runs-sync-equ1n0x-seo-marketing-framing-analyzer",
        "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/equ1n0x~seo-marketing-framing-analyzer/run-sync": {
      "post": {
        "operationId": "run-sync-equ1n0x-seo-marketing-framing-analyzer",
        "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": {
          "mode": {
            "title": "What do you want to do?",
            "enum": [
              "seo",
              "scrape",
              "code"
            ],
            "type": "string",
            "description": "SEO + marketing framing = on-page SEO signals plus persuasion-framing classification. Multimodal scrape = clean text (+ optional on-screen text transcription). Classify against a lens = tag pages against your own labels.",
            "default": "seo"
          },
          "question": {
            "title": "What are you trying to find out?",
            "type": "string",
            "description": "Optional, and in your own words — e.g. \"how do my competitors create urgency?\" It is kept with whatever this run learns, so asking a different question later keeps its own separate ground rather than mixing the two. Nothing rewrites or interprets it."
          },
          "startUrls": {
            "title": "Pages to analyze",
            "type": "array",
            "description": "The URLs to process. Paste a list, upload a file, link another Actor's output, or point at a sitemap / text file of URLs — sitemap indexes are expanded one level.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "urls": {
            "title": "URLs (plain list)",
            "type": "array",
            "description": "Alternative to the field above: a plain list of URL strings.",
            "items": {
              "type": "string"
            }
          },
          "multimodal": {
            "title": "Render pages and transcribe on-screen text",
            "type": "boolean",
            "description": "Renders each page and reads text from the rendered view — useful for JavaScript-heavy pages or text baked into images. Slower; leave off for standard HTML pages.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Route fetches through Apify Proxy so pages behind bot-protection, rate limits, or geo-walls can be read. Datacenter (the default) is cheap and reaches most sites; switch to Residential for the hardest ones. Turn it off for a direct fetch — many commercial pages will block that.",
            "default": {
              "useApifyProxy": true
            }
          },
          "followLinks": {
            "title": "Follow links on each page (crawl)",
            "type": "boolean",
            "description": "Off by default: only the URLs you supply are read. Turn on to also follow links found on those pages — same site only, never past Max pages, and honoring the site's robots.txt for anything discovered this way. Your bill is still one charge per page fetched, so Max pages is your spend cap.",
            "default": false
          },
          "maxDepth": {
            "title": "Crawl depth",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many link-hops past your starting URLs to follow. 1 = your pages plus the pages they link to. Only used when Follow links is on.",
            "default": 1
          },
          "lensName": {
            "title": "Which framing labels to use",
            "enum": [
              "marketing_seo_v1"
            ],
            "type": "string",
            "description": "Which built-in lens to classify against (SEO and Classify modes).",
            "default": "marketing_seo_v1"
          },
          "accrueLearning": {
            "title": "Learn from this run",
            "type": "boolean",
            "description": "Off by default. When on, the examples this run confirms are kept in a key-value store on YOUR account and read back at the start of your next run, so repeated runs over your own material get sharper. Nothing is retained by us, the stored file holds only the labels and quotes already in your dataset, and you can delete it at any time.",
            "default": false
          },
          "learningStore": {
            "title": "Where to keep what it learns",
            "type": "string",
            "description": "Which named key-value store on your account holds what was learned. Use different names to keep separate bodies of work apart.",
            "default": "ark-learned-examples"
          },
          "lensJson": {
            "title": "Your own labels (Classify mode)",
            "type": "object",
            "description": "Bring your own labels: { \"matching_modes\": { \"<group>\": { \"<label>\": { \"lexical_markers\": [\"trigger phrase\", \"another\"] } } } }. Overrides the built-in lens."
          },
          "maxItems": {
            "title": "Max pages",
            "minimum": 1,
            "type": "integer",
            "description": "Cap on how many pages this run processes.",
            "default": 50
          },
          "timeoutSecs": {
            "title": "Per-page timeout (seconds)",
            "minimum": 5,
            "type": "integer",
            "description": "How long to wait for a single page before skipping it.",
            "default": 30
          },
          "LENS_KEY": {
            "title": "Key for an encrypted label set (advanced)",
            "type": "string",
            "description": "Only needed if you use an encrypted proprietary lens. Leave blank otherwise."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}