{
  "openapi": "3.0.1",
  "info": {
    "title": "Facebook Public Group Posts & Comments [Only $1.5💰] NO COOKIES",
    "description": "[Only $1.5💰] Scrape Facebook public group posts and comments extract text, dates, media URLs, author info, engagement metrics (likes/shares), and detailed comment threads. Perfect for social listening, market research, or tracking community trends. High-speed, stealthy, and requires no login",
    "version": "0.0",
    "x-build-id": "3kr0PiGbrZJ7eKjQU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~facebook-public-group-posts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-facebook-public-group-posts-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~facebook-public-group-posts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-facebook-public-group-posts-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~facebook-public-group-posts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-facebook-public-group-posts-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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Facebook Group URLs",
            "type": "array",
            "description": "Full URLs to public Facebook groups you want to scrape.",
            "items": {
              "type": "string"
            }
          },
          "search": {
            "title": "Search / keyword filter",
            "type": "string",
            "description": "Only keep posts whose text contains your words. Matching is case-insensitive, and every word must appear somewhere in the post (order doesn't matter) — so \"visa grant\" keeps posts containing both words. Wrap the query in double quotes to require that exact phrase instead. Note this filters the posts the group feed returns; it does NOT search Facebook's archive, so it cannot find posts older than the feed reaches. You can also paste a group search URL (https://www.facebook.com/groups/<id>/search/?q=keyword) into the URLs field and the keyword is applied automatically. Leave empty to scrape all posts."
          },
          "searchKeywordByYear": {
            "title": "Search keyword by year",
            "minimum": 2004,
            "type": "integer",
            "description": "Optional. Keep only posts created in this calendar year (e.g. 2026). IMPORTANT: this filters the posts the group feed returns — it does NOT search Facebook's archive. Facebook only serves a limited window of a group's history (often ~6 months on a busy group), so setting a year older than that window returns zero results no matter how long the run goes. Leave empty unless you specifically want to narrow results to one year within the feed's range."
          },
          "includeComments": {
            "title": "Include Top Comments",
            "type": "boolean",
            "description": "If enabled, extracts the top/most interesting comments that Facebook inlines in the group feed. This is fast (no extra requests) but Facebook only inlines a curated subset and for many posts inlines none, so topComments is often empty. For reliable comments, use \"Fetch comments from each post\" below instead.",
            "default": false
          },
          "fetchAllComments": {
            "title": "Fetch comments from each post (reliable, slower)",
            "type": "boolean",
            "description": "If enabled, for each post that has comments the scraper makes one extra request to the post's page and returns the comments Facebook shows there (text, author name, author id, profile picture, and a direct link to each comment). Use this when \"Include Top Comments\" comes back empty — the group feed often omits comments even when the count is above zero, and this fills that gap. It adds one request per post that has comments, so runs are slower. Posts with zero comments are not fetched. This returns the top-level comments Facebook renders on the post page; to also get replies, enable \"Include comment replies\" below.",
            "default": false
          },
          "includeCommentReplies": {
            "title": "Include comment replies (deepest, slowest)",
            "type": "boolean",
            "description": "If enabled, comments are pulled from Facebook's comment view instead of the post page, which returns each post's top-level comments AND the replies under them (nested, with a threadingDepth field marking replies). This is the most complete comment mode and the slowest: busy posts take several requests. It supersedes \"Fetch comments from each post\" when both are on, and automatically falls back to top-level comments if Facebook changes its comment endpoint. Leave off unless you specifically need replies.",
            "default": false
          },
          "enrichMarketplaceListings": {
            "title": "Enrich Marketplace listings (location + title)",
            "type": "boolean",
            "description": "If enabled, for each post that is a Marketplace/buy-sell listing the scraper makes one extra request to the listing page to add its location (text + latitude/longitude) and structured title, which the group feed does not include. This adds one request per listing, so runs are a bit slower. Non-listing posts are unaffected.",
            "default": false
          },
          "monitoringMode": {
            "title": "Monitoring mode (only new posts)",
            "type": "boolean",
            "description": "If enabled, the scraper remembers post IDs it has already returned in previous runs and delivers only posts it hasn't seen before. Ideal for scheduled runs that should return just what's new since last time. Pagination stops early once it reaches already-seen posts. Note: posts already seen are still checked (and billed at the lower additional-data rate) since they must be fetched to be recognized as duplicates.",
            "default": false
          },
          "viewOption": {
            "title": "View Option (Sorting)",
            "enum": [
              "CHRONOLOGICAL",
              "RECENT_ACTIVITY",
              "TOP_POSTS",
              "CHRONOLOGICAL_LISTINGS"
            ],
            "type": "string",
            "description": "How to sort the posts in the group feed. CHRONOLOGICAL = new posts (default), RECENT_ACTIVITY = newest activity, TOP_POSTS = most relevant, CHRONOLOGICAL_LISTINGS = buy/sell items.",
            "default": "CHRONOLOGICAL"
          },
          "onlyPostsNewerThan": {
            "title": "Posts newer than",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])(T[0-2]\\d:[0-5]\\d(:[0-5]\\d)?(\\.\\d+)?Z?)?$|^(\\d+)\\s*(minute|hour|day|week|month|year)s?$",
            "type": "string",
            "description": "Use this if you only want to scrape posts from a specific period of time. Accepts an absolute date (e.g. 2026-04-20) or a relative period (e.g. 30 days, 2 weeks); the scraper stops paginating once it reaches posts older than this."
          },
          "onlyPostsNewerThanHours": {
            "title": "Posts newer than (hours)",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Keep only posts from the last N hours. If set, this overrides the date field above."
          },
          "onlyPostsOlderThan": {
            "title": "Posts older than",
            "type": "string",
            "description": "Optional upper bound on the date window. Keep only posts published BEFORE this point. Combine it with \"Posts newer than\" to scrape a closed range, e.g. newer-than 2026-01-01 plus older-than 2026-02-01 returns only January. Accepts an absolute date (2026-04-20) or a relative period (30 days, 2 weeks). Posts newer than this bound are skipped free of charge while the scraper seeks back to your window, so a \"before March\" run does not bill you for everything since March."
          },
          "maxItems": {
            "title": "Maximum number of posts per group",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of posts that will be scraped per group.",
            "default": 100
          },
          "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.",
            "default": 3
          },
          "postsPerRequest": {
            "title": "Posts per request (advanced)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Advanced: how many posts to request per feed call. Facebook caps this at about 3 posts per response no matter what you set — measured on group 1108531659756743, where a value of 30 returned the same 3 posts and the same ~600 KB payload as a value of 3. Raising it does not speed the scrape up. Leave it at the default; if a run is not finishing in time, raise the run's timeout or lower Max items instead.",
            "default": 3
          },
          "proxyCountry": {
            "title": "Proxy country (optional)",
            "enum": [
              "",
              "US",
              "GB",
              "DE",
              "FR",
              "ES",
              "IT",
              "NL",
              "DK",
              "SE",
              "NO",
              "FI",
              "PL",
              "IE",
              "PT",
              "AT",
              "BE",
              "CH",
              "CZ",
              "GR",
              "HU",
              "RO",
              "BG",
              "HR",
              "RS",
              "BA",
              "SI",
              "SK",
              "UA",
              "CA",
              "MX",
              "BR",
              "AR",
              "AU",
              "NZ",
              "IN",
              "JP",
              "KR",
              "SG",
              "PH",
              "ID",
              "TH",
              "VN",
              "MY",
              "TR",
              "AE",
              "SA",
              "IL",
              "ZA",
              "NG",
              "EG"
            ],
            "type": "string",
            "description": "Country for the actor's built-in residential proxy. Pick one when a group's posts differ by viewer country, or to keep requests coming from a single region. Leave on \"Anywhere\" for automatic worldwide routing. Ignored when you supply your own proxies below.",
            "default": ""
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}