{
  "openapi": "3.0.1",
  "info": {
    "title": "Flippa Marketplace Scraper",
    "description": "Scrape Flippa.com listings — price, revenue, profit, multiples, traffic, monetization, niche, and more. Perfect for deal sourcing and market research.",
    "version": "1.0",
    "x-build-id": "1YO0PEVXZhkj7ZsDq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/texmt~flippa-marketplace-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-texmt-flippa-marketplace-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/texmt~flippa-marketplace-scraper/runs": {
      "post": {
        "operationId": "runs-sync-texmt-flippa-marketplace-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/texmt~flippa-marketplace-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-texmt-flippa-marketplace-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": {
          "listingUrls": {
            "title": "Direct Listing URLs",
            "type": "array",
            "description": "Paste individual Flippa listing URLs or IDs to enrich directly (e.g. \"https://flippa.com/12345678\" or just \"12345678\"). Can be used alone or combined with category filters in one run. All listings return the same schema.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "outputMode": {
            "title": "Output Mode",
            "enum": [
              "full",
              "etl",
              "alerts"
            ],
            "type": "string",
            "description": "Controls what gets saved to the dataset. 'full' = every listing with all fields. 'etl' = same listings but null/empty fields stripped (clean for Sheets/Airtable/Postgres). 'alerts' = only listings with at least one flaggedReason (undervalued, price_drop, new_listing, sold, low_confidence).",
            "default": "full"
          },
          "propertyType": {
            "title": "Property Type",
            "type": "array",
            "description": "Filter by type of business/asset. Leave empty to scrape all categories.",
            "items": {
              "type": "string",
              "enum": [
                "website",
                "fba",
                "ios_app",
                "android_app",
                "domain",
                "business",
                "newsletter"
              ],
              "enumTitles": [
                "Website",
                "Amazon FBA",
                "iOS App",
                "Android App",
                "Domain",
                "Business",
                "Newsletter"
              ]
            },
            "default": []
          },
          "siteType": {
            "title": "Site Type / Business Model",
            "type": "array",
            "description": "Filter by business model. Multiple selections each scrape their own category page.",
            "items": {
              "type": "string",
              "enum": [
                "saas",
                "ecommerce",
                "content",
                "blog",
                "dropship",
                "digital-products",
                "shopify",
                "affiliate",
                "marketplace",
                "forum-community",
                "directory",
                "services"
              ],
              "enumTitles": [
                "SaaS",
                "Ecommerce",
                "Content",
                "Blog",
                "Dropshipping",
                "Digital Products",
                "Shopify",
                "Affiliate",
                "Marketplace",
                "Forum / Community",
                "Directory",
                "Services"
              ]
            },
            "default": []
          },
          "minPrice": {
            "title": "Minimum Asking Price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return listings at or above this asking price"
          },
          "maxPrice": {
            "title": "Maximum Asking Price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return listings at or below this asking price"
          },
          "minMonthlyProfit": {
            "title": "Minimum Monthly Profit (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return listings with at least this monthly net profit"
          },
          "maxMonthlyProfit": {
            "title": "Maximum Monthly Profit (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return listings with at most this monthly net profit"
          },
          "minRoiScore": {
            "title": "Minimum ROI Score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Only return listings at or above this ROI score. 100 = best deal (fastest payback), 0 = worst. Requires ROI Scoring to be enabled."
          },
          "titleKeywords": {
            "title": "Title Keywords",
            "type": "array",
            "description": "Only return listings whose title contains at least one of these keywords (case-insensitive). E.g. [\"AI\", \"SaaS\", \"recurring\"]. Leave empty to match all titles.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "descriptionKeywords": {
            "title": "Description Keywords",
            "type": "array",
            "description": "Only return listings whose description contains at least one of these keywords (case-insensitive). Useful for niche targeting. Leave empty to match all.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max Results",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum total listings to scrape across all selected categories",
            "default": 50
          },
          "roiScoring": {
            "title": "ROI Scoring",
            "type": "boolean",
            "description": "Add roiScore (0–100), paybackYears, and isUndervalued to every listing.",
            "default": true
          },
          "onlyUndervalued": {
            "title": "Only Return Undervalued Listings",
            "type": "boolean",
            "description": "When enabled, only listings flagged as undervalued (payback period below the threshold) are saved. Ideal for alert-style scheduled runs.",
            "default": false
          },
          "undervaluedMultipleThreshold": {
            "title": "Undervalued Threshold — Global Override (Years Payback)",
            "minimum": 0.5,
            "maximum": 10,
            "type": "number",
            "description": "If set, ALL business types use this payback threshold. Leave empty to use per-type thresholds (SaaS, Ecommerce, Content) set below."
          },
          "saasBenchmarkYears": {
            "title": "SaaS Undervalued Threshold (Years Payback)",
            "minimum": 0.5,
            "maximum": 10,
            "type": "number",
            "description": "Payback threshold for SaaS businesses. Default: 3.5 years. Ignored if Global Override is set.",
            "default": 3.5
          },
          "ecommerceBenchmarkYears": {
            "title": "Ecommerce / FBA Undervalued Threshold (Years Payback)",
            "minimum": 0.5,
            "maximum": 10,
            "type": "number",
            "description": "Payback threshold for Ecommerce and Amazon FBA businesses. Default: 2.5 years. Ignored if Global Override is set.",
            "default": 2.5
          },
          "contentBenchmarkYears": {
            "title": "Content / Blog / Affiliate Undervalued Threshold (Years Payback)",
            "minimum": 0.5,
            "maximum": 10,
            "type": "number",
            "description": "Payback threshold for content, blog, affiliate, and newsletter businesses. Default: 3.0 years. Ignored if Global Override is set.",
            "default": 3
          },
          "defaultBenchmarkYears": {
            "title": "Default Undervalued Threshold (Years Payback)",
            "minimum": 0.5,
            "maximum": 10,
            "type": "number",
            "description": "Fallback payback threshold for business types not matched above. Default: 3.0 years. Ignored if Global Override is set.",
            "default": 3
          },
          "onlyNewListings": {
            "title": "Only New Listings (Alert Mode)",
            "type": "boolean",
            "description": "Skip listings seen in previous runs. Uses a persistent store to track seen listing IDs across runs. Perfect for scheduled daily/weekly alerts.",
            "default": false
          },
          "includeSoldListings": {
            "title": "Include Sold Listings",
            "type": "boolean",
            "description": "Also scrape Flippa's /sold pages alongside active listings. Sold listings are tagged with isSold: true. Useful for market research on actual transaction prices.",
            "default": false
          },
          "trackPriceDrops": {
            "title": "Track Price Drops",
            "type": "boolean",
            "description": "Compare each listing's current asking price against the price stored from previous runs. Listings with a lower price are flagged with priceDropped: true and priceDrop: <USD amount dropped>. Best combined with scheduled runs.",
            "default": false
          },
          "scrapeDetailPages": {
            "title": "Scrape Detail Pages",
            "type": "boolean",
            "description": "Visit each listing's page for extra fields: verified status, editor's choice badge, seller rating, year established, monthly visitors.",
            "default": false
          },
          "webhookUrl": {
            "title": "Webhook URL (n8n / Zapier / Make / custom)",
            "type": "string",
            "description": "POST all saved listings to this URL at the end of each run. Works with Zapier, Make, n8n, or any HTTP endpoint."
          },
          "slackWebhookUrl": {
            "title": "Slack Webhook URL",
            "type": "string",
            "description": "Incoming Webhook URL from Slack. Sends a formatted Block Kit deal report at the end of each run. Get yours at api.slack.com/messaging/webhooks."
          },
          "airtableApiKey": {
            "title": "Airtable API Key",
            "type": "string",
            "description": "Personal Access Token from airtable.com/account. Required for Airtable export."
          },
          "airtableBaseId": {
            "title": "Airtable Base ID",
            "type": "string",
            "description": "The Base ID from your Airtable URL (e.g. appXXXXXXXXXXXXXX)."
          },
          "airtableTableName": {
            "title": "Airtable Table Name",
            "type": "string",
            "description": "Name of the table in your Airtable base where listings will be written.",
            "default": "Flippa Listings"
          },
          "notionApiKey": {
            "title": "Notion Integration Token",
            "type": "string",
            "description": "Internal Integration Token from notion.so/my-integrations. The integration must have access to your target database."
          },
          "notionDatabaseId": {
            "title": "Notion Database ID",
            "type": "string",
            "description": "The 32-character ID from your Notion database URL. Share the database with your integration first."
          },
          "googleServiceAccountJson": {
            "title": "Google Service Account JSON",
            "type": "string",
            "description": "Full JSON contents of a Google service account key file with Sheets API access. Create at console.cloud.google.com → IAM → Service Accounts → Keys. Share your sheet with the service account email."
          },
          "googleSheetsId": {
            "title": "Google Sheets Spreadsheet ID",
            "type": "string",
            "description": "The ID from your Google Sheets URL: docs.google.com/spreadsheets/d/<ID>/edit"
          },
          "googleSheetName": {
            "title": "Google Sheet Tab Name",
            "type": "string",
            "description": "Name of the tab/sheet within the spreadsheet where data will be appended.",
            "default": "Flippa Listings"
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Residential proxies are required — Flippa blocks datacenter IPs on its search routes."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}