{
  "openapi": "3.0.1",
  "info": {
    "title": "Autocomplete & Keyword Suggest Scraper - 7 Engines at Once",
    "description": "For SEO keyword research, PPC and product research: autocomplete suggestions for your seeds from Google, YouTube, Bing, DuckDuckGo, Amazon, eBay and Wikipedia in one run, one row each with the engine, the exact query and its rank. Seven engines show which surfaces a term and which does not.",
    "version": "0.1",
    "x-build-id": "TUn5JlYVpRDwNFbgu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~keyword-suggest-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-keyword-suggest-scraper",
        "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~keyword-suggest-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-keyword-suggest-scraper",
        "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~keyword-suggest-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-keyword-suggest-scraper",
        "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": {
          "keywords": {
            "title": "Seed keywords",
            "type": "array",
            "description": "The terms to get autocomplete suggestions for, one per line - for example 'coffee grinder'. Every seed is sent to each engine you selected, together with whichever expansions you turn on below.",
            "default": [
              "coffee grinder"
            ],
            "items": {
              "type": "string"
            }
          },
          "engines": {
            "title": "Search engines",
            "type": "array",
            "description": "Which autocomplete services to ask. google = Google web search, youtube = YouTube, bing = Bing, duckduckgo = DuckDuckGo, amazon = Amazon product search, ebay = eBay, wikipedia = Wikipedia article titles. Each engine is a separate request per query, so three engines cost three times as many requests as one. Only these seven names are accepted: anything else is rejected by Apify before the run starts, so a typo costs you nothing instead of producing a half-empty result.",
            "items": {
              "type": "string",
              "enum": [
                "google",
                "youtube",
                "bing",
                "duckduckgo",
                "amazon",
                "ebay",
                "wikipedia"
              ],
              "enumTitles": [
                "Google",
                "YouTube",
                "Bing",
                "DuckDuckGo",
                "Amazon",
                "eBay",
                "Wikipedia"
              ]
            },
            "default": [
              "google",
              "youtube",
              "bing"
            ]
          },
          "expandAlphabet": {
            "title": "A-Z expansion",
            "type": "boolean",
            "description": "Also ask for 'seed a', 'seed b' ... 'seed z'. This is the standard way to surface long-tail terms: it turns one seed into 27 queries per engine, so switch it on when you want depth and watch the request count.",
            "default": false
          },
          "expandDigits": {
            "title": "0-9 expansion",
            "type": "boolean",
            "description": "Also ask for 'seed 0' ... 'seed 9'. Useful for versioned or list-shaped terms ('iphone 1', 'top 5'). Adds 10 queries per seed per engine.",
            "default": false
          },
          "expandQuestions": {
            "title": "Question expansion",
            "type": "boolean",
            "description": "Also ask for 'how seed', 'what seed', 'why seed', 'where', 'when', 'which', 'who', 'can', 'is', 'are', 'does', 'should'. This is where the questions people actually type come from. Adds 12 queries per seed per engine.",
            "default": false
          },
          "expandPrepositions": {
            "title": "Preposition and comparison expansion",
            "type": "boolean",
            "description": "Also ask for 'seed for', 'seed with', 'seed without', 'seed near', 'seed like', 'seed to', 'seed from', 'seed vs'. Adds 8 queries per seed per engine.",
            "default": false
          },
          "country": {
            "title": "Country code",
            "type": "string",
            "description": "Two-letter country code sent to Google and YouTube, for example de or gb. Measured on 2026-09-08: this changes the answer for some countries (de returned German suggestions) and is ignored for others (jp returned the same US English list), because these services decide the region mainly from the IP the request comes out of. Every row carries requestedCountry so you can see what was asked for rather than assume what was returned. Bing, DuckDuckGo, Amazon, eBay and Wikipedia ignore it.",
            "default": ""
          },
          "language": {
            "title": "Language code",
            "type": "string",
            "description": "Language code sent to Google and YouTube (hl), and used to pick the Wikipedia edition - en goes to en.wikipedia.org, de to de.wikipedia.org. Defaults to en.",
            "default": "en"
          },
          "amazonMarketplaceId": {
            "title": "Amazon marketplace id",
            "type": "string",
            "description": "Which Amazon storefront to ask. The default ATVPDKIKX0DER is Amazon US - the value measured to work on 2026-09-08. Other storefronts have their own ids; if you pass one this Actor has not measured and Amazon answers in an unexpected shape, you get a free row saying so rather than an empty result.",
            "default": "ATVPDKIKX0DER"
          },
          "maxSuggestions": {
            "title": "Maximum suggestions to return",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Hard cap on the rows returned in total, applied after the filters and deduplication. When more were collected than this, the rows are taken evenly from every seed so no seed disappears, and a free row tells you how many were left out and how many each seed got. You are charged for the rows you actually receive.",
            "default": 1000
          },
          "maxRequests": {
            "title": "Maximum requests",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard cap on how many requests this run sends to the search engines. This is the limit that protects the services you are asking: expansions multiply queries fast (four expansions, three seeds and seven engines is 1,197 requests), and the row limit above cannot stop them because filtering happens after the answer arrives. When the cap is reached the run stops asking and says so in a free row.",
            "default": 500
          },
          "deduplicate": {
            "title": "Collapse the same suggestion into one row",
            "type": "boolean",
            "description": "When the same suggestion comes back from several engines or several seeds, return it once with the list of engines and seeds that produced it and its best rank. The per-row columns that no longer apply to a merged row - engine, query, expansion, rank and seed - are left empty rather than showing whichever row happened to be found first. Off = one row per engine, which is what you want when comparing engines.",
            "default": false
          },
          "keepRepeatsPerEngine": {
            "title": "Keep repeats within one engine",
            "type": "boolean",
            "description": "By default, when the same engine returns the same suggestion for two different expanded queries, only the first row is kept and charged - it is the same fact twice. Turn this on to keep every occurrence, with the query that produced each one. Measured on 2026-09-08, repeats were 2% of rows on a light expansion and up to 30% on a heavy one.",
            "default": false
          },
          "excludeSeedItself": {
            "title": "Drop the seed itself",
            "type": "boolean",
            "description": "Engines usually return the seed term as its own first suggestion. Turn this on to drop that row.",
            "default": false
          },
          "minWords": {
            "title": "Minimum words",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only suggestions with at least this many words - a simple way to keep long-tail phrases and drop one-word terms. 0 = no minimum.",
            "default": 0
          },
          "maxWords": {
            "title": "Maximum words",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only suggestions with at most this many words. 0 = no maximum.",
            "default": 0
          },
          "filterKeywords": {
            "title": "Must contain",
            "type": "array",
            "description": "Keep only suggestions whose text, query or seed contains at least one of these words. Case is ignored. Leave empty for no filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Must not contain",
            "type": "array",
            "description": "Drop a suggestion when these words appear in its text, in the query that was sent, or in the seed - the same three fields the 'must contain' filter searches. That means excluding a word that is part of your seed removes every row for that seed. Applied after the 'must contain' filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "useProxy": {
            "title": "Use a proxy if a service answers with a bot check",
            "type": "boolean",
            "description": "Off by default because all seven services answered directly from Apify when this was measured on 2026-09-08 (206-370 ms). Turn it on to retry through a residential proxy if a service ever answers with a bot check; a proxy makes each run slower and more expensive, so it is not used unless it is needed.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}