{
  "openapi": "3.0.1",
  "info": {
    "title": "Freelancer.nl Opdrachten Scraper - Freelance & ZZP Projects",
    "description": "Scrape freelancer.nl for Dutch freelance opdrachten and ZZP listings. Filter by city or keyword, enrich with full detail pages including budget and duration, and track new or changed listings incrementally.",
    "version": "0.1",
    "x-build-id": "ggiVNZL3KcJOn8kAZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~freelancer-nl-opdrachten-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-freelancer-nl-opdrachten-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/blackfalcondata~freelancer-nl-opdrachten-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-freelancer-nl-opdrachten-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/blackfalcondata~freelancer-nl-opdrachten-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-freelancer-nl-opdrachten-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": {
          "query": {
            "title": "Search Query",
            "type": "string",
            "description": "Keyword to filter listings (e.g. \"php\", \"webdesign\"). Strict match with proper pagination. Leave empty for all listings."
          },
          "location": {
            "title": "City",
            "type": "string",
            "description": "Filter by Dutch city (e.g. \"eindhoven\", \"rotterdam\", \"groningen\"). Maps to /opdrachten/{city} — a real strict filter on freelancer.nl with exact total counts. When combined with query, location takes precedence and the query is applied as a client-side title post-filter."
          },
          "daysOld": {
            "title": "Max Age (days)",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Drop listings older than N days (post-filter on parsed publishedAt). 0 = no filter.",
            "default": 0
          },
          "budgetType": {
            "title": "Budget Type",
            "enum": [
              "",
              "hourly",
              "fixed",
              "tbd"
            ],
            "type": "string",
            "description": "Filter by budget type. \"hourly\" = Per uur, \"fixed\" = Vaste prijs, \"tbd\" = In overleg (budget not specified). Applied as a post-filter on parsed budget data.",
            "default": ""
          },
          "budgetMin": {
            "title": "Budget Minimum (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum budget in euros. Listings whose upper bound is below this are dropped. Applied as a post-filter on parsed budget data."
          },
          "budgetMax": {
            "title": "Budget Maximum (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum budget in euros. Listings whose lower bound is above this are dropped. Applied as a post-filter on parsed budget data."
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Override listing URLs (e.g. category pages: https://www.freelancer.nl/opdrachten/php). Leave empty to use query/location filters or scrape all listings.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max Results",
            "minimum": 0,
            "maximum": 2000,
            "type": "integer",
            "description": "Maximum listings to return (0 = unlimited).",
            "default": 50
          },
          "maxPages": {
            "title": "Max Pages",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum listing pages per source.",
            "default": 5
          },
          "includeDetails": {
            "title": "Include Detail Pages",
            "type": "boolean",
            "description": "Fetch each listing's detail page for the full description (~3500 chars). Doubles the request count.",
            "default": true
          },
          "descriptionMaxLength": {
            "title": "Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to this many characters. 0 = no limit.",
            "default": 0
          },
          "compact": {
            "title": "Compact Output",
            "type": "boolean",
            "description": "Return only core fields (title, location, tags, URL, postedAt). Useful for AI / MCP workflows.",
            "default": false
          },
          "incrementalMode": {
            "title": "Incremental Mode",
            "type": "boolean",
            "description": "Track changes between runs. Requires stateKey.",
            "default": false
          },
          "stateKey": {
            "title": "State Key",
            "type": "string",
            "description": "Unique key for this tracking universe (e.g. \"all-nl\" or \"php-listings\")."
          },
          "emitUnchanged": {
            "title": "Emit Unchanged",
            "type": "boolean",
            "description": "Also emit listings that haven't changed since last run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit Expired",
            "type": "boolean",
            "description": "Also emit listings that disappeared since last run.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}