{
  "openapi": "3.0.1",
  "info": {
    "title": "Apify Store Competitor Analyzer: Pricing, Users & Revenue",
    "description": "For Apify developers and AI agents choosing what to build and price: every competitor for a Store search, category or Actor list, ranked by 30-day users, with runs, fail rate, rating, paid-plan price, start fee and revenue estimate. 'truth social' finds 422 Actors; 46 really match. Monitor mode.",
    "version": "0.1",
    "x-build-id": "4nYSVwy8clvFjBkLz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~apify-store-competitor-analyzer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-apify-store-competitor-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/neverempty~apify-store-competitor-analyzer/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-apify-store-competitor-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/neverempty~apify-store-competitor-analyzer/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-apify-store-competitor-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": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Apify Store search terms, one per line (for example google maps scraper). For each term the Actor reads the Store search results, keeps the Actors whose title or name contain all the words (see Match mode), ranks them by 30-day users and returns the top ones plus one free summary row for the term. If searchTerms, categories and actorIds are all empty, the example term google maps scraper is used.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Store categories",
            "type": "array",
            "description": "Apify Store categories to rank, one per line: AI, AGENTS, AUTOMATION, BUSINESS, COVID_19, DEVELOPER_EXAMPLES, DEVELOPER_TOOLS, ECOMMERCE, FOR_CREATORS, GAMES, JOBS, LEAD_GENERATION, MARKETING, NEWS, SEO_TOOLS, SOCIAL_MEDIA, TRAVEL, VIDEOS, REAL_ESTATE, SPORTS, EDUCATION, INTEGRATIONS, OTHER, OPEN_SOURCE, MCP_SERVERS. The Store's most popular Actors in the category are read and ranked by 30-day users.",
            "items": {
              "type": "string"
            }
          },
          "actorIds": {
            "title": "Actors (IDs, names or URLs)",
            "type": "array",
            "description": "Specific public Actors to analyze, one per line, as username/actor-name, username~actor-name, an Actor ID or its https://apify.com/username/actor-name URL (up to 500). Each one returns one row. No summary row is made for this list.",
            "items": {
              "type": "string"
            }
          },
          "matchMode": {
            "title": "Match mode (search terms)",
            "enum": [
              "title",
              "titleOrDescription",
              "store"
            ],
            "type": "string",
            "description": "The Apify Store search is loose: it also returns Actors that mention a word only in the description or README. title keeps Actors whose title or name contain every word of the term (strict, the default). titleOrDescription also accepts the description. store keeps the Store's results as they are.",
            "default": "title"
          },
          "maxActorsPerQuery": {
            "title": "Actors returned per search term or category",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many Actors (ranked by 30-day users) are returned and charged per search term or category (1 to 200). The free summary row always covers every matched Actor. In monitor mode, this caps the changed Actors returned per term; the rest are returned by the next run.",
            "default": 10
          },
          "maxStoreResults": {
            "title": "Store results read per search term or category",
            "minimum": 100,
            "maximum": 3000,
            "type": "integer",
            "description": "How many Apify Store search results are read before matching (100 to 3,000, in pages of 1,000). The summary row says how many results the Store had in total.",
            "default": 1000
          },
          "minUsers30Days": {
            "title": "Minimum 30-day users",
            "minimum": 0,
            "type": "integer",
            "description": "Leave out Actors with fewer users in the last 30 days (0 keeps all).",
            "default": 0
          },
          "includeApifyOwned": {
            "title": "Include Actors published by Apify itself",
            "type": "boolean",
            "description": "Keep Actors published by the apify account. Turn off to see the market without them; the summary row's leader share and price band then leave them out too and say so.",
            "default": true
          },
          "includeUnrunnableActors": {
            "title": "Include Actors the Store hides by default",
            "type": "boolean",
            "description": "The Store API leaves out Actors it does not consider safe to run automatically (for example from developers who have not passed verification). Turn on to include them, as the Store API's includeUnrunnableActors option does.",
            "default": false
          },
          "minUsersForPriceBand": {
            "title": "Minimum 30-day users for the price band",
            "minimum": 0,
            "type": "integer",
            "description": "The summary row's paid-plan price band (min, quartiles, max) uses only matched pay-per-event Actors with at least this many users in 30 days, so that listings nobody uses do not set the market price.",
            "default": 5
          },
          "includeReviews": {
            "title": "Add the written reviews",
            "type": "boolean",
            "description": "Add each Actor's written reviews from its public Reviews tab: star rating, date, text and whether the developer replied, lowest rating first. The reviewer's name is not returned. Costs one extra request per Actor, no extra charge.",
            "default": false
          },
          "maxReviewsPerActor": {
            "title": "Reviews per Actor",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many written reviews to add per Actor (1 to 50), lowest rating first and newest first within the same rating.",
            "default": 5
          },
          "onlyChanges": {
            "title": "Monitor mode: only what changed",
            "type": "boolean",
            "description": "Return only Actors that changed since the last run with the same watch name: a new competitor in the results of a search term or category, a price change (any event, any plan, start fee or pricing model) or a move in 30-day users of at least the percentage and number below. The first run returns the top Actors as the starting point. A run in which nothing changed returns a free row saying so and charges only the run start fee.",
            "default": false
          },
          "watchName": {
            "title": "Watch name",
            "type": "string",
            "description": "Name of the remembered state used to compare runs (letters, digits, dot, dash, underscore; up to 40). Setting it (or turning on monitor mode) fills changeType and changes. Use a different name for each list you track on its own schedule. With monitor mode on and no name, the name default is used."
          },
          "resetMonitoringState": {
            "title": "Forget what this watch remembered",
            "type": "boolean",
            "description": "Start this watch over: forget the remembered Actors and prices before this run, so the top Actors are returned as a first check.",
            "default": false
          },
          "userChangePercent": {
            "title": "User change to report (%)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "In monitor mode, report an Actor whose 30-day users moved by at least this percentage of the remembered number (and by at least the minimum below).",
            "default": 20
          },
          "userChangeMinimum": {
            "title": "User change to report (users)",
            "minimum": 0,
            "type": "integer",
            "description": "In monitor mode, the smallest move in 30-day users that is reported, so that 1 to 2 users on a tiny Actor are not reported as a 100% change.",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}