{
  "openapi": "3.0.1",
  "info": {
    "title": "Microsoft Marketplace & AppSource Offers Tracker",
    "description": "Scrape & monitor Azure Marketplace + AppSource: 28k offers, ratings, plans, publishers, G2 reviews (likes, dislikes, company size) with review insights, market reports. $2 / 1,000 offers.",
    "version": "1.0",
    "x-build-id": "E4CUpBcsDtC3WKOQM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/signalscope-data~microsoft-marketplace-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-signalscope-data-microsoft-marketplace-tracker",
        "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/signalscope-data~microsoft-marketplace-tracker/runs": {
      "post": {
        "operationId": "runs-sync-signalscope-data-microsoft-marketplace-tracker",
        "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/signalscope-data~microsoft-marketplace-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-signalscope-data-microsoft-marketplace-tracker",
        "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": {
          "outputLevel": {
            "title": "Output level",
            "enum": [
              "offers",
              "publishers"
            ],
            "type": "string",
            "description": "\"publishers\" groups the matching offers by publisher and loads each publisher's FULL portfolio across all offer types (SaaS, VM, containers, consulting…): offer count, website domain, Microsoft partner ID, total ratings, weighted average rating, top offer, categories, industries, transactable / free-trial / Azure-benefit-eligible offer counts, newest offer, and the offers list. In monitor modes alerts on new publishers, new offers, removed offers and new ratings. Charged per publisher row.",
            "default": "offers"
          },
          "includeMarketReport": {
            "title": "Add a niche market report",
            "type": "boolean",
            "description": "Also output one `market-report` row per search term (or one for the whole filter set): offers and publishers in the niche, publisher concentration, offer-type and pricing mix (transactable / free trial / contact-only), AppSource vs Azure storefronts, new offers in the last 90/365 days and by year, listing age, top categories and industries, ratings (rated share, weighted average, distribution, top publishers' share of ratings), most-rated offers and weak incumbents (20+ ratings, below 3.8 stars). With trackChanges: sinceLastRun (new offers, ratings added). Charged per report row.",
            "default": false
          },
          "marketReportOnly": {
            "title": "Market report only (no offer rows)",
            "type": "boolean",
            "description": "Output only the market report rows, no offer rows (you pay for the reports only). Good for sizing a niche: e.g. searchTerms [\"contract management\"] + offerTypes [\"saas\"].",
            "default": false
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keep offers whose name, summary, publisher or keywords contain the term as whole words (all words of a term must match, case-insensitive; plurals count, so \"siem\" matches \"SIEMs\" but not \"Siemens\"), e.g. \"copilot\", \"data security\", \"sap\". Leave empty to get every offer that matches the other filters.",
            "items": {
              "type": "string"
            }
          },
          "offerTypes": {
            "title": "Offer types",
            "type": "array",
            "description": "Only scan these offer types. Leave empty for all types (about 28,000 offers; a full scan takes 1-2 minutes).",
            "items": {
              "type": "string",
              "enum": [
                "saas",
                "virtual-machine",
                "azure-application",
                "container",
                "consulting-services",
                "managed-services",
                "other"
              ],
              "enumTitles": [
                "SaaS apps",
                "Virtual machine images",
                "Azure applications (managed apps / solution templates)",
                "Containers (AKS / Kubernetes apps)",
                "Consulting services",
                "Managed services",
                "Other (Azure services, legacy templates)"
              ]
            }
          },
          "categories": {
            "title": "Categories (catalog ids)",
            "type": "array",
            "description": "Only offers in at least one of these catalog categories, e.g. \"security\", \"ai-apps-and-agents\", \"ai-for-business\", \"it-and-management-tools\", \"business-applications\", \"developer-tools\", \"analytics\", \"databases\", \"devops\", \"productivity\", \"identity-and-access-management\". Every output item lists its categories, so run once without this filter to discover ids.",
            "items": {
              "type": "string"
            }
          },
          "industries": {
            "title": "Industries (filter)",
            "type": "array",
            "description": "Only offers tagged with an industry containing one of these, e.g. \"Healthcare\", \"Financial\", \"Government\", \"Manufacturing\", \"Retail\", \"Education\".",
            "items": {
              "type": "string"
            }
          },
          "publishers": {
            "title": "Publishers (filter)",
            "type": "array",
            "description": "Only offers whose publisher name contains one of these, or whose publisherId equals one, e.g. \"dynatrace\", \"Palo Alto\", \"canonical\".",
            "items": {
              "type": "string"
            }
          },
          "offerUrls": {
            "title": "Offer URLs or IDs (watchlist)",
            "type": "array",
            "description": "Specific offers to track, as marketplace / AppSource URLs (e.g. \"https://marketplace.microsoft.com/en-us/marketplace/apps/dynatrace.dynatrace-apm\") or offer ids (\"publisher.offer\", e.g. \"dynatrace.dynatrace-apm\"). Watchlist offers are always output, regardless of filters. If you set only a watchlist, no catalog scan is done.",
            "items": {
              "type": "string"
            }
          },
          "storefront": {
            "title": "Storefront",
            "enum": [
              "any",
              "appsource",
              "azure-marketplace"
            ],
            "type": "string",
            "description": "Keep only offers listed on this storefront.",
            "default": "any"
          },
          "pricing": {
            "title": "Pricing options (filter)",
            "type": "array",
            "description": "Keep only offers with at least one of these pricing options.",
            "items": {
              "type": "string",
              "enum": [
                "free",
                "free-trial",
                "payg",
                "byol"
              ],
              "enumTitles": [
                "Has a free plan",
                "Has a free trial",
                "Transactable / pay-as-you-go plan",
                "Bring your own license"
              ]
            }
          },
          "includePreview": {
            "title": "Include preview offers",
            "type": "boolean",
            "description": "Include offers marked as preview.",
            "default": true
          },
          "includeStopSell": {
            "title": "Include stop-sell offers",
            "type": "boolean",
            "description": "Include offers that are no longer sold (stop-sell).",
            "default": false
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "newest",
              "last-modified",
              "name",
              "most-rated",
              "top-rated"
            ],
            "type": "string",
            "description": "Order of the output. \"newest\" uses the listing creation date, so it is the easiest way to see what just launched. \"most-rated\" / \"top-rated\" rank by ratings (marketplace + G2 reviews shown on the listing); they load ratings for every matched offer, so narrow the search for speed.",
            "default": "newest"
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Max offers to output (after filters and sorting). With outputLevel \"publishers\" this is the max number of publisher rows (start with 10–50: each publisher loads its whole portfolio). 0 = no limit.",
            "default": 500
          },
          "maxOffersPerPublisher": {
            "title": "Max offers per publisher",
            "minimum": 0,
            "type": "integer",
            "description": "Publishers mode only: load at most this many offers per publisher (matching offers first, then newest). offerCount always shows the full portfolio size; portfolioComplete is false when capped. 0 = no limit.",
            "default": 100
          },
          "includePlans": {
            "title": "Include plans",
            "type": "boolean",
            "description": "Add the public plans of each offer (plan id, name, free / pay-as-you-go / free trial / BYOL flags), website and links. Needed for plan-added / plan-removed alerts.",
            "default": true
          },
          "includeDescription": {
            "title": "Include full description",
            "type": "boolean",
            "description": "Add the full listing description as plain text (up to 5,000 characters).",
            "default": false
          },
          "includeRatings": {
            "title": "Include ratings & popularity",
            "type": "boolean",
            "description": "Add rating (as shown on the listing), ratingCount, ratingSource, separate Microsoft marketplace and G2 ratings, 1–5 star distribution and the catalog popularity scores. Offers without ratings get rating null and ratingCount 0. In monitor modes adds the \"new-ratings\" change type (with ratingsAdded and previousRating). No extra charge.",
            "default": true
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "string",
            "description": "Only offers rated at least this (0–5), e.g. \"4.5\". Offers without ratings are excluded when set. Watchlist offers (offerUrls) are always kept."
          },
          "minRatingCount": {
            "title": "Minimum number of ratings",
            "minimum": 0,
            "type": "integer",
            "description": "Only offers with at least this many ratings (Microsoft marketplace + G2 combined). 0 = no filter.",
            "default": 0
          },
          "includeReviews": {
            "title": "Add review rows (G2 + marketplace reviews)",
            "type": "boolean",
            "description": "Also output the reviews shown on each output offer's listing as `review` rows: G2 reviews mirrored on the listing (the newest up to 200 per listing, with the G2 answers \"What do you like best?\", \"What do you dislike?\" and \"What problems is the product solving?\" as separate fields, company size and the G2 review link) plus reviews written on AppSource / the Azure portal, with rating, title, date and vendor reply. No proxy, no login. Reviewer names and job titles are not collected. In monitor modes (\"new\" / \"changed\") only reviews not seen in the previous run are output. Charged per review row.",
            "default": false
          },
          "maxReviewsPerOffer": {
            "title": "Max review rows per offer",
            "minimum": 1,
            "maximum": 400,
            "type": "integer",
            "description": "Max `review` rows per offer, newest first (up to 200 G2 reviews + all AppSource / Azure portal reviews are available per listing). Review insights always analyse every review served, whatever this limit.",
            "default": 50
          },
          "maxReviewRating": {
            "title": "Only reviews with at most N stars",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Review rows only: keep reviews rated at most this many stars, e.g. 3 for critical reviews. 0 = all ratings.",
            "default": 0
          },
          "onlyNewReviews": {
            "title": "Only new reviews since the last run",
            "type": "boolean",
            "description": "Review rows only: output only reviews not seen in the previous run with the same stateKey (a review monitor; schedule it with offerUrls). The first run is the baseline and outputs all reviews. Monitor modes (\"new\" / \"changed\") always behave like this.",
            "default": false
          },
          "includeReviewInsights": {
            "title": "Add review insights per offer + competitor comparison",
            "type": "boolean",
            "description": "One `review-insights` row per output offer with reviews: rating distribution and trend, complaint themes read from the G2 \"What do you dislike?\" answers (pricing & licensing, learning curve, usability, performance, bugs, setup, integrations, reporting, customization, support, documentation, alerts, mobile, security) with quotes, praise themes, feature requests, top complaint phrases, use-case phrases from \"What problems is the product solving?\", share of reviewers with nothing to dislike, ratings by company size (Enterprise / Mid-Market / Small-Business) with weak sizes, and vendor reply rate. With 2+ offers of 10+ reviews also one `review-comparison` row (complaint / praise themes per 100 reviews, relative weaknesses and strengths, rankings). Offers that show the same G2 product get one row. Charged per insights row.",
            "default": false
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "all",
              "new",
              "changed"
            ],
            "type": "string",
            "description": "\"new\" and \"changed\" compare with the previous run that used the same stateKey. The first run is the baseline and returns everything.",
            "default": "all"
          },
          "trackChanges": {
            "title": "Add change fields in \"all\" mode",
            "type": "boolean",
            "description": "Also compute isNew, changeTypes etc. when outputMode is \"all\" (saves a snapshot for the next run).",
            "default": false
          },
          "reportRemoved": {
            "title": "Report removed offers",
            "type": "boolean",
            "description": "In monitor mode, output offers that were in the previous snapshot but are gone from the catalog (changeTypes: [\"removed\"]). Only reported after a complete scan; keep the same filters for the same stateKey.",
            "default": true
          },
          "stateKey": {
            "title": "Monitor name (stateKey)",
            "type": "string",
            "description": "Name of the saved snapshot used by \"new\" / \"changed\" modes. Use a different name for each schedule or set of filters.",
            "default": "default"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}