{
  "openapi": "3.0.1",
  "info": {
    "title": "Gartner.com [$0.9💰] Reviews [Short URLs + Detail Enrichment]",
    "description": "💰$0.9 per 1,000 results. Extracts structured Gartner review data: ratings, company size, industry, job titles, detailed Q&A sections, vendor comparisons, deployment info, and reviewer demographics. Outputs a comprehensive JSON with 50+ fields per review.",
    "version": "0.0",
    "x-build-id": "5WqzfBtBFbpmHBXSJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~apify-gartner-scraper-ppr/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-apify-gartner-scraper-ppr",
        "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/memo23~apify-gartner-scraper-ppr/runs": {
      "post": {
        "operationId": "runs-sync-memo23-apify-gartner-scraper-ppr",
        "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/memo23~apify-gartner-scraper-ppr/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-apify-gartner-scraper-ppr",
        "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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Paste any mix of:<br>• <b>a whole category</b> — <code>https://www.gartner.com/reviews/market/collaborative-work-management</code> (every vendor and product in it)<br>• a single product — <code>.../market/&lt;market&gt;/vendor/&lt;vendor&gt;/product/&lt;product&gt;/reviews</code><br>• a short product URL — <code>/reviews/product/&lt;slug&gt;</code><br>• a single review — <code>.../review/view/&lt;id&gt;</code><br>Query filters on the URL (rating, company size, industry, sort) are forwarded.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "vendors": {
            "title": "Only these vendors",
            "type": "array",
            "description": "Narrows a category run to the companies you care about. Type them as you'd say them — <code>monday.com</code>, <code>Salesforce (Informatica)</code> — they're matched against both vendor and product names. Any name that matches nothing is reported in the log. Empty means every vendor in the category.",
            "items": {
              "type": "string"
            }
          },
          "summaryOnly": {
            "title": "Summary only — scores and review volumes, no reviews",
            "type": "boolean",
            "description": "One row per vendor: average rating, the full 1-5 star breakdown, review volume and the products listed under it. For all-time and last-12-months these are Gartner's own published figures and the whole category costs a single request. Any other window is computed from the reviews inside it. Note that Gartner's published figures exclude partner reviews.",
            "default": false
          },
          "lastNMonths": {
            "title": "Last N months",
            "minimum": 1,
            "type": "integer",
            "description": "Rolling window, filtered by Gartner server-side, so a re-run only fetches what's inside it. 12 also switches the summary to Gartner's own published 12-month scores. Ignored when a cutoff date is set below."
          },
          "reviewsAfterDate": {
            "title": "Only reviews after this date",
            "type": "string",
            "description": "Exact cutoff, e.g. <code>2026-06-18</code>. Use this for incremental re-runs: it collects only reviews dated on or after it, and stops paging as soon as it reaches older ones. Takes precedence over <b>Last N months</b>."
          },
          "includePartnerReviews": {
            "title": "Include partner reviews",
            "type": "boolean",
            "description": "Reviews collected through a vendor's own campaign. Gartner counts them in the review list but leaves them out of the rating and review count it publishes, so turn this off to reproduce the published figure exactly. Every review row carries a <code>partnerReview</code> flag either way.",
            "default": true
          },
          "maxItems": {
            "title": "Max Items",
            "type": "integer",
            "description": "Maximum number of reviews to scrape. Worth setting on a first category run — a large category can hold thousands of reviews.",
            "default": 10000
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "description": "Maximum number of pages that can be processed at the same time.",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min Concurrency",
            "type": "integer",
            "description": "Minimum number of pages that will be processed at the same time.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "type": "integer",
            "description": "Number of times the crawler will retry a failed request before giving up. Higher values ride out intermittent Cloudflare blocks on the entry request by rotating to more fresh IPs.",
            "default": 8
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "enrichReviewDetails": {
            "title": "Enrich each review with detail-page data",
            "type": "boolean",
            "description": "When true, the actor fetches the /review/view/{id} page for every review and merges a rich <code>reviewDetails</code> object onto each item (sections with Q&A, deployment architecture, market/vendor metadata, user demographics). Gartner gates these pages behind login, so this REQUIRES a valid authenticated cookie session via <code>cookieString</code> or <code>cookies</code>. Each review bills one result event ($0.0009); when the review-detail-page charge is active it adds $0.001 per detail page fetched. Failed enrichments (login redirect or stale cookies) bill only the basic result event.",
            "default": false
          },
          "reviewInsights": {
            "title": "📊 Review insights — instant digest per product (no AI, billed per product)",
            "type": "boolean",
            "description": "Adds one `review_insights` row per product: rating breakdown & sentiment split, the recurring software complaint themes (bugs, pricing, support, missing features, onboarding, integrations…), top negative-review terms, and feature-request snippets. Deterministic — instant, no AI credits or keys required. Billed per product analyzed.",
            "default": false
          },
          "painPointAnalysis": {
            "title": "🤖 Run AI pain-point analysis (one report per product)",
            "type": "boolean",
            "description": "Runs an AI (Claude) pass over each product's reviews and adds a `painPointAnalysis` row: clustered pain-point themes with severity & recurrence, missing features users ask for, quick wins, overall sentiment and a short summary. Requires a paid Apify plan (uses AI credits) and is billed per product analyzed.",
            "default": false
          },
          "cookieString": {
            "title": "Cookie header (raw string)",
            "type": "string",
            "description": "Paste a logged-in Gartner <code>Cookie:</code> header value here (DevTools → Network → click any www.gartner.com request → copy the Cookie request header value verbatim). One way to supply auth for <code>enrichReviewDetails</code>. Cookies expire in hours — for hands-off runs use <code>gartnerAccounts</code> instead."
          },
          "gartnerAccounts": {
            "title": "Gartner accounts (auto-login)",
            "type": "array",
            "description": "Gartner login credentials for automatic authentication. When provided (with <code>enrichReviewDetails</code> on), the actor logs in at the start of each run and mints a fresh session automatically — no cookie pasting, no expiry. Each item is <code>{\"email\": \"...\", \"password\": \"...\"}</code>. Supply several to spread load across accounts (one is used per run). These are YOUR Gartner accounts; credentials are sent only to Gartner's own login endpoint."
          },
          "sessionCacheMinutes": {
            "title": "Session cache TTL (minutes)",
            "minimum": 0,
            "type": "integer",
            "description": "How long a logged-in Gartner session is reused across runs before re-logging-in. Sessions are cached in a private named key-value store so frequent/scheduled runs don't hit Gartner's login endpoint every time (fewer logins = lower account-block risk). Default 30. Set 0 to disable caching and log in every run.",
            "default": 30
          },
          "cookies": {
            "title": "Cookies (array of cookie objects)",
            "type": "array",
            "description": "Alternative to <code>cookieString</code> — array of cookie objects in the format <code>{name, value, domain, sameSite}</code> (e.g. exported via a Cookie-Editor extension). Use one or the other."
          },
          "gartnerRpcMethod": {
            "title": "Gartner short-page RPC method ID (advanced)",
            "type": "string",
            "description": "Override for the short-product-page RPC ID (default works as of this build). If Gartner rotates the Server Action hash, find the new value in DevTools → Network on /reviews/product/&lt;slug&gt; — look for <code>ui-api/rpc/&lt;id&gt;?p=…</code>"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}