{
  "openapi": "3.0.1",
  "info": {
    "title": "Review Intelligence — analyze real reviews from every site",
    "description": "Real reviews from Google, Trustpilot, Yelp, G2 and the app stores, turned into competitor & category intelligence: themes with % frequencies, quotes and switching reasons, distilled into an LLM-ready brief — plus a shareable dashboard, email digest and reply drafts for your own reviews.",
    "version": "0.1",
    "x-build-id": "ewJRJOKOOlGPc5hxW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/inovaflow~track-reviews/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-inovaflow-track-reviews",
        "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/inovaflow~track-reviews/runs": {
      "post": {
        "operationId": "runs-sync-inovaflow-track-reviews",
        "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/inovaflow~track-reviews/run-sync": {
      "post": {
        "operationId": "run-sync-inovaflow-track-reviews",
        "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": {
          "companies": {
            "title": "Companies to analyze",
            "minItems": 1,
            "maxItems": 10,
            "type": "array",
            "description": "One entry per company. Give it a name, paste the links for whichever review sites it is on, and tick “This is my company” on your own. Add as many as you like (up to 10) — for category research, add every player and tick none.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "title": "Company name",
                  "type": "string",
                  "editor": "textfield",
                  "description": "How this company appears in the report."
                },
                "isMine": {
                  "title": "This is my company",
                  "type": "boolean",
                  "editor": "checkbox",
                  "default": false,
                  "description": "Tick this on your own company. Leave every row unticked to analyze a category with no 'you'."
                },
                "g2ProductUrl": {
                  "title": "G2 product page URL",
                  "type": "string",
                  "editor": "textfield",
                  "description": "e.g. https://www.g2.com/products/acme-crm/reviews"
                },
                "trustpilotDomain": {
                  "title": "Trustpilot domain",
                  "type": "string",
                  "editor": "textfield",
                  "description": "e.g. acme-crm.com"
                },
                "googlePlaceUrl": {
                  "title": "Google Maps link",
                  "type": "string",
                  "editor": "textfield",
                  "description": "Open the listing on Google Maps and copy the URL."
                },
                "yelpBusinessUrl": {
                  "title": "Yelp business page link",
                  "type": "string",
                  "editor": "textfield",
                  "description": "e.g. https://www.yelp.com/biz/acme-crm"
                },
                "appStoreAppId": {
                  "title": "Apple App Store app ID",
                  "type": "string",
                  "editor": "textfield",
                  "description": "The digits after 'id' in the App Store URL."
                },
                "googlePlayAppId": {
                  "title": "Google Play app ID",
                  "type": "string",
                  "editor": "textfield",
                  "description": "The package name, e.g. com.acme.crm"
                }
              }
            }
          },
          "useCase": {
            "title": "What do you want to learn?",
            "enum": [
              "reputation-monitor",
              "full-report",
              "category-gaps",
              "well-served",
              "what-people-love",
              "competitor-battlecard",
              "switching-reasons",
              "pricing-objections",
              "feature-requests",
              "onboarding-friction",
              "support-quality",
              "positioning"
            ],
            "type": "string",
            "description": "Pick the question this run should answer. The preset reframes the report headline, the AI synthesis and the ready-to-paste \"Copy for LLM\" analyst prompt — battlecards, category gaps, switching reasons, pricing objections and more.",
            "default": "full-report"
          },
          "customPrompt": {
            "title": "Custom question (optional)",
            "type": "string",
            "description": "Ask your own question instead of a preset — e.g. \"Which complaints would make an enterprise buyer hesitate, and which vendor handles them best?\". It runs over the distilled review brief (not the raw reviews), so it stays fast and the flat run fee covers it."
          },
          "reviewsFromLastDays": {
            "title": "Analyze reviews from the last N days",
            "minimum": 0,
            "maximum": 36500,
            "type": "integer",
            "description": "How far back to look, in days. The first run backfills this window; later runs only fetch new reviews. Set **0** to pull the business's ENTIRE review history — a one-time deep backfill (slower, and the review-scraper cost lands on your own Apify account); after that it goes incremental again automatically.",
            "default": 90
          },
          "draftReplies": {
            "title": "Draft reply suggestions",
            "type": "boolean",
            "description": "When on, every new review of YOUR business gets a ready-to-edit reply draft in the report.",
            "default": true
          },
          "language": {
            "title": "Report language",
            "type": "string",
            "description": "Two-letter language code for reply drafts and theme labels, e.g. `en`, `de`, `cs`.",
            "default": "en"
          },
          "aiAnalysis": {
            "title": "AI analysis",
            "enum": [
              "claude-haiku",
              "claude-sonnet",
              "keyless"
            ],
            "type": "string",
            "description": "How sentiment, themes and reply drafts are produced. `claude-haiku` (default) uses our built-in Claude — included in the run fee, no extra charge — for smarter sentiment (sarcasm, mixed reviews), cleaner themes and replies that reference what the reviewer actually said. `claude-sonnet` is highest quality but requires your own Anthropic key (added below); without one it falls back to the included Haiku. `keyless` uses the built-in rules engine — instant, English-oriented.",
            "default": "claude-haiku"
          },
          "anthropicApiKey": {
            "title": "Your own Anthropic API key (optional)",
            "type": "string",
            "description": "Paste your own Anthropic API key and the AI analysis runs on it for free (no per-business AI fee). Leave blank to use the built-in key."
          },
          "outputEmail": {
            "title": "Your email address",
            "type": "string",
            "description": "Type an email address and every run emails you the digest — new reviews, sentiment, themes and reply drafts, with a link to the interactive dashboard. Sent from reputation-radar@apify.inovaflow.app (no-reply). Leave blank to skip email."
          },
          "newReviewAlertEmail": {
            "title": "Additional alert for each new review",
            "type": "string",
            "description": "In addition to the run digest, send a separate email listing every NEW review found this run — each flagged by rating — with a direct link and the drafted reply. Same address as the digest or a different one (e.g. a shared inbox). Leave blank to skip."
          },
          "apifyMcpConnector": {
            "title": "Run the review scrapers under a different Apify account (connector)",
            "type": "string",
            "description": "An Apify MCP connector whose account runs and pays for the review scrapers — you authorize once, with no token to paste. Create it in the Apify Console under Settings → Integrations → MCP Connectors with the server URL https://mcp.apify.com, then pick it here. Takes precedence over the API token below if both are set. Optional — leave blank to run on the account executing this Actor."
          },
          "apifyToken": {
            "title": "…or paste an Apify API token",
            "type": "string",
            "description": "An Apify API token — the no-connector alternative to the connector option above. When set (and no connector is given), every review scraper (and the read of its results) runs on — and is billed to — THIS token's account instead of the account running Review Intelligence. Find or create a token in the Apify Console under Settings → API & Integrations. Treat it like a password. Optional — leave blank to run everything on the account executing this Actor."
          },
          "maxReviewsPerPlatform": {
            "title": "Safety cap — max reviews per platform per run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "A cost ceiling, not a target. We size each fetch automatically from how many new reviews actually appeared, so you normally never hit this — it is just the most we will ever pull from one platform in a single run. Raise it if a run warns that it hit the cap.",
            "default": 200
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}