{
  "openapi": "3.0.1",
  "info": {
    "title": "Malt Fr Scraper",
    "description": "Scrape freelance profiles from the Malt directory (malt.fr, malt.de, malt.es): name, headline, skills, day rate, location, rating, missions and recommendations. Search by skill, role or city. Backed by Malt's internal JSON search API.",
    "version": "0.0",
    "x-build-id": "Kjsf99eiZZ233ep6n"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ahmed_jasarevic~malt-fr-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ahmed_jasarevic-malt-fr-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/ahmed_jasarevic~malt-fr-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ahmed_jasarevic-malt-fr-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/ahmed_jasarevic~malt-fr-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ahmed_jasarevic-malt-fr-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": [
          "searchTerms"
        ],
        "properties": {
          "searchTerms": {
            "title": "Search terms",
            "minItems": 1,
            "type": "array",
            "description": "Skills, roles or keywords to search for (e.g. \"react\", \"data scientist\", \"ux designer\"). Each term is searched per selected domain and, by default, expanded into several query variants (see \"Expand keywords into query variants\"). Multiple terms are merged and deduplicated.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations / cities (optional)",
            "type": "array",
            "description": "Optional cities or regions to pass as a `location` filter. Note: Malt's public search API currently ignores this filter and returns the same randomised sample regardless.",
            "items": {
              "type": "string"
            }
          },
          "domains": {
            "title": "Malt domains",
            "type": "array",
            "description": "Which Malt country sites to search.",
            "items": {
              "type": "string",
              "enum": [
                "fr",
                "de",
                "es"
              ],
              "enumTitles": [
                "malt.fr (France)",
                "malt.de (Germany)",
                "malt.es (Spain)"
              ]
            },
            "default": [
              "fr"
            ]
          },
          "maxItems": {
            "title": "Max freelancers",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of freelancer profiles to save to the dataset.",
            "default": 100
          },
          "maxRepetitions": {
            "title": "Repetitions per query",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Malt's guest search returns a random ~24-profile sample and ignores paging, sorting and location. Repeating the same query draws new profiles from the pool until it dries up, so this is what raises coverage for a keyword. Higher = more results (and more proxy usage) for common skills; the Actor stops early once repetitions stop yielding new profiles.",
            "default": 10
          },
          "expandWithVariants": {
            "title": "Expand keywords into query variants",
            "type": "boolean",
            "description": "Malt returns a fixed top-24 per exact query, but a *different* 24 for each query string, so this is the main coverage lever. For every search term the Actor also runs the term combined with common qualifiers (see \"Variant modifiers\"). Example: \"react\" also searches \"react freelance\", \"react senior\", \"react remote\", etc. — together easily 100+ unique profiles for one keyword. Turn off for a strict, exact-match search.",
            "default": true
          },
          "variantModifiers": {
            "title": "Variant modifiers",
            "type": "array",
            "description": "Words appended to each search term when \"Expand keywords into query variants\" is on. Leave empty to use the built-in list (freelance, senior, expert, junior, lead, remote, consultant, indépendant).",
            "items": {
              "type": "string"
            }
          },
          "scrapeProfileDetails": {
            "title": "Scrape full profile details (extra charge)",
            "type": "boolean",
            "description": "Fetch each freelancer's profile page (in parallel) to add spoken languages, experience level, category/sub-category, description and availability. Not part of the search API, so it costs one extra request per freelancer and is billed as an additional \"profile-detail\" event. Leave off for bulk lists.",
            "default": false
          },
          "experienceLevel": {
            "title": "Experience level (optional)",
            "type": "string",
            "description": "Optional experience filter passed to Malt's search (e.g. \"junior\", \"confirmed\", \"senior\")."
          },
          "language": {
            "title": "Language (optional)",
            "type": "string",
            "description": "Optional language filter passed to Malt's search (ISO code, e.g. \"en\", \"fr\")."
          },
          "category": {
            "title": "Category (optional)",
            "type": "string",
            "description": "Optional category filter passed to Malt's search (e.g. \"tech\", \"data\")."
          },
          "speciality": {
            "title": "Speciality (optional)",
            "type": "string",
            "description": "Optional speciality filter passed to Malt's search (e.g. \"fullstack\")."
          },
          "minDayRate": {
            "title": "Min day rate (optional)",
            "type": "integer",
            "description": "Optional minimum day rate (in EUR) filter."
          },
          "maxDayRate": {
            "title": "Max day rate (optional)",
            "type": "integer",
            "description": "Optional maximum day rate (in EUR) filter."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many search requests to run in parallel. Higher is faster but uses more proxy bandwidth.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Malt is behind Cloudflare and blocks datacenter IPs. The default UNBLOCKER group is required to make the internal API return data. Set \"useApifyProxy\": false only if you have another working route."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}