{
  "openapi": "3.0.1",
  "info": {
    "title": "GoodFirms Scraper — B2B Agencies, Ratings & Reviews",
    "description": "Scrape GoodFirms B2B company directories into JSON for lead lists: ratings, review counts, hourly rates, team size, every office, website, emails, phones, services, and reviews. Paste a directory or company URL, or pick a category shortcut. One dataset row per company saved.",
    "version": "0.1",
    "x-build-id": "znLSuFT6Gz15pddrc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~goodfirms-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-goodfirms-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/memo23~goodfirms-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-goodfirms-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/memo23~goodfirms-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-goodfirms-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": {
          "startUrls": {
            "title": "Directory or company URLs",
            "type": "array",
            "description": "GoodFirms URLs to crawl. Directory pages (for example https://www.goodfirms.co/directory/languages/top-software-development-companies or https://www.goodfirms.co/companies/web-development-agency) are paginated. Company profiles (https://www.goodfirms.co/company/instinctools) are scraped directly. Leave empty to use Category.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category shortcut",
            "enum": [
              "software-development",
              "web-development",
              "web-design",
              "digital-marketing",
              "mobile-app-development",
              "seo",
              "artificial-intelligence",
              "devops"
            ],
            "type": "string",
            "description": "Used only when Start URLs is empty. Paths were checked against the live GoodFirms sitemap: software-development, web-development, web-design, digital-marketing, mobile-app-development, seo, artificial-intelligence, devops. Example: web-development.",
            "default": "software-development"
          },
          "country": {
            "title": "Country or location slug",
            "type": "string",
            "description": "Used only when Start URLs is empty. software-development takes a short slug such as us, gb, de, in (builds /directory/country/top-software-development-companies/us). web-development, artificial-intelligence, and devops append the slug GoodFirms uses on that path (us or usa, uk, india). web-design, digital-marketing, mobile-app-development, and seo ignore this field — paste a location URL in Start URLs instead. Leave empty for the global list."
          },
          "maxItems": {
            "title": "Max companies",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many companies are saved. Default 100. Free Apify plans are capped at 100. Example: 50.",
            "default": 100
          },
          "maxPages": {
            "title": "Max directory pages",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many paginated directory pages to open per Start URL (?page=1, 2, …). Default 5. A page with no new companies ends that directory early. Example: 3.",
            "default": 5
          },
          "includeProfileDetails": {
            "title": "Open each company profile",
            "type": "boolean",
            "description": "When on, each company profile is fetched for website, domain, founding year, employee band, emails, phones, every office, services, social links, and reviews. When off, only the directory card is saved (rating, hourly rate, one office, one featured review) and the run is faster.",
            "default": true
          },
          "maxReviewsPerCompany": {
            "title": "Max reviews per company",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "How many review objects to keep on each company row. Default 5. The review count and rating always come from the full GoodFirms total, not from this cap. Example: 10.",
            "default": 5
          },
          "maxConcurrency": {
            "title": "Profile concurrency",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many company profiles to fetch at once. Default 8. Lower it if GoodFirms starts returning errors.",
            "default": 8
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Each URL is tried directly first. If that fails, the proxy selected here is used for the retry. Datacenter is enough for most directory pages. Switch on Residential if a run comes back empty.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}